OSDN Git Service

Update INSTALL.ja.utf-8 for new release.
[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,353,
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,38, "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,39, "error / client connect rs failed");
426                 }
427                 break;
428             default:
429                 //invalid status
430                 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,79, "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     struct l7vs_dest *d;    // destination for sorry-server
1009     int sorry_state;        // sorry state
1010
1011     struct l7vs_lsock *lsock = NULL;
1012
1013     if (!iom) {
1014         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,36, "error / iom is null");
1015         /*-------- DEBUG LOG --------*/
1016         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1017             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,112,
1018                 "out_function: static int l7vs_conn_is_rs_connected("
1019                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1020                 "return_value: 0");
1021         }
1022         /*------ DEBUG LOG END ------*/
1023         return 0;
1024     }
1025
1026     if (!conn) {
1027         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,37, "error / conn is null");
1028         /*-------- DEBUG LOG --------*/
1029         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1030             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,113,
1031                 "out_function: static int l7vs_conn_is_rs_connected("
1032                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1033                 "return_value: 0");
1034         }
1035         /*------ DEBUG LOG END ------*/
1036         return 0;
1037     }
1038
1039     if (iomux_conn_received != iom->status) {
1040         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,38, "error / invalid status(%d)", iom->status);
1041         /*-------- DEBUG LOG --------*/
1042         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1043             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,114,
1044                 "out_function: static int l7vs_conn_is_rs_connected("
1045                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1046                 "return_value: 0");
1047         }
1048         /*------ DEBUG LOG END ------*/
1049         return 0;
1050     }
1051
1052     lsock = conn->lsock;
1053     /*-------- DEBUG LOG --------*/
1054     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1055         char lsock_str[DEBUG_STR_LEN] = {0};
1056         l7vs_lsock_c_str(lsock_str, lsock);
1057         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,115,
1058             "pointer_assign: lsock=%s",
1059             lsock_str);
1060     }
1061     /*------ DEBUG LOG END ------*/
1062
1063     //is real server connected?
1064     if (-1 != conn->riom->fd) {
1065         // check sorry status of service
1066         // argment 0 means no connection count check
1067         sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
1068         if (sorry_state) {
1069             // check connect to sorry-server now
1070             if (!conn->sorry_conn_flag) {
1071                 // get sorry-server destination (argment 0)
1072                 d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
1073                 /*-------- DEBUG LOG --------*/
1074                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1075                     char sorry_dest_str1[DEBUG_STR_LEN] = {0};
1076                     l7vs_dest_c_str(sorry_dest_str1, d);
1077                     LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
1078                         "pointer_assign: d=%s",
1079                         sorry_dest_str1);
1080                 }
1081                 /*------ DEBUG LOG END ------*/
1082                 if (!d) {
1083                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
1084                     /*-------- DEBUG LOG --------*/
1085                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1086                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
1087                             "iom->status change: %d->%d",
1088                             iom->status, iomux_conn_rs_connect_error);
1089                     }
1090                     /*------ DEBUG LOG END ------*/
1091                     iom->status = iomux_conn_rs_connect_error;
1092                     /*-------- DEBUG LOG --------*/
1093                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1094                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
1095                             "out_function: static int l7vs_conn_is_rs_connected("
1096                             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1097                             "return_value: 0");
1098                     }
1099                     /*------ DEBUG LOG END ------*/
1100                     return 0;
1101                 }
1102                 conn->old_dest = conn->dest;
1103                 /*-------- DEBUG LOG --------*/
1104                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1105                     char old_dest_str[DEBUG_STR_LEN] = {0};
1106                     l7vs_dest_c_str(old_dest_str, conn->old_dest);
1107                     LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
1108                         "pointer_assign: conn->old_dest=%s",
1109                         old_dest_str);
1110                 }
1111                 /*------ DEBUG LOG END ------*/
1112                 // change connection to sorry-server
1113                 if (!l7vs_conn_change_connect_rs(conn, d)) {
1114                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
1115                     /*-------- DEBUG LOG --------*/
1116                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1117                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
1118                             "iom->status change: %d->%d",
1119                             iom->status, iomux_conn_rs_connect_error);
1120                     }
1121                     /*------ DEBUG LOG END ------*/
1122                     iom->status = iomux_conn_rs_connect_error;
1123                     /*-------- DEBUG LOG --------*/
1124                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1125                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
1126                             "out_function: static int l7vs_conn_is_rs_connected("
1127                             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1128                             "return_value: 0");
1129                     }
1130                     /*------ DEBUG LOG END ------*/
1131                     return 0;
1132                 }
1133                 conn->sorry_conn_flag = 1;
1134             }
1135         } else {
1136             // check connect to sorry-server now
1137             if (conn->sorry_conn_flag) {
1138                 // get old real-server destination (argment 1)
1139                 d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
1140                 /*-------- DEBUG LOG --------*/
1141                 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1142                     char sorry_dest_str2[DEBUG_STR_LEN] = {0};
1143                     l7vs_dest_c_str(sorry_dest_str2, d);
1144                     LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
1145                         "pointer_assign: d=%s",
1146                         sorry_dest_str2);
1147                 }
1148                 /*------ DEBUG LOG END ------*/
1149                 if (!d) {
1150                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
1151                     /*-------- DEBUG LOG --------*/
1152                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1153                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
1154                             "iom->status change: %d->%d",
1155                             iom->status, iomux_conn_rs_connect_error);
1156                     }
1157                     /*------ DEBUG LOG END ------*/
1158                     iom->status = iomux_conn_rs_connect_error;
1159                     /*-------- DEBUG LOG --------*/
1160                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1161                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
1162                             "out_function: static int l7vs_conn_is_rs_connected("
1163                             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1164                             "return_value: 0");
1165                     }
1166                     /*------ DEBUG LOG END ------*/
1167                     return 0;
1168                 }
1169                 // change connection to real-server
1170                 if (!l7vs_conn_change_connect_rs(conn, d)) {
1171                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
1172                     /*-------- DEBUG LOG --------*/
1173                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1174                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
1175                             "iom->status change: %d->%d",
1176                             iom->status, iomux_conn_rs_connect_error);
1177                     }
1178                     /*------ DEBUG LOG END ------*/
1179                     iom->status = iomux_conn_rs_connect_error;
1180                     /*-------- DEBUG LOG --------*/
1181                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1182                         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
1183                             "out_function: static int l7vs_conn_is_rs_connected("
1184                             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1185                             "return_value: 0");
1186                     }
1187                     /*------ DEBUG LOG END ------*/
1188                     return 0;
1189                 }
1190                 conn->sorry_conn_flag = 0;
1191             }
1192         }
1193         /*-------- DEBUG LOG --------*/
1194         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1195             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,127,
1196                 "iom->status change: %d->%d",
1197                 iom->status, iomux_conn_block);
1198         }
1199         /*------ DEBUG LOG END ------*/
1200         iom->status = iomux_conn_block;
1201         if (iomux_conn_busy == conn->riom->status) {
1202             /*-------- DEBUG LOG --------*/
1203             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1204                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,128,
1205                     "conn->riom->status change: %d->%d",
1206                     conn->riom->status, iomux_conn_sending_busy);
1207             }
1208             /*------ DEBUG LOG END ------*/
1209             conn->riom->status = iomux_conn_sending_busy;
1210         }
1211         else {
1212             /*-------- DEBUG LOG --------*/
1213             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1214                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,129,
1215                     "conn->riom->status change: %d->%d",
1216                     conn->riom->status, iomux_conn_sending);
1217             }
1218             /*------ DEBUG LOG END ------*/
1219             conn->riom->status = iomux_conn_sending;
1220         }
1221         //epoll re-registration for write
1222         l7vs_iomux_mod(conn->riom, iom_write);
1223     }
1224     else {
1225         //select service
1226         ret = l7vs_lsock_select_service(lsock, conn, conn->cldata,
1227                         conn->cldata_len, srv, dest);
1228         if (0 >= ret) {
1229             *srv = NULL;
1230             *dest = NULL;
1231             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,22, "error / no matching service found");
1232             /*-------- DEBUG LOG --------*/
1233             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1234                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,130,
1235                     "iom->status change: %d->%d",
1236                     iom->status, iomux_conn_receive_error);
1237             }
1238             /*------ DEBUG LOG END ------*/
1239             iom->status = iomux_conn_receive_error;
1240             /*-------- DEBUG LOG --------*/
1241             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1242                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,131,
1243                     "out_function: static int l7vs_conn_is_rs_connected("
1244                     "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1245                     "return_value: 0");
1246             }
1247             /*------ DEBUG LOG END ------*/
1248             return 0;
1249         }
1250         /*-------- DEBUG LOG --------*/
1251         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1252             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,132,
1253                 "iom->status change: %d->%d",
1254                 iom->status, iomux_conn_service_selected);
1255         }
1256         /*------ DEBUG LOG END ------*/
1257         iom->status = iomux_conn_service_selected;
1258     }
1259
1260     // analyze and modify client data
1261     if (conn->srv) {
1262         ret = conn->srv->pm->analyze_cldata(conn->srv, conn, conn->cldata, &conn->cldata_len);
1263         if (ret != 0) {
1264             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_PROTOCOL,19,
1265                 "Failed to modify client data: %d", ret);
1266         }
1267     }
1268
1269     /*-------- DEBUG LOG --------*/
1270     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1271         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,133,
1272             "out_function: static int l7vs_conn_is_rs_connected("
1273             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1274             "return_value: 1");
1275     }
1276     /*------ DEBUG LOG END ------*/
1277     return 1;
1278 }
1279
1280 /*!
1281  * connecction establish
1282  *
1283  * @param[in]   iom     connection_iomux
1284  * @param[in]   conn    connection
1285  * @param[in]   srv     service
1286  * @param[in]   dest    destination(real server)
1287  * @return      status
1288  * @retval      0       failed
1289  * @retval      1       succeed
1290  */
1291 static int
1292 l7vs_conn_connection_establish(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)
1293 {
1294     /*-------- DEBUG LOG --------*/
1295     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1296         char iom_str[DEBUG_STR_LEN] = {0};
1297         char conn_str[DEBUG_STR_LEN] = {0};
1298         char srv_str[DEBUG_STR_LEN] = {0};
1299         char dest_str[DEBUG_STR_LEN] = {0};
1300         l7vs_iomux_c_str(iom_str, iom);
1301         l7vs_conn_c_str(conn_str, conn);
1302         l7vs_service_c_str(srv_str, srv);
1303         l7vs_dest_c_str(dest_str, dest);
1304         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,134,
1305             "in_function: static int l7vs_conn_connection_establish("
1306             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1307             "iom=%s: "
1308             "conn=%s: "
1309             "srv=%s: "
1310             "dest=%s",
1311             iom_str, conn_str, srv_str, dest_str);
1312     }
1313     /*------ DEBUG LOG END ------*/
1314     int ret = 0;
1315
1316     if (!iom) {
1317         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,39, "error / iom is null");
1318         /*-------- DEBUG LOG --------*/
1319         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1320             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,135,
1321                 "out_function: static int l7vs_conn_connection_establish("
1322                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1323                 "return_value: 0");
1324         }
1325         /*------ DEBUG LOG END ------*/
1326         return 0;
1327     }
1328
1329     if (!conn) {
1330         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,40, "error / conn is null");
1331         /*-------- DEBUG LOG --------*/
1332         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1333             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,136,
1334                 "out_function: static int l7vs_conn_connection_establish("
1335                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1336                 "return_value: 0");
1337         }
1338         /*------ DEBUG LOG END ------*/
1339         return 0;
1340     }
1341
1342     if (!srv) {
1343         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,41, "error / srv is null");
1344         /*-------- DEBUG LOG --------*/
1345         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1346             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,137,
1347                 "out_function: static int l7vs_conn_connection_establish("
1348                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1349                 "return_value: 0");
1350         }
1351         /*------ DEBUG LOG END ------*/
1352         return 0;
1353     }
1354
1355     if (!dest) {
1356         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,42, "error / dest is null");
1357         /*-------- DEBUG LOG --------*/
1358         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1359             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,138,
1360                 "out_function: static int l7vs_conn_connection_establish("
1361                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1362                 "return_value: 0");
1363         }
1364         /*------ DEBUG LOG END ------*/
1365         return 0;
1366     }
1367
1368     if (iom->status != iomux_conn_service_selected) {
1369         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,43, "error / invalid status(%d)", iom->status);
1370         /*-------- DEBUG LOG --------*/
1371         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1372             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,139,
1373                 "out_function: static int l7vs_conn_connection_establish("
1374                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1375                 "return_value: 0");
1376         }
1377         /*------ DEBUG LOG END ------*/
1378         return 0;
1379     }
1380
1381     // connect to real server
1382     if (!l7vs_conn_connect_rs(conn, dest)) {
1383         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,23, "error / connect rs failed");
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,140,
1387                 "iom->status change: %d->%d",
1388                 iom->status, iomux_conn_rs_connect_error);
1389         }
1390         /*------ DEBUG LOG END ------*/
1391         iom->status = iomux_conn_rs_connect_error;
1392         /*-------- DEBUG LOG --------*/
1393         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1394             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,141,
1395                 "out_function: static int l7vs_conn_connection_establish("
1396                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1397                 "return_value: 0");
1398         }
1399         /*------ DEBUG LOG END ------*/
1400         return 0;
1401     }
1402     /*-------- DEBUG LOG --------*/
1403     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1404         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,142,
1405             "iom->status change: %d->%d",
1406             iom->status, iomux_conn_rs_connected);
1407     }
1408     /*------ DEBUG LOG END ------*/
1409     iom->status = iomux_conn_rs_connected;
1410
1411     // set pointer for cross reference
1412     conn->srv = srv;
1413     /*-------- DEBUG LOG --------*/
1414     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1415         char service_str[DEBUG_STR_LEN] = {0};
1416         l7vs_service_c_str(service_str, conn->srv);
1417         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,143,
1418             "pointer_assign: conn->srv=%s",
1419             service_str);
1420     }
1421     /*------ DEBUG LOG END ------*/
1422     l7vs_service_register_conn(srv, conn);
1423
1424     // service establish
1425     ret = l7vs_service_establish(conn->srv, conn);
1426     if (0 > ret) {
1427         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,24, "error / service establish failed");
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,144,
1431                 "iom->status change: %d->%d",
1432                 iom->status, iomux_conn_rs_connect_error);
1433         }
1434         /*------ DEBUG LOG END ------*/
1435         iom->status = iomux_conn_rs_connect_error;
1436         /*-------- DEBUG LOG --------*/
1437         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1438             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,145,
1439                 "out_function: static int l7vs_conn_connection_establish("
1440                 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1441                 "return_value: 0");
1442         }
1443         /*------ DEBUG LOG END ------*/
1444         return 0;
1445     }
1446     
1447     // iom status set 
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,146,
1451             "iom->status change: %d->%d",
1452             iom->status, iomux_conn_block);
1453     }
1454     /*------ DEBUG LOG END ------*/
1455     iom->status = iomux_conn_block;
1456     /*-------- DEBUG LOG --------*/
1457     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1458         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,147,
1459             "conn->riom->status change: %d->%d",
1460             conn->riom->status, iomux_conn_sending);
1461     }
1462     /*------ DEBUG LOG END ------*/
1463     conn->riom->status = iomux_conn_sending;
1464
1465     /*-------- DEBUG LOG --------*/
1466     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1467         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,148,
1468             "out_function: static int l7vs_conn_connection_establish("
1469             "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1470             "return_value: 1");
1471     }
1472     /*------ DEBUG LOG END ------*/
1473     return 1;
1474 }
1475
1476 /*!
1477  * block status:
1478  * when block status, arrived data turn next epoll reaction
1479  * and changes state to busy, expect the another iom is already busy
1480  *
1481  * @param[in]   iom         connection_iomux
1482  * @param[in]   another_iom another side's iomux
1483  * @return      status
1484  * @retval      0       failed
1485  * @retval      1       succeed
1486  */
1487 static int
1488 l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1489 {
1490     /*-------- DEBUG LOG --------*/
1491     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1492         char iom_str[DEBUG_STR_LEN] = {0};
1493         char a_iom_str[DEBUG_STR_LEN] = {0};
1494         l7vs_iomux_c_str(iom_str, iom);
1495         l7vs_iomux_c_str(a_iom_str, another_iom);
1496         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,149,
1497             "in_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1498             "iom=%s: "
1499             "another_iom=%s",
1500             iom_str, a_iom_str);
1501     }
1502     /*------ DEBUG LOG END ------*/
1503
1504     if (!iom) {
1505         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,44, "error / iom is null");
1506         /*-------- DEBUG LOG --------*/
1507         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1508             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,150,
1509                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1510                 "return_value: 0");
1511         }
1512         /*------ DEBUG LOG END ------*/
1513         return 0;
1514     }
1515
1516     if (!another_iom) {
1517         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,45, "error / another_iom is null");
1518         /*-------- DEBUG LOG --------*/
1519         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1520             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,151,
1521                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1522                 "return_value: 0");
1523         }
1524         /*------ DEBUG LOG END ------*/
1525         return 0;
1526     }
1527
1528     if (iomux_conn_block != iom->status) {
1529         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,46, "error / invalid status(%d)", iom->status);
1530         /*-------- DEBUG LOG --------*/
1531         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1532             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,152,
1533                 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1534                 "return_value: 0");
1535         }
1536         /*------ DEBUG LOG END ------*/
1537         return 0;
1538     }
1539
1540     // epoll re-registraion for read
1541     l7vs_iomux_mod(iom, iom_read);
1542
1543     // when another iom status is busy, do not change my status
1544     if (iomux_conn_busy != another_iom->status &&
1545         iomux_conn_sending_busy != another_iom->status &&
1546         iomux_conn_sent_busy != another_iom->status) {
1547         /*-------- DEBUG LOG --------*/
1548         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1549             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,153,
1550                 "iom->status change: %d->%d",
1551                 iom->status, iomux_conn_busy);
1552         }
1553         /*------ DEBUG LOG END ------*/
1554         iom->status = iomux_conn_busy;
1555     }
1556
1557     /*-------- DEBUG LOG --------*/
1558     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1559         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,154,
1560             "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1561             "return_value: 1");
1562     }
1563     /*------ DEBUG LOG END ------*/
1564     return 1;
1565 }
1566
1567 /*!
1568  * busy status:
1569  * when busy status, arrived data turn next epoll reaction and status keep busy
1570  *
1571  * @param[in]   iom     connection_iomux
1572  * @return      status
1573  * @retval      0       failed
1574  * @retval      1       succeed
1575  */
1576 static int
1577 l7vs_conn_busy(struct l7vs_iomux *iom)
1578 {
1579     /*-------- DEBUG LOG --------*/
1580     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1581         char iom_str[DEBUG_STR_LEN] = {0};
1582         l7vs_iomux_c_str(iom_str, iom);
1583         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,155,
1584             "in_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1585             "iom=%s",
1586             iom_str);
1587     }
1588     /*------ DEBUG LOG END ------*/
1589
1590     if (!iom) {
1591         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,47, "error / iom is null");
1592         /*-------- DEBUG LOG --------*/
1593         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1594             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,156,
1595                 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1596                 "return_value: 0");
1597         }
1598         /*------ DEBUG LOG END ------*/
1599         return 0;
1600     }
1601
1602     if (iomux_conn_busy != iom->status) {
1603         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,48, "error / invalid status(%d)", iom->status);
1604         /*-------- DEBUG LOG --------*/
1605         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1606             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,157,
1607                 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1608                 "return_value: 0");
1609         }
1610         /*------ DEBUG LOG END ------*/
1611         return 0;
1612     }
1613
1614     //epoll re-registration for read
1615     // l7vs_iomux_mod(iom, iom_read);
1616
1617     /*-------- DEBUG LOG --------*/
1618     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1619         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,158,
1620             "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1621             "return_value: 1");
1622     }
1623     /*------ DEBUG LOG END ------*/
1624     return 1;
1625 }
1626
1627 /*!
1628  * sending status:
1629  * 
1630  * @param[in]   iom         connection_iomux
1631  * @param[in]   another_iom another side's iomux
1632  * @return      status
1633  * @retval      0       failed
1634  * @retval      1       succeed
1635  */
1636 static int
1637 l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1638 {
1639     /*-------- DEBUG LOG --------*/
1640     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1641         char iom_str[DEBUG_STR_LEN] = {0};
1642         char a_iom_str[DEBUG_STR_LEN] = {0};
1643         l7vs_iomux_c_str(iom_str, iom);
1644         l7vs_iomux_c_str(a_iom_str, another_iom);
1645         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,159,
1646             "in_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1647             "iom=%s: "
1648             "another_iom=%s",
1649             iom_str, a_iom_str);
1650     }
1651     /*------ DEBUG LOG END ------*/
1652
1653     if (!iom) {
1654         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,49, "error / iom is null");
1655         /*-------- DEBUG LOG --------*/
1656         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1657             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,160,
1658                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1659                 "return_value: 0");
1660         }
1661         /*------ DEBUG LOG END ------*/
1662         return 0; 
1663     }
1664
1665     if (!another_iom) {
1666         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,50, "error / another_iom is null");
1667         /*-------- DEBUG LOG --------*/
1668         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1669             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,161,
1670                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1671                 "return_value: 0");
1672         }
1673         /*------ DEBUG LOG END ------*/
1674         return 0; 
1675     }
1676
1677     if (iomux_conn_sending != iom->status && iomux_conn_sending_busy != iom->status) {
1678         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,51, "error / invalid status(%d)", iom->status);
1679         /*-------- DEBUG LOG --------*/
1680         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1681             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,162,
1682                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1683                 "return_value: 0");
1684         }
1685         /*------ DEBUG LOG END ------*/
1686         return 0;
1687     }
1688
1689     // send to handling iom
1690     if (!l7vs_conn_send(iom, iom->fd)) {
1691         iom->status = iomux_conn_send_error;
1692         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,25, "error / send failed");
1693         /*-------- DEBUG LOG --------*/
1694         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1695             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,163,
1696                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1697                 "return_value: 0");
1698         }
1699         /*------ DEBUG LOG END ------*/
1700         return 0;
1701     }
1702     if (iomux_conn_sent == iom->status || iomux_conn_sent_busy == iom->status) {
1703         // when all data was sent, select the next state
1704         if (!l7vs_conn_sent_next_state(another_iom, iom)) {
1705             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,26, "error / send next state failed");
1706             /*-------- DEBUG LOG --------*/
1707             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1708                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,164,
1709                     "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1710                     "return_value: 0");
1711             }
1712             /*------ DEBUG LOG END ------*/
1713             return 0;
1714         }
1715         if (iomux_conn_receiving != iom->status && iomux_conn_block != iom->status) {
1716             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,52, "error / invalid status(%d)", iom->status);
1717             /*-------- DEBUG LOG --------*/
1718             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1719                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,165,
1720                     "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1721                     "return_value: 0");
1722             }
1723             /*------ DEBUG LOG END ------*/
1724             return 0;
1725         }
1726     }
1727     else if (iomux_conn_sending == iom->status || iomux_conn_sending_busy == iom->status) {
1728         // data still remain
1729         // epoll re-registration for write
1730         l7vs_iomux_mod(iom, iom_write);
1731     }
1732     else  {
1733         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,53, "error / invalid status(%d)", iom->status);
1734         /*-------- DEBUG LOG --------*/
1735         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1736             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,166,
1737                 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1738                 "return_value: 0");
1739         }
1740         /*------ DEBUG LOG END ------*/
1741         return 0;
1742     }
1743
1744     /*-------- DEBUG LOG --------*/
1745     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1746         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,167,
1747             "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1748             "return_value: 1");
1749     }
1750     /*------ DEBUG LOG END ------*/
1751     return 1;
1752 }
1753
1754 /*!
1755  * decide sent next state
1756  *
1757  * @param[in,out]   src_iom     source connection_iomux
1758  * @param[in,out]   dest_iom    destionation connection_iomux
1759  * @return      status
1760  * @retval      0       failed
1761  * @retval      1       succeed
1762  */
1763 static int
1764 l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom)
1765 {
1766     /*-------- DEBUG LOG --------*/
1767     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1768         char s_iom_str[DEBUG_STR_LEN] = {0};
1769         char d_iom_str[DEBUG_STR_LEN] = {0};
1770         l7vs_iomux_c_str(s_iom_str, src_iom);
1771         l7vs_iomux_c_str(d_iom_str, dest_iom);
1772         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,168,
1773             "in_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1774             "src_iom=%s: "
1775             "dest_iom=%s",
1776             s_iom_str, d_iom_str);
1777     }
1778     /*------ DEBUG LOG END ------*/
1779
1780     if (!src_iom) {
1781         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,54, "error / src_iom is null");
1782         /*-------- DEBUG LOG --------*/
1783         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1784             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,169,
1785                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1786                 "return_value: 0");
1787         }
1788         /*------ DEBUG LOG END ------*/
1789         return  0;
1790     }
1791     if (!dest_iom) {
1792         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,55, "error / dest_iom is null");
1793         /*-------- DEBUG LOG --------*/
1794         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1795             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,170,
1796                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1797                 "return_value: 0");
1798         }
1799         /*------ DEBUG LOG END ------*/
1800         return  0;
1801     }
1802
1803     // when writing, the dest_status will be "sent" or "sent_busy"
1804     if (iomux_conn_sent != dest_iom->status && iomux_conn_sent_busy != dest_iom->status) {
1805         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,56, "error / invalid dest status(%d)", dest_iom->status);
1806         /*-------- DEBUG LOG --------*/
1807         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1808             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,171,
1809                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1810                 "return_value: 0");
1811         }
1812         /*------ DEBUG LOG END ------*/
1813         return 0;
1814     }
1815     // and the src_status will be "block" or "busy"
1816     if (iomux_conn_block != src_iom->status && iomux_conn_busy != src_iom->status) {
1817         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,57, "error / invalid src status(%d)", src_iom->status);
1818         /*-------- DEBUG LOG --------*/
1819         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1820             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,172,
1821                 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1822                 "return_value: 0");
1823         }
1824         /*------ DEBUG LOG END ------*/
1825         return 0;
1826     }
1827
1828     // decide the next state
1829     if (iomux_conn_sent_busy == dest_iom->status) {
1830         // when receiving from source, request come to the destination, then destination has priority
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,173,
1834                 "src_iom->status change: %d->%d",
1835                 src_iom->status, iomux_conn_block);
1836         }
1837         /*------ DEBUG LOG END ------*/
1838         src_iom->status = iomux_conn_block;
1839         /*-------- DEBUG LOG --------*/
1840         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1841             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,174,
1842                 "dest_iom->status change: %d->%d",
1843                 dest_iom->status, iomux_conn_receiving);
1844         }
1845         /*------ DEBUG LOG END ------*/
1846         dest_iom->status = iomux_conn_receiving;
1847     }
1848     else if (iomux_conn_busy == src_iom->status) {
1849         // when sending to destination, request come to the source, then source has priority
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,175,
1853                 "src_iom->status change: %d->%d",
1854                 src_iom->status, iomux_conn_receiving);
1855         }
1856         /*------ DEBUG LOG END ------*/
1857         src_iom->status = iomux_conn_receiving;
1858         /*-------- DEBUG LOG --------*/
1859         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1860             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,176,
1861                 "dest_iom->status change: %d->%d",
1862                 dest_iom->status, iomux_conn_block);
1863         }
1864         /*------ DEBUG LOG END ------*/
1865         dest_iom->status = iomux_conn_block;
1866     }
1867     else {
1868         // request come to neither source nor destnation, ready to read both
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,177,
1872                 "src_iom->status change: %d->%d",
1873                 src_iom->status, iomux_conn_receiving);
1874         }
1875         /*------ DEBUG LOG END ------*/
1876         src_iom->status = iomux_conn_receiving;
1877         /*-------- DEBUG LOG --------*/
1878         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1879             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,178,
1880                 "dest_iom->status change: %d->%d",
1881                 dest_iom->status, iomux_conn_receiving);
1882         }
1883         /*------ DEBUG LOG END ------*/
1884         dest_iom->status = iomux_conn_receiving;
1885     }
1886     l7vs_iomux_mod(src_iom, iom_read);
1887     l7vs_iomux_mod(dest_iom, iom_read);
1888
1889     /*-------- DEBUG LOG --------*/
1890     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1891         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,179,
1892             "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1893             "return_value: 1");
1894     }
1895     /*------ DEBUG LOG END ------*/
1896     return 1;
1897 }
1898
1899 /*!
1900  * realserver connection callback
1901  *
1902  * @param[in]   iom     connection iomux
1903  * @return      status
1904  * @retval      0       failed
1905  * @retval      1       succeed
1906  */
1907 static int
1908 l7vs_conn_rs_callback(struct l7vs_iomux *iom)
1909 {
1910     /*-------- DEBUG LOG --------*/
1911     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1912         char iom_str[DEBUG_STR_LEN] = {0};
1913         l7vs_iomux_c_str(iom_str, iom);
1914         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,180,
1915             "in_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1916             "iom=%s",
1917             iom_str);
1918     }
1919     /*------ DEBUG LOG END ------*/
1920     struct l7vs_conn* conn = NULL;
1921
1922     if (!iom) {
1923         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,58, "error / iom is null");
1924         /*-------- DEBUG LOG --------*/
1925         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1926             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,181,
1927                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1928                 "return_value: 0");
1929         }
1930         /*------ DEBUG LOG END ------*/
1931         return 0;
1932     }
1933
1934     conn = (struct l7vs_conn *)iom->data;
1935     /*-------- DEBUG LOG --------*/
1936     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1937         char conn_str[DEBUG_STR_LEN] = {0};
1938         l7vs_conn_c_str(conn_str, conn);
1939         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,182,
1940             "pointer_assign: conn=%s",
1941             conn_str);
1942     }
1943     /*------ DEBUG LOG END ------*/
1944
1945     // invalid status check
1946     if (iomux_conn_receiving != iom->status &&
1947         iomux_conn_block != iom->status &&
1948         iomux_conn_busy != iom->status && 
1949         iomux_conn_sending != iom->status && 
1950         iomux_conn_sending_busy != iom->status) {
1951         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,59, "error / invalid status(%d)", iom->status);
1952         l7vs_conn_destroy(conn);
1953         /*-------- DEBUG LOG --------*/
1954         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1955             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,183,
1956                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1957                 "return_value: 0");
1958         }
1959         /*------ DEBUG LOG END ------*/
1960         return 0;
1961     }
1962
1963     // switch by current status
1964     switch (iom->status) {
1965     case iomux_conn_receiving:
1966         if (!l7vs_conn_realserver_receiving(iom)) {
1967             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,27, "error / rs_callback/realserver receiving failed");
1968             l7vs_conn_destroy(conn);
1969             /*-------- DEBUG LOG --------*/
1970             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1971                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,184,
1972                     "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1973                     "return_value: 0");
1974             }
1975             /*------ DEBUG LOG END ------*/
1976             return 0;
1977         }
1978         if (iomux_conn_disconnected == iom->status) {
1979             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1980                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,185, "realserver connection disconnected");
1981             }
1982             l7vs_conn_destroy(conn);
1983         }
1984         break;
1985     case iomux_conn_block:
1986         if (!l7vs_conn_block(iom, conn->ciom)) {
1987             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,28, "error / rs_callback/block failed");
1988             l7vs_conn_destroy(conn);
1989             /*-------- DEBUG LOG --------*/
1990             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1991                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,186,
1992                     "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1993                     "return_value: 0");
1994             }
1995             /*------ DEBUG LOG END ------*/
1996             return 0;
1997         }
1998         break;
1999     case iomux_conn_busy:
2000         if (!l7vs_conn_busy(iom)) {
2001             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,29, "error / rs_callback/busy failed");
2002             l7vs_conn_destroy(conn);
2003             /*-------- DEBUG LOG --------*/
2004             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2005                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,187,
2006                     "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2007                     "return_value: 0");
2008             }
2009             /*------ DEBUG LOG END ------*/
2010             return 0;
2011         }
2012         break;
2013     case iomux_conn_sending:
2014         if (!l7vs_conn_sending(iom, conn->ciom)) {
2015             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,30, "error / rs_callback/sending failed");
2016             l7vs_conn_destroy(conn);
2017             /*-------- DEBUG LOG --------*/
2018             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2019                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,188,
2020                     "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2021                     "return_value: 0");
2022             }
2023             /*------ DEBUG LOG END ------*/
2024             return 0;
2025         }
2026         break;
2027     case iomux_conn_sending_busy:
2028         if (!l7vs_conn_sending(iom, conn->ciom)) {
2029             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,31, "error / rs_callback/sending_busy failed");
2030             l7vs_conn_destroy(conn);
2031             /*-------- DEBUG LOG --------*/
2032             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2033                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,189,
2034                     "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2035                     "return_value: 0");
2036             }
2037             /*------ DEBUG LOG END ------*/
2038             return 0;
2039         }
2040         break;
2041     default:
2042         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,60, "error / invalid status(%d)", iom->status);
2043         l7vs_conn_destroy(conn);
2044         /*-------- DEBUG LOG --------*/
2045         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2046             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,190,
2047                 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2048                 "return_value: 0");
2049         }
2050         /*------ DEBUG LOG END ------*/
2051         return 0;
2052     }
2053
2054     /*-------- DEBUG LOG --------*/
2055     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2056         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,191,
2057             "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2058             "return_value: 1");
2059     }
2060     /*------ DEBUG LOG END ------*/
2061     return 1;
2062 }
2063
2064 /*!
2065  * realserver receiving 
2066  *
2067  * @param[in]   iom     connection iomux
2068  * @return      status
2069  * @retval      0       failed
2070  * @retval      1       succeed
2071  */
2072 static int
2073 l7vs_conn_realserver_receiving(struct l7vs_iomux *iom)
2074 {
2075     /*-------- DEBUG LOG --------*/
2076     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2077         char iom_str[DEBUG_STR_LEN] = {0};
2078         l7vs_iomux_c_str(iom_str, iom);
2079         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,192,
2080             "in_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2081             "iom=%s",
2082             iom_str);
2083     }
2084     /*------ DEBUG LOG END ------*/
2085
2086     struct l7vs_conn *conn = NULL;
2087
2088     if (!iom) {
2089         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,61, "error / iom is null");
2090         /*-------- DEBUG LOG --------*/
2091         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2092             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,193,
2093                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2094                 "return_value: 0");
2095         }
2096         /*------ DEBUG LOG END ------*/
2097         return 0;
2098     }
2099
2100     if (iomux_conn_receiving != iom->status) {
2101         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,62, "error / invalid status(%d)", iom->status);
2102         /*-------- DEBUG LOG --------*/
2103         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2104             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,194,
2105                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2106                 "return_value: 0");
2107         }
2108         /*------ DEBUG LOG END ------*/
2109         return 0;
2110     }
2111
2112     conn = (struct l7vs_conn *)iom->data;
2113     /*-------- DEBUG LOG --------*/
2114     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2115         char conn_str[DEBUG_STR_LEN] = {0};
2116         l7vs_conn_c_str(conn_str, conn);
2117         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,195,
2118             "pointer_assign: conn=%s",
2119             conn_str);
2120     }
2121     /*------ DEBUG LOG END ------*/
2122
2123     // when the client is not set in read-blocked
2124     if (iomux_conn_block != conn->ciom->status && iomux_conn_busy != conn->ciom->status) {
2125         // set the real server in read-blocked
2126         /*-------- DEBUG LOG --------*/
2127         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2128             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,196,
2129                 "conn->ciom->status change: %d->%d",
2130                 conn->ciom->status, iomux_conn_block);
2131         }
2132         /*------ DEBUG LOG END ------*/
2133         conn->ciom->status = iomux_conn_block;
2134     }
2135
2136     // receive realserver data
2137     if (!l7vs_conn_recv(iom, iom->fd)) {
2138         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,32, "error / recv failed");
2139         /*-------- DEBUG LOG --------*/
2140         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2141             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,197,
2142                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2143                 "return_value: 0");
2144         }
2145         /*------ DEBUG LOG END ------*/
2146         return 0;
2147     }
2148     switch (iom->status) {
2149     case iomux_conn_receiving:
2150         // data still remain, epoll re-registration for read
2151         l7vs_iomux_mod(iom, iom_read);
2152         break;
2153     case iomux_conn_received:
2154         // all data is received, append the session infomation
2155         if (!l7vs_conn_realserver_modify_data(iom)) {
2156             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,33, "error / realserver modify data failed");
2157             /*-------- DEBUG LOG --------*/
2158             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2159                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,198,
2160                     "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2161                     "return_value: 0");
2162             }
2163             /*------ DEBUG LOG END ------*/
2164             return 0;
2165         }
2166         /*-------- DEBUG LOG --------*/
2167         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2168             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,199,
2169                 "iom->status change: %d->%d",
2170                 iom->status, iomux_conn_block);
2171         }
2172         /*------ DEBUG LOG END ------*/
2173         iom->status = iomux_conn_block;
2174         if (iomux_conn_busy == conn->ciom->status) {
2175             /*-------- DEBUG LOG --------*/
2176             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2177                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,200,
2178                     "conn->ciom->status change: %d->%d",
2179                     conn->ciom->status, iomux_conn_sending_busy);
2180             }
2181             /*------ DEBUG LOG END ------*/
2182             conn->ciom->status = iomux_conn_sending_busy;
2183         } else {
2184             /*-------- DEBUG LOG --------*/
2185             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2186                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,201,
2187                     "conn->ciom->status change: %d->%d",
2188                     conn->ciom->status, iomux_conn_sending);
2189             }
2190             /*------ DEBUG LOG END ------*/
2191             conn->ciom->status = iomux_conn_sending;
2192         }
2193         //epoll re-registration for write
2194         l7vs_iomux_mod(conn->ciom, iom_write);
2195     case iomux_conn_disconnected:
2196         // client connection was disconnected
2197         break;
2198     default:
2199         //invalid status
2200         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,63, "error / invalid status(%d)", iom->status);
2201         /*-------- DEBUG LOG --------*/
2202         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2203             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,202,
2204                 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2205                 "return_value: 0");
2206         }
2207         /*------ DEBUG LOG END ------*/
2208         return 0;
2209     }
2210
2211     /*-------- DEBUG LOG --------*/
2212     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2213         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,203,
2214             "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2215             "return_value: 1");
2216     }
2217     /*------ DEBUG LOG END ------*/
2218     return 1;
2219 }
2220
2221 /*!
2222  * realserver modify data
2223  *
2224  * @param[in]   iom     connection iomux
2225  * @return      status
2226  * @retval      0       failed
2227  * @retval      1       succeed
2228  */
2229 static int
2230 l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom)
2231 {
2232     /*-------- DEBUG LOG --------*/
2233     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2234         char iom_str[DEBUG_STR_LEN] = {0};
2235         l7vs_iomux_c_str(iom_str, iom);
2236         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,204,
2237             "in_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2238             "iom=%s",
2239             iom_str);
2240     }
2241     /*------ DEBUG LOG END ------*/
2242     struct l7vs_conn *conn = NULL;
2243         char *newbuf = NULL;
2244     int (*relayf)(struct l7vs_service *, struct l7vs_conn *, char *, size_t *) = NULL;
2245     int ret = 0;
2246     size_t len_ret = 0;
2247
2248     if (!iom) {
2249         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,64, "error / iom is null");
2250         /*-------- DEBUG LOG --------*/
2251         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2252             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,205,
2253                 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2254                 "return_value: 0");
2255         }
2256         /*------ DEBUG LOG END ------*/
2257         return 0;
2258     }
2259
2260     if (iomux_conn_received != iom->status) {
2261         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,65, "error / invalid status(%d)", iom->status);
2262         /*-------- DEBUG LOG --------*/
2263         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2264             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,206,
2265                 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2266                 "return_value: 0");
2267         }
2268         /*------ DEBUG LOG END ------*/
2269         return 0;
2270     }
2271
2272     conn = (struct l7vs_conn *)iom->data;
2273     /*-------- DEBUG LOG --------*/
2274     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2275         char conn_str[DEBUG_STR_LEN] = {0};
2276         l7vs_conn_c_str(conn_str, conn);
2277         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,207,
2278             "pointer_assign: conn=%s",
2279             conn_str);
2280     }
2281     /*------ DEBUG LOG END ------*/
2282
2283     //set the function pointer that modify the real server data
2284     if (conn->srv) {
2285         relayf = conn->srv->pm->analyze_rsdata;
2286         /*-------- DEBUG LOG --------*/
2287         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2288             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,208,
2289                 "pointer_assign: relayf=%p",
2290                 relayf);
2291         }
2292         /*------ DEBUG LOG END ------*/
2293     }
2294
2295     if (relayf) {
2296         len_ret = conn->cldata_len;
2297         newbuf = (char *)realloc(conn->cldata, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2298         if (!newbuf) {
2299             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,10, "error / realloc failed");
2300             iom->status = iomux_conn_buffer_realloc_error;
2301             /*-------- DEBUG LOG --------*/
2302             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2303                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,209,
2304                     "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2305                     "return_value: 0");
2306             }
2307             /*------ DEBUG LOG END ------*/
2308             return 0;
2309         }
2310         /*-------- DEBUG LOG --------*/
2311         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2312             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,210,
2313                 "realloc: newbuf=%p: size=%zu",
2314                 newbuf, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2315         }
2316         /*------ DEBUG LOG END ------*/
2317         conn->cldata = newbuf;
2318
2319         ret = (*relayf)(conn->srv, conn, conn->cldata, &len_ret);
2320         if (0 != ret) {
2321             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,34, "error / analyze rsdata failed");
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,211,
2325                     "iom->status change: %d->%d",
2326                     iom->status, iomux_conn_rsdata_modify_error);
2327             }
2328             /*------ DEBUG LOG END ------*/
2329             iom->status = iomux_conn_rsdata_modify_error;
2330             /*-------- DEBUG LOG --------*/
2331             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2332                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,212,
2333                     "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2334                     "return_value: 0");
2335             }
2336             /*------ DEBUG LOG END ------*/
2337             return 0;
2338         }
2339         if (L7VS_PROTOMOD_MAX_ADD_BUFSIZE < len_ret - conn->cldata_len) {
2340             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,35, "error / bufsize too long modified by protomod");
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,213,
2344                     "iom->status change: %d->%d",
2345                     iom->status, iomux_conn_rsdata_modify_error);
2346             }
2347             /*------ DEBUG LOG END ------*/
2348             iom->status = iomux_conn_rsdata_modify_error;
2349             /*-------- DEBUG LOG --------*/
2350             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2351                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,214,
2352                     "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2353                     "return_value: 0");
2354             }
2355             /*------ DEBUG LOG END ------*/
2356             return 0;
2357         }
2358         else {
2359             conn->cldata_len = len_ret;
2360         }
2361     }
2362     /*-------- DEBUG LOG --------*/
2363     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2364         char modify_data[DEBUG_STR_LEN] = {0};
2365         l7vs_conn_dump_data(modify_data, conn->cldata, conn->cldata_len);
2366         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,215,
2367             "modify data: %s",
2368             modify_data);
2369     }
2370     /*------ DEBUG LOG END ------*/
2371
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,216,
2375             "iom->status change: %d->%d",
2376             iom->status, iomux_conn_rsdata_modified);
2377     }
2378     /*------ DEBUG LOG END ------*/
2379     iom->status = iomux_conn_rsdata_modified;
2380     /*-------- DEBUG LOG --------*/
2381     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2382         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,217,
2383             "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2384             "return_value: 1");
2385     }
2386     /*------ DEBUG LOG END ------*/
2387     return 1;
2388 }
2389
2390 /*!
2391  * receive data
2392  *
2393  * @param[in]   iom         connection_iomux
2394  * @param[in]   source_fd   the filedescriptor to be read
2395  * @return      status
2396  * @retval      0       failed 
2397  * @retval      1       succeed
2398  */
2399 static int
2400 l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd)
2401 {
2402     /*-------- DEBUG LOG --------*/
2403     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2404         char iom_str[DEBUG_STR_LEN] = {0};
2405         l7vs_iomux_c_str(iom_str, iom);
2406         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,218,
2407             "in_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2408             "iom=%s: "
2409             "source_fd=%d",
2410             iom_str, source_fd);
2411     }
2412     /*------ DEBUG LOG END ------*/
2413         int ret = 0;
2414     struct l7vs_conn *conn = NULL;
2415     char read_buf[l7vs_conn_read_bufsize];
2416 //        char *newbuf = NULL;
2417
2418     if (!iom) {
2419         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,66, "error / iom is null");
2420         /*-------- DEBUG LOG --------*/
2421         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2422             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,219,
2423                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2424                 "return_value: 0");
2425         }
2426         /*------ DEBUG LOG END ------*/
2427         return 0;
2428     }
2429
2430     if (0 > source_fd || INT_MAX == source_fd) {
2431         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,67, "error / source fd is not specified");
2432         /*-------- DEBUG LOG --------*/
2433         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2434             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,220,
2435                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2436                 "return_value: 0");
2437         }
2438         /*------ DEBUG LOG END ------*/
2439         return 0;
2440     }
2441
2442     if (iomux_conn_receiving != iom->status) {
2443         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,68, "error / invalid status(%d)", iom->status);
2444         /*-------- DEBUG LOG --------*/
2445         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2446             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,221,
2447                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2448                 "return_value: 0");
2449         }
2450         /*------ DEBUG LOG END ------*/
2451         return 0;
2452     }
2453
2454     conn = (struct l7vs_conn *)iom->data;
2455     /*-------- DEBUG LOG --------*/
2456     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2457         char conn_str[DEBUG_STR_LEN] = {0};
2458         l7vs_conn_c_str(conn_str, conn);
2459         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,222,
2460             "pointer_assign: conn=%s",
2461             conn_str);
2462     }
2463     /*------ DEBUG LOG END ------*/
2464
2465     //QoS Control to server
2466     if( (source_fd == conn->ciom->fd) && !l7vs_conn_QoS_control( conn, QOS_UP ) ){
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,223,
2470                 "iom->status change: %d->%d",
2471                 iom->status, iomux_conn_receiving);
2472         }
2473         /*------ DEBUG LOG END ------*/
2474         iom->status = iomux_conn_receiving;
2475         /*-------- DEBUG LOG --------*/
2476         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2477             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
2478                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2479                 "return_value: 1");
2480         }
2481         /*------ DEBUG LOG END ------*/
2482         return 1;
2483     }
2484     //QoS Control to client
2485     if( (source_fd == conn->riom->fd) && !l7vs_conn_QoS_control( conn, QOS_DOWN ) ){
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,346,
2489                 "iom->status change: %d->%d",
2490                 iom->status, iomux_conn_receiving);
2491         }
2492         /*------ DEBUG LOG END ------*/
2493         iom->status = iomux_conn_receiving;
2494         /*-------- DEBUG LOG --------*/
2495         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2496             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,347,
2497                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2498                 "return_value: 1");
2499         }
2500         /*------ DEBUG LOG END ------*/
2501         return 1;
2502     }
2503     // read the data
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,225,
2507             "recv param: source_fd=%d: len=%d: flags=%d",
2508             source_fd, (l7vs_conn_read_bufsize - 1), 0);
2509     }
2510     /*------ DEBUG LOG END ------*/
2511     ret = recv(source_fd, read_buf, (l7vs_conn_read_bufsize - 1), 0);
2512     /*-------- DEBUG LOG --------*/
2513     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2514         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,226,
2515             "recv result: ret=%d",
2516             ret);
2517     }
2518     /*------ DEBUG LOG END ------*/
2519     /*-------- DEBUG LOG --------*/
2520     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2521         char recv_data[DEBUG_STR_LEN] = {0};
2522         l7vs_conn_dump_data(recv_data, read_buf, ret);
2523         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,227,
2524             "recv data: %s",
2525             recv_data);
2526     }
2527     /*------ DEBUG LOG END ------*/
2528     switch (ret) {
2529     case -1:
2530         if (EAGAIN != errno) {
2531             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,12, "error / recv error(%s)", strerror(errno));
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,228,
2535                     "iom->status change: %d->%d",
2536                     iom->status, iomux_conn_receive_error);
2537             }
2538             /*------ DEBUG LOG END ------*/
2539             iom->status = iomux_conn_receive_error;
2540             /*-------- DEBUG LOG --------*/
2541             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2542                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,229,
2543                     "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2544                     "return_value: 0");
2545             }
2546             /*------ DEBUG LOG END ------*/
2547             return 0;
2548         }
2549         /*-------- DEBUG LOG --------*/
2550         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2551             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,230,
2552                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2553                 "return_value: 1");
2554         }
2555         /*------ DEBUG LOG END ------*/
2556         return 1;
2557     case 0:
2558         /*-------- DEBUG LOG --------*/
2559         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2560             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,231, "peer disconnected");
2561             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,232,
2562                 "iom->status change: %d->%d",
2563                 iom->status, iomux_conn_disconnected);
2564         }
2565         /*------ DEBUG LOG END ------*/
2566         iom->status = iomux_conn_disconnected;
2567         /*-------- DEBUG LOG --------*/
2568         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2569             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,233,
2570                 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2571                 "return_value: 1");
2572         }
2573         /*------ DEBUG LOG END ------*/
2574         return 1;
2575     default:
2576         // reading data is finished
2577         /*-------- DEBUG LOG --------*/
2578         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2579             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,239,
2580                 "iom->status change: %d->%d",
2581                 iom->status, iomux_conn_received);
2582         }
2583         /*------ DEBUG LOG END ------*/
2584         iom->status = iomux_conn_received;
2585         break;
2586     }
2587     
2588     // register reveive information for QoS to server
2589     if( source_fd == conn->ciom->fd ){
2590         l7vs_conn_QoS_recvsize_register( conn, ret, QOS_UP );
2591     }
2592     // register reveive information for QoS to client
2593     if( source_fd == conn->riom->fd ){
2594         l7vs_conn_QoS_recvsize_register( conn, ret, QOS_DOWN );
2595     }
2596     // copy to conn_buffer
2597     memcpy(conn->cldata + conn->cldata_len, read_buf, ret);
2598     conn->cldata_len += ret;
2599     conn->cldata[conn->cldata_len] = '\0';
2600
2601     /*-------- DEBUG LOG --------*/
2602     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2603         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,240,
2604             "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2605             "return_value: 1");
2606     }
2607     /*------ DEBUG LOG END ------*/
2608     return 1;
2609 }
2610
2611 /*!
2612  * pre-read whether next data exists
2613  *
2614  * @param[in]   iom         connection iomux
2615  * @param[in]   source_fd   source file description
2616  * @return      status
2617  * @retval      0       failed
2618  * @retval      1       succeed
2619  */
2620 static int
2621 l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd)
2622 {
2623     /*-------- DEBUG LOG --------*/
2624     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2625         char iom_str[DEBUG_STR_LEN] = {0};
2626         l7vs_iomux_c_str(iom_str, iom);
2627         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,241,
2628             "in_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2629             "iom=%s: "
2630             "source_fd=%d",
2631             iom_str, source_fd);
2632     }
2633     /*------ DEBUG LOG END ------*/
2634     int preread_ret = 0;
2635     char preread_buf[1] = {0};
2636
2637     if (!iom) {
2638         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,69, "error / iom is null");
2639         /*-------- DEBUG LOG --------*/
2640         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2641             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,242,
2642                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2643                 "return_value: 0");
2644         }
2645         /*------ DEBUG LOG END ------*/
2646         return 0;
2647     }
2648
2649     if (-1 == source_fd) {
2650         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,70, "error / source fd is not specified");
2651         /*-------- DEBUG LOG --------*/
2652         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2653             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,243,
2654                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2655                 "return_value: 0");
2656         }
2657         /*------ DEBUG LOG END ------*/
2658         return 0;
2659     }
2660
2661     if (iomux_conn_receiving != iom->status) {
2662         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,71, "error / invalid status(%d)", iom->status);
2663         /*-------- DEBUG LOG --------*/
2664         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2665             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,244,
2666                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2667                 "return_value: 0");
2668         }
2669         /*------ DEBUG LOG END ------*/
2670         return 0;
2671     }
2672
2673     /*-------- DEBUG LOG --------*/
2674     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2675         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,245,
2676             "recv param: source_fd=%d: len=1: flags=MSG_PEEK",
2677             source_fd);
2678     }
2679     /*------ DEBUG LOG END ------*/
2680     preread_ret = recv(source_fd, preread_buf, 1, MSG_PEEK);
2681     /*-------- DEBUG LOG --------*/
2682     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2683         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,246,
2684             "recv result: preread_ret=%d",
2685             preread_ret);
2686     }
2687     /*------ DEBUG LOG END ------*/
2688     /*-------- DEBUG LOG --------*/
2689     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2690         char recv_data[DEBUG_STR_LEN] = {0};
2691         l7vs_conn_dump_data(recv_data, preread_buf, preread_ret);
2692         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,247,
2693             "recv data: %s",
2694             recv_data);
2695     }
2696     /*------ DEBUG LOG END ------*/
2697     switch (preread_ret) {
2698     case -1:
2699         if (EAGAIN != errno) {
2700             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,13, "error / recv error(%s)", strerror(errno));
2701             /*-------- DEBUG LOG --------*/
2702             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2703                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,248,
2704                     "iom->status change: %d->%d",
2705                     iom->status, iomux_conn_receive_error);
2706             }
2707             /*------ DEBUG LOG END ------*/
2708             iom->status = iomux_conn_receive_error;
2709             /*-------- DEBUG LOG --------*/
2710             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2711                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,249,
2712                     "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2713                     "return_value: 0");
2714             }
2715             /*------ DEBUG LOG END ------*/
2716             return 0;
2717         }
2718         // finished reading all data
2719         /*-------- DEBUG LOG --------*/
2720         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2721             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,250,
2722                 "iom->status change: %d->%d",
2723                 iom->status, iomux_conn_received);
2724         }
2725         /*------ DEBUG LOG END ------*/
2726         iom->status = iomux_conn_received;
2727         break;
2728     case 0:
2729         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2730             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,251, "peer disconnected");
2731         }
2732         /*-------- DEBUG LOG --------*/
2733         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2734             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,252,
2735                 "iom->status change: %d->%d",
2736                 iom->status, iomux_conn_disconnected);
2737         }
2738         /*------ DEBUG LOG END ------*/
2739         iom->status =  iomux_conn_disconnected;
2740         break;
2741     case 1:
2742         // the data that should be read remains
2743         // status does not change
2744         break;
2745     default:
2746         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,37, "error / preread error");
2747         /*-------- DEBUG LOG --------*/
2748         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2749             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,253,
2750                 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2751                 "return_value: 0");
2752         }
2753         /*------ DEBUG LOG END ------*/
2754         return 0;
2755     }
2756     /*-------- DEBUG LOG --------*/
2757     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2758         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,254,
2759             "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2760             "return_value: 1");
2761     }
2762     /*------ DEBUG LOG END ------*/
2763     return 1;
2764 }
2765
2766 /*!
2767  * send data
2768  *
2769  * @param[in]   iom         connection_iomux
2770  * @param[in]   dest_fd     the filedescriptor to be write
2771  * @return      status
2772  * @retval      0       failed 
2773  * @retval      1       succeed
2774  */
2775 static int
2776 l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd)
2777 {
2778     /*-------- DEBUG LOG --------*/
2779     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2780         char iom_str[DEBUG_STR_LEN] = {0};
2781         l7vs_iomux_c_str(iom_str, iom);
2782         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,255,
2783             "in_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2784             "iom=%s: "
2785             "dest_fd=%d",
2786             iom_str, dest_fd);
2787     }
2788     /*------ DEBUG LOG END ------*/
2789
2790     int ret = 0;
2791     struct l7vs_conn *conn = NULL;
2792     char *newbuf = NULL;
2793     size_t sent_len = 0;
2794
2795     if (!iom) {
2796         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,72, "error / iom is null");
2797         /*-------- DEBUG LOG --------*/
2798         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2799             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,256,
2800                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2801                 "return_value: 0");
2802         }
2803         /*------ DEBUG LOG END ------*/
2804         return 0;
2805     }
2806
2807     if (-1 == dest_fd) {
2808         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,73, "error / dest fd is not specified");
2809         /*-------- DEBUG LOG --------*/
2810         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2811             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,257,
2812                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2813                 "return_value: 0");
2814         }
2815         /*------ DEBUG LOG END ------*/
2816         return 0;
2817     }
2818
2819     if (iomux_conn_sending != iom->status &&
2820         iomux_conn_sending_busy != iom->status) {
2821         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,74, "error / invalid status(%d)", iom->status);
2822         /*-------- DEBUG LOG --------*/
2823         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2824             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,258,
2825                 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2826                 "return_value: 0");
2827         }
2828         /*------ DEBUG LOG END ------*/
2829         return 0;
2830     }
2831
2832     conn = (struct l7vs_conn *)iom->data;
2833     /*-------- DEBUG LOG --------*/
2834     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2835         char conn_str[DEBUG_STR_LEN] = {0};
2836         l7vs_conn_c_str(conn_str, conn);
2837         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,259,
2838             "pointer_assign: conn=%s",
2839             conn_str);
2840     }
2841     /*------ DEBUG LOG END ------*/
2842
2843     /*-------- DEBUG LOG --------*/
2844     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2845         char send_data[DEBUG_STR_LEN] = {0};
2846         l7vs_conn_dump_data(send_data, conn->cldata, conn->cldata_len);
2847         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,260,
2848             "send data: %s",
2849             send_data);
2850     }
2851     /*------ DEBUG LOG END ------*/
2852     // write the data
2853     /*-------- DEBUG LOG --------*/
2854     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2855         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,261,
2856             "send param: dest_fd=%d: len=%zu: flags=MSG_NOSIGNAL",
2857             dest_fd, conn->cldata_len);
2858     }
2859     /*------ DEBUG LOG END ------*/
2860     ret = send(dest_fd, conn->cldata, conn->cldata_len, MSG_NOSIGNAL);
2861     /*-------- DEBUG LOG --------*/
2862     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2863         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,262,
2864             "send result: ret=%d",
2865             ret);
2866     }
2867     /*------ DEBUG LOG END ------*/
2868     if (0 > ret) {
2869         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,14, "error / send error(%s)", strerror(errno));
2870         iom->status = iomux_conn_send_error;
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,263,
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     sent_len = ret;
2881     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2882         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,264, "sent %zu bytes", sent_len);
2883     }
2884
2885     // decide the status
2886     if (conn->cldata_len == sent_len) {
2887         // finished sending all data
2888         if (iomux_conn_sending == iom->status) {
2889             /*-------- DEBUG LOG --------*/
2890             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2891                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,265,
2892                     "iom->status change: %d->%d",
2893                     iom->status, iomux_conn_sent);
2894             }
2895             /*------ DEBUG LOG END ------*/
2896             iom->status = iomux_conn_sent;
2897         } else {
2898             /*-------- DEBUG LOG --------*/
2899             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2900                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,266,
2901                     "iom->status change: %d->%d",
2902                     iom->status, iomux_conn_sent_busy);
2903             }
2904             /*------ DEBUG LOG END ------*/
2905             iom->status = iomux_conn_sent_busy;
2906         }
2907         //cldata memory realloc
2908         conn->cldata_len = 0;
2909         conn->cldata_bufsize = l7vs_conn_read_bufsize;
2910         newbuf = (char *)malloc(conn->cldata_bufsize);
2911         if (!newbuf) {
2912             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,12, "error / malloc failed");
2913             iom->status = iomux_conn_send_error;
2914             /*-------- DEBUG LOG --------*/
2915             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2916                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,267,
2917                     "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2918                     "return_value: 0");
2919             }
2920             /*------ DEBUG LOG END ------*/
2921             return 0;
2922         }
2923         free(conn->cldata);
2924         conn->cldata = newbuf;
2925         memset(conn->cldata, 0, l7vs_conn_read_bufsize);
2926     }
2927     else {
2928         // shift data for next sending
2929         newbuf = (char *)malloc((conn->cldata_len - sent_len) + 1);
2930         if (!newbuf) {
2931             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,13, "error / malloc failed");
2932             /*-------- DEBUG LOG --------*/
2933             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2934                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,268,
2935                     "iom->status change: %d->%d",
2936                     iom->status, iomux_conn_send_error);
2937             }
2938             /*------ DEBUG LOG END ------*/
2939             iom->status = iomux_conn_send_error;
2940             /*-------- DEBUG LOG --------*/
2941             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2942                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,269,
2943                     "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2944                     "return_value: 0");
2945             }
2946             /*------ DEBUG LOG END ------*/
2947             return 0;
2948         }
2949         memcpy(newbuf, (conn->cldata + sent_len), conn->cldata_len - sent_len);
2950         free(conn->cldata);
2951         conn->cldata = newbuf;
2952         conn->cldata_len -= sent_len;
2953         conn->cldata[conn->cldata_len] = '\0';
2954
2955         // the data that should be sent remains, status does not change
2956     }
2957
2958     /*-------- DEBUG LOG --------*/
2959     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2960         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,270,
2961             "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2962             "return_value: 1");
2963     }
2964     /*------ DEBUG LOG END ------*/
2965     return 1;
2966
2967 }
2968
2969 /*!
2970  * connect to real server
2971  *
2972  * @param[in]   conn    connection
2973  * @param[in]   dest    destination
2974  * @return      status
2975  * @retval      0       failed 
2976  * @retval      1       succeed
2977  */
2978 int
2979 l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
2980 {
2981     /*-------- DEBUG LOG --------*/
2982     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2983         char conn_str[DEBUG_STR_LEN] = {0};
2984         char dest_str[DEBUG_STR_LEN] = {0};
2985         l7vs_conn_c_str(conn_str, conn);
2986         l7vs_dest_c_str(dest_str, dest);
2987         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,271,
2988             "in_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
2989             "conn=%s: "
2990             "dest=%s",
2991             conn_str, dest_str);
2992     }
2993     /*------ DEBUG LOG END ------*/
2994
2995         int s;
2996         int stype;
2997         int flags;
2998         int ret;
2999     enum iomaction action;
3000
3001     if (!conn) {
3002         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,75, "error / conn is null");
3003         /*-------- DEBUG LOG --------*/
3004         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3005             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,272,
3006                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3007                 "return_value: 0");
3008         }
3009         /*------ DEBUG LOG END ------*/
3010         return 0;
3011     }
3012     if (!dest) {
3013         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,76, "error / dest is null");
3014         /*-------- DEBUG LOG --------*/
3015         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3016             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,273,
3017                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3018                 "return_value: 0");
3019         }
3020         /*------ DEBUG LOG END ------*/
3021         return 0;
3022     }
3023
3024         switch (conn->proto) {
3025         case IPPROTO_TCP:
3026                 stype = SOCK_STREAM;
3027                 break;
3028         case IPPROTO_UDP:
3029                 stype = SOCK_DGRAM;
3030                 break;
3031         default:
3032         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,15, "error / unknown socket type");
3033         /*-------- DEBUG LOG --------*/
3034         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3035             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,274,
3036                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3037                 "return_value: 0");
3038         }
3039         /*------ DEBUG LOG END ------*/
3040                 return 0;
3041         }
3042
3043     /*-------- DEBUG LOG --------*/
3044     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3045         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,275,
3046             "socket param: family=PF_INET: type=%d: protocol=%d",
3047             stype, conn->proto);
3048     }
3049     /*------ DEBUG LOG END ------*/
3050         s = socket(PF_INET, stype, conn->proto);  
3051         if (0 > s) {
3052         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,16, "error / socket error(%s)", strerror(errno));
3053         /*-------- DEBUG LOG --------*/
3054         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3055             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,276,
3056                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3057                 "return_value: 0");
3058         }
3059         /*------ DEBUG LOG END ------*/
3060                 return 0;
3061         }
3062         
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,277,
3066             "fnctl param: s=%d: cmd=F_GETFL: flags=0",
3067             s);
3068     }
3069     /*------ DEBUG LOG END ------*/
3070         flags = fcntl(s, F_GETFL, 0);
3071         if (0 > flags) {
3072         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,17, "error / fcntl(s=%d,F_GETFL) error(%s)", s,strerror(errno));
3073                 close(s);
3074         /*-------- DEBUG LOG --------*/
3075         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3076             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,278,
3077                 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3078                 "return_value: 0");
3079         }
3080         /*------ DEBUG LOG END ------*/
3081                 return 0;
3082         }
3083     /*-------- DEBUG LOG --------*/
3084     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3085         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,279,
3086             "fnctl result: flags=%d",
3087             flags);
3088     }
3089     /*------ DEBUG LOG END ------*/
3090
3091     /*-------- DEBUG LOG --------*/
3092     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3093         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,280,
3094             "fnctl param: s=%d: cmd=F_SETFL: flags=%d",
3095             s, (flags | O_NONBLOCK));
3096     }
3097     /*------ DEBUG LOG END ------*/
3098         flags = fcntl(s, F_SETFL, flags | O_NONBLOCK);
3099         if (0 > flags) {
3100         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,18, "error / fcntl(s=%d,F_SETFL) error(%s)", s,strerror(errno));
3101                 close(s);
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,281,
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     /*-------- DEBUG LOG --------*/
3112     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3113         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,282,
3114             "fnctl result: flags=%d",
3115             flags);
3116     }
3117     /*------ DEBUG LOG END ------*/
3118
3119         if (conn->cmss > 0) {
3120         /*-------- DEBUG LOG --------*/
3121         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3122             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,283,
3123                 "setsockopt param: s=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: optval=%d: "
3124                 "len=%zu",
3125                 s, conn->cmss, sizeof(int));
3126         }
3127         /*------ DEBUG LOG END ------*/
3128                 ret = setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &conn->cmss,
3129                                  sizeof(int));
3130                 if (ret < 0) {
3131             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,19, "error / setsockopt(TCP_MAXSEG) error(%s)", strerror(errno));
3132                 }
3133         /*-------- DEBUG LOG --------*/
3134         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3135             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,284,
3136                 "setsockopt result: ret=%d: len=%zu",
3137                 ret, sizeof(int));
3138         }
3139         /*------ DEBUG LOG END ------*/
3140         }
3141
3142     /*-------- DEBUG LOG --------*/
3143     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3144         char addr_str[DEBUG_STR_LEN] = {0};
3145         l7vs_conn_sockaddr_in_c_str(addr_str, &dest->addr);
3146         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,285,
3147             "connect param: s=%d: dest->addr=%s: len=%zu",
3148             s, addr_str, sizeof(struct sockaddr_in));
3149     }
3150     /*------ DEBUG LOG END ------*/
3151         ret = connect(s, (struct sockaddr *)&dest->addr,
3152                       sizeof(struct sockaddr_in)); 
3153         if (0 > ret) {
3154                 if (errno != EINPROGRESS) {
3155             LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,20, "error / connect error(%s)", strerror(errno));
3156                         close(s);
3157             /*-------- DEBUG LOG --------*/
3158             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3159                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,286,
3160                     "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3161                     "return_value: 0");
3162             }
3163             /*------ DEBUG LOG END ------*/
3164                         return 0;
3165                 }
3166     }
3167     /*-------- DEBUG LOG --------*/
3168     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3169         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,287,
3170             "connect result: ret=%d",
3171             ret);
3172     }
3173     /*------ DEBUG LOG END ------*/
3174     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3175         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,288, "dest %p nactive %d->%d",
3176             dest, dest->nactive,
3177             dest->nactive + 1);
3178     }
3179
3180     action = iom_write;
3181     dest->nactive++;   
3182     conn->dest = dest;
3183     /*-------- DEBUG LOG --------*/
3184     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3185         char dest_str[DEBUG_STR_LEN] = {0};
3186         l7vs_dest_c_str(dest_str, conn->dest);
3187         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,289,
3188             "pointer_assign: conn->dest=%s",
3189             dest_str);
3190     }
3191     /*------ DEBUG LOG END ------*/
3192     conn->riom->fd = s;
3193     conn->riom->callback = l7vs_conn_rs_callback;
3194     /*-------- DEBUG LOG --------*/
3195     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3196         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,290,
3197             "pointer_assign: conn->riom->callback=%p",
3198             conn->riom->callback);
3199     }
3200     /*------ DEBUG LOG END ------*/
3201     conn->riom->data = conn;
3202     /*-------- DEBUG LOG --------*/
3203     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3204         char conn_str[DEBUG_STR_LEN] = {0};
3205         l7vs_conn_c_str(conn_str, conn);
3206         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,291,
3207             "pointer_assign: conn->riom->data=%s",
3208             conn_str);
3209     }
3210     /*------ DEBUG LOG END ------*/
3211     l7vs_iomux_add(conn->riom, action);
3212
3213     /*-------- DEBUG LOG --------*/
3214     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3215         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,292,
3216             "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3217             "return_value: 1");
3218     }
3219
3220     if ( dest ){
3221                 /*-------- DEBUG LOG --------*/
3222         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3223                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
3224                 "RealServer Connecting Count : nactive is %d",
3225                 dest->nactive);
3226         }
3227         /*-------- DEBUG LOG --------*/
3228
3229         /*-------- INFO LOG (Access Log) --------*/
3230         if (LOG_LV_INFO >= logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3231             char addr_str_tmp[ADDR_STR_LEN] = {0};
3232             memcpy(addr_str_tmp, inet_ntoa(conn->caddr.sin_addr), ADDR_STR_LEN);
3233             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,342,
3234                 "[[AccessLog] (SRC)%s:%d -> (DST)%s:%d ]",
3235                 addr_str_tmp,
3236                 ntohs(conn->caddr.sin_port),
3237                 inet_ntoa(conn->dest->addr.sin_addr),
3238                 ntohs(conn->dest->addr.sin_port));
3239         }
3240         /*------ INFO LOG END (Access Log) ------*/
3241     }
3242
3243     /*------ DEBUG LOG END ------*/
3244         return 1;
3245 }
3246
3247 /*!
3248  * close client socket 
3249  *
3250  * @param[in]   conn    connection
3251  * @return      void 
3252  */
3253 void
3254 l7vs_conn_close_csock(struct l7vs_conn *conn)
3255 {
3256     /*-------- DEBUG LOG --------*/
3257     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3258         char conn_str[DEBUG_STR_LEN] = {0};
3259         l7vs_conn_c_str(conn_str, conn);
3260         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,293,
3261             "in_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3262             "conn=%s",
3263             conn_str);
3264     }
3265     /*------ DEBUG LOG END ------*/
3266
3267     if (!conn) {
3268         /*-------- DEBUG LOG --------*/
3269         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3270             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,294,
3271                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3272                 "return_value: void");
3273         }
3274         /*------ DEBUG LOG END ------*/
3275         return;
3276     }
3277     if (!conn->ciom) {
3278         /*-------- DEBUG LOG --------*/
3279         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3280             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,295,
3281                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3282                 "return_value: void");
3283         }
3284         /*------ DEBUG LOG END ------*/
3285         return;
3286     }
3287     if (-1 == conn->ciom->fd) {
3288         /*-------- DEBUG LOG --------*/
3289         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3290             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,296,
3291                 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3292                 "return_value: void");
3293         }
3294         /*------ DEBUG LOG END ------*/
3295         return;
3296     }
3297
3298     l7vs_iomux_remove(conn->ciom);
3299     /*-------- DEBUG LOG --------*/
3300     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3301         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,297,
3302             "close: conn->ciom->fd=%d",
3303             conn->ciom->fd);
3304     }
3305     /*------ DEBUG LOG END ------*/
3306     close(conn->ciom->fd);
3307     conn->ciom->fd = -1;
3308
3309     /*-------- DEBUG LOG --------*/
3310     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3311         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,298,
3312             "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3313             "return_value: void");
3314     }
3315     /*------ DEBUG LOG END ------*/
3316 }
3317
3318 /*!
3319  * close real server socket
3320  *
3321  * @param[in]   conn    connection
3322  * @return      void 
3323  */
3324 void
3325 l7vs_conn_close_rsock(struct l7vs_conn *conn)
3326 {
3327     /*-------- DEBUG LOG --------*/
3328     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3329         char conn_str[DEBUG_STR_LEN] = {0};
3330         l7vs_conn_c_str(conn_str, conn);
3331         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,299,
3332             "in_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3333             "conn=%s",
3334             conn_str);
3335     }
3336     /*------ DEBUG LOG END ------*/
3337
3338     if (!conn) {
3339         /*-------- DEBUG LOG --------*/
3340         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3341             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,300,
3342                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3343                 "return_value: void");
3344         }
3345         /*------ DEBUG LOG END ------*/
3346         return;
3347     }
3348     if (!conn->riom) {
3349         /*-------- DEBUG LOG --------*/
3350         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3351             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,301,
3352                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3353                 "return_value: void");
3354         }
3355         /*------ DEBUG LOG END ------*/
3356         return;
3357     }
3358     if (-1 == conn->riom->fd) {
3359         /*-------- DEBUG LOG --------*/
3360         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3361             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,302,
3362                 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3363                 "return_value: void");
3364         }
3365         /*------ DEBUG LOG END ------*/
3366         return;
3367     }
3368
3369     if (conn->dest) {
3370         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3371             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,303, "dest %p nactive %d->%d",
3372                 conn->dest, conn->dest->nactive,
3373                 conn->dest->nactive - 1);
3374         }
3375         conn->dest->nactive--;
3376         conn->dest->ninact++;
3377         if(conn->dest->ninact == INT_MAX) {
3378             conn->dest->ninact = 0;
3379         }
3380
3381         /*-------- DEBUG LOG --------*/
3382         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3383                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,343,
3384                 "RealServer Connected Count : ninact is %d",
3385                 conn->dest->ninact);
3386         }
3387         /*------ DEBUG LOG END ------*/
3388     }
3389
3390     l7vs_iomux_remove(conn->riom);
3391     /*-------- DEBUG LOG --------*/
3392     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3393         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,304,
3394             "close: conn->riom->fd=%d",
3395             conn->riom->fd);
3396     }
3397     /*------ DEBUG LOG END ------*/
3398     close(conn->riom->fd);
3399     conn->riom->fd = -1;
3400
3401     /*-------- DEBUG LOG --------*/
3402     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3403         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,305,
3404             "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3405             "return_value: void");
3406     }
3407     /*------ DEBUG LOG END ------*/
3408 }
3409
3410 /*!
3411  * confirmation of whether conn is closed
3412  *
3413  * @param[in]   conn    connection
3414  * @return      closed or not
3415  * @retval      0       not closed 
3416  * @retval      1       closed
3417  */
3418 int
3419 l7vs_conn_closed(struct l7vs_conn *conn)
3420 {
3421     /*-------- DEBUG LOG --------*/
3422     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3423         char conn_str[DEBUG_STR_LEN] = {0};
3424         l7vs_conn_c_str(conn_str, conn);
3425         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,306,
3426             "in_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3427             "conn=%s",
3428             conn_str);
3429     }
3430     /*------ DEBUG LOG END ------*/
3431
3432     if (!conn) {
3433         /*-------- DEBUG LOG --------*/
3434         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3435             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,307,
3436                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3437                 "return_value: 1");
3438         }
3439         /*------ DEBUG LOG END ------*/
3440         return 1;
3441     }
3442     if ((conn->ciom && -1 != conn->ciom->fd) || (conn->riom && -1 != conn->riom->fd)) {
3443         /*-------- DEBUG LOG --------*/
3444         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3445             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,308,
3446                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3447                 "return_value: 0");
3448         }
3449         /*------ DEBUG LOG END ------*/
3450         return 0;
3451     } else {
3452         /*-------- DEBUG LOG --------*/
3453         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3454             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,309,
3455                 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3456                 "return_value: 1");
3457         }
3458         /*------ DEBUG LOG END ------*/
3459         return 1;
3460     }
3461 }
3462
3463 /*!
3464  * Change connection to specified destination (to real-server or sorry-server).
3465  *
3466  * @param[in]   *conn   connection pointer
3467  * @param[in]   *dest   destination pointer
3468  * @return      int     change connection result 0=NG, 1=OK
3469  */
3470 static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
3471 {
3472     /*-------- DEBUG LOG --------*/
3473     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3474         char conn_str[DEBUG_STR_LEN] = {0};
3475         char dest_str[DEBUG_STR_LEN] = {0};
3476         l7vs_conn_c_str(conn_str, conn);
3477         l7vs_dest_c_str(dest_str, dest);
3478         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,310,
3479             "in_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3480             "conn=%s: "
3481             "dest=%s",
3482             conn_str, dest_str);
3483     }
3484     /*------ DEBUG LOG END ------*/
3485
3486     int ret;
3487
3488     if (!conn) {
3489         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,77, "error / conn is null");
3490         /*-------- DEBUG LOG --------*/
3491         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3492             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,311,
3493                 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3494                 "return_value: 0");
3495         }
3496         /*------ DEBUG LOG END ------*/
3497         return 0;
3498     }
3499     if (!dest) {
3500         LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,78, "error / dest is null");
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,312,
3504                 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3505                 "return_value: 0");
3506         }
3507         /*------ DEBUG LOG END ------*/
3508         return 0;
3509     }
3510     // save old destination
3511     conn->old_dest = conn->dest;
3512     /*-------- DEBUG LOG --------*/
3513     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3514         char old_dest_str[DEBUG_STR_LEN] = {0};
3515         l7vs_dest_c_str(old_dest_str, conn->old_dest);
3516         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
3517             "pointer_assign: conn->old_dest=%s",
3518             old_dest_str);
3519     }
3520     /*------ DEBUG LOG END ------*/
3521     // close real-server connection
3522     l7vs_conn_close_rsock(conn);
3523     // connect to new destination
3524     ret = l7vs_conn_connect_rs(conn, dest);
3525
3526     /*-------- DEBUG LOG --------*/
3527     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3528         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,314,
3529             "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3530             "return_value: %d",
3531             ret);
3532     }
3533     /*------ DEBUG LOG END ------*/
3534     return ret;
3535 }
3536
3537 /*!
3538  * Judges from the data size received last time and recieve-interval
3539  *
3540  * @param[in]   *conn       connection pointer
3541  * @param[in]   direction   traffic direction
3542  * @return      int         permitte for recv function call 0=NG(not permitted), 1=OK(permitted)
3543  */
3544 static int
3545 l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction )
3546 {
3547     /*-------- DEBUG LOG --------*/
3548     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3549         char conn_str[DEBUG_STR_LEN] = {0};
3550         l7vs_conn_c_str(conn_str, conn);
3551         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,315,
3552             "in_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3553             "conn=%s, direction=%d",
3554             conn_str, direction);
3555     }
3556     /*------ DEBUG LOG END ------*/
3557
3558     if (!conn) {
3559         /*-------- DEBUG LOG --------*/
3560         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3561             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,316,
3562                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3563                 "return_value: 1");
3564         }
3565         /*------ DEBUG LOG END ------*/
3566         return 1;
3567     }
3568     if (!conn->srv) {
3569         /*-------- DEBUG LOG --------*/
3570         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3571             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,348,
3572                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3573                 "return_value: 1");
3574         }
3575         /*------ DEBUG LOG END ------*/
3576         return 1;
3577     }
3578
3579     struct timeval CurrTime;
3580     gettimeofday( &CurrTime, NULL );
3581     /*-------- DEBUG LOG --------*/
3582     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3583         char time_str[DEBUG_STR_LEN] = {0};
3584         snprintf(time_str, DEBUG_STR_LEN,
3585             "timeval="
3586             "{tv_sec=%ld: "
3587             "tv_usec=%ld}"
3588             , CurrTime.tv_sec
3589             , CurrTime.tv_usec);
3590         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
3591             "gettimeofday result: CurrTime=%s",
3592             time_str);
3593     }
3594     /*------ DEBUG LOG END ------*/
3595
3596     unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3597     l7vs_service_update_throughput(conn->srv, cur_recvtime);
3598
3599     switch (direction) {
3600     case QOS_UP:
3601         //QoS Control check : to server
3602         conn->srv->throughput_to_server = conn->srv->cur_recvsize_from_client * 1000000ULL / throughput_interval;
3603         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3604             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,323, "QoS threshold to server:%lld ", conn->srv->qos_threshold_up);
3605             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,324, "(current throughput:%lld)", conn->srv->throughput_to_server);
3606         }
3607         if( (conn->srv->qos_threshold_up) && (conn->srv->throughput_to_server + l7vs_conn_read_bufsize > conn->srv->qos_threshold_up) ){
3608             if (conn->srv->qos_up_flag == 0) {
3609                 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,1, "Start QoS traffic control to server.");
3610                 conn->srv->qos_up_flag = 1;
3611             }
3612             /*-------- DEBUG LOG --------*/
3613             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3614                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,326,
3615                     "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3616                     "return_value: 0");
3617             }
3618             /*------ DEBUG LOG END ------*/
3619             return 0;
3620         }
3621         if (conn->srv->qos_up_flag == 1) {
3622             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,2, "Stop QoS traffic control to server.");
3623             conn->srv->qos_up_flag = 0;
3624         }
3625         break;
3626     case QOS_DOWN:
3627         //QoS Control check : to client
3628         conn->srv->throughput_to_client = conn->srv->cur_recvsize_from_server * 1000000ULL / throughput_interval;
3629         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3630             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,349, "QoS threshold to client:%lld ", conn->srv->qos_threshold_down);
3631             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,350, "(current throughput:%lld)", conn->srv->throughput_to_client);
3632         }
3633         if( (conn->srv->qos_threshold_down) && (conn->srv->throughput_to_client + l7vs_conn_read_bufsize > conn->srv->qos_threshold_down) ){
3634             if (conn->srv->qos_down_flag == 0) {
3635                 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,3, "Start QoS traffic control to client.");
3636                 conn->srv->qos_down_flag = 1;
3637             }
3638             /*-------- DEBUG LOG --------*/
3639             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3640                 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,351,
3641                     "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3642                     "return_value: 0");
3643             }
3644             /*------ DEBUG LOG END ------*/
3645             return 0;
3646         }
3647         if (conn->srv->qos_down_flag == 1) {
3648             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,4, "Stop QoS traffic control to client.");
3649             conn->srv->qos_down_flag = 0;
3650         }
3651         break;
3652     default:
3653         /*-------- DEBUG LOG --------*/
3654         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3655             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
3656                 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3657                 "return_value: 1");
3658         }
3659         /*------ DEBUG LOG END ------*/
3660         return 1;
3661     }
3662
3663     /*-------- DEBUG LOG --------*/
3664     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3665         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,335,
3666             "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn ) "
3667             "return_value: 1");
3668     }
3669     /*------ DEBUG LOG END ------*/
3670     return 1;
3671 }
3672
3673 /*!
3674  * Regsiter recive time and recieved data size
3675  *
3676  * @param[in]   *conn       connection pointer
3677  * @param[in]   in_recvsize recieved size
3678  * @param[in]   direction   traffic direction
3679  * @return      void 
3680  */
3681 static void
3682 l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction )
3683 {
3684     /*-------- DEBUG LOG --------*/
3685     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3686         char conn_str[DEBUG_STR_LEN] = {0};
3687         l7vs_conn_c_str(conn_str, conn);
3688         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,336,
3689             "in_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3690             "conn=%s: "
3691             "in_recvsize=%zu",
3692             conn_str, in_recvsize);
3693     }
3694     /*------ DEBUG LOG END ------*/
3695
3696     if (!conn) {
3697         /*-------- DEBUG LOG --------*/
3698         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3699             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,337,
3700                 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3701                 "return_value: void");
3702         }
3703         /*------ DEBUG LOG END ------*/
3704         return;
3705     }
3706     if (!conn->srv) {
3707         /*-------- DEBUG LOG --------*/
3708         if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3709             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,338,
3710                 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3711                 "return_value: void");
3712         }
3713         /*------ DEBUG LOG END ------*/
3714         return;
3715     }
3716     struct timeval CurrTime;
3717     gettimeofday( &CurrTime, NULL );
3718     /*-------- DEBUG LOG --------*/
3719     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3720         char time_str[DEBUG_STR_LEN] = {0};
3721         snprintf(time_str, DEBUG_STR_LEN,
3722             "timeval="
3723             "{tv_sec=%ld: "
3724             "tv_usec=%ld}"
3725             , CurrTime.tv_sec
3726             , CurrTime.tv_usec);
3727         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,352,
3728             "gettimeofday result: CurrTime=%s",
3729             time_str);
3730     }
3731     /*------ DEBUG LOG END ------*/
3732
3733     int throughput_interval = BPS_DEFAULT_INTERVAL;
3734     if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
3735         throughput_interval = parameter_get_int_value( PARAM_COMP_L7VSD, "calc_throughput_interval" );
3736     }
3737     unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3738     l7vs_service_update_throughput(conn->srv, cur_recvtime);
3739
3740     switch (direction) {
3741     case QOS_UP:
3742         conn->srv->cur_recvsize_from_client += in_recvsize;
3743         break;
3744     case QOS_DOWN:
3745         conn->srv->cur_recvsize_from_server += in_recvsize;
3746         break;
3747     default:
3748         break;
3749     }
3750
3751     /*-------- DEBUG LOG --------*/
3752     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3753         LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,340,
3754             "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3755             "return_value: void");
3756     }
3757     /*------ DEBUG LOG END ------*/
3758 }
3759