00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef _tcp_conn_h
00043 #define _tcp_conn_h
00044
00045 #include "tcp_init.h"
00046 #include "tcp_options.h"
00047
00048 #include "ip_addr.h"
00049 #include "locking.h"
00050 #include "atomic_ops.h"
00051 #include "timer_ticks.h"
00052 #include "timer.h"
00053
00054
00055 #define TCP_CON_MAX_ALIASES (4*3)
00056
00057 #define TCP_CHILD_TIMEOUT 5
00058
00059 #define TCP_MAIN_SELECT_TIMEOUT 5
00060 #define TCP_CHILD_SELECT_TIMEOUT 2
00061
00062
00063
00064 #define F_CONN_READ_W 2
00065 #define F_CONN_WRITE_W 4
00066 #define F_CONN_READER 8
00067 #define F_CONN_HASHED 16
00068 #define F_CONN_FD_CLOSED 32
00069 #define F_CONN_PENDING 64
00070 #define F_CONN_MAIN_TIMER 128
00071 #define F_CONN_EOF_SEEN 256
00072 #define F_CONN_FORCE_EOF 512
00073 #define F_CONN_OOB_DATA 1024
00074 #define F_CONN_WR_ERROR 2048
00075 #define F_CONN_WANTS_RD 4096
00076 #define F_CONN_WANTS_WR 8192
00077 #define F_CONN_PASSIVE 16384
00078
00079 #ifndef NO_READ_HTTP11
00080 #define READ_HTTP11
00081 #endif
00082
00083 #ifndef NO_READ_MSRP
00084 #define READ_MSRP
00085 #endif
00086
00087 enum tcp_req_errors { TCP_REQ_INIT, TCP_REQ_OK, TCP_READ_ERROR,
00088 TCP_REQ_OVERRUN, TCP_REQ_BAD_LEN };
00089 enum tcp_req_states { H_SKIP_EMPTY, H_SKIP_EMPTY_CR_FOUND,
00090 H_SKIP_EMPTY_CRLF_FOUND, H_SKIP_EMPTY_CRLFCR_FOUND,
00091 H_SKIP, H_LF, H_LFCR, H_BODY, H_STARTWS,
00092 H_CONT_LEN1, H_CONT_LEN2, H_CONT_LEN3, H_CONT_LEN4, H_CONT_LEN5,
00093 H_CONT_LEN6, H_CONT_LEN7, H_CONT_LEN8, H_CONT_LEN9, H_CONT_LEN10,
00094 H_CONT_LEN11, H_CONT_LEN12, H_CONT_LEN13, H_L_COLON,
00095 H_CONT_LEN_BODY, H_CONT_LEN_BODY_PARSE,
00096 H_STUN_MSG, H_STUN_READ_BODY, H_STUN_FP, H_STUN_END, H_PING_CRLF
00097 #ifdef READ_HTTP11
00098 , H_HTTP11_CHUNK_START, H_HTTP11_CHUNK_SIZE,
00099 H_HTTP11_CHUNK_BODY, H_HTTP11_CHUNK_END, H_HTTP11_CHUNK_FINISH
00100 #endif
00101 #ifdef READ_MSRP
00102 , H_MSRP_BODY, H_MSRP_BODY_LF, H_MSRP_BODY_END, H_MSRP_FINISH
00103 #endif
00104 };
00105
00106 enum tcp_conn_states { S_CONN_ERROR=-2, S_CONN_BAD=-1,
00107 S_CONN_OK=0,
00108 S_CONN_INIT,
00109 S_CONN_EOF,
00110 S_CONN_ACCEPT, S_CONN_CONNECT
00111 };
00112
00113
00114
00115 enum conn_cmds {
00116 CONN_DESTROY=-3 ,
00117 CONN_ERROR=-2 ,
00118 CONN_EOF=-1 ,
00119 CONN_NOP=0 ,
00120 CONN_RELEASE
00121 ,
00122 CONN_GET_FD ,
00123 CONN_NEW
00124 ,
00125 CONN_QUEUED_WRITE
00126 ,
00127 CONN_NEW_PENDING_WRITE
00128
00129 ,
00130 CONN_NEW_COMPLETE
00131
00132 };
00133
00134
00135
00136 struct tcp_req{
00137 struct tcp_req* next;
00138
00139 char* buf;
00140 char* start;
00141
00142 char* pos;
00143 char* parsed;
00144 char* body;
00145 unsigned int b_size;
00146 int content_len;
00147 #ifdef READ_HTTP11
00148 int chunk_size;
00149 #endif
00150 unsigned short flags;
00151 int bytes_to_go;
00152 enum tcp_req_errors error;
00153 enum tcp_req_states state;
00154 };
00155
00156
00157 #define F_TCP_REQ_HAS_CLEN 1
00158 #define F_TCP_REQ_COMPLETE 2
00159 #ifdef READ_HTTP11
00160 #define F_TCP_REQ_BCHUNKED 4
00161 #endif
00162 #ifdef READ_MSRP
00163 #define F_TCP_REQ_MSRP_NO 8
00164 #define F_TCP_REQ_MSRP_FRAME 16
00165 #define F_TCP_REQ_MSRP_BODY 32
00166 #endif
00167
00168 #define TCP_REQ_HAS_CLEN(tr) ((tr)->flags & F_TCP_REQ_HAS_CLEN)
00169 #define TCP_REQ_COMPLETE(tr) ((tr)->flags & F_TCP_REQ_COMPLETE)
00170 #ifdef READ_HTTP11
00171 #define TCP_REQ_BCHUNKED(tr) ((tr)->flags & F_TCP_REQ_BCHUNKED)
00172 #endif
00173
00174
00175 struct tcp_connection;
00176
00177
00178 struct tcp_conn_alias{
00179 struct tcp_connection* parent;
00180 struct tcp_conn_alias* next;
00181 struct tcp_conn_alias* prev;
00182 unsigned short port;
00183 unsigned short hash;
00184 };
00185
00186
00187 #ifdef TCP_ASYNC
00188 struct tcp_wbuffer{
00189 struct tcp_wbuffer* next;
00190 unsigned int b_size;
00191 char buf[1];
00192 };
00193
00194 struct tcp_wbuffer_queue{
00195 struct tcp_wbuffer* first;
00196 struct tcp_wbuffer* last;
00197 ticks_t wr_timeout;
00198 unsigned int queued;
00199 unsigned int offset;
00200
00201 unsigned int last_used;
00202 };
00203 #endif
00204
00205
00206 struct tcp_connection{
00207 int s;
00208 int fd;
00209 gen_lock_t write_lock;
00210 int id;
00211
00212 int reader_pid;
00213 struct receive_info rcv;
00214 struct tcp_req req;
00215 atomic_t refcnt;
00216 enum sip_protos type;
00217 unsigned short flags;
00218 snd_flags_t send_flags;
00219 enum tcp_conn_states state;
00220 void* extra_data;
00221 struct timer_ln timer;
00222 ticks_t timeout;
00223 unsigned id_hash;
00224 struct tcp_connection* id_next;
00225 struct tcp_connection* id_prev;
00226 struct tcp_connection* c_next;
00227 struct tcp_connection* c_prev;
00228 struct tcp_conn_alias con_aliases[TCP_CON_MAX_ALIASES];
00229 int aliases;
00230 #ifdef TCP_ASYNC
00231 struct tcp_wbuffer_queue wbuf_q;
00232 #endif
00233 };
00234
00235
00236
00237
00238 #define tcpconn_set_send_flags(c, snd_flags) \
00239 SND_FLAGS_OR(&(c)->send_flags, &(c)->send_flags, &(snd_flags))
00240
00241 #define tcpconn_close_after_send(c) ((c)->send_flags.f & SND_F_CON_CLOSE)
00242
00243 #define TCP_RCV_INFO(c) (&(c)->rcv)
00244
00245 #define TCP_RCV_LADDR(r) (&((r).dst_ip))
00246 #define TCP_RCV_LPORT(r) ((r).dst_port)
00247 #define TCP_RCV_PADDR(r) (&((r).src_ip))
00248 #define TCP_RCV_PPORT(r) ((r).src_port)
00249 #define TCP_RCV_PSU(r) (&(r).src_su)
00250 #define TCP_RCV_SOCK_INFO(r) ((r).bind_address)
00251 #define TCP_RCV_PROTO(r) ((r).proto)
00252 #ifdef USE_COMP
00253 #define TCP_RCV_COMP(r) ((r).comp)
00254 #else
00255 #define TCP_RCV_COMP(r) 0
00256 #endif
00257
00258 #define TCP_LADDR(c) TCP_RCV_LADDR(c->rcv)
00259 #define TCP_LPORT(c) TCP_RCV_LPORT(c->rcv)
00260 #define TCP_PADDR(c) TCP_RCV_PADDR(c->rcv)
00261 #define TCP_PPORT(c) TCP_RCV_PPORT(c->rcv)
00262 #define TCP_PSU(c) TCP_RCV_PSU(c->rcv)
00263 #define TCP_SOCK_INFO(c) TCP_RCV_SOCK_INFO(c->rcv)
00264 #define TCP_PROTO(c) TCP_RCV_PROTO(c->rcv)
00265 #define TCP_COMP(c) TCP_RCV_COMP(c->rcv)
00266
00267
00268
00269 #define tcpconn_ref(c) atomic_inc(&((c)->refcnt))
00270 #define tcpconn_put(c) atomic_dec_and_test(&((c)->refcnt))
00271
00272
00273 #define init_tcp_req( r, rd_buf, rd_buf_size) \
00274 do{ \
00275 memset( (r), 0, sizeof(struct tcp_req)); \
00276 (r)->buf=(rd_buf) ;\
00277 (r)->b_size=(rd_buf_size)-1; \
00278 (r)->parsed=(r)->pos=(r)->start=(r)->buf; \
00279 (r)->error=TCP_REQ_OK;\
00280 (r)->state=H_SKIP_EMPTY; \
00281 }while(0)
00282
00283
00284
00285
00286 #define tcpconn_listadd(head, c, next, prev) \
00287 do{ \
00288 \
00289 (c)->next=(head); \
00290 (c)->prev=0; \
00291 if ((head)) (head)->prev=(c); \
00292 (head)=(c); \
00293 } while(0)
00294
00295
00296
00297 #define tcpconn_listrm(head, c, next, prev) \
00298 do{ \
00299 if ((head)==(c)) (head)=(c)->next; \
00300 if ((c)->next) (c)->next->prev=(c)->prev; \
00301 if ((c)->prev) (c)->prev->next=(c)->next; \
00302 }while(0)
00303
00304
00305 #define TCPCONN_LOCK lock_get(tcpconn_lock);
00306 #define TCPCONN_UNLOCK lock_release(tcpconn_lock);
00307
00308 #define TCP_ALIAS_HASH_SIZE 4096
00309 #define TCP_ID_HASH_SIZE 1024
00310
00311
00312 static inline unsigned tcp_addr_hash( struct ip_addr* ip,
00313 unsigned short port,
00314 struct ip_addr* l_ip,
00315 unsigned short l_port)
00316 {
00317 unsigned h;
00318
00319 if(ip->len==4)
00320 h=(ip->u.addr32[0]^port)^(l_ip->u.addr32[0]^l_port);
00321 else if (ip->len==16)
00322 h= (ip->u.addr32[0]^ip->u.addr32[1]^ip->u.addr32[2]^
00323 ip->u.addr32[3]^port) ^
00324 (l_ip->u.addr32[0]^l_ip->u.addr32[1]^l_ip->u.addr32[2]^
00325 l_ip->u.addr32[3]^l_port);
00326 else{
00327 LOG(L_CRIT, "tcp_addr_hash: BUG: bad len %d for an ip address\n",
00328 ip->len);
00329 return 0;
00330 }
00331
00332
00333
00334 h ^= h>>17;
00335 h ^= h>>7;
00336 return h & (TCP_ALIAS_HASH_SIZE-1);
00337 }
00338
00339 #define tcp_id_hash(id) (id&(TCP_ID_HASH_SIZE-1))
00340
00341 struct tcp_connection* tcpconn_get(int id, struct ip_addr* ip, int port,
00342 union sockaddr_union* local_addr,
00343 ticks_t timeout);
00344
00345 typedef struct tcp_event_info {
00346 int type;
00347 char *buf;
00348 unsigned int len;
00349 struct receive_info *rcv;
00350 struct tcp_connection *con;
00351 } tcp_event_info_t;
00352
00353 #endif
00354
00355