3 * @bref Connection is managed.
4 * @bref The previous substance becomes one conn though two iom is registered
5 * @bref in sets of imoux so that conn may have sockaddr for a real server
6 * @bref and sockaddr for the client internally.
8 * L7VSD: Linux Virtual Server for Layer7 Load Balancing
9 * Copyright (C) 2005 NTT COMWARE Corporation.
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 **********************************************************************/
30 #include <netinet/in.h>
31 #include <arpa/inet.h>
33 #include "l7vs_iomuxlist.h"
34 #include "l7vs_dest.h"
35 #include "logger_wrapper.h"
37 #define FDSET_SIZE (8192)
42 #define FD_ZERO(ptr) memset((ptr), 0, FDSET_SIZE)
44 // connection management datatype
45 #define L7VS_CLDATA_CHUNKSIZE (512)
46 #define L7VS_CLDATA_BUFSIZE(L) (((L)->cldata_len + L7VS_CLDATA_CHUNKSIZE - 1) & ~(L7VS_CLDATA_CHUNKSIZE - 1))
47 #define L7VS_CLDATA_REST(L) (L7VS_CLDATA_BUFSIZE(L) - (L)->cldata_len)
49 #define L7VS_CONN_S_CL_CONNECTED 0
50 #define L7VS_CONN_S_RS_CONNECTING 1
51 #define L7VS_CONN_S_RS_CONNECTED 2
56 #define L7VS_CONN_READ_BUFSIZE_MAX 262144 //minimum l7vs_conn_read_bufsize 262144Byte = 256KByte
57 #define L7VS_CONN_READ_BUFSIZE_MIN 2048 //minimum l7vs_conn_read_bufsize
60 struct l7vs_lsock* lsock; //! l7vs_lsock pointer
61 struct l7vs_service* srv; //! l7vs_service pointer
62 struct l7vs_dest* dest; //! real server pointer
63 int splice; //! tcp splice handle (don't use)
64 struct sockaddr_in caddr; //! client sockaddr struct
65 struct sockaddr_in raddr; //! real server sockaddr struct
66 struct sockaddr_in vaddr; //!
67 struct sockaddr_in laddr; //!
68 struct l7vs_iomux* ciom; //! client-side socket
69 struct l7vs_iomux* riom; //! realserver-side socket
71 uint32_t state; //! connn status
72 char* cldata; //! client data buffer
73 size_t cldata_len; //! client data buffer length
74 size_t cldata_bufsize; //! client buffer size
76 int sorry_conn_flag; //! sorry connection flag
77 struct l7vs_dest* old_dest; //! old destination
83 extern struct l7vs_conn* l7vs_conn_create( int, struct l7vs_lsock* );
84 extern void l7vs_conn_destroy( struct l7vs_conn* );
85 //extern int l7vs_conn_recv_client( struct l7vs_conn* );
86 extern int l7vs_conn_connect_rs( struct l7vs_conn*, struct l7vs_dest* );
87 //extern int l7vs_conn_splice( struct l7vs_conn* );
88 extern void l7vs_conn_close_csock( struct l7vs_conn* );
89 extern void l7vs_conn_close_rsock( struct l7vs_conn* );
90 extern int l7vs_conn_closed( struct l7vs_conn* );
92 * @return success return is 0, else error code
94 extern int l7vs_conn_init();
96 * serialize struct sockaddr_in
98 * @param[out] ret serialized string
99 * @param[in] conn source sockaddr_in
102 inline void l7vs_conn_sockaddr_in_c_str(char* ret, const struct sockaddr_in* addr)
109 snprintf(ret, DEBUG_STR_LEN, "(nil)");
113 snprintf(ret, DEBUG_STR_LEN,
117 , inet_ntoa(addr->sin_addr)
118 , ntohs(addr->sin_port));
122 * serialize struct l7vs_conn
124 * @param[out] ret serialized string
125 * @param[in] conn source l7vs_conn
128 inline void l7vs_conn_c_str(char* ret, const struct l7vs_conn* conn)
134 char dest_str[DEBUG_STR_LEN];
135 char caddr_str[DEBUG_STR_LEN];
136 char raddr_str[DEBUG_STR_LEN];
137 char ciom_str[DEBUG_STR_LEN];
138 char riom_str[DEBUG_STR_LEN];
139 char old_dest_str[DEBUG_STR_LEN];
142 snprintf(ret, DEBUG_STR_LEN, "(nil)");
146 l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
147 l7vs_conn_sockaddr_in_c_str(raddr_str, &conn->raddr);
148 l7vs_dest_c_str(dest_str, conn->dest);
149 l7vs_iomux_c_str(ciom_str, conn->ciom);
150 l7vs_iomux_c_str(riom_str, conn->riom);
151 l7vs_dest_c_str(old_dest_str, conn->old_dest);
153 snprintf(ret, DEBUG_STR_LEN,
165 "cldata_bufsize=%zu: "
167 "sorry_conn_flag=%d: "
179 , conn->cldata_bufsize
181 , conn->sorry_conn_flag