1 #ifndef __SOCKET_H_ 2 #define __SOCKET_H_ 3 4 #include <sys/queue.h> 5 #include "tcp_stream_queue.h" 6 #include "mtcp_epoll.h" 7 #include "mos_api.h" 8 #include "bpf/sfbpf.h" 9 #include "bpf/sfbpf_dlt.h" 10 #include "event_callback.h" 11 #include "tcp_rb.h" 12 #include "scalable_event.h" 13 14 /*----------------------------------------------------------------------------*/ 15 #ifndef __SOCKET_MAP 16 #define __SOCKET_MAP 17 typedef struct socket_map * socket_map_t; 18 #endif 19 /*----------------------------------------------------------------------------*/ 20 enum socket_opts 21 { 22 MTCP_NONBLOCK = 0x01, 23 MTCP_ADDR_BIND = 0x02, 24 }; 25 /*----------------------------------------------------------------------------*/ 26 struct tcp_listener 27 { 28 int sockid; 29 socket_map_t socket; 30 31 int backlog; 32 stream_queue_t acceptq; 33 34 pthread_mutex_t accept_lock; 35 pthread_cond_t accept_cond; 36 }; 37 /*----------------------------------------------------------------------------*/ 38 struct mon_listener 39 { 40 socket_map_t socket; 41 void *uctx; 42 43 uint8_t ude_id; 44 uint8_t client_buf_mgmt: 2, /* controls different buf mgmt modes (client-side) */ 45 server_buf_mgmt: 2, /* controls different buf mgmt modes (server-side) */ 46 client_mon: 1, /* controls client-side monitoring */ 47 server_mon: 1, /* controls server-side monitoring */ 48 is_stream_syn_filter_hit: 1; 49 50 // struct sfbpf_program fcode; 51 52 union { 53 /** For MOS_SOCK_MONITOR_RAW type socket **/ 54 struct sfbpf_program raw_pkt_fcode; 55 /** For MOS_SOCK_MONITOR_STREAM type socket **/ 56 struct { 57 struct sfbpf_program stream_syn_fcode; 58 struct sfbpf_program stream_orphan_fcode; 59 }; 60 }; 61 62 struct event_queue *eq; 63 64 #ifdef NEWEV 65 stree_t *stree_dontcare; 66 stree_t *stree_pre_rcv; 67 stree_t *stree_post_snd; 68 #else 69 struct ev_base dontcare_evb; 70 struct ev_base pre_tcp_evb; 71 struct ev_base post_tcp_evb; 72 #endif 73 74 TAILQ_ENTRY(mon_listener) link; 75 }; 76 /*----------------------------------------------------------------------------*/ 77 struct mon_stream 78 { 79 socket_map_t socket; 80 struct tcp_stream *stream; 81 void *uctx; 82 83 /* 84 * offset that points to the monitoring stream offset. 85 * This variable will eventually be moved to socket. 86 */ 87 #ifdef NEWRB 88 loff_t peek_offset[MOS_SIDE_BOTH]; 89 #else 90 struct { 91 uint32_t head_offset[MOS_SIDE_BOTH]; 92 uint8_t overlap[MOS_SIDE_BOTH]; 93 } monitor_read; 94 #endif 95 96 struct mon_listener *monitor_listener; 97 98 #ifdef NEWEV 99 stree_t *stree_dontcare; 100 stree_t *stree_pre_rcv; 101 stree_t *stree_post_snd; 102 #else 103 struct ev_pointer dontcare_evp; 104 struct ev_pointer pre_tcp_evp; 105 struct ev_pointer post_tcp_evp; 106 #endif 107 108 uint8_t client_buf_mgmt: 2, 109 server_buf_mgmt: 2, 110 client_mon: 1, 111 server_mon: 1; 112 }; 113 /*----------------------------------------------------------------------------*/ 114 struct socket_map 115 { 116 int id; 117 int socktype; 118 uint32_t opts; 119 uint8_t forward; 120 121 struct sockaddr_in saddr; 122 123 union { 124 struct tcp_stream *stream; 125 struct tcp_listener *listener; 126 struct mon_listener *monitor_listener; 127 struct mon_stream *monitor_stream; 128 struct mtcp_epoll *ep; 129 struct pipe *pp; 130 }; 131 132 uint64_t epoll; /* registered events */ 133 uint64_t events; /* available events */ 134 mtcp_epoll_data_t ep_data; 135 136 TAILQ_ENTRY (socket_map) link; 137 }; 138 /*----------------------------------------------------------------------------*/ 139 socket_map_t 140 AllocateSocket(mctx_t mctx, int socktype); 141 /*----------------------------------------------------------------------------*/ 142 void 143 FreeSocket(mctx_t mctx, int sockid, int socktype); 144 /*----------------------------------------------------------------------------*/ 145 socket_map_t 146 GetSocket(mctx_t mctx, int sockid); 147 /*----------------------------------------------------------------------------*/ 148 149 #endif /* __SOCKET_H_ */ 150