OSDN Git Service

Add new entries into Makefile.am.
[ultramonkey-l7/ultramonkey-l7-v2.git] / src / conn.c
1 /*
2  * @file  conn.c
3  * @brief the connection management component
4  * @brief transmit data between client and realserver
5  * @brief and calls protocol module to decide realserver
6  * @brief also modify realserver data
7  *
8  * L7VSD: Linux Virtual Server for Layer7 Load Balancing
9  * Copyright (C) 2005  NTT COMWARE Corporation.
10  *
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.
15  *
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.
20  *
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
24  * 02110-1301 USA
25  *
26  **********************************************************************/
27
28 #include <sys/types.h>
29 #include <sys/socket.h>
30 #include <sys/select.h>
31 #include <sys/time.h>
32 #include <netinet/in.h>
33 #include <netinet/tcp.h>
34 #include <arpa/inet.h>
35 #include <unistd.h>
36 #include <fcntl.h>
37 #include <stdlib.h>
38 #include <assert.h>
39 #include <glib.h>
40 #include <limits.h>
41 #include <errno.h>
42 #include "logger_wrapper.h"
43 #include "l7vs_config.h"
44 #include "l7vs_iomuxlist.h"
45 #include "l7vs_lsock.h"
46 #include "l7vs_conn.h"
47 #include "l7vs_service.h"
48 #include "l7vs.h"
49 #include "l7vs_module.h"
50 #include "l7vs_sched.h"
51
52 static int l7vs_conn_cl_callback(struct l7vs_iomux*);
53 static int l7vs_conn_client_receiving(struct l7vs_iomux*);
54 static int l7vs_conn_is_rs_connected(struct l7vs_iomux*, struct l7vs_conn*, struct l7vs_service**, struct l7vs_dest**);
55 static int l7vs_conn_connection_establish(struct l7vs_iomux*, struct l7vs_conn*, struct l7vs_service*, struct l7vs_dest*);
56 static int l7vs_conn_block(struct l7vs_iomux*, struct l7vs_iomux*);
57 static int l7vs_conn_busy(struct l7vs_iomux*);
58 static int l7vs_conn_sending(struct l7vs_iomux*, struct l7vs_iomux*);
59 static int l7vs_conn_sent_next_state(struct l7vs_iomux*, struct l7vs_iomux*);
60 static int l7vs_conn_rs_callback(struct l7vs_iomux* );
61 static int l7vs_conn_realserver_receiving(struct l7vs_iomux*);
62 static int l7vs_conn_realserver_modify_data(struct l7vs_iomux*);
63 static int l7vs_conn_recv(struct l7vs_iomux*, int);
64 static int l7vs_conn_preread(struct l7vs_iomux*, int);
65 static int l7vs_conn_send(struct l7vs_iomux*, int);
66 static int l7vs_conn_change_connect_rs(struct l7vs_conn*, struct l7vs_dest*);
67 static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction );
68 static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction );
69 static void l7vs_conn_dump_data(char* str_data, const char* data, const size_t len);
70 static int l7vs_conn_read_bufsize = 20480;                         //! conn read buffer size
71 static int throughput_interval = BPS_DEFAULT_INTERVAL; //! throughput interval
72
73 int
74 l7vs_conn_init(void)
75 {
76         /*-------- DEBUG LOG --------*/
77         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
78                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
79                         "in_function: int lvs_conn_init() ");
80         }
81         /*------ DEBUG LOG END ------*/
82
83     int ret = parameter_is_int_exist( PARAM_COMP_CONN, "read_bufsize" );
84     if (ret) {
85         int bufsize = parameter_get_int_value( PARAM_COMP_CONN, "read_bufsize" );
86         if (bufsize >= L7VS_CONN_READ_BUFSIZE_MIN && bufsize <= L7VS_CONN_READ_BUFSIZE_MAX)
87             l7vs_conn_read_bufsize = bufsize;
88 //              LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,5,
89 //                              "l7vsd uses read_bufsize = %d ",bufsize);
90         else if (bufsize > L7VS_CONN_READ_BUFSIZE_MAX) {
91                 l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MAX;
92                 LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,1,
93                         "Your read_bufsize is over maximum size. l7vsd uses maximum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MAX);
94         }
95         else {
96                 l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MIN;
97                 LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,2,
98                         "Your read_bufsize is under minimum size. l7vsd uses minimum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MIN);
99         }
100     }
101     else {
102                 LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,3,
103                         "read_bufsize is not specified. l7vsd uses default read_bufsize = %d ",l7vs_conn_read_bufsize);
104     }
105
106     if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
107         throughput_interval = parameter_get_int_value( PARAM_COMP_L7VSD, "calc_throughput_interval" );
108     }
109
110     /*-------- DEBUG LOG --------*/
111         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
112                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,345,
113                         "out_function: int lvs_conn_init() ");
114         }
115         /*------ DEBUG LOG END ------*/
116         return 1;
117 }
118
119 /*!
120  * dump data
121  *
122  * @param[out]  str_data        dump string
123  * @param[in]   data            source data
124  * @param[in]   len             source data length
125  * @return      void
126  */
127 void l7vs_conn_dump_data(char* str_data, const char* data, const size_t len)
128 {
129         if (!str_data) {
130                 return;
131         }
132
133         if (!data) {
134                 snprintf(str_data, DEBUG_STR_LEN, "(nil)");
135                 return;
136         }
137
138         const char* table[] = {
139                 "00 ", "01 ", "02 ", "03 ", "04 ", "05 ", "06 ", "07 ", "08 ", "09 ", "0a ", "0b ", "0c ", "0d ", "0e ", "0f ",
140                 "10 ", "11 ", "12 ", "13 ", "14 ", "15 ", "16 ", "17 ", "18 ", "19 ", "1a ", "1b ", "1c ", "1d ", "1e ", "1f ",
141                 "20 ", "21 ", "22 ", "23 ", "24 ", "25 ", "26 ", "27 ", "28 ", "29 ", "2a ", "2b ", "2c ", "2d ", "2e ", "2f ",
142                 "30 ", "31 ", "32 ", "33 ", "34 ", "35 ", "36 ", "37 ", "38 ", "39 ", "3a ", "3b ", "3c ", "3d ", "3e ", "3f ",
143                 "40 ", "41 ", "42 ", "43 ", "44 ", "45 ", "46 ", "47 ", "48 ", "49 ", "4a ", "4b ", "4c ", "4d ", "4e ", "4f ",
144                 "50 ", "51 ", "52 ", "53 ", "54 ", "55 ", "56 ", "57 ", "58 ", "59 ", "5a ", "5b ", "5c ", "5d ", "5e ", "5f ",
145                 "60 ", "61 ", "62 ", "63 ", "64 ", "65 ", "66 ", "67 ", "68 ", "69 ", "6a ", "6b ", "6c ", "6d ", "6e ", "6f ",
146                 "70 ", "71 ", "72 ", "73 ", "74 ", "75 ", "76 ", "77 ", "78 ", "79 ", "7a ", "7b ", "7c ", "7d ", "7e ", "7f ",
147                 "80 ", "81 ", "82 ", "83 ", "84 ", "85 ", "86 ", "87 ", "88 ", "89 ", "8a ", "8b ", "8c ", "8d ", "8e ", "8f ",
148                 "90 ", "91 ", "92 ", "93 ", "94 ", "95 ", "96 ", "97 ", "98 ", "99 ", "9a ", "9b ", "9c ", "9d ", "9e ", "9f ",
149                 "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "a6 ", "a7 ", "a8 ", "a9 ", "aa ", "ab ", "ac ", "ad ", "ae ", "af ",
150                 "b0 ", "b1 ", "b2 ", "b3 ", "b4 ", "b5 ", "b6 ", "b7 ", "b8 ", "b9 ", "ba ", "bb ", "bc ", "bd ", "be ", "bf ",
151                 "c0 ", "c1 ", "c2 ", "c3 ", "c4 ", "c5 ", "c6 ", "c7 ", "c8 ", "c9 ", "ca ", "cb ", "cc ", "cd ", "ce ", "cf ",
152                 "d0 ", "d1 ", "d2 ", "d3 ", "d4 ", "d5 ", "d6 ", "d7 ", "d8 ", "d9 ", "da ", "db ", "dc ", "dd ", "de ", "df ",
153                 "e0 ", "e1 ", "e2 ", "e3 ", "e4 ", "e5 ", "e6 ", "e7 ", "e8 ", "e9 ", "ea ", "eb ", "ec ", "ed ", "ee ", "ef ",
154                 "f0 ", "f1 ", "f2 ", "f3 ", "f4 ", "f5 ", "f6 ", "f7 ", "f8 ", "f9 ", "fa ", "fb ", "fc ", "fd ", "fe ", "ff "
155         };
156         const int hx_len = 3;
157
158         size_t pos = 0;
159         for (size_t i = 0; i < len; ++i) {
160                 if (DEBUG_STR_LEN <= pos + hx_len) {
161                         break;
162                 }
163                 strncpy(str_data + pos, table[(unsigned char)*(data + i)], hx_len);
164                 pos += hx_len;
165         }
166         *(str_data + pos) = '\0';
167 }
168
169 /*!
170  * connection create
171  *
172  * @param[in]   lfd     listening socket fd
173  * @param[in]   lsock   listening socket
174  * @return      connection
175  */
176 struct l7vs_conn *
177 l7vs_conn_create(int lfd, struct l7vs_lsock *lsock)
178 {
179         /*-------- DEBUG LOG --------*/
180         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
181                 char lsock_str[DEBUG_STR_LEN] = {0};
182                 l7vs_lsock_c_str(lsock_str, lsock);
183                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,50,
184                         "in_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
185                         "lfd=%d: "
186                         "lsock=%s",
187                         lfd, lsock_str);
188         }
189         /*------ DEBUG LOG END ------*/
190
191         socklen_t len = 0;
192         struct l7vs_conn *conn = NULL;
193         int mss = 0;
194         int ret = 0;
195         int flags = 0;
196
197         if (-1 == lfd) {
198                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,28, "error / lsock fd is not specified");
199                 goto create_error;
200         }
201
202         if (!lsock) {
203                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,29, "error / lsock is null");
204                 goto create_error;
205         }
206        
207         conn = (struct l7vs_conn*)malloc(sizeof(struct l7vs_conn));
208         if (!conn) {
209                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,8, "error / can not allocate memory");
210                 goto create_error;
211         }
212         /*-------- DEBUG LOG --------*/
213         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
214                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,51,
215                         "malloc: conn=%p: size=%zu",
216                         conn, sizeof(struct l7vs_conn));
217         }
218         /*------ DEBUG LOG END ------*/
219         memset(conn, 0, sizeof(struct l7vs_conn));
220
221         conn->ciom = l7vs_iomux_get_from_avail_list();
222         if (!conn->ciom) {
223                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,7, "error / can not get client iom");
224                 goto create_error;
225         }
226         /*-------- DEBUG LOG --------*/
227         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
228                 char ciom_str[DEBUG_STR_LEN] = {0};
229                 l7vs_iomux_c_str(ciom_str, conn->ciom);
230                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,52,
231                         "iom_get: conn->ciom=%s",
232                         ciom_str);
233         }
234         /*------ DEBUG LOG END ------*/
235
236         conn->riom = l7vs_iomux_get_from_avail_list();
237         if (!conn->riom) {
238                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,8, "error / can not get realserver iom");
239                 goto create_error;
240         }
241         /*-------- DEBUG LOG --------*/
242         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
243                 char riom_str[DEBUG_STR_LEN] = {0};
244                 l7vs_iomux_c_str(riom_str, conn->riom);
245                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,53,
246                         "iom_get: conn->riom=%s",
247                         riom_str);
248         }
249         /*------ DEBUG LOG END ------*/
250
251         conn->cldata_len = 0;
252         conn->cldata_bufsize = l7vs_conn_read_bufsize;
253         conn->cldata = (char *)malloc(conn->cldata_bufsize);
254         if (!conn->cldata) {
255                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,9, "error / can not allocate memory for buffer");
256                 goto create_error;
257         }
258         /*-------- DEBUG LOG --------*/
259         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
260                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,54,
261                         "malloc: conn->cldata=%p: size=%zu",
262                         conn->cldata, conn->cldata_bufsize);
263         }
264         /*------ DEBUG LOG END ------*/
265         memset(conn->cldata, 0, conn->cldata_bufsize);
266
267         len = sizeof(struct sockaddr_in);
268         /*-------- DEBUG LOG --------*/
269         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
270                 char caddr_str[DEBUG_STR_LEN] = {0};
271                 l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
272                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,55,
273                         "accept param: lfd=%d: conn->caddr=%s: len=%d",
274                         lfd, caddr_str, len);
275         }
276         /*------ DEBUG LOG END ------*/
277         conn->ciom->fd = accept(lfd, (struct sockaddr *)&conn->caddr, &len);
278         if (conn->ciom->fd < 0) {
279                 char caddr_str[DEBUG_STR_LEN] = {0};
280                 l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
281                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,8,
282                         "error / accept error accept param: lfd=%d: conn->caddr=%s: len=%d (%s)",
283                         lfd, caddr_str, len,strerror(errno));
284                 goto create_error;
285         }
286         /*-------- DEBUG LOG --------*/
287         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
288                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,56,
289                         "accept result: conn->ciom->fd=%d",
290                         conn->ciom->fd);
291         }
292         /*------ DEBUG LOG END ------*/
293
294         // get current flag
295         /*-------- DEBUG LOG --------*/
296         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
297                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,57,
298                         "fnctl param: conn->ciom->fd=%d: cmd=F_GETFL: flags=0",
299                         conn->ciom->fd);
300         }
301         /*------ DEBUG LOG END ------*/
302         flags = fcntl(conn->ciom->fd, F_GETFL, 0);
303         if (0 > flags) {
304                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,9,
305                          "error / fcntl((conn->ciom->fd=%d),F_GETFL) error(%s)",
306                          conn->ciom->fd,strerror(errno));
307                 goto create_error;
308         }
309         /*-------- DEBUG LOG --------*/
310         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
311                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,58,
312                         "fnctl result: flags=%d",
313                         flags);
314         }
315         /*------ DEBUG LOG END ------*/
316
317         // set nonblocking
318         /*-------- DEBUG LOG --------*/
319         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
320                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,59,
321                         "fnctl param: conn->ciom->fd=%d: cmd=F_SETFL: flags=%d",
322                         conn->ciom->fd, (flags | O_NONBLOCK));
323         }
324         /*------ DEBUG LOG END ------*/
325         flags = fcntl(conn->ciom->fd, F_SETFL, flags | O_NONBLOCK);
326         if (0 > flags) {
327                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,10,
328                         "error / fcntl((conn->ciom->fd=%d),F_SETFL) error(%s)",
329                         conn->ciom->fd,strerror(errno));
330                 goto create_error;
331         }
332         /*-------- DEBUG LOG --------*/
333         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
334                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,60,
335                         "fnctl result: flags=%d",
336                         flags);
337         }
338         /*------ DEBUG LOG END ------*/
339
340         // get client mss
341         len = sizeof(int);
342         /*-------- DEBUG LOG --------*/
343         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
344                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,61,
345                         "getsockopt param: conn->ciom->fd=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: "
346                         "len=%d",
347                         conn->ciom->fd, len);
348         }
349         /*------ DEBUG LOG END ------*/
350         ret = getsockopt(conn->ciom->fd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
351         if (0 > ret) {
352                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,11, "error / getsockopt TCP_MAXSEG error(%s)", strerror(errno));
353                 goto create_error;
354         }
355         /*-------- DEBUG LOG --------*/
356         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
357                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,62,
358                         "getsockopt result: mss=%d: len=%d",
359                         mss, len);
360         }
361         /*------ DEBUG LOG END ------*/
362         conn->cmss = mss;
363         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
364                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,63, "client %s mss %d",
365                                             inet_ntoa(conn->caddr.sin_addr), mss);
366         }
367
368         conn->lsock = lsock;
369         /*-------- DEBUG LOG --------*/
370         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
371                 char lsock_str[DEBUG_STR_LEN] = {0};
372                 l7vs_lsock_c_str(lsock_str, lsock);
373                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,64,
374                         "pointer_assign: conn->lsock=%s",
375                         lsock_str);
376         }
377         /*------ DEBUG LOG END ------*/
378         conn->proto = lsock->proto;
379         /*-------- DEBUG LOG --------*/
380         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
381                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,65,
382                         "conn->ciom->status change: %d->%d",
383                         conn->ciom->status, iomux_conn_receiving);
384         }
385         /*------ DEBUG LOG END ------*/
386         conn->ciom->status = iomux_conn_receiving;
387         conn->ciom->callback = l7vs_conn_cl_callback;
388         /*-------- DEBUG LOG --------*/
389         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
390                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,66,
391                         "pointer_assign: conn->ciom->callback=%p",
392                         l7vs_conn_cl_callback);
393         }
394         /*------ DEBUG LOG END ------*/
395         conn->ciom->data = conn;
396         /*-------- DEBUG LOG --------*/
397         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
398                 char conn_str[DEBUG_STR_LEN] = {0};
399                 l7vs_conn_c_str(conn_str, conn);
400                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,67,
401                         "pointer_assign: conn->ciom->data=%s",
402                         conn_str);
403         }
404         /*------ DEBUG LOG END ------*/
405         conn->sorry_conn_flag = 0;
406         conn->old_dest = NULL;
407         l7vs_iomux_add(conn->ciom, iom_read);
408
409         // connect real server immediately if all lsock services are fast schedule.
410         if (lsock->fast_schedule) {
411                 struct l7vs_service* srv;
412                 struct l7vs_dest* dest;
413                 conn->ciom->status = iomux_conn_received;
414                 if (!l7vs_conn_is_rs_connected(conn->ciom, conn, &srv, &dest)) {
415                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
416                 }
417                 else {
418                         switch (conn->ciom->status) {
419                         case iomux_conn_block:
420                                 //already decided real server
421                                 break;
422                         case iomux_conn_service_selected:
423                                 //service and destination were selected then attempt to connect the real server
424                                 if (!l7vs_conn_connection_establish(conn->ciom, conn, srv, dest)) {
425                                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
426                                 }
427                                 break;
428                         default:
429                                 //invalid status
430                                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", conn->ciom->status);
431                                 break;
432                         }
433                 }
434         }
435         /*-------- DEBUG LOG --------*/
436         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
437                 char ret_conn_str[DEBUG_STR_LEN] = {0};
438                 l7vs_conn_c_str(ret_conn_str, conn);
439                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,68,
440                         "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
441                         "return_value: conn=%s",
442                         ret_conn_str);
443         }
444         /*------ DEBUG LOG END ------*/
445         return conn;
446
447 create_error:
448         /*-------- DEBUG LOG --------*/
449         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
450                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,69,
451                         "entering: create_error_label");
452         }
453         /*------ DEBUG LOG END ------*/
454         if (conn) {
455                 if (conn->ciom) {
456                         if (-1 != conn->ciom->fd) {
457                                 /*-------- DEBUG LOG --------*/
458                                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
459                                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,70,
460                                                 "close: conn->ciom->fd=%d",
461                                                 conn->ciom->fd);
462                                 }
463                                 /*------ DEBUG LOG END ------*/
464                                 close(conn->ciom->fd);
465                         }
466                         /*-------- DEBUG LOG --------*/
467                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
468                                 char put_ciom_str[DEBUG_STR_LEN] = {0};
469                                 l7vs_iomux_c_str(put_ciom_str, conn->ciom);
470                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,71,
471                                         "iom_put: conn->ciom=%s",
472                                         put_ciom_str);
473                         }
474                         /*------ DEBUG LOG END ------*/
475                         l7vs_iomux_put_to_avail_list(conn->ciom);
476                 }
477                 if (conn->riom) {
478                         /*-------- DEBUG LOG --------*/
479                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
480                                 char put_riom_str[DEBUG_STR_LEN] = {0};
481                                 l7vs_iomux_c_str(put_riom_str, conn->riom);
482                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,72,
483                                         "iom_put: conn->riom=%s",
484                                         put_riom_str);
485                         }
486                         /*------ DEBUG LOG END ------*/
487                         l7vs_iomux_put_to_avail_list(conn->riom);
488                 }
489                 if (conn->cldata) {
490                         /*-------- DEBUG LOG --------*/
491                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
492                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,73,
493                                         "free: conn->cldata=%p",
494                                         conn->cldata);
495                         }
496                         /*------ DEBUG LOG END ------*/
497                         free(conn->cldata);
498                 }
499                 /*-------- DEBUG LOG --------*/
500                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
501                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,74,
502                                 "free: conn=%p",
503                                 conn);
504                 }
505                 /*------ DEBUG LOG END ------*/
506                 free(conn);
507         }
508         /*-------- DEBUG LOG --------*/
509         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
510                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,75,
511                         "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
512                         "return_value: conn=NULL");
513         }
514         /*------ DEBUG LOG END ------*/
515         return NULL;
516 }
517
518 /*!
519  * connection destroy
520  *
521  * @param[in]   conn    connection
522  * @return      void
523  */
524 void
525 l7vs_conn_destroy(struct l7vs_conn *conn)
526 {
527         /*-------- DEBUG LOG --------*/
528         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
529                 char conn_str[DEBUG_STR_LEN] = {0};
530                 l7vs_conn_c_str(conn_str, conn);
531                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,76,
532                         "in_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
533                         "conn=%s",
534                         conn_str);
535         }
536         /*------ DEBUG LOG END ------*/
537         if (!conn) {
538                 /*-------- DEBUG LOG --------*/
539                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
540                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,77,
541                                 "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
542                                 "return_value: void");
543                 }
544                 /*------ DEBUG LOG END ------*/
545                 return;
546         }
547
548         if (conn->srv) {
549                 l7vs_service_remove_conn(conn->srv, conn);
550                 /*-------- DEBUG LOG --------*/
551                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
552                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,78,
553                                 "pointer_assign: conn->srv=NULL");
554                 }
555                 /*------ DEBUG LOG END ------*/
556                 conn->srv = NULL;
557         }
558
559         if (conn->ciom) {
560                 if (-1 != conn->ciom->fd) {
561                         l7vs_conn_close_csock(conn);
562                 }
563                 /*-------- DEBUG LOG --------*/
564                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
565                         char put_ciom_str[DEBUG_STR_LEN] = {0};
566                         l7vs_iomux_c_str(put_ciom_str, conn->ciom);
567                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,79,
568                                 "iom_put: conn->ciom=%s",
569                                 put_ciom_str);
570                 }
571                 /*------ DEBUG LOG END ------*/
572                 l7vs_iomux_put_to_avail_list(conn->ciom);
573                 /*-------- DEBUG LOG --------*/
574                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
575                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,80,
576                                 "pointer_assign: conn->ciom=NULL");
577                 }
578                 /*------ DEBUG LOG END ------*/
579                 conn->ciom = NULL;
580         }
581
582         if (conn->riom) {
583                 if (-1 != conn->riom->fd) {
584                         l7vs_conn_close_rsock(conn);
585                 }
586                 /*-------- DEBUG LOG --------*/
587                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
588                         char put_riom_str[DEBUG_STR_LEN] = {0};
589                         l7vs_iomux_c_str(put_riom_str, conn->riom);
590                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,81,
591                                 "iom_put: conn->riom=%s",
592                                 put_riom_str);
593                 }
594                 /*------ DEBUG LOG END ------*/
595                 l7vs_iomux_put_to_avail_list(conn->riom);
596                 /*-------- DEBUG LOG --------*/
597                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
598                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,82,
599                                 "pointer_assign: conn->riom=NULL");
600                 }
601                 /*------ DEBUG LOG END ------*/
602                 conn->riom = NULL;
603         }
604
605         if (conn->cldata) {
606                 /*-------- DEBUG LOG --------*/
607                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
608                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,83,
609                                 "free: conn->cldata=%p",
610                                 conn->cldata);
611                 }
612                 /*------ DEBUG LOG END ------*/
613                 free(conn->cldata);
614                 /*-------- DEBUG LOG --------*/
615                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
616                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,84,
617                                 "pointer_assign: conn->cldata=NULL");
618                 }
619                 /*------ DEBUG LOG END ------*/
620                 conn->cldata = NULL;
621         }
622
623         /*-------- DEBUG LOG --------*/
624         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
625                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,85,
626                         "free: conn=%p",
627                         conn);
628         }
629         /*------ DEBUG LOG END ------*/
630         free(conn);     
631         /*-------- DEBUG LOG --------*/
632         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
633                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,86,
634                         "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
635                         "return_value: void");
636         }
637         /*------ DEBUG LOG END ------*/
638 }
639
640 /*!
641  * client connection callback
642  *
643  * @param[in]   iom     connection iomux
644  * @return      status
645  * @retval      0       failed
646  * @retval      1       succeed
647  */
648 static int
649 l7vs_conn_cl_callback(struct l7vs_iomux *iom )
650 {
651         /*-------- DEBUG LOG --------*/
652         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
653                 char iom_str[DEBUG_STR_LEN] = {0};
654                 l7vs_iomux_c_str(iom_str, iom);
655                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,87,
656                         "in_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
657                         "iom=%s",
658                         iom_str);
659         }
660         /*------ DEBUG LOG END ------*/
661         struct l7vs_conn* conn = NULL;
662
663         if (!iom) {
664                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,30, "error / iom is null");
665                 /*-------- DEBUG LOG --------*/
666                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
667                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,88,
668                                 "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
669                                 "return_value: 0");
670                 }
671                 /*------ DEBUG LOG END ------*/
672                 return 0;
673         }
674
675         conn = (struct l7vs_conn *)iom->data;
676         /*-------- DEBUG LOG --------*/
677         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
678                 char conn_str[DEBUG_STR_LEN] = {0};
679                 l7vs_conn_c_str(conn_str, conn);
680                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,89,
681                         "pointer_assign: conn=%s",
682                         conn_str);
683         }
684         /*------ DEBUG LOG END ------*/
685
686         // invalid status check
687         if (iomux_conn_receiving != iom->status &&
688             iomux_conn_block != iom->status &&
689             iomux_conn_busy != iom->status && 
690             iomux_conn_sending != iom->status && 
691             iomux_conn_sending_busy != iom->status) {
692                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,31, "error / invalid status(%d)", iom->status);
693                 l7vs_conn_destroy(conn);
694                 /*-------- DEBUG LOG --------*/
695                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
696                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,90,
697                                 "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
698                                 "return_value: 0");
699                 }
700                 /*------ DEBUG LOG END ------*/
701                 return 0;
702         }
703
704         // switch by current status
705         switch (iom->status) {
706         case iomux_conn_receiving:
707                 if (!l7vs_conn_client_receiving(iom)) {
708                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,9, "error / cl_callback/client receiving failed");
709                         l7vs_conn_destroy(conn);
710                         /*-------- DEBUG LOG --------*/
711                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
712                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,91,
713                                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
714                                         "return_value: 0");
715                         }
716                         /*------ DEBUG LOG END ------*/
717                         return 0;
718                 }
719                 if (iomux_conn_disconnected == iom->status) {
720                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
721                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,92, "client connection disconnected");
722                         }
723                         l7vs_conn_destroy(conn);
724                 }
725                 break;
726         case iomux_conn_block:
727                 if (!l7vs_conn_block(iom, conn->riom)) {
728                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,10, "error / cl_callback/block failed");
729                         l7vs_conn_destroy(conn);
730                         /*-------- DEBUG LOG --------*/
731                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
732                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,93,
733                                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
734                                         "return_value: 0");
735                         }
736                         /*------ DEBUG LOG END ------*/
737                         return 0;
738                 }
739                 break;
740         case iomux_conn_busy:
741                 if (!l7vs_conn_busy(iom)) {
742                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,11, "error / cl_callback/busy failed");
743                         l7vs_conn_destroy(conn);
744                         /*-------- DEBUG LOG --------*/
745                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
746                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,94,
747                                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
748                                         "return_value: 0");
749                         }
750                         /*------ DEBUG LOG END ------*/
751                         return 0;       
752                 }
753                 break;          
754         case iomux_conn_sending:
755                 if (!l7vs_conn_sending(iom, conn->riom)) {
756                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,12, "error / cl_callback/sending failed");
757                         l7vs_conn_destroy(conn);
758                         /*-------- DEBUG LOG --------*/
759                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
760                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,95,
761                                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
762                                         "return_value: 0");
763                         }
764                         /*------ DEBUG LOG END ------*/
765                         return 0;
766                 }
767                 break;
768         case iomux_conn_sending_busy:
769                 if (!l7vs_conn_sending(iom, conn->riom)) {
770                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,13, "error / cl_callback/sending_busy failed");
771                         l7vs_conn_destroy(conn);
772                         /*-------- DEBUG LOG --------*/
773                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
774                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,96,
775                                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
776                                         "return_value: 0");
777                         }
778                         /*------ DEBUG LOG END ------*/
779                         return 0;
780                 }
781                 break;
782         default:
783                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,14, "error / invalid status(%d)", iom->status);
784                 l7vs_conn_destroy(conn);
785                 /*-------- DEBUG LOG --------*/
786                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
787                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,97,
788                                 "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
789                                 "return_value: 0");
790                 }
791                 /*------ DEBUG LOG END ------*/
792                 return 0;
793         }
794
795         /*-------- DEBUG LOG --------*/
796         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
797                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,98,
798                         "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
799                         "return_value: 1");
800         }
801         /*------ DEBUG LOG END ------*/
802         return 1;
803 }
804
805 /*!
806  * client receiving
807  *
808  * @param[in]   iom     connection iomux
809  * @return      status
810  * @retval      0       failed
811  * @retval      1       succeed
812  */
813 static int
814 l7vs_conn_client_receiving(struct l7vs_iomux *iom)
815 {
816         /*-------- DEBUG LOG --------*/
817         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
818                 char iom_str[DEBUG_STR_LEN] = {0};
819                 l7vs_iomux_c_str(iom_str, iom);
820                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,99,
821                         "in_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
822                         "iom=%s",
823                         iom_str);
824         }
825         /*------ DEBUG LOG END ------*/
826         struct l7vs_conn *conn = NULL;
827         struct l7vs_service *srv = NULL;
828         struct l7vs_dest *dest = NULL;
829
830         if (!iom) {
831                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,32, "error / iom is null");
832                 /*-------- DEBUG LOG --------*/
833                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
834                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,100,
835                                 "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
836                                 "return_value: 0");
837                 }
838                 /*------ DEBUG LOG END ------*/
839                 return 0;
840         }
841
842         if (iomux_conn_receiving != iom->status) {
843                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,33, "error / invalid status(%d)", iom->status);
844                 /*-------- DEBUG LOG --------*/
845                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
846                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,101,
847                                 "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
848                                 "return_value: 0");
849                 }
850                 /*------ DEBUG LOG END ------*/
851                 return 0;
852         }
853
854         conn = (struct l7vs_conn *)iom->data;
855         /*-------- DEBUG LOG --------*/
856         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
857                 char conn_str[DEBUG_STR_LEN] = {0};
858                 l7vs_conn_c_str(conn_str, conn);
859                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,102,
860                         "pointer_assign: conn=%s",
861                         conn_str);
862         }
863         /*------ DEBUG LOG END ------*/
864
865         // when the real server is not set in read-blocked
866         if (iomux_conn_block != conn->riom->status && iomux_conn_busy != conn->riom->status) {
867                 // set the real server in read-blocked
868                 /*-------- DEBUG LOG --------*/
869                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
870                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,103,
871                                 "conn->riom->status change: %d->%d",
872                                 conn->riom->status, iomux_conn_block);
873                 }
874                 /*------ DEBUG LOG END ------*/
875                 conn->riom->status = iomux_conn_block;
876         }
877
878         // receive client data
879         if (!l7vs_conn_recv(iom, iom->fd)) {
880                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,15, "error / recv failed");
881                 /*-------- DEBUG LOG --------*/
882                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
883                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,104,
884                                 "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
885                                 "return_value: 0");
886                 }
887                 /*------ DEBUG LOG END ------*/
888                 return 0;
889         }
890         switch (iom->status) {
891         case iomux_conn_receiving:
892                 // data still remain, epoll re-registration for read
893                 l7vs_iomux_mod(iom, iom_read);
894                 break;
895         case iomux_conn_received:
896                 // all data is received, service is selected by using the received data
897                 if (!l7vs_conn_is_rs_connected(iom, conn, &srv, &dest)) {
898                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
899                         /*-------- DEBUG LOG --------*/
900                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
901                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,105,
902                                         "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
903                                         "return_value: 0");
904                         }
905                         /*------ DEBUG LOG END ------*/
906                         return 0;
907                 }
908                 switch (iom->status) {
909                 case iomux_conn_block:
910                         //already decided real server
911                         /*-------- DEBUG LOG --------*/
912                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
913                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,106,
914                                         "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
915                                         "return_value: 1");
916                         }
917                         /*------ DEBUG LOG END ------*/
918                         return 1;
919                 case iomux_conn_service_selected:
920                         //service and destination were selected then attempt to connect the real server
921                         if (!l7vs_conn_connection_establish(iom, conn, srv, dest)) {
922                                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
923                                 /*-------- DEBUG LOG --------*/
924                                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
925                                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,107,
926                                                 "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
927                                                 "return_value: 0");
928                                 }
929                                 /*------ DEBUG LOG END ------*/
930                                 return 0;
931                         }
932                         l7vs_conn_QoS_recvsize_register( conn, conn->cldata_len, QOS_UP );
933                         break;
934                 default:
935                         //invalid status
936                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", iom->status);
937                         /*-------- DEBUG LOG --------*/
938                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
939                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,108,
940                                         "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
941                                         "return_value: 0");
942                         }
943                         /*------ DEBUG LOG END ------*/
944                         return 0;
945                 }
946                 break;
947         case iomux_conn_disconnected:
948                 // client connection was disconnected
949                 break;
950         default:
951                 //invalid status
952                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,35, "error / invalid status(%d)", iom->status);
953                 /*-------- DEBUG LOG --------*/
954                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
955                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,109,
956                                 "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
957                                 "return_value: 0");
958                 }
959                 /*------ DEBUG LOG END ------*/
960                 return 0;
961         }
962         /*-------- DEBUG LOG --------*/
963         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
964                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,110,
965                         "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
966                         "return_value: 1");
967         }
968         /*------ DEBUG LOG END ------*/
969         return 1;
970 }
971
972 /*!
973  * check realserver fd, and if real server not connected, call select_service function
974  *
975  * @param[in]   iom     connection_iomux
976  * @param[in]   conn    connection
977  * @param[out]  srv     service
978  * @param[out]  dest    destination(real server)
979  * @return      status
980  * @retval      0       failed
981  * @retval      1       succeed
982  */
983 static int
984 l7vs_conn_is_rs_connected(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest)
985 {
986         /*-------- DEBUG LOG --------*/
987         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
988                 char iom_str[DEBUG_STR_LEN] = {0};
989                 char conn_str[DEBUG_STR_LEN] = {0};
990                 char srv_str[DEBUG_STR_LEN] = {0};
991                 char dest_str[DEBUG_STR_LEN] = {0};
992                 l7vs_iomux_c_str(iom_str, iom);
993                 l7vs_conn_c_str(conn_str, conn);
994                 l7vs_service_c_str(srv_str, *srv);
995                 l7vs_dest_c_str(dest_str, *dest);
996                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,111,
997                         "in_function: static int l7vs_conn_is_rs_connected("
998                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
999                         "iom=%s: "
1000                         "conn=%s: "
1001                         "srv=%s: "
1002                         "dest=%s",
1003                         iom_str, conn_str, srv_str, dest_str);
1004         }
1005         /*------ DEBUG LOG END ------*/
1006
1007         int ret = 0;
1008         int temp_tcps = 0;
1009         struct l7vs_dest *d;    // destination for sorry-server
1010         int sorry_state;        // sorry state
1011
1012         struct l7vs_lsock *lsock = NULL;
1013
1014         if (!iom) {
1015                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,36, "error / iom is null");
1016                 /*-------- DEBUG LOG --------*/
1017                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1018                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,112,
1019                                 "out_function: static int l7vs_conn_is_rs_connected("
1020                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1021                                 "return_value: 0");
1022                 }
1023                 /*------ DEBUG LOG END ------*/
1024                 return 0;
1025         }
1026
1027         if (!conn) {
1028                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,37, "error / conn is null");
1029                 /*-------- DEBUG LOG --------*/
1030                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1031                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,113,
1032                                 "out_function: static int l7vs_conn_is_rs_connected("
1033                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1034                                 "return_value: 0");
1035                 }
1036                 /*------ DEBUG LOG END ------*/
1037                 return 0;
1038         }
1039
1040         if (iomux_conn_received != iom->status) {
1041                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,38, "error / invalid status(%d)", iom->status);
1042                 /*-------- DEBUG LOG --------*/
1043                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1044                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,114,
1045                                 "out_function: static int l7vs_conn_is_rs_connected("
1046                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1047                                 "return_value: 0");
1048                 }
1049                 /*------ DEBUG LOG END ------*/
1050                 return 0;
1051         }
1052
1053         lsock = conn->lsock;
1054         /*-------- DEBUG LOG --------*/
1055         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1056                 char lsock_str[DEBUG_STR_LEN] = {0};
1057                 l7vs_lsock_c_str(lsock_str, lsock);
1058                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,115,
1059                         "pointer_assign: lsock=%s",
1060                         lsock_str);
1061         }
1062         /*------ DEBUG LOG END ------*/
1063
1064         //is real server connected?
1065         if (-1 != conn->riom->fd) {
1066                 // check sorry status of service
1067                 // argment 0 means no connection count check
1068                 sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
1069                 if (sorry_state) {
1070                         // check connect to sorry-server now
1071                         if (!conn->sorry_conn_flag) {
1072                                 // get sorry-server destination (argment 0)
1073                                 d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
1074                                 /*-------- DEBUG LOG --------*/
1075                                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1076                                         char sorry_dest_str1[DEBUG_STR_LEN] = {0};
1077                                         l7vs_dest_c_str(sorry_dest_str1, d);
1078                                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
1079                                                 "pointer_assign: d=%s",
1080                                                 sorry_dest_str1);
1081                                 }
1082                                 /*------ DEBUG LOG END ------*/
1083                                 if (!d) {
1084                                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
1085                                         /*-------- DEBUG LOG --------*/
1086                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1087                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
1088                                                         "iom->status change: %d->%d",
1089                                                         iom->status, iomux_conn_rs_connect_error);
1090                                         }
1091                                         /*------ DEBUG LOG END ------*/
1092                                         iom->status = iomux_conn_rs_connect_error;
1093                                         /*-------- DEBUG LOG --------*/
1094                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1095                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
1096                                                         "out_function: static int l7vs_conn_is_rs_connected("
1097                                                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1098                                                         "return_value: 0");
1099                                         }
1100                                         /*------ DEBUG LOG END ------*/
1101                                         return 0;
1102                                 }
1103                                 conn->old_dest = conn->dest;
1104                                 /*-------- DEBUG LOG --------*/
1105                                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1106                                         char old_dest_str[DEBUG_STR_LEN] = {0};
1107                                         l7vs_dest_c_str(old_dest_str, conn->old_dest);
1108                                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
1109                                                 "pointer_assign: conn->old_dest=%s",
1110                                                 old_dest_str);
1111                                 }
1112                                 /*------ DEBUG LOG END ------*/
1113                                 // change connection to sorry-server
1114                                 if (!l7vs_conn_change_connect_rs(conn, d)) {
1115                                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
1116                                         /*-------- DEBUG LOG --------*/
1117                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1118                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
1119                                                         "iom->status change: %d->%d",
1120                                                         iom->status, iomux_conn_rs_connect_error);
1121                                         }
1122                                         /*------ DEBUG LOG END ------*/
1123                                         iom->status = iomux_conn_rs_connect_error;
1124                                         /*-------- DEBUG LOG --------*/
1125                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1126                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
1127                                                         "out_function: static int l7vs_conn_is_rs_connected("
1128                                                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1129                                                         "return_value: 0");
1130                                         }
1131                                         /*------ DEBUG LOG END ------*/
1132                                         return 0;
1133                                 }
1134                                 conn->sorry_conn_flag = 1;
1135                         }
1136                 } else {
1137                         // check connect to sorry-server now
1138                         if (conn->sorry_conn_flag) {
1139                                 // get old real-server destination (argment 1)
1140                                 d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
1141                                 /*-------- DEBUG LOG --------*/
1142                                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1143                                         char sorry_dest_str2[DEBUG_STR_LEN] = {0};
1144                                         l7vs_dest_c_str(sorry_dest_str2, d);
1145                                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
1146                                                 "pointer_assign: d=%s",
1147                                                 sorry_dest_str2);
1148                                 }
1149                                 /*------ DEBUG LOG END ------*/
1150                                 if (!d) {
1151                                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
1152                                         /*-------- DEBUG LOG --------*/
1153                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1154                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
1155                                                         "iom->status change: %d->%d",
1156                                                         iom->status, iomux_conn_rs_connect_error);
1157                                         }
1158                                         /*------ DEBUG LOG END ------*/
1159                                         iom->status = iomux_conn_rs_connect_error;
1160                                         /*-------- DEBUG LOG --------*/
1161                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1162                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
1163                                                         "out_function: static int l7vs_conn_is_rs_connected("
1164                                                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1165                                                         "return_value: 0");
1166                                         }
1167                                         /*------ DEBUG LOG END ------*/
1168                                         return 0;
1169                                 }
1170                                 // change connection to real-server
1171                                 if (!l7vs_conn_change_connect_rs(conn, d)) {
1172                                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
1173                                         /*-------- DEBUG LOG --------*/
1174                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1175                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
1176                                                         "iom->status change: %d->%d",
1177                                                         iom->status, iomux_conn_rs_connect_error);
1178                                         }
1179                                         /*------ DEBUG LOG END ------*/
1180                                         iom->status = iomux_conn_rs_connect_error;
1181                                         /*-------- DEBUG LOG --------*/
1182                                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1183                                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
1184                                                         "out_function: static int l7vs_conn_is_rs_connected("
1185                                                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1186                                                         "return_value: 0");
1187                                         }
1188                                         /*------ DEBUG LOG END ------*/
1189                                         return 0;
1190                                 }
1191                                 conn->sorry_conn_flag = 0;
1192                         }
1193                 }
1194                 /*-------- DEBUG LOG --------*/
1195                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1196                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,127,
1197                                 "iom->status change: %d->%d",
1198                                 iom->status, iomux_conn_block);
1199                 }
1200                 /*------ DEBUG LOG END ------*/
1201                 iom->status = iomux_conn_block;
1202                 if (iomux_conn_busy == conn->riom->status) {
1203                         /*-------- DEBUG LOG --------*/
1204                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1205                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,128,
1206                                         "conn->riom->status change: %d->%d",
1207                                         conn->riom->status, iomux_conn_sending_busy);
1208                         }
1209                         /*------ DEBUG LOG END ------*/
1210                         conn->riom->status = iomux_conn_sending_busy;
1211                 }
1212                 else {
1213                         /*-------- DEBUG LOG --------*/
1214                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1215                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,129,
1216                                         "conn->riom->status change: %d->%d",
1217                                         conn->riom->status, iomux_conn_sending);
1218                         }
1219                         /*------ DEBUG LOG END ------*/
1220                         conn->riom->status = iomux_conn_sending;
1221                 }
1222                 //epoll re-registration for write
1223                 l7vs_iomux_mod(conn->riom, iom_write);
1224         }
1225         else {
1226                 //select service
1227                 ret = l7vs_lsock_select_service(lsock, conn, conn->cldata,
1228                                                 conn->cldata_len, srv, dest, &temp_tcps);
1229                 if (0 >= ret) {
1230                         *srv = NULL;
1231                         *dest = NULL;
1232                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,22, "error / no matching service found");
1233                         /*-------- DEBUG LOG --------*/
1234                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1235                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,130,
1236                                         "iom->status change: %d->%d",
1237                                         iom->status, iomux_conn_receive_error);
1238                         }
1239                         /*------ DEBUG LOG END ------*/
1240                         iom->status = iomux_conn_receive_error;
1241                         /*-------- DEBUG LOG --------*/
1242                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1243                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,131,
1244                                         "out_function: static int l7vs_conn_is_rs_connected("
1245                                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1246                                         "return_value: 0");
1247                         }
1248                         /*------ DEBUG LOG END ------*/
1249                         return 0;
1250                 }
1251                 /*-------- DEBUG LOG --------*/
1252                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1253                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,132,
1254                                 "iom->status change: %d->%d",
1255                                 iom->status, iomux_conn_service_selected);
1256                 }
1257                 /*------ DEBUG LOG END ------*/
1258                 iom->status = iomux_conn_service_selected;
1259         }
1260
1261         /*-------- DEBUG LOG --------*/
1262         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1263                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,133,
1264                         "out_function: static int l7vs_conn_is_rs_connected("
1265                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1266                         "return_value: 1");
1267         }
1268         /*------ DEBUG LOG END ------*/
1269         return 1;
1270 }
1271
1272 /*!
1273  * connecction establish
1274  *
1275  * @param[in]   iom     connection_iomux
1276  * @param[in]   conn    connection
1277  * @param[in]   srv     service
1278  * @param[in]   dest    destination(real server)
1279  * @return      status
1280  * @retval      0       failed
1281  * @retval      1       succeed
1282  */
1283 static int
1284 l7vs_conn_connection_establish(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)
1285 {
1286         /*-------- DEBUG LOG --------*/
1287         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1288                 char iom_str[DEBUG_STR_LEN] = {0};
1289                 char conn_str[DEBUG_STR_LEN] = {0};
1290                 char srv_str[DEBUG_STR_LEN] = {0};
1291                 char dest_str[DEBUG_STR_LEN] = {0};
1292                 l7vs_iomux_c_str(iom_str, iom);
1293                 l7vs_conn_c_str(conn_str, conn);
1294                 l7vs_service_c_str(srv_str, srv);
1295                 l7vs_dest_c_str(dest_str, dest);
1296                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,134,
1297                         "in_function: static int l7vs_conn_connection_establish("
1298                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1299                         "iom=%s: "
1300                         "conn=%s: "
1301                         "srv=%s: "
1302                         "dest=%s",
1303                         iom_str, conn_str, srv_str, dest_str);
1304         }
1305         /*------ DEBUG LOG END ------*/
1306         int ret = 0;
1307
1308         if (!iom) {
1309                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,39, "error / iom is null");
1310                 /*-------- DEBUG LOG --------*/
1311                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1312                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,135,
1313                                 "out_function: static int l7vs_conn_connection_establish("
1314                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1315                                 "return_value: 0");
1316                 }
1317                 /*------ DEBUG LOG END ------*/
1318                 return 0;
1319         }
1320
1321         if (!conn) {
1322                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,40, "error / conn is null");
1323                 /*-------- DEBUG LOG --------*/
1324                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1325                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,136,
1326                                 "out_function: static int l7vs_conn_connection_establish("
1327                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1328                                 "return_value: 0");
1329                 }
1330                 /*------ DEBUG LOG END ------*/
1331                 return 0;
1332         }
1333
1334         if (!srv) {
1335                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,41, "error / srv is null");
1336                 /*-------- DEBUG LOG --------*/
1337                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1338                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,137,
1339                                 "out_function: static int l7vs_conn_connection_establish("
1340                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1341                                 "return_value: 0");
1342                 }
1343                 /*------ DEBUG LOG END ------*/
1344                 return 0;
1345         }
1346
1347         if (!dest) {
1348                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,42, "error / dest is null");
1349                 /*-------- DEBUG LOG --------*/
1350                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1351                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,138,
1352                                 "out_function: static int l7vs_conn_connection_establish("
1353                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1354                                 "return_value: 0");
1355                 }
1356                 /*------ DEBUG LOG END ------*/
1357                 return 0;
1358         }
1359
1360         if (iom->status != iomux_conn_service_selected) {
1361                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,43, "error / invalid status(%d)", iom->status);
1362                 /*-------- DEBUG LOG --------*/
1363                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1364                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,139,
1365                                 "out_function: static int l7vs_conn_connection_establish("
1366                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1367                                 "return_value: 0");
1368                 }
1369                 /*------ DEBUG LOG END ------*/
1370                 return 0;
1371         }
1372
1373         // connect to real server
1374         if (!l7vs_conn_connect_rs(conn, dest)) {
1375                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,23, "error / connect rs failed");
1376                 /*-------- DEBUG LOG --------*/
1377                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1378                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,140,
1379                                 "iom->status change: %d->%d",
1380                                 iom->status, iomux_conn_rs_connect_error);
1381                 }
1382                 /*------ DEBUG LOG END ------*/
1383                 iom->status = iomux_conn_rs_connect_error;
1384                 /*-------- DEBUG LOG --------*/
1385                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1386                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,141,
1387                                 "out_function: static int l7vs_conn_connection_establish("
1388                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1389                                 "return_value: 0");
1390                 }
1391                 /*------ DEBUG LOG END ------*/
1392                 return 0;
1393         }
1394         /*-------- DEBUG LOG --------*/
1395         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1396                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,142,
1397                         "iom->status change: %d->%d",
1398                         iom->status, iomux_conn_rs_connected);
1399         }
1400         /*------ DEBUG LOG END ------*/
1401         iom->status = iomux_conn_rs_connected;
1402
1403         // set pointer for cross reference
1404         conn->srv = srv;
1405         /*-------- DEBUG LOG --------*/
1406         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1407                 char service_str[DEBUG_STR_LEN] = {0};
1408                 l7vs_service_c_str(service_str, conn->srv);
1409                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,143,
1410                         "pointer_assign: conn->srv=%s",
1411                         service_str);
1412         }
1413         /*------ DEBUG LOG END ------*/
1414         l7vs_service_register_conn(srv, conn);
1415
1416         // service establish
1417         ret = l7vs_service_establish(conn->srv, conn);
1418         if (0 > ret) {
1419                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,24, "error / service establish failed");
1420                 /*-------- DEBUG LOG --------*/
1421                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1422                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,144,
1423                                 "iom->status change: %d->%d",
1424                                 iom->status, iomux_conn_rs_connect_error);
1425                 }
1426                 /*------ DEBUG LOG END ------*/
1427                 iom->status = iomux_conn_rs_connect_error;
1428                 /*-------- DEBUG LOG --------*/
1429                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1430                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,145,
1431                                 "out_function: static int l7vs_conn_connection_establish("
1432                                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1433                                 "return_value: 0");
1434                 }
1435                 /*------ DEBUG LOG END ------*/
1436                 return 0;
1437         }
1438         
1439         // iom status set 
1440         /*-------- DEBUG LOG --------*/
1441         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1442                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,146,
1443                         "iom->status change: %d->%d",
1444                         iom->status, iomux_conn_block);
1445         }
1446         /*------ DEBUG LOG END ------*/
1447         iom->status = iomux_conn_block;
1448         /*-------- DEBUG LOG --------*/
1449         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1450                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,147,
1451                         "conn->riom->status change: %d->%d",
1452                         conn->riom->status, iomux_conn_sending);
1453         }
1454         /*------ DEBUG LOG END ------*/
1455         conn->riom->status = iomux_conn_sending;
1456
1457         /*-------- DEBUG LOG --------*/
1458         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1459                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,148,
1460                         "out_function: static int l7vs_conn_connection_establish("
1461                         "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1462                         "return_value: 1");
1463         }
1464         /*------ DEBUG LOG END ------*/
1465         return 1;
1466 }
1467
1468 /*!
1469  * block status:
1470  * when block status, arrived data turn next epoll reaction
1471  * and changes state to busy, expect the another iom is already busy
1472  *
1473  * @param[in]   iom             connection_iomux
1474  * @param[in]   another_iom     another side's iomux
1475  * @return      status
1476  * @retval      0       failed
1477  * @retval      1       succeed
1478  */
1479 static int
1480 l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1481 {
1482         /*-------- DEBUG LOG --------*/
1483         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1484                 char iom_str[DEBUG_STR_LEN] = {0};
1485                 char a_iom_str[DEBUG_STR_LEN] = {0};
1486                 l7vs_iomux_c_str(iom_str, iom);
1487                 l7vs_iomux_c_str(a_iom_str, another_iom);
1488                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,149,
1489                         "in_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1490                         "iom=%s: "
1491                         "another_iom=%s",
1492                         iom_str, a_iom_str);
1493         }
1494         /*------ DEBUG LOG END ------*/
1495
1496         if (!iom) {
1497                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,44, "error / iom is null");
1498                 /*-------- DEBUG LOG --------*/
1499                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1500                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,150,
1501                                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1502                                 "return_value: 0");
1503                 }
1504                 /*------ DEBUG LOG END ------*/
1505                 return 0;
1506         }
1507
1508         if (!another_iom) {
1509                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,45, "error / another_iom is null");
1510                 /*-------- DEBUG LOG --------*/
1511                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1512                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,151,
1513                                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1514                                 "return_value: 0");
1515                 }
1516                 /*------ DEBUG LOG END ------*/
1517                 return 0;
1518         }
1519
1520         if (iomux_conn_block != iom->status) {
1521                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,46, "error / invalid status(%d)", iom->status);
1522                 /*-------- DEBUG LOG --------*/
1523                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1524                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,152,
1525                                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1526                                 "return_value: 0");
1527                 }
1528                 /*------ DEBUG LOG END ------*/
1529                 return 0;
1530         }
1531
1532         // epoll re-registraion for read
1533         l7vs_iomux_mod(iom, iom_read);
1534
1535         // when another iom status is busy, do not change my status
1536         if (iomux_conn_busy != another_iom->status &&
1537             iomux_conn_sending_busy != another_iom->status &&
1538             iomux_conn_sent_busy != another_iom->status) {
1539                 /*-------- DEBUG LOG --------*/
1540                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1541                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,153,
1542                                 "iom->status change: %d->%d",
1543                                 iom->status, iomux_conn_busy);
1544                 }
1545                 /*------ DEBUG LOG END ------*/
1546                 iom->status = iomux_conn_busy;
1547         }
1548
1549         /*-------- DEBUG LOG --------*/
1550         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1551                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,154,
1552                         "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1553                         "return_value: 1");
1554         }
1555         /*------ DEBUG LOG END ------*/
1556         return 1;
1557 }
1558
1559 /*!
1560  * busy status:
1561  * when busy status, arrived data turn next epoll reaction and status keep busy
1562  *
1563  * @param[in]   iom     connection_iomux
1564  * @return      status
1565  * @retval      0       failed
1566  * @retval      1       succeed
1567  */
1568 static int
1569 l7vs_conn_busy(struct l7vs_iomux *iom)
1570 {
1571         /*-------- DEBUG LOG --------*/
1572         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1573                 char iom_str[DEBUG_STR_LEN] = {0};
1574                 l7vs_iomux_c_str(iom_str, iom);
1575                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,155,
1576                         "in_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1577                         "iom=%s",
1578                         iom_str);
1579         }
1580         /*------ DEBUG LOG END ------*/
1581
1582         if (!iom) {
1583                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,47, "error / iom is null");
1584                 /*-------- DEBUG LOG --------*/
1585                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1586                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,156,
1587                                 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1588                                 "return_value: 0");
1589                 }
1590                 /*------ DEBUG LOG END ------*/
1591                 return 0;
1592         }
1593
1594         if (iomux_conn_busy != iom->status) {
1595                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,48, "error / invalid status(%d)", iom->status);
1596                 /*-------- DEBUG LOG --------*/
1597                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1598                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,157,
1599                                 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1600                                 "return_value: 0");
1601                 }
1602                 /*------ DEBUG LOG END ------*/
1603                 return 0;
1604         }
1605
1606         //epoll re-registration for read
1607         // l7vs_iomux_mod(iom, iom_read);
1608
1609         /*-------- DEBUG LOG --------*/
1610         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1611                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,158,
1612                         "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1613                         "return_value: 1");
1614         }
1615         /*------ DEBUG LOG END ------*/
1616         return 1;
1617 }
1618
1619 /*!
1620  * sending status:
1621  * 
1622  * @param[in]   iom             connection_iomux
1623  * @param[in]   another_iom     another side's iomux
1624  * @return      status
1625  * @retval      0       failed
1626  * @retval      1       succeed
1627  */
1628 static int
1629 l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1630 {
1631         /*-------- DEBUG LOG --------*/
1632         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1633                 char iom_str[DEBUG_STR_LEN] = {0};
1634                 char a_iom_str[DEBUG_STR_LEN] = {0};
1635                 l7vs_iomux_c_str(iom_str, iom);
1636                 l7vs_iomux_c_str(a_iom_str, another_iom);
1637                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,159,
1638                         "in_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1639                         "iom=%s: "
1640                         "another_iom=%s",
1641                         iom_str, a_iom_str);
1642         }
1643         /*------ DEBUG LOG END ------*/
1644
1645         if (!iom) {
1646                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,49, "error / iom is null");
1647                 /*-------- DEBUG LOG --------*/
1648                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1649                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,160,
1650                                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1651                                 "return_value: 0");
1652                 }
1653                 /*------ DEBUG LOG END ------*/
1654                 return 0; 
1655         }
1656
1657         if (!another_iom) {
1658                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,50, "error / another_iom is null");
1659                 /*-------- DEBUG LOG --------*/
1660                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1661                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,161,
1662                                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1663                                 "return_value: 0");
1664                 }
1665                 /*------ DEBUG LOG END ------*/
1666                 return 0; 
1667         }
1668
1669         if (iomux_conn_sending != iom->status && iomux_conn_sending_busy != iom->status) {
1670                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,51, "error / invalid status(%d)", iom->status);
1671                 /*-------- DEBUG LOG --------*/
1672                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1673                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,162,
1674                                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1675                                 "return_value: 0");
1676                 }
1677                 /*------ DEBUG LOG END ------*/
1678                 return 0;
1679         }
1680
1681         // send to handling iom
1682         if (!l7vs_conn_send(iom, iom->fd)) {
1683                 iom->status = iomux_conn_send_error;
1684                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,25, "error / send failed");
1685                 /*-------- DEBUG LOG --------*/
1686                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1687                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,163,
1688                                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1689                                 "return_value: 0");
1690                 }
1691                 /*------ DEBUG LOG END ------*/
1692                 return 0;
1693         }
1694         if (iomux_conn_sent == iom->status || iomux_conn_sent_busy == iom->status) {
1695                 // when all data was sent, select the next state
1696                 if (!l7vs_conn_sent_next_state(another_iom, iom)) {
1697                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,26, "error / send next state failed");
1698                         /*-------- DEBUG LOG --------*/
1699                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1700                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,164,
1701                                         "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1702                                         "return_value: 0");
1703                         }
1704                         /*------ DEBUG LOG END ------*/
1705                         return 0;
1706                 }
1707                 if (iomux_conn_receiving != iom->status && iomux_conn_block != iom->status) {
1708                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,52, "error / invalid status(%d)", iom->status);
1709                         /*-------- DEBUG LOG --------*/
1710                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1711                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,165,
1712                                         "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1713                                         "return_value: 0");
1714                         }
1715                         /*------ DEBUG LOG END ------*/
1716                         return 0;
1717                 }
1718         }
1719         else if (iomux_conn_sending == iom->status || iomux_conn_sending_busy == iom->status) {
1720                 // data still remain
1721                 // epoll re-registration for write
1722                 l7vs_iomux_mod(iom, iom_write);
1723         }
1724         else  {
1725                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,53, "error / invalid status(%d)", iom->status);
1726                 /*-------- DEBUG LOG --------*/
1727                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1728                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,166,
1729                                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1730                                 "return_value: 0");
1731                 }
1732                 /*------ DEBUG LOG END ------*/
1733                 return 0;
1734         }
1735
1736         /*-------- DEBUG LOG --------*/
1737         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1738                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,167,
1739                         "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1740                         "return_value: 1");
1741         }
1742         /*------ DEBUG LOG END ------*/
1743         return 1;
1744 }
1745
1746 /*!
1747  * decide sent next state
1748  *
1749  * @param[in,out]       src_iom         source connection_iomux
1750  * @param[in,out]       dest_iom        destionation connection_iomux
1751  * @return      status
1752  * @retval      0       failed
1753  * @retval      1       succeed
1754  */
1755 static int
1756 l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom)
1757 {
1758         /*-------- DEBUG LOG --------*/
1759         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1760                 char s_iom_str[DEBUG_STR_LEN] = {0};
1761                 char d_iom_str[DEBUG_STR_LEN] = {0};
1762                 l7vs_iomux_c_str(s_iom_str, src_iom);
1763                 l7vs_iomux_c_str(d_iom_str, dest_iom);
1764                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,168,
1765                         "in_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1766                         "src_iom=%s: "
1767                         "dest_iom=%s",
1768                         s_iom_str, d_iom_str);
1769         }
1770         /*------ DEBUG LOG END ------*/
1771
1772         if (!src_iom) {
1773                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,54, "error / src_iom is null");
1774                 /*-------- DEBUG LOG --------*/
1775                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1776                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,169,
1777                                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1778                                 "return_value: 0");
1779                 }
1780                 /*------ DEBUG LOG END ------*/
1781                 return  0;
1782         }
1783         if (!dest_iom) {
1784                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,55, "error / dest_iom is null");
1785                 /*-------- DEBUG LOG --------*/
1786                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1787                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,170,
1788                                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1789                                 "return_value: 0");
1790                 }
1791                 /*------ DEBUG LOG END ------*/
1792                 return  0;
1793         }
1794
1795         // when writing, the dest_status will be "sent" or "sent_busy"
1796         if (iomux_conn_sent != dest_iom->status && iomux_conn_sent_busy != dest_iom->status) {
1797                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,56, "error / invalid dest status(%d)", dest_iom->status);
1798                 /*-------- DEBUG LOG --------*/
1799                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1800                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,171,
1801                                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1802                                 "return_value: 0");
1803                 }
1804                 /*------ DEBUG LOG END ------*/
1805                 return 0;
1806         }
1807         // and the src_status will be "block" or "busy"
1808         if (iomux_conn_block != src_iom->status && iomux_conn_busy != src_iom->status) {
1809                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,57, "error / invalid src status(%d)", src_iom->status);
1810                 /*-------- DEBUG LOG --------*/
1811                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1812                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,172,
1813                                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1814                                 "return_value: 0");
1815                 }
1816                 /*------ DEBUG LOG END ------*/
1817                 return 0;
1818         }
1819
1820         // decide the next state
1821         if (iomux_conn_sent_busy == dest_iom->status) {
1822                 // when receiving from source, request come to the destination, then destination has priority
1823                 /*-------- DEBUG LOG --------*/
1824                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1825                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,173,
1826                                 "src_iom->status change: %d->%d",
1827                                 src_iom->status, iomux_conn_block);
1828                 }
1829                 /*------ DEBUG LOG END ------*/
1830                 src_iom->status = iomux_conn_block;
1831                 /*-------- DEBUG LOG --------*/
1832                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1833                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,174,
1834                                 "dest_iom->status change: %d->%d",
1835                                 dest_iom->status, iomux_conn_receiving);
1836                 }
1837                 /*------ DEBUG LOG END ------*/
1838                 dest_iom->status = iomux_conn_receiving;
1839         }
1840         else if (iomux_conn_busy == src_iom->status) {
1841                 // when sending to destination, request come to the source, then source has priority
1842                 /*-------- DEBUG LOG --------*/
1843                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1844                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,175,
1845                                 "src_iom->status change: %d->%d",
1846                                 src_iom->status, iomux_conn_receiving);
1847                 }
1848                 /*------ DEBUG LOG END ------*/
1849                 src_iom->status = iomux_conn_receiving;
1850                 /*-------- DEBUG LOG --------*/
1851                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1852                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,176,
1853                                 "dest_iom->status change: %d->%d",
1854                                 dest_iom->status, iomux_conn_block);
1855                 }
1856                 /*------ DEBUG LOG END ------*/
1857                 dest_iom->status = iomux_conn_block;
1858         }
1859         else {
1860                 // request come to neither source nor destnation, ready to read both
1861                 /*-------- DEBUG LOG --------*/
1862                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1863                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,177,
1864                                 "src_iom->status change: %d->%d",
1865                                 src_iom->status, iomux_conn_receiving);
1866                 }
1867                 /*------ DEBUG LOG END ------*/
1868                 src_iom->status = iomux_conn_receiving; 
1869                 /*-------- DEBUG LOG --------*/
1870                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1871                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,178,
1872                                 "dest_iom->status change: %d->%d",
1873                                 dest_iom->status, iomux_conn_receiving);
1874                 }
1875                 /*------ DEBUG LOG END ------*/
1876                 dest_iom->status = iomux_conn_receiving;
1877         }
1878         l7vs_iomux_mod(src_iom, iom_read);
1879         l7vs_iomux_mod(dest_iom, iom_read);
1880
1881         /*-------- DEBUG LOG --------*/
1882         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1883                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,179,
1884                         "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1885                         "return_value: 1");
1886         }
1887         /*------ DEBUG LOG END ------*/
1888         return 1;
1889 }
1890
1891 /*!
1892  * realserver connection callback
1893  *
1894  * @param[in]   iom     connection iomux
1895  * @return      status
1896  * @retval      0       failed
1897  * @retval      1       succeed
1898  */
1899 static int
1900 l7vs_conn_rs_callback(struct l7vs_iomux *iom)
1901 {
1902         /*-------- DEBUG LOG --------*/
1903         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1904                 char iom_str[DEBUG_STR_LEN] = {0};
1905                 l7vs_iomux_c_str(iom_str, iom);
1906                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,180,
1907                         "in_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1908                         "iom=%s",
1909                         iom_str);
1910         }
1911         /*------ DEBUG LOG END ------*/
1912         struct l7vs_conn* conn = NULL;
1913
1914         if (!iom) {
1915                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,58, "error / iom is null");
1916                 /*-------- DEBUG LOG --------*/
1917                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1918                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,181,
1919                                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1920                                 "return_value: 0");
1921                 }
1922                 /*------ DEBUG LOG END ------*/
1923                 return 0;
1924         }
1925
1926         conn = (struct l7vs_conn *)iom->data;
1927         /*-------- DEBUG LOG --------*/
1928         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1929                 char conn_str[DEBUG_STR_LEN] = {0};
1930                 l7vs_conn_c_str(conn_str, conn);
1931                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,182,
1932                         "pointer_assign: conn=%s",
1933                         conn_str);
1934         }
1935         /*------ DEBUG LOG END ------*/
1936
1937         // invalid status check
1938         if (iomux_conn_receiving != iom->status &&
1939             iomux_conn_block != iom->status &&
1940             iomux_conn_busy != iom->status && 
1941             iomux_conn_sending != iom->status && 
1942             iomux_conn_sending_busy != iom->status) {
1943                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,59, "error / invalid status(%d)", iom->status);
1944                 l7vs_conn_destroy(conn);
1945                 /*-------- DEBUG LOG --------*/
1946                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1947                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,183,
1948                                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1949                                 "return_value: 0");
1950                 }
1951                 /*------ DEBUG LOG END ------*/
1952                 return 0;
1953         }
1954
1955         // switch by current status
1956         switch (iom->status) {
1957         case iomux_conn_receiving:
1958                 if (!l7vs_conn_realserver_receiving(iom)) {
1959                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,27, "error / rs_callback/realserver receiving failed");
1960                         l7vs_conn_destroy(conn);
1961                         /*-------- DEBUG LOG --------*/
1962                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1963                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,184,
1964                                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1965                                         "return_value: 0");
1966                         }
1967                         /*------ DEBUG LOG END ------*/
1968                         return 0;
1969                 }
1970                 if (iomux_conn_disconnected == iom->status) {
1971                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1972                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,185, "realserver connection disconnected");
1973                         }
1974                         l7vs_conn_destroy(conn);
1975                 }
1976                 break;
1977         case iomux_conn_block:
1978                 if (!l7vs_conn_block(iom, conn->ciom)) {
1979                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,28, "error / rs_callback/block failed");
1980                         l7vs_conn_destroy(conn);
1981                         /*-------- DEBUG LOG --------*/
1982                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1983                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,186,
1984                                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1985                                         "return_value: 0");
1986                         }
1987                         /*------ DEBUG LOG END ------*/
1988                         return 0;
1989                 }
1990                 break;
1991         case iomux_conn_busy:
1992                 if (!l7vs_conn_busy(iom)) {
1993                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,29, "error / rs_callback/busy failed");
1994                         l7vs_conn_destroy(conn);
1995                         /*-------- DEBUG LOG --------*/
1996                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1997                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,187,
1998                                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1999                                         "return_value: 0");
2000                         }
2001                         /*------ DEBUG LOG END ------*/
2002                         return 0;       
2003                 }
2004                 break;          
2005         case iomux_conn_sending:
2006                 if (!l7vs_conn_sending(iom, conn->ciom)) {
2007                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,30, "error / rs_callback/sending failed");
2008                         l7vs_conn_destroy(conn);
2009                         /*-------- DEBUG LOG --------*/
2010                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2011                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,188,
2012                                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2013                                         "return_value: 0");
2014                         }
2015                         /*------ DEBUG LOG END ------*/
2016                         return 0;
2017                 }
2018                 break;
2019         case iomux_conn_sending_busy:
2020                 if (!l7vs_conn_sending(iom, conn->ciom)) {
2021                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,31, "error / rs_callback/sending_busy failed");
2022                         l7vs_conn_destroy(conn);
2023                         /*-------- DEBUG LOG --------*/
2024                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2025                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,189,
2026                                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2027                                         "return_value: 0");
2028                         }
2029                         /*------ DEBUG LOG END ------*/
2030                         return 0;
2031                 }
2032                 break;
2033         default:
2034                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,60, "error / invalid status(%d)", iom->status);
2035                 l7vs_conn_destroy(conn);
2036                 /*-------- DEBUG LOG --------*/
2037                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2038                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,190,
2039                                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2040                                 "return_value: 0");
2041                 }
2042                 /*------ DEBUG LOG END ------*/
2043                 return 0;
2044         }
2045
2046         /*-------- DEBUG LOG --------*/
2047         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2048                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,191,
2049                         "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2050                         "return_value: 1");
2051         }
2052         /*------ DEBUG LOG END ------*/
2053         return 1;
2054 }
2055
2056 /*!
2057  * realserver receiving 
2058  *
2059  * @param[in]   iom     connection iomux
2060  * @return      status
2061  * @retval      0       failed
2062  * @retval      1       succeed
2063  */
2064 static int
2065 l7vs_conn_realserver_receiving(struct l7vs_iomux *iom)
2066 {
2067         /*-------- DEBUG LOG --------*/
2068         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2069                 char iom_str[DEBUG_STR_LEN] = {0};
2070                 l7vs_iomux_c_str(iom_str, iom);
2071                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,192,
2072                         "in_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2073                         "iom=%s",
2074                         iom_str);
2075         }
2076         /*------ DEBUG LOG END ------*/
2077
2078         struct l7vs_conn *conn = NULL;
2079
2080         if (!iom) {
2081                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,61, "error / iom is null");
2082                 /*-------- DEBUG LOG --------*/
2083                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2084                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,193,
2085                                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2086                                 "return_value: 0");
2087                 }
2088                 /*------ DEBUG LOG END ------*/
2089                 return 0;
2090         }
2091
2092         if (iomux_conn_receiving != iom->status) {
2093                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,62, "error / invalid status(%d)", iom->status);
2094                 /*-------- DEBUG LOG --------*/
2095                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2096                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,194,
2097                                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2098                                 "return_value: 0");
2099                 }
2100                 /*------ DEBUG LOG END ------*/
2101                 return 0;
2102         }
2103
2104         conn = (struct l7vs_conn *)iom->data;
2105         /*-------- DEBUG LOG --------*/
2106         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2107                 char conn_str[DEBUG_STR_LEN] = {0};
2108                 l7vs_conn_c_str(conn_str, conn);
2109                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,195,
2110                         "pointer_assign: conn=%s",
2111                         conn_str);
2112         }
2113         /*------ DEBUG LOG END ------*/
2114
2115         // when the client is not set in read-blocked
2116         if (iomux_conn_block != conn->ciom->status && iomux_conn_busy != conn->ciom->status) {
2117                 // set the real server in read-blocked
2118                 /*-------- DEBUG LOG --------*/
2119                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2120                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,196,
2121                                 "conn->ciom->status change: %d->%d",
2122                                 conn->ciom->status, iomux_conn_block);
2123                 }
2124                 /*------ DEBUG LOG END ------*/
2125                 conn->ciom->status = iomux_conn_block;
2126         }
2127
2128         // receive realserver data
2129         if (!l7vs_conn_recv(iom, iom->fd)) {
2130                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,32, "error / recv failed");
2131                 /*-------- DEBUG LOG --------*/
2132                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2133                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,197,
2134                                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2135                                 "return_value: 0");
2136                 }
2137                 /*------ DEBUG LOG END ------*/
2138                 return 0;
2139         }
2140         switch (iom->status) {
2141         case iomux_conn_receiving:
2142                 // data still remain, epoll re-registration for read
2143                 l7vs_iomux_mod(iom, iom_read);
2144                 break;
2145         case iomux_conn_received:
2146                 // all data is received, append the session infomation
2147                 if (!l7vs_conn_realserver_modify_data(iom)) {
2148                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,33, "error / realserver modify data failed");
2149                         /*-------- DEBUG LOG --------*/
2150                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2151                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,198,
2152                                         "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2153                                         "return_value: 0");
2154                         }
2155                         /*------ DEBUG LOG END ------*/
2156                         return 0;
2157                 }
2158                 /*-------- DEBUG LOG --------*/
2159                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2160                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,199,
2161                                 "iom->status change: %d->%d",
2162                                 iom->status, iomux_conn_block);
2163                 }
2164                 /*------ DEBUG LOG END ------*/
2165                 iom->status = iomux_conn_block;
2166                 if (iomux_conn_busy == conn->ciom->status) {
2167                         /*-------- DEBUG LOG --------*/
2168                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2169                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,200,
2170                                         "conn->ciom->status change: %d->%d",
2171                                         conn->ciom->status, iomux_conn_sending_busy);
2172                         }
2173                         /*------ DEBUG LOG END ------*/
2174                         conn->ciom->status = iomux_conn_sending_busy;
2175                 } else {
2176                         /*-------- DEBUG LOG --------*/
2177                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2178                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,201,
2179                                         "conn->ciom->status change: %d->%d",
2180                                         conn->ciom->status, iomux_conn_sending);
2181                         }
2182                         /*------ DEBUG LOG END ------*/
2183                         conn->ciom->status = iomux_conn_sending;
2184                 }
2185                 //epoll re-registration for write
2186                 l7vs_iomux_mod(conn->ciom, iom_write);
2187         case iomux_conn_disconnected:
2188                 // client connection was disconnected
2189                 break;
2190         default:
2191                 //invalid status
2192                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,63, "error / invalid status(%d)", iom->status);
2193                 /*-------- DEBUG LOG --------*/
2194                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2195                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,202,
2196                                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2197                                 "return_value: 0");
2198                 }
2199                 /*------ DEBUG LOG END ------*/
2200                 return 0;
2201         }
2202
2203         /*-------- DEBUG LOG --------*/
2204         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2205                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,203,
2206                         "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2207                         "return_value: 1");
2208         }
2209         /*------ DEBUG LOG END ------*/
2210         return 1;
2211 }
2212
2213 /*!
2214  * realserver modify data
2215  *
2216  * @param[in]   iom     connection iomux
2217  * @return      status
2218  * @retval      0       failed
2219  * @retval      1       succeed
2220  */
2221 static int
2222 l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom)
2223 {
2224         /*-------- DEBUG LOG --------*/
2225         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2226                 char iom_str[DEBUG_STR_LEN] = {0};
2227                 l7vs_iomux_c_str(iom_str, iom);
2228                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,204,
2229                         "in_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2230                         "iom=%s",
2231                         iom_str);
2232         }
2233         /*------ DEBUG LOG END ------*/
2234         struct l7vs_conn *conn = NULL;
2235         char *newbuf = NULL;
2236         int (*relayf)(struct l7vs_service *, struct l7vs_conn *, char *, size_t *) = NULL;
2237         int ret = 0;
2238         size_t len_ret = 0;
2239
2240         if (!iom) {
2241                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,64, "error / iom is null");
2242                 /*-------- DEBUG LOG --------*/
2243                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2244                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,205,
2245                                 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2246                                 "return_value: 0");
2247                 }
2248                 /*------ DEBUG LOG END ------*/
2249                 return 0;
2250         }
2251
2252         if (iomux_conn_received != iom->status) {
2253                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,65, "error / invalid status(%d)", iom->status);
2254                 /*-------- DEBUG LOG --------*/
2255                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2256                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,206,
2257                                 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2258                                 "return_value: 0");
2259                 }
2260                 /*------ DEBUG LOG END ------*/
2261                 return 0;
2262         }
2263
2264         conn = (struct l7vs_conn *)iom->data;
2265         /*-------- DEBUG LOG --------*/
2266         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2267                 char conn_str[DEBUG_STR_LEN] = {0};
2268                 l7vs_conn_c_str(conn_str, conn);
2269                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,207,
2270                         "pointer_assign: conn=%s",
2271                         conn_str);
2272         }
2273         /*------ DEBUG LOG END ------*/
2274
2275         //set the function pointer that modify the real server data
2276         if (conn->srv) {
2277                 relayf = conn->srv->pm->analyze_rsdata;
2278                 /*-------- DEBUG LOG --------*/
2279                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2280                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,208,
2281                                 "pointer_assign: relayf=%p",
2282                                 relayf);
2283                 }
2284                 /*------ DEBUG LOG END ------*/
2285         }
2286
2287         if (relayf) {
2288                 len_ret = conn->cldata_len;
2289                 newbuf = (char *)realloc(conn->cldata, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2290                 if (!newbuf) {
2291                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,10, "error / realloc failed");
2292                         iom->status = iomux_conn_buffer_realloc_error;
2293                         /*-------- DEBUG LOG --------*/
2294                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2295                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,209,
2296                                         "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2297                                         "return_value: 0");
2298                         }
2299                         /*------ DEBUG LOG END ------*/
2300                         return 0;
2301                 }
2302                 /*-------- DEBUG LOG --------*/
2303                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2304                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,210,
2305                                 "realloc: newbuf=%p: size=%zu",
2306                                 newbuf, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2307                 }
2308                 /*------ DEBUG LOG END ------*/
2309                 conn->cldata = newbuf;
2310
2311                 ret = (*relayf)(conn->srv, conn, conn->cldata, &len_ret);
2312                 if (0 != ret) {
2313                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,34, "error / analyze rsdata failed");
2314                         /*-------- DEBUG LOG --------*/
2315                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2316                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,211,
2317                                         "iom->status change: %d->%d",
2318                                         iom->status, iomux_conn_rsdata_modify_error);
2319                         }
2320                         /*------ DEBUG LOG END ------*/
2321                         iom->status = iomux_conn_rsdata_modify_error;
2322                         /*-------- DEBUG LOG --------*/
2323                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2324                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,212,
2325                                         "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2326                                         "return_value: 0");
2327                         }
2328                         /*------ DEBUG LOG END ------*/
2329                         return 0;
2330                 }
2331                 if (L7VS_PROTOMOD_MAX_ADD_BUFSIZE < len_ret - conn->cldata_len) {
2332                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,35, "error / bufsize too long modified by protomod");
2333                         /*-------- DEBUG LOG --------*/
2334                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2335                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,213,
2336                                         "iom->status change: %d->%d",
2337                                         iom->status, iomux_conn_rsdata_modify_error);
2338                         }
2339                         /*------ DEBUG LOG END ------*/
2340                         iom->status = iomux_conn_rsdata_modify_error;
2341                         /*-------- DEBUG LOG --------*/
2342                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2343                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,214,
2344                                         "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2345                                         "return_value: 0");
2346                         }
2347                         /*------ DEBUG LOG END ------*/
2348                         return 0;
2349                 }
2350                 else {
2351                         conn->cldata_len = len_ret;
2352                 }
2353         }
2354         /*-------- DEBUG LOG --------*/
2355         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2356                 char modify_data[DEBUG_STR_LEN] = {0};
2357                 l7vs_conn_dump_data(modify_data, conn->cldata, conn->cldata_len);
2358                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,215,
2359                         "modify data: %s",
2360                         modify_data);
2361         }
2362         /*------ DEBUG LOG END ------*/
2363
2364         /*-------- DEBUG LOG --------*/
2365         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2366                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,216,
2367                         "iom->status change: %d->%d",
2368                         iom->status, iomux_conn_rsdata_modified);
2369         }
2370         /*------ DEBUG LOG END ------*/
2371         iom->status = iomux_conn_rsdata_modified;
2372         /*-------- DEBUG LOG --------*/
2373         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2374                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,217,
2375                         "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2376                         "return_value: 1");
2377         }
2378         /*------ DEBUG LOG END ------*/
2379         return 1;
2380 }
2381
2382 /*!
2383  * receive data
2384  *
2385  * @param[in]   iom             connection_iomux
2386  * @param[in]   source_fd       the filedescriptor to be read
2387  * @return      status
2388  * @retval      0       failed 
2389  * @retval      1       succeed
2390  */
2391 static int
2392 l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd)
2393 {
2394         /*-------- DEBUG LOG --------*/
2395         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2396                 char iom_str[DEBUG_STR_LEN] = {0};
2397                 l7vs_iomux_c_str(iom_str, iom);
2398                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,218,
2399                         "in_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2400                         "iom=%s: "
2401                         "source_fd=%d",
2402                         iom_str, source_fd);
2403         }
2404         /*------ DEBUG LOG END ------*/
2405         int ret = 0;
2406         struct l7vs_conn *conn = NULL;
2407         char read_buf[l7vs_conn_read_bufsize];
2408 //        char *newbuf = NULL;
2409
2410         if (!iom) {
2411                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,66, "error / iom is null");
2412                 /*-------- DEBUG LOG --------*/
2413                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2414                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,219,
2415                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2416                                 "return_value: 0");
2417                 }
2418                 /*------ DEBUG LOG END ------*/
2419                 return 0;
2420         }
2421
2422         if (0 > source_fd || INT_MAX == source_fd) {
2423                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,67, "error / source fd is not specified");
2424                 /*-------- DEBUG LOG --------*/
2425                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2426                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,220,
2427                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2428                                 "return_value: 0");
2429                 }
2430                 /*------ DEBUG LOG END ------*/
2431                 return 0;
2432         }
2433
2434         if (iomux_conn_receiving != iom->status) {
2435                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,68, "error / invalid status(%d)", iom->status);
2436                 /*-------- DEBUG LOG --------*/
2437                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2438                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,221,
2439                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2440                                 "return_value: 0");
2441                 }
2442                 /*------ DEBUG LOG END ------*/
2443                 return 0;
2444         }
2445
2446         conn = (struct l7vs_conn *)iom->data;
2447         /*-------- DEBUG LOG --------*/
2448         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2449                 char conn_str[DEBUG_STR_LEN] = {0};
2450                 l7vs_conn_c_str(conn_str, conn);
2451                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,222,
2452                         "pointer_assign: conn=%s",
2453                         conn_str);
2454         }
2455         /*------ DEBUG LOG END ------*/
2456
2457         //QoS Control to server
2458         if( (source_fd == conn->ciom->fd) && !l7vs_conn_QoS_control( conn, QOS_UP ) ){
2459                 /*-------- DEBUG LOG --------*/
2460                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2461                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
2462                                 "iom->status change: %d->%d",
2463                                 iom->status, iomux_conn_receiving);
2464                 }
2465                 /*------ DEBUG LOG END ------*/
2466                 iom->status = iomux_conn_receiving;
2467                 /*-------- DEBUG LOG --------*/
2468                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2469                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
2470                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2471                                 "return_value: 1");
2472                 }
2473                 /*------ DEBUG LOG END ------*/
2474                 return 1;
2475         }
2476         //QoS Control to client
2477         if( (source_fd == conn->riom->fd) && !l7vs_conn_QoS_control( conn, QOS_DOWN ) ){
2478                 /*-------- DEBUG LOG --------*/
2479                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2480                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
2481                                 "iom->status change: %d->%d",
2482                                 iom->status, iomux_conn_receiving);
2483                 }
2484                 /*------ DEBUG LOG END ------*/
2485                 iom->status = iomux_conn_receiving;
2486                 /*-------- DEBUG LOG --------*/
2487                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2488                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
2489                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2490                                 "return_value: 1");
2491                 }
2492                 /*------ DEBUG LOG END ------*/
2493                 return 1;
2494         }
2495         // read the data
2496         /*-------- DEBUG LOG --------*/
2497         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2498                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,225,
2499                         "recv param: source_fd=%d: len=%d: flags=%d",
2500                         source_fd, (l7vs_conn_read_bufsize - 1), 0);
2501         }
2502         /*------ DEBUG LOG END ------*/
2503         ret = recv(source_fd, read_buf, (l7vs_conn_read_bufsize - 1), 0);
2504         /*-------- DEBUG LOG --------*/
2505         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2506                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,226,
2507                         "recv result: ret=%d",
2508                         ret);
2509         }
2510         /*------ DEBUG LOG END ------*/
2511         /*-------- DEBUG LOG --------*/
2512         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2513                 char recv_data[DEBUG_STR_LEN] = {0};
2514                 l7vs_conn_dump_data(recv_data, read_buf, ret);
2515                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,227,
2516                         "recv data: %s",
2517                         recv_data);
2518         }
2519         /*------ DEBUG LOG END ------*/
2520         switch (ret) {
2521         case -1:
2522                 if (EAGAIN != errno) {
2523                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,12, "error / recv error(%s)", strerror(errno));
2524                         /*-------- DEBUG LOG --------*/
2525                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2526                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,228,
2527                                         "iom->status change: %d->%d",
2528                                         iom->status, iomux_conn_receive_error);
2529                         }
2530                         /*------ DEBUG LOG END ------*/
2531                         iom->status = iomux_conn_receive_error;
2532                         /*-------- DEBUG LOG --------*/
2533                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2534                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,229,
2535                                         "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2536                                         "return_value: 0");
2537                         }
2538                         /*------ DEBUG LOG END ------*/
2539                         return 0;
2540                 }
2541                 /*-------- DEBUG LOG --------*/
2542                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2543                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,230,
2544                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2545                                 "return_value: 1");
2546                 }
2547                 /*------ DEBUG LOG END ------*/
2548                 return 1;
2549         case 0:
2550                 /*-------- DEBUG LOG --------*/
2551                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2552                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,231, "peer disconnected");
2553                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,232,
2554                                 "iom->status change: %d->%d",
2555                                 iom->status, iomux_conn_disconnected);
2556                 }
2557                 /*------ DEBUG LOG END ------*/
2558                 iom->status = iomux_conn_disconnected;
2559                 /*-------- DEBUG LOG --------*/
2560                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2561                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,233,
2562                                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2563                                 "return_value: 1");
2564                 }
2565                 /*------ DEBUG LOG END ------*/
2566                 return 1;
2567 //      case L7VS_CONN_READ_BUFSIZE - 1:
2568 //              // if the buffer is insufficient, realloc the buffer
2569 //              conn->cldata_bufsize += L7VS_CONN_READ_BUFSIZE - 1;
2570 //              newbuf = (char *)realloc(conn->cldata,
2571 //                                       conn->cldata_bufsize);
2572 //              if (!newbuf) {
2573 //                      LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,11, "error / realloc failed");
2574 //                      iom->status = iomux_conn_buffer_realloc_error;
2575 //                      /*-------- DEBUG LOG --------*/
2576 //                      if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2577 //                              LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,234,
2578 //                                      "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2579 //                                      "return_value: 0");
2580 //                      }
2581 //                      /*------ DEBUG LOG END ------*/
2582 //                      return 0;
2583 //              }
2584 //              /*-------- DEBUG LOG --------*/
2585 //              if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2586 //                      LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,235,
2587 //                              "realloc: newbuf=%p: size=%zu",
2588 //                              newbuf, conn->cldata_bufsize);
2589 //              }
2590 //              /*------ DEBUG LOG END ------*/
2591 //              conn->cldata = newbuf;
2592 //
2593 //              // check the next data, and decide the status
2594 //              if (!l7vs_conn_preread(iom, source_fd)) {
2595 //                      LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,36, "error / preread failed");
2596 //                      /*-------- DEBUG LOG --------*/
2597 //                      if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2598 //                              LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,236,
2599 //                                      "iom->status change: %d->%d",
2600 //                                      iom->status, iomux_conn_receive_error);
2601 //                      }
2602 //                      /*------ DEBUG LOG END ------*/
2603 //                      iom->status = iomux_conn_receive_error;
2604 //                      /*-------- DEBUG LOG --------*/
2605 //                      if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2606 //                              LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,237,
2607 //                                      "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2608 //                                      "return_value: 0");
2609 //                      }
2610 //                      /*------ DEBUG LOG END ------*/
2611 //                      return 0;
2612 //              }
2613 //              if (iomux_conn_disconnected == iom->status) {
2614 //                      /*-------- DEBUG LOG --------*/
2615 //                      if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2616 //                              LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,238,
2617 //                                      "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2618 //                                      "return_value: 1");
2619 //                      }
2620 //                      /*------ DEBUG LOG END ------*/
2621 //                      return 1;
2622 //              }
2623 //              break;
2624         default:
2625                 // reading data is finished
2626                 /*-------- DEBUG LOG --------*/
2627                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2628                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,239,
2629                                 "iom->status change: %d->%d",
2630                                 iom->status, iomux_conn_received);
2631                 }
2632                 /*------ DEBUG LOG END ------*/
2633                 iom->status = iomux_conn_received;
2634                 break;
2635         }
2636         
2637         // register reveive information for QoS to server
2638         if( source_fd == conn->ciom->fd ){
2639                 l7vs_conn_QoS_recvsize_register( conn, ret, QOS_UP );
2640         }
2641         // register reveive information for QoS to client
2642         if( source_fd == conn->riom->fd ){
2643                 l7vs_conn_QoS_recvsize_register( conn, ret, QOS_DOWN );
2644         }
2645         // copy to conn_buffer
2646         memcpy(conn->cldata + conn->cldata_len, read_buf, ret);
2647         conn->cldata_len += ret;
2648         conn->cldata[conn->cldata_len] = '\0';
2649
2650         /*-------- DEBUG LOG --------*/
2651         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2652                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,240,
2653                         "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2654                         "return_value: 1");
2655         }
2656         /*------ DEBUG LOG END ------*/
2657         return 1;
2658 }
2659
2660 /*!
2661  * pre-read whether next data exists
2662  *
2663  * @param[in]   iom             connection iomux
2664  * @param[in]   source_fd       source file description
2665  * @return      status
2666  * @retval      0       failed
2667  * @retval      1       succeed
2668  */
2669 static int
2670 l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd)
2671 {
2672         /*-------- DEBUG LOG --------*/
2673         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2674                 char iom_str[DEBUG_STR_LEN] = {0};
2675                 l7vs_iomux_c_str(iom_str, iom);
2676                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,241,
2677                         "in_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2678                         "iom=%s: "
2679                         "source_fd=%d",
2680                         iom_str, source_fd);
2681         }
2682         /*------ DEBUG LOG END ------*/
2683         int preread_ret = 0;
2684         char preread_buf[1] = {0};
2685
2686         if (!iom) {
2687                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,69, "error / iom is null");
2688                 /*-------- DEBUG LOG --------*/
2689                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2690                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,242,
2691                                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2692                                 "return_value: 0");
2693                 }
2694                 /*------ DEBUG LOG END ------*/
2695                 return 0;
2696         }
2697
2698         if (-1 == source_fd) {
2699                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,70, "error / source fd is not specified");
2700                 /*-------- DEBUG LOG --------*/
2701                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2702                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,243,
2703                                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2704                                 "return_value: 0");
2705                 }
2706                 /*------ DEBUG LOG END ------*/
2707                 return 0;
2708         }
2709
2710         if (iomux_conn_receiving != iom->status) {
2711                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,71, "error / invalid status(%d)", iom->status);
2712                 /*-------- DEBUG LOG --------*/
2713                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2714                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,244,
2715                                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2716                                 "return_value: 0");
2717                 }
2718                 /*------ DEBUG LOG END ------*/
2719                 return 0;
2720         }
2721
2722         /*-------- DEBUG LOG --------*/
2723         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2724                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,245,
2725                         "recv param: source_fd=%d: len=1: flags=MSG_PEEK",
2726                         source_fd);
2727         }
2728         /*------ DEBUG LOG END ------*/
2729         preread_ret = recv(source_fd, preread_buf, 1, MSG_PEEK);
2730         /*-------- DEBUG LOG --------*/
2731         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2732                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,246,
2733                         "recv result: preread_ret=%d",
2734                         preread_ret);
2735         }
2736         /*------ DEBUG LOG END ------*/
2737         /*-------- DEBUG LOG --------*/
2738         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2739                 char recv_data[DEBUG_STR_LEN] = {0};
2740                 l7vs_conn_dump_data(recv_data, preread_buf, preread_ret);
2741                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,247,
2742                         "recv data: %s",
2743                         recv_data);
2744         }
2745         /*------ DEBUG LOG END ------*/
2746         switch (preread_ret) {
2747         case -1:
2748                 if (EAGAIN != errno) {
2749                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,13, "error / recv error(%s)", strerror(errno));
2750                         /*-------- DEBUG LOG --------*/
2751                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2752                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,248,
2753                                         "iom->status change: %d->%d",
2754                                         iom->status, iomux_conn_receive_error);
2755                         }
2756                         /*------ DEBUG LOG END ------*/
2757                         iom->status = iomux_conn_receive_error;
2758                         /*-------- DEBUG LOG --------*/
2759                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2760                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,249,
2761                                         "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2762                                         "return_value: 0");
2763                         }
2764                         /*------ DEBUG LOG END ------*/
2765                         return 0;
2766                 }
2767                 // finished reading all data
2768                 /*-------- DEBUG LOG --------*/
2769                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2770                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,250,
2771                                 "iom->status change: %d->%d",
2772                                 iom->status, iomux_conn_received);
2773                 }
2774                 /*------ DEBUG LOG END ------*/
2775                 iom->status = iomux_conn_received;
2776                 break;
2777         case 0:
2778                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2779                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,251, "peer disconnected");
2780                 }
2781                 /*-------- DEBUG LOG --------*/
2782                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2783                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,252,
2784                                 "iom->status change: %d->%d",
2785                                 iom->status, iomux_conn_disconnected);
2786                 }
2787                 /*------ DEBUG LOG END ------*/
2788                 iom->status =  iomux_conn_disconnected;
2789                 break;
2790         case 1:
2791                 // the data that should be read remains
2792                 // status does not change
2793                 break;
2794         default:
2795                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,37, "error / preread error");
2796                 /*-------- DEBUG LOG --------*/
2797                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2798                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,253,
2799                                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2800                                 "return_value: 0");
2801                 }
2802                 /*------ DEBUG LOG END ------*/
2803                 return 0;
2804         }
2805         /*-------- DEBUG LOG --------*/
2806         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2807                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,254,
2808                         "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2809                         "return_value: 1");
2810         }
2811         /*------ DEBUG LOG END ------*/
2812         return 1;
2813 }
2814
2815 /*!
2816  * send data
2817  *
2818  * @param[in]   iom     connection_iomux
2819  * @param[in]   dest_fd the filedescriptor to be write
2820  * @return      status
2821  * @retval      0       failed 
2822  * @retval      1       succeed
2823  */
2824 static int
2825 l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd)
2826 {
2827         /*-------- DEBUG LOG --------*/
2828         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2829                 char iom_str[DEBUG_STR_LEN] = {0};
2830                 l7vs_iomux_c_str(iom_str, iom);
2831                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,255,
2832                         "in_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2833                         "iom=%s: "
2834                         "dest_fd=%d",
2835                         iom_str, dest_fd);
2836         }
2837         /*------ DEBUG LOG END ------*/
2838
2839         int ret = 0;
2840         struct l7vs_conn *conn = NULL;
2841         char *newbuf = NULL;
2842         size_t sent_len = 0;
2843
2844         if (!iom) {
2845                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,72, "error / iom is null");
2846                 /*-------- DEBUG LOG --------*/
2847                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2848                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,256,
2849                                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2850                                 "return_value: 0");
2851                 }
2852                 /*------ DEBUG LOG END ------*/
2853                 return 0;
2854         }
2855
2856         if (-1 == dest_fd) {
2857                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,73, "error / dest fd is not specified");
2858                 /*-------- DEBUG LOG --------*/
2859                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2860                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,257,
2861                                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2862                                 "return_value: 0");
2863                 }
2864                 /*------ DEBUG LOG END ------*/
2865                 return 0;
2866         }
2867
2868         if (iomux_conn_sending != iom->status &&
2869             iomux_conn_sending_busy != iom->status) {
2870                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,74, "error / invalid status(%d)", iom->status);
2871                 /*-------- DEBUG LOG --------*/
2872                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2873                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,258,
2874                                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2875                                 "return_value: 0");
2876                 }
2877                 /*------ DEBUG LOG END ------*/
2878                 return 0;
2879         }
2880
2881         conn = (struct l7vs_conn *)iom->data;
2882         /*-------- DEBUG LOG --------*/
2883         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2884                 char conn_str[DEBUG_STR_LEN] = {0};
2885                 l7vs_conn_c_str(conn_str, conn);
2886                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,259,
2887                         "pointer_assign: conn=%s",
2888                         conn_str);
2889         }
2890         /*------ DEBUG LOG END ------*/
2891
2892         /*-------- DEBUG LOG --------*/
2893         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2894                 char send_data[DEBUG_STR_LEN] = {0};
2895                 l7vs_conn_dump_data(send_data, conn->cldata, conn->cldata_len);
2896                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,260,
2897                         "send data: %s",
2898                         send_data);
2899         }
2900         /*------ DEBUG LOG END ------*/
2901         // write the data
2902         /*-------- DEBUG LOG --------*/
2903         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2904                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,261,
2905                         "send param: dest_fd=%d: len=%zu: flags=MSG_NOSIGNAL",
2906                         dest_fd, conn->cldata_len);
2907         }
2908         /*------ DEBUG LOG END ------*/
2909         ret = send(dest_fd, conn->cldata, conn->cldata_len, MSG_NOSIGNAL);
2910         /*-------- DEBUG LOG --------*/
2911         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2912                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,262,
2913                         "send result: ret=%d",
2914                         ret);
2915         }
2916         /*------ DEBUG LOG END ------*/
2917         if (0 > ret) {
2918                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,14, "error / send error(%s)", strerror(errno));
2919                 iom->status = iomux_conn_send_error;
2920                 /*-------- DEBUG LOG --------*/
2921                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2922                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,263,
2923                                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2924                                 "return_value: 0");
2925                 }
2926                 /*------ DEBUG LOG END ------*/
2927                 return 0;
2928         }
2929         sent_len = ret;
2930         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2931                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,264, "sent %zu bytes", sent_len);
2932         }
2933
2934         // decide the status
2935         if (conn->cldata_len == sent_len) {
2936                 // finished sending all data
2937                 if (iomux_conn_sending == iom->status) {
2938                         /*-------- DEBUG LOG --------*/
2939                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2940                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,265,
2941                                         "iom->status change: %d->%d",
2942                                         iom->status, iomux_conn_sent);
2943                         }
2944                         /*------ DEBUG LOG END ------*/
2945                         iom->status = iomux_conn_sent;
2946                 } else {
2947                         /*-------- DEBUG LOG --------*/
2948                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2949                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,266,
2950                                         "iom->status change: %d->%d",
2951                                         iom->status, iomux_conn_sent_busy);
2952                         }
2953                         /*------ DEBUG LOG END ------*/
2954                         iom->status = iomux_conn_sent_busy;
2955                 }
2956                 //cldata memory realloc
2957                 conn->cldata_len = 0;
2958                 conn->cldata_bufsize = l7vs_conn_read_bufsize;
2959                 newbuf = (char *)malloc(conn->cldata_bufsize);
2960                 if (!newbuf) {  
2961                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,12, "error / malloc failed");
2962                         iom->status = iomux_conn_send_error;
2963                         /*-------- DEBUG LOG --------*/
2964                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2965                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,267,
2966                                         "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2967                                         "return_value: 0");
2968                         }
2969                         /*------ DEBUG LOG END ------*/
2970                         return 0;
2971                 }
2972                 free(conn->cldata);
2973                 conn->cldata = newbuf;
2974                 memset(conn->cldata, 0, l7vs_conn_read_bufsize);
2975         }
2976         else {
2977                 // shift data for next sending
2978                 newbuf = (char *)malloc((conn->cldata_len - sent_len) + 1);
2979                 if (!newbuf) {  
2980                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,13, "error / malloc failed");
2981                         /*-------- DEBUG LOG --------*/
2982                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2983                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,268,
2984                                         "iom->status change: %d->%d",
2985                                         iom->status, iomux_conn_send_error);
2986                         }
2987                         /*------ DEBUG LOG END ------*/
2988                         iom->status = iomux_conn_send_error;
2989                         /*-------- DEBUG LOG --------*/
2990                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2991                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,269,
2992                                         "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2993                                         "return_value: 0");
2994                         }
2995                         /*------ DEBUG LOG END ------*/
2996                         return 0;
2997                 }
2998                 memcpy(newbuf, (conn->cldata + sent_len), conn->cldata_len - sent_len);
2999                 free(conn->cldata);
3000                 conn->cldata = newbuf;
3001                 conn->cldata_len -= sent_len;
3002                 conn->cldata[conn->cldata_len] = '\0';
3003
3004                 // the data that should be sent remains, status does not change
3005         }
3006
3007         /*-------- DEBUG LOG --------*/
3008         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3009                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,270,
3010                         "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
3011                         "return_value: 1");
3012         }
3013         /*------ DEBUG LOG END ------*/
3014         return 1;
3015
3016 }
3017
3018 /*!
3019  * connect to real server
3020  *
3021  * @param[in]   conn    connection
3022  * @param[in]   dest    destination
3023  * @return      status
3024  * @retval      0       failed 
3025  * @retval      1       succeed
3026  */
3027 int
3028 l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
3029 {
3030         /*-------- DEBUG LOG --------*/
3031         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3032                 char conn_str[DEBUG_STR_LEN] = {0};
3033                 char dest_str[DEBUG_STR_LEN] = {0};
3034                 l7vs_conn_c_str(conn_str, conn);
3035                 l7vs_dest_c_str(dest_str, dest);
3036                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,271,
3037                         "in_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3038                         "conn=%s: "
3039                         "dest=%s",
3040                         conn_str, dest_str);
3041         }
3042         /*------ DEBUG LOG END ------*/
3043
3044         int s;
3045         int stype;
3046         int flags;
3047         int ret;
3048         enum iomaction  action;
3049
3050         if (!conn) {
3051                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,75, "error / conn is null");
3052                 /*-------- DEBUG LOG --------*/
3053                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3054                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,272,
3055                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3056                                 "return_value: 0");
3057                 }
3058                 /*------ DEBUG LOG END ------*/
3059                 return 0;
3060         }
3061         if (!dest) {
3062                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,76, "error / dest is null");
3063                 /*-------- DEBUG LOG --------*/
3064                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3065                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,273,
3066                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3067                                 "return_value: 0");
3068                 }
3069                 /*------ DEBUG LOG END ------*/
3070                 return 0;
3071         }
3072
3073         switch (conn->proto) {
3074         case IPPROTO_TCP:
3075                 stype = SOCK_STREAM;
3076                 break;
3077         case IPPROTO_UDP:
3078                 stype = SOCK_DGRAM;
3079                 break;
3080         default:
3081                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,15, "error / unknown socket type");
3082                 /*-------- DEBUG LOG --------*/
3083                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3084                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,274,
3085                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3086                                 "return_value: 0");
3087                 }
3088                 /*------ DEBUG LOG END ------*/
3089                 return 0;
3090         }
3091
3092         /*-------- DEBUG LOG --------*/
3093         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3094                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,275,
3095                         "socket param: family=PF_INET: type=%d: protocol=%d",
3096                         stype, conn->proto);
3097         }
3098         /*------ DEBUG LOG END ------*/
3099         s = socket(PF_INET, stype, conn->proto);  
3100         if (0 > s) {
3101                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,16, "error / socket error(%s)", strerror(errno));
3102                 /*-------- DEBUG LOG --------*/
3103                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3104                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,276,
3105                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3106                                 "return_value: 0");
3107                 }
3108                 /*------ DEBUG LOG END ------*/
3109                 return 0;
3110         }
3111         
3112         /*-------- DEBUG LOG --------*/
3113         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3114                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,277,
3115                         "fnctl param: s=%d: cmd=F_GETFL: flags=0",
3116                         s);
3117         }
3118         /*------ DEBUG LOG END ------*/
3119         flags = fcntl(s, F_GETFL, 0);
3120         if (0 > flags) {
3121                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,17, "error / fcntl(s=%d,F_GETFL) error(%s)", s,strerror(errno));
3122                 close(s);
3123                 /*-------- DEBUG LOG --------*/
3124                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3125                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,278,
3126                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3127                                 "return_value: 0");
3128                 }
3129                 /*------ DEBUG LOG END ------*/
3130                 return 0;
3131         }
3132         /*-------- DEBUG LOG --------*/
3133         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3134                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,279,
3135                         "fnctl result: flags=%d",
3136                         flags);
3137         }
3138         /*------ DEBUG LOG END ------*/
3139
3140         /*-------- DEBUG LOG --------*/
3141         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3142                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,280,
3143                         "fnctl param: s=%d: cmd=F_SETFL: flags=%d",
3144                         s, (flags | O_NONBLOCK));
3145         }
3146         /*------ DEBUG LOG END ------*/
3147         flags = fcntl(s, F_SETFL, flags | O_NONBLOCK);
3148         if (0 > flags) {
3149                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,18, "error / fcntl(s=%d,F_SETFL) error(%s)", s,strerror(errno));
3150                 close(s);
3151                 /*-------- DEBUG LOG --------*/
3152                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3153                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,281,
3154                                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3155                                 "return_value: 0");
3156                 }
3157                 /*------ DEBUG LOG END ------*/
3158                 return 0;
3159         }
3160         /*-------- DEBUG LOG --------*/
3161         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3162                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,282,
3163                         "fnctl result: flags=%d",
3164                         flags);
3165         }
3166         /*------ DEBUG LOG END ------*/
3167
3168         if (conn->cmss > 0) {
3169                 /*-------- DEBUG LOG --------*/
3170                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3171                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,283,
3172                                 "setsockopt param: s=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: optval=%d: "
3173                                 "len=%zu",
3174                                 s, conn->cmss, sizeof(int));
3175                 }
3176                 /*------ DEBUG LOG END ------*/
3177                 ret = setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &conn->cmss,
3178                                  sizeof(int));
3179                 if (ret < 0) {
3180                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,19, "error / setsockopt(TCP_MAXSEG) error(%s)", strerror(errno));
3181                 }
3182                 /*-------- DEBUG LOG --------*/
3183                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3184                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,284,
3185                                 "setsockopt result: ret=%d: len=%zu",
3186                                 ret, sizeof(int));
3187                 }
3188                 /*------ DEBUG LOG END ------*/
3189         }
3190
3191         /*-------- DEBUG LOG --------*/
3192         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3193                 char addr_str[DEBUG_STR_LEN] = {0};
3194                 l7vs_conn_sockaddr_in_c_str(addr_str, &dest->addr);
3195                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,285,
3196                         "connect param: s=%d: dest->addr=%s: len=%zu",
3197                         s, addr_str, sizeof(struct sockaddr_in));
3198         }
3199         /*------ DEBUG LOG END ------*/
3200         ret = connect(s, (struct sockaddr *)&dest->addr,
3201                       sizeof(struct sockaddr_in)); 
3202         if (0 > ret) {
3203                 if (errno != EINPROGRESS) {
3204                         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,20, "error / connect error(%s)", strerror(errno));
3205                         close(s);
3206                         /*-------- DEBUG LOG --------*/
3207                         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3208                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,286,
3209                                         "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3210                                         "return_value: 0");
3211                         }
3212                         /*------ DEBUG LOG END ------*/
3213                         return 0;
3214                 }
3215         }
3216         /*-------- DEBUG LOG --------*/
3217         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3218                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,287,
3219                         "connect result: ret=%d",
3220                         ret);
3221         }
3222         /*------ DEBUG LOG END ------*/
3223         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3224                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,288, "dest %p nactive %d->%d",
3225                         dest, dest->nactive,
3226                         dest->nactive + 1);
3227         }
3228
3229         action = iom_write;
3230         dest->nactive++;   
3231         conn->dest = dest;
3232         /*-------- DEBUG LOG --------*/
3233         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3234                 char dest_str[DEBUG_STR_LEN] = {0};
3235                 l7vs_dest_c_str(dest_str, conn->dest);
3236                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,289,
3237                         "pointer_assign: conn->dest=%s",
3238                         dest_str);
3239         }
3240         /*------ DEBUG LOG END ------*/
3241         conn->riom->fd = s;
3242         conn->riom->callback = l7vs_conn_rs_callback;
3243         /*-------- DEBUG LOG --------*/
3244         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3245                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,290,
3246                         "pointer_assign: conn->riom->callback=%p",
3247                         conn->riom->callback);
3248         }
3249         /*------ DEBUG LOG END ------*/
3250         conn->riom->data = conn;
3251         /*-------- DEBUG LOG --------*/
3252         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3253                 char conn_str[DEBUG_STR_LEN] = {0};
3254                 l7vs_conn_c_str(conn_str, conn);
3255                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,291,
3256                         "pointer_assign: conn->riom->data=%s",
3257                         conn_str);
3258         }
3259         /*------ DEBUG LOG END ------*/
3260         l7vs_iomux_add(conn->riom, action);
3261
3262         /*-------- DEBUG LOG --------*/
3263         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3264                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,292,
3265                         "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3266                         "return_value: 1");
3267         }
3268
3269         if ( dest ){
3270                 /*-------- DEBUG LOG --------*/
3271                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3272                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
3273                                 "RealServer Connecting Count : nactive is %d",
3274                                 dest->nactive);
3275                 }
3276                 /*-------- DEBUG LOG --------*/
3277
3278                 /*-------- INFO LOG (Access Log) --------*/
3279                 if (LOG_LV_INFO >= logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3280                         char addr_str_tmp[ADDR_STR_LEN] = {0};
3281                         memcpy(addr_str_tmp, inet_ntoa(conn->caddr.sin_addr), ADDR_STR_LEN);
3282                         LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,342,
3283                                 "[[AccessLog] (SRC)%s:%d -> (DST)%s:%d ]",
3284                                 addr_str_tmp,
3285                                 ntohs(conn->caddr.sin_port),
3286                                 inet_ntoa(conn->dest->addr.sin_addr),
3287                                 ntohs(conn->dest->addr.sin_port));
3288                 }
3289                 /*------ INFO LOG END (Access Log) ------*/
3290         }
3291
3292         /*------ DEBUG LOG END ------*/
3293         return 1;
3294 }
3295
3296 /*!
3297  * close client socket 
3298  *
3299  * @param[in]   conn    connection
3300  * @return      void 
3301  */
3302 void
3303 l7vs_conn_close_csock(struct l7vs_conn *conn)
3304 {
3305         /*-------- DEBUG LOG --------*/
3306         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3307                 char conn_str[DEBUG_STR_LEN] = {0};
3308                 l7vs_conn_c_str(conn_str, conn);
3309                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,293,
3310                         "in_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3311                         "conn=%s",
3312                         conn_str);
3313         }
3314         /*------ DEBUG LOG END ------*/
3315
3316         if (!conn) {
3317                 /*-------- DEBUG LOG --------*/
3318                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3319                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,294,
3320                                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3321                                 "return_value: void");
3322                 }
3323                 /*------ DEBUG LOG END ------*/
3324                 return;
3325         }
3326         if (!conn->ciom) {
3327                 /*-------- DEBUG LOG --------*/
3328                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3329                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,295,
3330                                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3331                                 "return_value: void");
3332                 }
3333                 /*------ DEBUG LOG END ------*/
3334                 return;
3335         }
3336         if (-1 == conn->ciom->fd) {
3337                 /*-------- DEBUG LOG --------*/
3338                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3339                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,296,
3340                                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3341                                 "return_value: void");
3342                 }
3343                 /*------ DEBUG LOG END ------*/
3344                 return;
3345         }
3346
3347         l7vs_iomux_remove(conn->ciom);
3348         /*-------- DEBUG LOG --------*/
3349         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3350                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,297,
3351                         "close: conn->ciom->fd=%d",
3352                         conn->ciom->fd);
3353         }
3354         /*------ DEBUG LOG END ------*/
3355         close(conn->ciom->fd);
3356         conn->ciom->fd = -1;
3357
3358         /*-------- DEBUG LOG --------*/
3359         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3360                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,298,
3361                         "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3362                         "return_value: void");
3363         }
3364         /*------ DEBUG LOG END ------*/
3365 }
3366
3367 /*!
3368  * close real server socket
3369  *
3370  * @param[in]   conn    connection
3371  * @return      void 
3372  */
3373 void
3374 l7vs_conn_close_rsock(struct l7vs_conn *conn)
3375 {
3376         /*-------- DEBUG LOG --------*/
3377         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3378                 char conn_str[DEBUG_STR_LEN] = {0};
3379                 l7vs_conn_c_str(conn_str, conn);
3380                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,299,
3381                         "in_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3382                         "conn=%s",
3383                         conn_str);
3384         }
3385         /*------ DEBUG LOG END ------*/
3386
3387         if (!conn) {
3388                 /*-------- DEBUG LOG --------*/
3389                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3390                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,300,
3391                                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3392                                 "return_value: void");
3393                 }
3394                 /*------ DEBUG LOG END ------*/
3395                 return;
3396         }
3397         if (!conn->riom) {
3398                 /*-------- DEBUG LOG --------*/
3399                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3400                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,301,
3401                                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3402                                 "return_value: void");
3403                 }
3404                 /*------ DEBUG LOG END ------*/
3405                 return;
3406         }
3407         if (-1 == conn->riom->fd) {
3408                 /*-------- DEBUG LOG --------*/
3409                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3410                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,302,
3411                                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3412                                 "return_value: void");
3413                 }
3414                 /*------ DEBUG LOG END ------*/
3415                 return;
3416         }
3417
3418         if (conn->dest) {
3419                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3420                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,303, "dest %p nactive %d->%d",
3421                                 conn->dest, conn->dest->nactive,
3422                                 conn->dest->nactive - 1);
3423                 }
3424                 conn->dest->nactive--;
3425                 conn->dest->ninact++;
3426                 if(conn->dest->ninact == INT_MAX) {
3427                         conn->dest->ninact = 0;
3428                 }
3429
3430                 /*-------- DEBUG LOG --------*/
3431                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3432                                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,343,
3433                                 "RealServer Connected Count : ninact is %d",
3434                                 conn->dest->ninact);
3435                 }
3436                 /*------ DEBUG LOG END ------*/
3437         }
3438
3439         l7vs_iomux_remove(conn->riom);
3440         /*-------- DEBUG LOG --------*/
3441         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3442                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,304,
3443                         "close: conn->riom->fd=%d",
3444                         conn->riom->fd);
3445         }
3446         /*------ DEBUG LOG END ------*/
3447         close(conn->riom->fd);
3448         conn->riom->fd = -1;
3449
3450         /*-------- DEBUG LOG --------*/
3451         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3452                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,305,
3453                         "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3454                         "return_value: void");
3455         }
3456         /*------ DEBUG LOG END ------*/
3457 }
3458
3459 /*!
3460  * confirmation of whether conn is closed
3461  *
3462  * @param[in]   conn    connection
3463  * @return      closed or not
3464  * @retval      0       not closed 
3465  * @retval      1       closed
3466  */
3467 int
3468 l7vs_conn_closed(struct l7vs_conn *conn)
3469 {
3470         /*-------- DEBUG LOG --------*/
3471         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3472                 char conn_str[DEBUG_STR_LEN] = {0};
3473                 l7vs_conn_c_str(conn_str, conn);
3474                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,306,
3475                         "in_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3476                         "conn=%s",
3477                         conn_str);
3478         }
3479         /*------ DEBUG LOG END ------*/
3480
3481         if (!conn) {
3482                 /*-------- DEBUG LOG --------*/
3483                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3484                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,307,
3485                                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3486                                 "return_value: 1");
3487                 }
3488                 /*------ DEBUG LOG END ------*/
3489                 return 1;
3490         }
3491         if ((conn->ciom && -1 != conn->ciom->fd) || (conn->riom && -1 != conn->riom->fd)) {
3492                 /*-------- DEBUG LOG --------*/
3493                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3494                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,308,
3495                                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3496                                 "return_value: 0");
3497                 }
3498                 /*------ DEBUG LOG END ------*/
3499                 return 0;
3500         } else {
3501                 /*-------- DEBUG LOG --------*/
3502                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3503                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,309,
3504                                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3505                                 "return_value: 1");
3506                 }
3507                 /*------ DEBUG LOG END ------*/
3508                 return 1;
3509         }
3510 }
3511
3512 /*!
3513  * Change connection to specified destination (to real-server or sorry-server).
3514  *
3515  * @param[in]   *conn           connection pointer
3516  * @param[in]   *dest           destination pointer
3517  * @return      int             change connection result 0=NG, 1=OK
3518  */
3519 static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
3520 {
3521         /*-------- DEBUG LOG --------*/
3522         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3523                 char conn_str[DEBUG_STR_LEN] = {0};
3524                 char dest_str[DEBUG_STR_LEN] = {0};
3525                 l7vs_conn_c_str(conn_str, conn);
3526                 l7vs_dest_c_str(dest_str, dest);
3527                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,310,
3528                         "in_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3529                         "conn=%s: "
3530                         "dest=%s",
3531                         conn_str, dest_str);
3532         }
3533         /*------ DEBUG LOG END ------*/
3534
3535         int ret;
3536
3537         if (!conn) {
3538                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,77, "error / conn is null");
3539                 /*-------- DEBUG LOG --------*/
3540                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3541                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,311,
3542                                 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3543                                 "return_value: 0");
3544                 }
3545                 /*------ DEBUG LOG END ------*/
3546                 return 0;
3547         }
3548         if (!dest) {
3549                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,78, "error / dest is null");
3550                 /*-------- DEBUG LOG --------*/
3551                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3552                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,312,
3553                                 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3554                                 "return_value: 0");
3555                 }
3556                 /*------ DEBUG LOG END ------*/
3557                 return 0;
3558         }
3559         // save old destination
3560         conn->old_dest = conn->dest;
3561         /*-------- DEBUG LOG --------*/
3562         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3563                 char old_dest_str[DEBUG_STR_LEN] = {0};
3564                 l7vs_dest_c_str(old_dest_str, conn->old_dest);
3565                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
3566                         "pointer_assign: conn->old_dest=%s",
3567                         old_dest_str);
3568         }
3569         /*------ DEBUG LOG END ------*/
3570         // close real-server connection
3571         l7vs_conn_close_rsock(conn);
3572         // connect to new destination
3573         ret = l7vs_conn_connect_rs(conn, dest);
3574
3575         /*-------- DEBUG LOG --------*/
3576         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3577                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,314,
3578                         "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3579                         "return_value: %d",
3580                         ret);
3581         }
3582         /*------ DEBUG LOG END ------*/
3583         return ret;
3584 }
3585
3586 /*!
3587  * Judges from the data size received last time and recieve-interval
3588  *
3589  * @param[in]   *conn           connection pointer
3590  * @param[in]   direction       traffic direction
3591  * @return      int             permitte for recv function call 0=NG(not permitted), 1=OK(permitted)
3592  */
3593 static int
3594 l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction )
3595 {
3596         /*-------- DEBUG LOG --------*/
3597         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3598                 char conn_str[DEBUG_STR_LEN] = {0};
3599                 l7vs_conn_c_str(conn_str, conn);
3600                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,315,
3601                         "in_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3602                         "conn=%s, direction=%d",
3603                         conn_str, direction);
3604         }
3605         /*------ DEBUG LOG END ------*/
3606
3607         if (!conn) {
3608                 /*-------- DEBUG LOG --------*/
3609                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3610                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,316,
3611                                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3612                                 "return_value: 1");
3613                 }
3614                 /*------ DEBUG LOG END ------*/
3615                 return 1;
3616         }
3617         if (!conn->srv) {
3618                 /*-------- DEBUG LOG --------*/
3619                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3620                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
3621                                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3622                                 "return_value: 1");
3623                 }
3624                 /*------ DEBUG LOG END ------*/
3625                 return 1;
3626         }
3627
3628         struct timeval CurrTime;
3629         gettimeofday( &CurrTime, NULL );
3630         /*-------- DEBUG LOG --------*/
3631         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3632                 char time_str[DEBUG_STR_LEN] = {0};
3633                 snprintf(time_str, DEBUG_STR_LEN,
3634                         "timeval="
3635                         "{tv_sec=%ld: "
3636                         "tv_usec=%ld}"
3637                         , CurrTime.tv_sec
3638                         , CurrTime.tv_usec);
3639                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
3640                         "gettimeofday result: CurrTime=%s",
3641                         time_str);
3642         }
3643         /*------ DEBUG LOG END ------*/
3644
3645     unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3646     l7vs_service_update_throughput(conn->srv, cur_recvtime);
3647
3648     switch (direction) {
3649     case QOS_UP:
3650         //QoS Control check : to server
3651         conn->srv->throughput_to_server = conn->srv->cur_recvsize_from_client * 1000000ULL / throughput_interval;
3652         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3653             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,323, "QoS threshold to server:%lld ", conn->srv->qos_threshold_up);
3654             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,324, "(current throughput:%lld)", conn->srv->throughput_to_server);
3655         }
3656         if( (conn->srv->qos_threshold_up) && (conn->srv->throughput_to_server + l7vs_conn_read_bufsize > conn->srv->qos_threshold_up) ){
3657             if (conn->srv->qos_up_flag == 0) {
3658                 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,1, "Start QoS traffic control to server.");
3659                 conn->srv->qos_up_flag = 1;
3660             }
3661             /*-------- DEBUG LOG --------*/
3662             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3663                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,326,
3664                     "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3665                     "return_value: 0");
3666             }
3667             /*------ DEBUG LOG END ------*/
3668             return 0;
3669         }
3670         if (conn->srv->qos_up_flag == 1) {
3671             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,2, "Stop QoS traffic control to server.");
3672             conn->srv->qos_up_flag = 0;
3673         }
3674         break;
3675     case QOS_DOWN:
3676         //QoS Control check : to client
3677         conn->srv->throughput_to_client = conn->srv->cur_recvsize_from_server * 1000000ULL / throughput_interval;
3678         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3679             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,323, "QoS threshold to client:%lld ", conn->srv->qos_threshold_down);
3680             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,324, "(current throughput:%lld)", conn->srv->throughput_to_client);
3681         }
3682         if( (conn->srv->qos_threshold_down) && (conn->srv->throughput_to_client + l7vs_conn_read_bufsize > conn->srv->qos_threshold_down) ){
3683             if (conn->srv->qos_down_flag == 0) {
3684                 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,3, "Start QoS traffic control to client.");
3685                 conn->srv->qos_down_flag = 1;
3686             }
3687             /*-------- DEBUG LOG --------*/
3688             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3689                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,326,
3690                     "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3691                     "return_value: 0");
3692             }
3693             /*------ DEBUG LOG END ------*/
3694             return 0;
3695         }
3696         if (conn->srv->qos_down_flag == 1) {
3697             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,4, "Stop QoS traffic control to client.");
3698             conn->srv->qos_down_flag = 0;
3699         }
3700         break;
3701     default:
3702         /*-------- DEBUG LOG --------*/
3703         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3704             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
3705                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3706                 "return_value: 1");
3707         }
3708         /*------ DEBUG LOG END ------*/
3709         return 1;
3710     }
3711
3712         /*-------- DEBUG LOG --------*/
3713         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3714                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,335,
3715                         "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn ) "
3716                         "return_value: 1");
3717         }
3718         /*------ DEBUG LOG END ------*/
3719         return 1;
3720 }
3721
3722 /*!
3723  * Regsiter recive time and recieved data size
3724  *
3725  * @param[in]   *conn           connection pointer
3726  * @param[in]   in_recvsize     recieved size
3727  * @param[in]   direction   traffic direction
3728  * @return      void 
3729  */
3730 static void
3731 l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction )
3732 {
3733         /*-------- DEBUG LOG --------*/
3734         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3735                 char conn_str[DEBUG_STR_LEN] = {0};
3736                 l7vs_conn_c_str(conn_str, conn);
3737                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,336,
3738                         "in_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3739                         "conn=%s: "
3740                         "in_recvsize=%zu",
3741                         conn_str, in_recvsize);
3742         }
3743         /*------ DEBUG LOG END ------*/
3744
3745         if (!conn) {
3746                 /*-------- DEBUG LOG --------*/
3747                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3748                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,337,
3749                                 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3750                                 "return_value: void");
3751                 }
3752                 /*------ DEBUG LOG END ------*/
3753                 return;
3754         }
3755         if (!conn->srv) {
3756                 /*-------- DEBUG LOG --------*/
3757                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3758                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,338,
3759                                 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3760                                 "return_value: void");
3761                 }
3762                 /*------ DEBUG LOG END ------*/
3763                 return;
3764         }
3765         struct timeval CurrTime;
3766         gettimeofday( &CurrTime, NULL );
3767         /*-------- DEBUG LOG --------*/
3768         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3769                 char time_str[DEBUG_STR_LEN] = {0};
3770                 snprintf(time_str, DEBUG_STR_LEN,
3771                         "timeval="
3772                         "{tv_sec=%ld: "
3773                         "tv_usec=%ld}"
3774                         , CurrTime.tv_sec
3775                         , CurrTime.tv_usec);
3776                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
3777                         "gettimeofday result: CurrTime=%s",
3778                         time_str);
3779         }
3780         /*------ DEBUG LOG END ------*/
3781
3782     int throughput_interval = BPS_DEFAULT_INTERVAL;
3783     if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
3784         throughput_interval = parameter_get_int_value( PARAM_COMP_L7VSD, "calc_throughput_interval" );
3785     }
3786     unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3787     l7vs_service_update_throughput(conn->srv, cur_recvtime);
3788
3789     switch (direction) {
3790     case QOS_UP:
3791         conn->srv->cur_recvsize_from_client += in_recvsize;
3792         break;
3793     case QOS_DOWN:
3794         conn->srv->cur_recvsize_from_server += in_recvsize;
3795         break;
3796     default:
3797         break;
3798     }
3799
3800         /*-------- DEBUG LOG --------*/
3801         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3802                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,340,
3803                         "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3804                         "return_value: void");
3805         }
3806         /*------ DEBUG LOG END ------*/
3807 }
3808