4 * Copyright (C) 2001-2003 Fhg Fokus
6 * This file is part of ser, a free SIP server.
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
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:
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.
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
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 */
44 enum { TCP_REQ_INIT, TCP_REQ_OK, TCP_READ_ERROR, TCP_REQ_OVERRUN,
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
53 /* fd communication commands */
54 enum { CONN_DESTROY=-3, CONN_ERROR=-2, CONN_EOF=-1, CONN_RELEASE, CONN_GET_FD,
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 */
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*/
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
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 */
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;
96 #define init_tcp_req( r) \
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; \
105 /* add a tcpconn to a list*/
106 /* list head, new element, next member, prev member */
107 #define tcpconn_listadd(head, c, next, prev) \
109 /* add it at the begining of the list*/ \
112 if ((head)) (head)->prev=(c); \
117 /* remove a tcpconn from a list*/
118 #define tcpconn_listrm(head, c, next, prev) \
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; \
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__);