387f095f823af46d0623cc6ed13280ad0c912f8f
[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_INIT, TCP_REQ_OK, TCP_READ_ERROR, TCP_REQ_OVERRUN, 
45                 TCP_REQ_BAD_LEN };
46 enum {  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_DESTROY=-3, CONN_ERROR=-2, CONN_EOF=-1, CONN_RELEASE, CONN_GET_FD,
55            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         int error;
69         int 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 ip_addr ip; /* peer ip */
81         int port; /* peer port */
82         int sock_idx; /* receiving socket index in the tcp_info array */
83         union sockaddr_union su;
84         struct tcp_req req; /* request data */
85         int refcnt;
86         int timeout; /* connection timeout, after this it will be removed*/
87         struct tcp_connection* next; /* next, prev in hash table, used by "main" */
88         struct tcp_connection* prev;
89         struct tcp_connection* c_next; /* child next prev (use locally) */
90         struct tcp_connection* c_prev;
91 };
92
93
94
95
96 #define init_tcp_req( r) \
97         do{ \
98                 memset( (r), 0, sizeof(struct tcp_req)); \
99                 (r)->parsed=(r)->pos=(r)->buf; \
100                 (r)->error=TCP_REQ_OK;\
101                 (r)->state=H_STARTWS; \
102         }while(0)
103
104
105 /* add a tcpconn to a list*/
106 /* list head, new element, next member, prev member */
107 #define tcpconn_listadd(head, c, next, prev) \
108         do{ \
109                 /* add it at the begining of the list*/ \
110                 (c)->next=(head); \
111                 (c)->prev=0; \
112                 if ((head)) (head)->prev=(c); \
113                 (head)=(c); \
114         } while(0)
115
116
117 /* remove a tcpconn from a list*/
118 #define tcpconn_listrm(head, c, next, prev) \
119         do{ \
120                 if ((head)==(c)) (head)=(c)->next; \
121                 if ((c)->next) (c)->next->prev=(c)->prev; \
122                 if ((c)->prev) (c)->prev->next=(c)->next; \
123         }while(0)
124
125
126 #define TCPCONN_LOCK LOG(L_CRIT, "LOCK not implemented yet: %s : %d: %s\n", \
127                                                         __FILE__, __LINE__, __FUNCTION__);
128 #define TCPCONN_UNLOCK LOG(L_CRIT, "UNLOCK not implemented yet: %s: %d: %s\n",\
129                                                         __FILE__, __LINE__, __FUNCTION__);
130
131
132
133 #endif
134
135