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 loff_t peek_offset[MOS_SIDE_BOTH]; 88 struct mon_listener *monitor_listener; 89 90 #ifdef NEWEV 91 stree_t *stree_dontcare; 92 stree_t *stree_pre_rcv; 93 stree_t *stree_post_snd; 94 #else 95 struct ev_pointer dontcare_evp; 96 struct ev_pointer pre_tcp_evp; 97 struct ev_pointer post_tcp_evp; 98 #endif 99 100 uint8_t client_buf_mgmt: 2, 101 server_buf_mgmt: 2, 102 client_mon: 1, 103 server_mon: 1; 104 }; 105 /*----------------------------------------------------------------------------*/ 106 struct socket_map 107 { 108 int id; 109 int socktype; 110 uint32_t opts; 111 uint8_t forward; 112 113 struct sockaddr_in saddr; 114 115 union { 116 struct tcp_stream *stream; 117 struct tcp_listener *listener; 118 struct mon_listener *monitor_listener; 119 struct mon_stream *monitor_stream; 120 struct mtcp_epoll *ep; 121 struct pipe *pp; 122 }; 123 124 uint64_t epoll; /* registered events */ 125 uint64_t events; /* available events */ 126 mtcp_epoll_data_t ep_data; 127 128 TAILQ_ENTRY (socket_map) link; 129 }; 130 /*----------------------------------------------------------------------------*/ 131 socket_map_t 132 AllocateSocket(mctx_t mctx, int socktype); 133 /*----------------------------------------------------------------------------*/ 134 void 135 FreeSocket(mctx_t mctx, int sockid, int socktype); 136 /*----------------------------------------------------------------------------*/ 137 socket_map_t 138 GetSocket(mctx_t mctx, int sockid); 139 /*----------------------------------------------------------------------------*/ 140 141 #endif /* __SOCKET_H_ */ 142