- changed sip_msg (new rcv member containing all the ips, ports, protocol)
[sip-router] / tcp_conn.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2001-2003 Fhg Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27
28
29
30 #ifndef _tcp_conn_h
31 #define _tcp_conn_h
32
33 #include "ip_addr.h"
34
35
36 #define TCP_BUF_SIZE 65535
37 #define TCP_CON_TIMEOUT 60 /* in  seconds */
38 #define TCP_CHILD_TIMEOUT 5 /* after 5 seconds, the child "returns" 
39                                                          the connection to the tcp master process */
40 #define TCP_MAIN_SELECT_TIMEOUT 5 /* how often "tcp main" checks for timeout*/
41 #define TCP_CHILD_SELECT_TIMEOUT 2 /* the same as above but for children */
42
43
44 enum tcp_req_errors {   TCP_REQ_INIT, TCP_REQ_OK, TCP_READ_ERROR,
45                                                 TCP_REQ_OVERRUN, TCP_REQ_BAD_LEN };
46 enum tcp_req_states {   H_SKIP, H_LF, H_LFCR,  H_BODY, H_STARTWS,
47                 H_CONT_LEN1, H_CONT_LEN2, H_CONT_LEN3, H_CONT_LEN4, H_CONT_LEN5,
48                 H_CONT_LEN6, H_CONT_LEN7, H_CONT_LEN8, H_CONT_LEN9, H_CONT_LEN10,
49                 H_CONT_LEN11, H_CONT_LEN12, H_CONT_LEN13, H_L_COLON, 
50                 H_CONT_LEN_BODY, H_CONT_LEN_BODY_PARSE 
51         };
52
53 /* fd communication commands */
54 enum conn_cmds { CONN_DESTROY=-3, CONN_ERROR=-2, CONN_EOF=-1, CONN_RELEASE, 
55                                         CONN_GET_FD, CONN_NEW };
56
57 struct tcp_req{
58         struct tcp_req* next;
59         /* sockaddr ? */
60         char buf[TCP_BUF_SIZE]; /* bytes read so far*/
61         char* pos; /* current position in buf */
62         char* parsed; /* last parsed position */
63         char* body; /* body position */
64         int content_len;
65         int has_content_len; /* 1 if content_length was parsed ok*/
66         int complete; /* 1 if one req has been fully read, 0 otherwise*/
67         int bytes_to_go; /* how many bytes we have still to read from the body*/
68         enum tcp_req_errors error;
69         enum tcp_req_states state;
70 };
71
72
73
74
75 struct tcp_connection{
76         int s; /*socket, used by "tcp main" */
77         int fd; /* used only by "children" */
78         int id; /* id (unique!) used to retrieve a specific connection when
79                    reply-ing*/
80         struct receive_info rcv; /* src & dst ip, ports, proto a.s.o*/
81 #if 0
82         struct ip_addr ip; /* peer ip */
83         int port; /* peer port */
84         int sock_idx; /* receiving socket index in the tcp_info array */
85         union sockaddr_union su;
86 #endif
87         struct tcp_req req; /* request data */
88         int refcnt;
89         int timeout; /* connection timeout, after this it will be removed*/
90         struct tcp_connection* next; /* next, prev in hash table, used by "main" */
91         struct tcp_connection* prev;
92         struct tcp_connection* c_next; /* child next prev (use locally) */
93         struct tcp_connection* c_prev;
94 };
95
96
97
98
99 #define init_tcp_req( r) \
100         do{ \
101                 memset( (r), 0, sizeof(struct tcp_req)); \
102                 (r)->parsed=(r)->pos=(r)->buf; \
103                 (r)->error=TCP_REQ_OK;\
104                 (r)->state=H_STARTWS; \
105         }while(0)
106
107
108 /* add a tcpconn to a list*/
109 /* list head, new element, next member, prev member */
110 #define tcpconn_listadd(head, c, next, prev) \
111         do{ \
112                 /* add it at the begining of the list*/ \
113                 (c)->next=(head); \
114                 (c)->prev=0; \
115                 if ((head)) (head)->prev=(c); \
116                 (head)=(c); \
117         } while(0)
118
119
120 /* remove a tcpconn from a list*/
121 #define tcpconn_listrm(head, c, next, prev) \
122         do{ \
123                 if ((head)==(c)) (head)=(c)->next; \
124                 if ((c)->next) (c)->next->prev=(c)->prev; \
125                 if ((c)->prev) (c)->prev->next=(c)->next; \
126         }while(0)
127
128
129 #define TCPCONN_LOCK LOG(L_CRIT, "LOCK not implemented yet: %s : %d: %s\n", \
130                                                         __FILE__, __LINE__, __FUNCTION__);
131 #define TCPCONN_UNLOCK LOG(L_CRIT, "UNLOCK not implemented yet: %s: %d: %s\n",\
132                                                         __FILE__, __LINE__, __FUNCTION__);
133
134
135
136 #endif
137
138