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
8 * L7VSD: Linux Virtual Server for Layer7 Load Balancing
9 * Copyright (C) 2005 NTT COMWARE Corporation.
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 **********************************************************************/
28 #include <sys/types.h>
29 #include <sys/socket.h>
30 #include <sys/select.h>
32 #include <netinet/in.h>
33 #include <netinet/tcp.h>
34 #include <arpa/inet.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"
49 #include "l7vs_module.h"
50 #include "l7vs_sched.h"
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
76 /*-------- DEBUG LOG --------*/
77 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
78 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
79 "in_function: int lvs_conn_init() ");
81 /*------ DEBUG LOG END ------*/
83 int ret = parameter_is_int_exist( PARAM_COMP_CONN, "read_bufsize" );
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);
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);
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);
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" );
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() ");
115 /*------ DEBUG LOG END ------*/
122 * @param[out] str_data dump string
123 * @param[in] data source data
124 * @param[in] len source data length
127 void l7vs_conn_dump_data(char* str_data, const char* data, const size_t len)
134 snprintf(str_data, DEBUG_STR_LEN, "(nil)");
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 "
156 const int hx_len = 3;
159 for (size_t i = 0; i < len; ++i) {
160 if (DEBUG_STR_LEN <= pos + hx_len) {
163 strncpy(str_data + pos, table[(unsigned char)*(data + i)], hx_len);
166 *(str_data + pos) = '\0';
172 * @param[in] lfd listening socket fd
173 * @param[in] lsock listening socket
177 l7vs_conn_create(int lfd, struct l7vs_lsock *lsock)
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) "
189 /*------ DEBUG LOG END ------*/
192 struct l7vs_conn *conn = NULL;
198 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,28, "error / lsock fd is not specified");
203 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,29, "error / lsock is null");
207 conn = (struct l7vs_conn*)malloc(sizeof(struct l7vs_conn));
209 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,8, "error / can not allocate memory");
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));
218 /*------ DEBUG LOG END ------*/
219 memset(conn, 0, sizeof(struct l7vs_conn));
221 conn->ciom = l7vs_iomux_get_from_avail_list();
223 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,7, "error / can not get client iom");
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",
234 /*------ DEBUG LOG END ------*/
236 conn->riom = l7vs_iomux_get_from_avail_list();
238 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,8, "error / can not get realserver iom");
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",
249 /*------ DEBUG LOG END ------*/
251 conn->cldata_len = 0;
252 conn->cldata_bufsize = l7vs_conn_read_bufsize;
253 conn->cldata = (char *)malloc(conn->cldata_bufsize);
255 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,9, "error / can not allocate memory for buffer");
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);
264 /*------ DEBUG LOG END ------*/
265 memset(conn->cldata, 0, conn->cldata_bufsize);
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);
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));
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",
292 /*------ DEBUG LOG END ------*/
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",
301 /*------ DEBUG LOG END ------*/
302 flags = fcntl(conn->ciom->fd, F_GETFL, 0);
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));
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",
315 /*------ DEBUG LOG END ------*/
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));
324 /*------ DEBUG LOG END ------*/
325 flags = fcntl(conn->ciom->fd, F_SETFL, flags | O_NONBLOCK);
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));
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",
338 /*------ DEBUG LOG END ------*/
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: "
347 conn->ciom->fd, len);
349 /*------ DEBUG LOG END ------*/
350 ret = getsockopt(conn->ciom->fd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
352 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,11, "error / getsockopt TCP_MAXSEG error(%s)", strerror(errno));
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",
361 /*------ DEBUG LOG END ------*/
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);
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",
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);
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);
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",
404 /*------ DEBUG LOG END ------*/
405 conn->sorry_conn_flag = 0;
406 conn->old_dest = NULL;
407 l7vs_iomux_add(conn->ciom, iom_read);
409 // connect real server immediately if all lsock services are fast schedule.
410 if (lsock->fast_schedule) {
411 struct l7vs_service* srv;
412 struct l7vs_dest* dest;
413 conn->ciom->status = iomux_conn_received;
414 if (!l7vs_conn_is_rs_connected(conn->ciom, conn, &srv, &dest)) {
415 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
418 switch (conn->ciom->status) {
419 case iomux_conn_block:
420 //already decided real server
422 case iomux_conn_service_selected:
423 //service and destination were selected then attempt to connect the real server
424 if (!l7vs_conn_connection_establish(conn->ciom, conn, srv, dest)) {
425 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
430 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", conn->ciom->status);
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",
444 /*------ DEBUG LOG END ------*/
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");
453 /*------ DEBUG LOG END ------*/
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",
463 /*------ DEBUG LOG END ------*/
464 close(conn->ciom->fd);
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",
474 /*------ DEBUG LOG END ------*/
475 l7vs_iomux_put_to_avail_list(conn->ciom);
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",
486 /*------ DEBUG LOG END ------*/
487 l7vs_iomux_put_to_avail_list(conn->riom);
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",
496 /*------ DEBUG LOG END ------*/
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,
505 /*------ DEBUG LOG END ------*/
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");
514 /*------ DEBUG LOG END ------*/
521 * @param[in] conn connection
525 l7vs_conn_destroy(struct l7vs_conn *conn)
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) "
536 /*------ DEBUG LOG END ------*/
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");
544 /*------ DEBUG LOG END ------*/
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");
555 /*------ DEBUG LOG END ------*/
560 if (-1 != conn->ciom->fd) {
561 l7vs_conn_close_csock(conn);
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",
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");
578 /*------ DEBUG LOG END ------*/
583 if (-1 != conn->riom->fd) {
584 l7vs_conn_close_rsock(conn);
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",
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");
601 /*------ DEBUG LOG END ------*/
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",
612 /*------ DEBUG LOG END ------*/
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");
619 /*------ DEBUG LOG END ------*/
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,
629 /*------ DEBUG LOG END ------*/
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");
637 /*------ DEBUG LOG END ------*/
641 * client connection callback
643 * @param[in] iom connection iomux
649 l7vs_conn_cl_callback(struct l7vs_iomux *iom )
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 ) "
660 /*------ DEBUG LOG END ------*/
661 struct l7vs_conn* conn = NULL;
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 ) "
671 /*------ DEBUG LOG END ------*/
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",
684 /*------ DEBUG LOG END ------*/
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 ) "
700 /*------ DEBUG LOG END ------*/
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 ) "
716 /*------ DEBUG LOG END ------*/
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");
723 l7vs_conn_destroy(conn);
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 ) "
736 /*------ DEBUG LOG END ------*/
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 ) "
750 /*------ DEBUG LOG END ------*/
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 ) "
764 /*------ DEBUG LOG END ------*/
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 ) "
778 /*------ DEBUG LOG END ------*/
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 ) "
791 /*------ DEBUG LOG END ------*/
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 ) "
801 /*------ DEBUG LOG END ------*/
808 * @param[in] iom connection iomux
814 l7vs_conn_client_receiving(struct l7vs_iomux *iom)
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) "
825 /*------ DEBUG LOG END ------*/
826 struct l7vs_conn *conn = NULL;
827 struct l7vs_service *srv = NULL;
828 struct l7vs_dest *dest = NULL;
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) "
838 /*------ DEBUG LOG END ------*/
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) "
850 /*------ DEBUG LOG END ------*/
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",
863 /*------ DEBUG LOG END ------*/
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);
874 /*------ DEBUG LOG END ------*/
875 conn->riom->status = iomux_conn_block;
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) "
887 /*------ DEBUG LOG END ------*/
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);
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) "
905 /*------ DEBUG LOG END ------*/
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) "
917 /*------ DEBUG LOG END ------*/
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) "
929 /*------ DEBUG LOG END ------*/
932 l7vs_conn_QoS_recvsize_register( conn, conn->cldata_len, QOS_UP );
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) "
943 /*------ DEBUG LOG END ------*/
947 case iomux_conn_disconnected:
948 // client connection was disconnected
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) "
959 /*------ DEBUG LOG END ------*/
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) "
968 /*------ DEBUG LOG END ------*/
973 * check realserver fd, and if real server not connected, call select_service function
975 * @param[in] iom connection_iomux
976 * @param[in] conn connection
977 * @param[out] srv service
978 * @param[out] dest destination(real server)
984 l7vs_conn_is_rs_connected(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest)
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) "
1003 iom_str, conn_str, srv_str, dest_str);
1005 /*------ DEBUG LOG END ------*/
1009 struct l7vs_dest *d; // destination for sorry-server
1010 int sorry_state; // sorry state
1012 struct l7vs_lsock *lsock = NULL;
1015 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,36, "error / iom is null");
1016 /*-------- DEBUG LOG --------*/
1017 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1018 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,112,
1019 "out_function: static int l7vs_conn_is_rs_connected("
1020 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1023 /*------ DEBUG LOG END ------*/
1028 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,37, "error / conn is null");
1029 /*-------- DEBUG LOG --------*/
1030 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1031 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,113,
1032 "out_function: static int l7vs_conn_is_rs_connected("
1033 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1036 /*------ DEBUG LOG END ------*/
1040 if (iomux_conn_received != iom->status) {
1041 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,38, "error / invalid status(%d)", iom->status);
1042 /*-------- DEBUG LOG --------*/
1043 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1044 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,114,
1045 "out_function: static int l7vs_conn_is_rs_connected("
1046 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1049 /*------ DEBUG LOG END ------*/
1053 lsock = conn->lsock;
1054 /*-------- DEBUG LOG --------*/
1055 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1056 char lsock_str[DEBUG_STR_LEN] = {0};
1057 l7vs_lsock_c_str(lsock_str, lsock);
1058 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,115,
1059 "pointer_assign: lsock=%s",
1062 /*------ DEBUG LOG END ------*/
1064 //is real server connected?
1065 if (-1 != conn->riom->fd) {
1066 // check sorry status of service
1067 // argment 0 means no connection count check
1068 sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
1070 // check connect to sorry-server now
1071 if (!conn->sorry_conn_flag) {
1072 // get sorry-server destination (argment 0)
1073 d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
1074 /*-------- DEBUG LOG --------*/
1075 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1076 char sorry_dest_str1[DEBUG_STR_LEN] = {0};
1077 l7vs_dest_c_str(sorry_dest_str1, d);
1078 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
1079 "pointer_assign: d=%s",
1082 /*------ DEBUG LOG END ------*/
1084 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
1085 /*-------- DEBUG LOG --------*/
1086 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1087 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
1088 "iom->status change: %d->%d",
1089 iom->status, iomux_conn_rs_connect_error);
1091 /*------ DEBUG LOG END ------*/
1092 iom->status = iomux_conn_rs_connect_error;
1093 /*-------- DEBUG LOG --------*/
1094 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1095 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
1096 "out_function: static int l7vs_conn_is_rs_connected("
1097 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1100 /*------ DEBUG LOG END ------*/
1103 conn->old_dest = conn->dest;
1104 /*-------- DEBUG LOG --------*/
1105 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1106 char old_dest_str[DEBUG_STR_LEN] = {0};
1107 l7vs_dest_c_str(old_dest_str, conn->old_dest);
1108 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
1109 "pointer_assign: conn->old_dest=%s",
1112 /*------ DEBUG LOG END ------*/
1113 // change connection to sorry-server
1114 if (!l7vs_conn_change_connect_rs(conn, d)) {
1115 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
1116 /*-------- DEBUG LOG --------*/
1117 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1118 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
1119 "iom->status change: %d->%d",
1120 iom->status, iomux_conn_rs_connect_error);
1122 /*------ DEBUG LOG END ------*/
1123 iom->status = iomux_conn_rs_connect_error;
1124 /*-------- DEBUG LOG --------*/
1125 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1126 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
1127 "out_function: static int l7vs_conn_is_rs_connected("
1128 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1131 /*------ DEBUG LOG END ------*/
1134 conn->sorry_conn_flag = 1;
1137 // check connect to sorry-server now
1138 if (conn->sorry_conn_flag) {
1139 // get old real-server destination (argment 1)
1140 d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
1141 /*-------- DEBUG LOG --------*/
1142 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1143 char sorry_dest_str2[DEBUG_STR_LEN] = {0};
1144 l7vs_dest_c_str(sorry_dest_str2, d);
1145 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
1146 "pointer_assign: d=%s",
1149 /*------ DEBUG LOG END ------*/
1151 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
1152 /*-------- DEBUG LOG --------*/
1153 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1154 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
1155 "iom->status change: %d->%d",
1156 iom->status, iomux_conn_rs_connect_error);
1158 /*------ DEBUG LOG END ------*/
1159 iom->status = iomux_conn_rs_connect_error;
1160 /*-------- DEBUG LOG --------*/
1161 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1162 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
1163 "out_function: static int l7vs_conn_is_rs_connected("
1164 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1167 /*------ DEBUG LOG END ------*/
1170 // change connection to real-server
1171 if (!l7vs_conn_change_connect_rs(conn, d)) {
1172 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
1173 /*-------- DEBUG LOG --------*/
1174 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1175 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
1176 "iom->status change: %d->%d",
1177 iom->status, iomux_conn_rs_connect_error);
1179 /*------ DEBUG LOG END ------*/
1180 iom->status = iomux_conn_rs_connect_error;
1181 /*-------- DEBUG LOG --------*/
1182 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1183 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
1184 "out_function: static int l7vs_conn_is_rs_connected("
1185 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1188 /*------ DEBUG LOG END ------*/
1191 conn->sorry_conn_flag = 0;
1194 /*-------- DEBUG LOG --------*/
1195 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1196 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,127,
1197 "iom->status change: %d->%d",
1198 iom->status, iomux_conn_block);
1200 /*------ DEBUG LOG END ------*/
1201 iom->status = iomux_conn_block;
1202 if (iomux_conn_busy == conn->riom->status) {
1203 /*-------- DEBUG LOG --------*/
1204 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1205 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,128,
1206 "conn->riom->status change: %d->%d",
1207 conn->riom->status, iomux_conn_sending_busy);
1209 /*------ DEBUG LOG END ------*/
1210 conn->riom->status = iomux_conn_sending_busy;
1213 /*-------- DEBUG LOG --------*/
1214 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1215 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,129,
1216 "conn->riom->status change: %d->%d",
1217 conn->riom->status, iomux_conn_sending);
1219 /*------ DEBUG LOG END ------*/
1220 conn->riom->status = iomux_conn_sending;
1222 //epoll re-registration for write
1223 l7vs_iomux_mod(conn->riom, iom_write);
1227 ret = l7vs_lsock_select_service(lsock, conn, conn->cldata,
1228 conn->cldata_len, srv, dest, &temp_tcps);
1232 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,22, "error / no matching service found");
1233 /*-------- DEBUG LOG --------*/
1234 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1235 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,130,
1236 "iom->status change: %d->%d",
1237 iom->status, iomux_conn_receive_error);
1239 /*------ DEBUG LOG END ------*/
1240 iom->status = iomux_conn_receive_error;
1241 /*-------- DEBUG LOG --------*/
1242 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1243 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,131,
1244 "out_function: static int l7vs_conn_is_rs_connected("
1245 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1248 /*------ DEBUG LOG END ------*/
1251 /*-------- DEBUG LOG --------*/
1252 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1253 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,132,
1254 "iom->status change: %d->%d",
1255 iom->status, iomux_conn_service_selected);
1257 /*------ DEBUG LOG END ------*/
1258 iom->status = iomux_conn_service_selected;
1261 /*-------- DEBUG LOG --------*/
1262 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1263 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,133,
1264 "out_function: static int l7vs_conn_is_rs_connected("
1265 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
1268 /*------ DEBUG LOG END ------*/
1273 * connecction establish
1275 * @param[in] iom connection_iomux
1276 * @param[in] conn connection
1277 * @param[in] srv service
1278 * @param[in] dest destination(real server)
1284 l7vs_conn_connection_establish(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)
1286 /*-------- DEBUG LOG --------*/
1287 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1288 char iom_str[DEBUG_STR_LEN] = {0};
1289 char conn_str[DEBUG_STR_LEN] = {0};
1290 char srv_str[DEBUG_STR_LEN] = {0};
1291 char dest_str[DEBUG_STR_LEN] = {0};
1292 l7vs_iomux_c_str(iom_str, iom);
1293 l7vs_conn_c_str(conn_str, conn);
1294 l7vs_service_c_str(srv_str, srv);
1295 l7vs_dest_c_str(dest_str, dest);
1296 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,134,
1297 "in_function: static int l7vs_conn_connection_establish("
1298 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1303 iom_str, conn_str, srv_str, dest_str);
1305 /*------ DEBUG LOG END ------*/
1309 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,39, "error / iom is null");
1310 /*-------- DEBUG LOG --------*/
1311 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1312 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,135,
1313 "out_function: static int l7vs_conn_connection_establish("
1314 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1317 /*------ DEBUG LOG END ------*/
1322 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,40, "error / conn is null");
1323 /*-------- DEBUG LOG --------*/
1324 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1325 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,136,
1326 "out_function: static int l7vs_conn_connection_establish("
1327 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1330 /*------ DEBUG LOG END ------*/
1335 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,41, "error / srv is null");
1336 /*-------- DEBUG LOG --------*/
1337 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1338 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,137,
1339 "out_function: static int l7vs_conn_connection_establish("
1340 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1343 /*------ DEBUG LOG END ------*/
1348 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,42, "error / dest is null");
1349 /*-------- DEBUG LOG --------*/
1350 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1351 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,138,
1352 "out_function: static int l7vs_conn_connection_establish("
1353 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1356 /*------ DEBUG LOG END ------*/
1360 if (iom->status != iomux_conn_service_selected) {
1361 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,43, "error / invalid status(%d)", iom->status);
1362 /*-------- DEBUG LOG --------*/
1363 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1364 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,139,
1365 "out_function: static int l7vs_conn_connection_establish("
1366 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1369 /*------ DEBUG LOG END ------*/
1373 // connect to real server
1374 if (!l7vs_conn_connect_rs(conn, dest)) {
1375 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,23, "error / connect rs failed");
1376 /*-------- DEBUG LOG --------*/
1377 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1378 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,140,
1379 "iom->status change: %d->%d",
1380 iom->status, iomux_conn_rs_connect_error);
1382 /*------ DEBUG LOG END ------*/
1383 iom->status = iomux_conn_rs_connect_error;
1384 /*-------- DEBUG LOG --------*/
1385 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1386 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,141,
1387 "out_function: static int l7vs_conn_connection_establish("
1388 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1391 /*------ DEBUG LOG END ------*/
1394 /*-------- DEBUG LOG --------*/
1395 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1396 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,142,
1397 "iom->status change: %d->%d",
1398 iom->status, iomux_conn_rs_connected);
1400 /*------ DEBUG LOG END ------*/
1401 iom->status = iomux_conn_rs_connected;
1403 // set pointer for cross reference
1405 /*-------- DEBUG LOG --------*/
1406 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1407 char service_str[DEBUG_STR_LEN] = {0};
1408 l7vs_service_c_str(service_str, conn->srv);
1409 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,143,
1410 "pointer_assign: conn->srv=%s",
1413 /*------ DEBUG LOG END ------*/
1414 l7vs_service_register_conn(srv, conn);
1416 // service establish
1417 ret = l7vs_service_establish(conn->srv, conn);
1419 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,24, "error / service establish failed");
1420 /*-------- DEBUG LOG --------*/
1421 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1422 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,144,
1423 "iom->status change: %d->%d",
1424 iom->status, iomux_conn_rs_connect_error);
1426 /*------ DEBUG LOG END ------*/
1427 iom->status = iomux_conn_rs_connect_error;
1428 /*-------- DEBUG LOG --------*/
1429 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1430 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,145,
1431 "out_function: static int l7vs_conn_connection_establish("
1432 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1435 /*------ DEBUG LOG END ------*/
1440 /*-------- DEBUG LOG --------*/
1441 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1442 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,146,
1443 "iom->status change: %d->%d",
1444 iom->status, iomux_conn_block);
1446 /*------ DEBUG LOG END ------*/
1447 iom->status = iomux_conn_block;
1448 /*-------- DEBUG LOG --------*/
1449 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1450 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,147,
1451 "conn->riom->status change: %d->%d",
1452 conn->riom->status, iomux_conn_sending);
1454 /*------ DEBUG LOG END ------*/
1455 conn->riom->status = iomux_conn_sending;
1457 /*-------- DEBUG LOG --------*/
1458 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1459 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,148,
1460 "out_function: static int l7vs_conn_connection_establish("
1461 "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
1464 /*------ DEBUG LOG END ------*/
1470 * when block status, arrived data turn next epoll reaction
1471 * and changes state to busy, expect the another iom is already busy
1473 * @param[in] iom connection_iomux
1474 * @param[in] another_iom another side's iomux
1480 l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1482 /*-------- DEBUG LOG --------*/
1483 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1484 char iom_str[DEBUG_STR_LEN] = {0};
1485 char a_iom_str[DEBUG_STR_LEN] = {0};
1486 l7vs_iomux_c_str(iom_str, iom);
1487 l7vs_iomux_c_str(a_iom_str, another_iom);
1488 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,149,
1489 "in_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1492 iom_str, a_iom_str);
1494 /*------ DEBUG LOG END ------*/
1497 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,44, "error / iom is null");
1498 /*-------- DEBUG LOG --------*/
1499 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1500 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,150,
1501 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1504 /*------ DEBUG LOG END ------*/
1509 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,45, "error / another_iom is null");
1510 /*-------- DEBUG LOG --------*/
1511 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1512 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,151,
1513 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1516 /*------ DEBUG LOG END ------*/
1520 if (iomux_conn_block != iom->status) {
1521 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,46, "error / invalid status(%d)", iom->status);
1522 /*-------- DEBUG LOG --------*/
1523 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1524 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,152,
1525 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1528 /*------ DEBUG LOG END ------*/
1532 // epoll re-registraion for read
1533 l7vs_iomux_mod(iom, iom_read);
1535 // when another iom status is busy, do not change my status
1536 if (iomux_conn_busy != another_iom->status &&
1537 iomux_conn_sending_busy != another_iom->status &&
1538 iomux_conn_sent_busy != another_iom->status) {
1539 /*-------- DEBUG LOG --------*/
1540 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1541 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,153,
1542 "iom->status change: %d->%d",
1543 iom->status, iomux_conn_busy);
1545 /*------ DEBUG LOG END ------*/
1546 iom->status = iomux_conn_busy;
1549 /*-------- DEBUG LOG --------*/
1550 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1551 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,154,
1552 "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1555 /*------ DEBUG LOG END ------*/
1561 * when busy status, arrived data turn next epoll reaction and status keep busy
1563 * @param[in] iom connection_iomux
1569 l7vs_conn_busy(struct l7vs_iomux *iom)
1571 /*-------- DEBUG LOG --------*/
1572 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1573 char iom_str[DEBUG_STR_LEN] = {0};
1574 l7vs_iomux_c_str(iom_str, iom);
1575 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,155,
1576 "in_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1580 /*------ DEBUG LOG END ------*/
1583 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,47, "error / iom is null");
1584 /*-------- DEBUG LOG --------*/
1585 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1586 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,156,
1587 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1590 /*------ DEBUG LOG END ------*/
1594 if (iomux_conn_busy != iom->status) {
1595 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,48, "error / invalid status(%d)", iom->status);
1596 /*-------- DEBUG LOG --------*/
1597 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1598 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,157,
1599 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1602 /*------ DEBUG LOG END ------*/
1606 //epoll re-registration for read
1607 // l7vs_iomux_mod(iom, iom_read);
1609 /*-------- DEBUG LOG --------*/
1610 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1611 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,158,
1612 "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
1615 /*------ DEBUG LOG END ------*/
1622 * @param[in] iom connection_iomux
1623 * @param[in] another_iom another side's iomux
1629 l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
1631 /*-------- DEBUG LOG --------*/
1632 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1633 char iom_str[DEBUG_STR_LEN] = {0};
1634 char a_iom_str[DEBUG_STR_LEN] = {0};
1635 l7vs_iomux_c_str(iom_str, iom);
1636 l7vs_iomux_c_str(a_iom_str, another_iom);
1637 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,159,
1638 "in_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1641 iom_str, a_iom_str);
1643 /*------ DEBUG LOG END ------*/
1646 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,49, "error / iom is null");
1647 /*-------- DEBUG LOG --------*/
1648 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1649 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,160,
1650 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1653 /*------ DEBUG LOG END ------*/
1658 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,50, "error / another_iom is null");
1659 /*-------- DEBUG LOG --------*/
1660 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1661 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,161,
1662 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1665 /*------ DEBUG LOG END ------*/
1669 if (iomux_conn_sending != iom->status && iomux_conn_sending_busy != iom->status) {
1670 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,51, "error / invalid status(%d)", iom->status);
1671 /*-------- DEBUG LOG --------*/
1672 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1673 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,162,
1674 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1677 /*------ DEBUG LOG END ------*/
1681 // send to handling iom
1682 if (!l7vs_conn_send(iom, iom->fd)) {
1683 iom->status = iomux_conn_send_error;
1684 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,25, "error / send failed");
1685 /*-------- DEBUG LOG --------*/
1686 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1687 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,163,
1688 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1691 /*------ DEBUG LOG END ------*/
1694 if (iomux_conn_sent == iom->status || iomux_conn_sent_busy == iom->status) {
1695 // when all data was sent, select the next state
1696 if (!l7vs_conn_sent_next_state(another_iom, iom)) {
1697 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,26, "error / send next state failed");
1698 /*-------- DEBUG LOG --------*/
1699 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1700 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,164,
1701 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1704 /*------ DEBUG LOG END ------*/
1707 if (iomux_conn_receiving != iom->status && iomux_conn_block != iom->status) {
1708 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,52, "error / invalid status(%d)", iom->status);
1709 /*-------- DEBUG LOG --------*/
1710 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1711 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,165,
1712 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1715 /*------ DEBUG LOG END ------*/
1719 else if (iomux_conn_sending == iom->status || iomux_conn_sending_busy == iom->status) {
1720 // data still remain
1721 // epoll re-registration for write
1722 l7vs_iomux_mod(iom, iom_write);
1725 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,53, "error / invalid status(%d)", iom->status);
1726 /*-------- DEBUG LOG --------*/
1727 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1728 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,166,
1729 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1732 /*------ DEBUG LOG END ------*/
1736 /*-------- DEBUG LOG --------*/
1737 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1738 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,167,
1739 "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
1742 /*------ DEBUG LOG END ------*/
1747 * decide sent next state
1749 * @param[in,out] src_iom source connection_iomux
1750 * @param[in,out] dest_iom destionation connection_iomux
1756 l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom)
1758 /*-------- DEBUG LOG --------*/
1759 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1760 char s_iom_str[DEBUG_STR_LEN] = {0};
1761 char d_iom_str[DEBUG_STR_LEN] = {0};
1762 l7vs_iomux_c_str(s_iom_str, src_iom);
1763 l7vs_iomux_c_str(d_iom_str, dest_iom);
1764 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,168,
1765 "in_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1768 s_iom_str, d_iom_str);
1770 /*------ DEBUG LOG END ------*/
1773 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,54, "error / src_iom is null");
1774 /*-------- DEBUG LOG --------*/
1775 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1776 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,169,
1777 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1780 /*------ DEBUG LOG END ------*/
1784 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,55, "error / dest_iom is null");
1785 /*-------- DEBUG LOG --------*/
1786 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1787 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,170,
1788 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1791 /*------ DEBUG LOG END ------*/
1795 // when writing, the dest_status will be "sent" or "sent_busy"
1796 if (iomux_conn_sent != dest_iom->status && iomux_conn_sent_busy != dest_iom->status) {
1797 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,56, "error / invalid dest status(%d)", dest_iom->status);
1798 /*-------- DEBUG LOG --------*/
1799 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1800 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,171,
1801 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1804 /*------ DEBUG LOG END ------*/
1807 // and the src_status will be "block" or "busy"
1808 if (iomux_conn_block != src_iom->status && iomux_conn_busy != src_iom->status) {
1809 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,57, "error / invalid src status(%d)", src_iom->status);
1810 /*-------- DEBUG LOG --------*/
1811 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1812 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,172,
1813 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1816 /*------ DEBUG LOG END ------*/
1820 // decide the next state
1821 if (iomux_conn_sent_busy == dest_iom->status) {
1822 // when receiving from source, request come to the destination, then destination has priority
1823 /*-------- DEBUG LOG --------*/
1824 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1825 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,173,
1826 "src_iom->status change: %d->%d",
1827 src_iom->status, iomux_conn_block);
1829 /*------ DEBUG LOG END ------*/
1830 src_iom->status = iomux_conn_block;
1831 /*-------- DEBUG LOG --------*/
1832 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1833 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,174,
1834 "dest_iom->status change: %d->%d",
1835 dest_iom->status, iomux_conn_receiving);
1837 /*------ DEBUG LOG END ------*/
1838 dest_iom->status = iomux_conn_receiving;
1840 else if (iomux_conn_busy == src_iom->status) {
1841 // when sending to destination, request come to the source, then source has priority
1842 /*-------- DEBUG LOG --------*/
1843 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1844 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,175,
1845 "src_iom->status change: %d->%d",
1846 src_iom->status, iomux_conn_receiving);
1848 /*------ DEBUG LOG END ------*/
1849 src_iom->status = iomux_conn_receiving;
1850 /*-------- DEBUG LOG --------*/
1851 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1852 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,176,
1853 "dest_iom->status change: %d->%d",
1854 dest_iom->status, iomux_conn_block);
1856 /*------ DEBUG LOG END ------*/
1857 dest_iom->status = iomux_conn_block;
1860 // request come to neither source nor destnation, ready to read both
1861 /*-------- DEBUG LOG --------*/
1862 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1863 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,177,
1864 "src_iom->status change: %d->%d",
1865 src_iom->status, iomux_conn_receiving);
1867 /*------ DEBUG LOG END ------*/
1868 src_iom->status = iomux_conn_receiving;
1869 /*-------- DEBUG LOG --------*/
1870 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1871 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,178,
1872 "dest_iom->status change: %d->%d",
1873 dest_iom->status, iomux_conn_receiving);
1875 /*------ DEBUG LOG END ------*/
1876 dest_iom->status = iomux_conn_receiving;
1878 l7vs_iomux_mod(src_iom, iom_read);
1879 l7vs_iomux_mod(dest_iom, iom_read);
1881 /*-------- DEBUG LOG --------*/
1882 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1883 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,179,
1884 "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
1887 /*------ DEBUG LOG END ------*/
1892 * realserver connection callback
1894 * @param[in] iom connection iomux
1900 l7vs_conn_rs_callback(struct l7vs_iomux *iom)
1902 /*-------- DEBUG LOG --------*/
1903 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1904 char iom_str[DEBUG_STR_LEN] = {0};
1905 l7vs_iomux_c_str(iom_str, iom);
1906 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,180,
1907 "in_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1911 /*------ DEBUG LOG END ------*/
1912 struct l7vs_conn* conn = NULL;
1915 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,58, "error / iom is null");
1916 /*-------- DEBUG LOG --------*/
1917 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1918 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,181,
1919 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1922 /*------ DEBUG LOG END ------*/
1926 conn = (struct l7vs_conn *)iom->data;
1927 /*-------- DEBUG LOG --------*/
1928 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1929 char conn_str[DEBUG_STR_LEN] = {0};
1930 l7vs_conn_c_str(conn_str, conn);
1931 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,182,
1932 "pointer_assign: conn=%s",
1935 /*------ DEBUG LOG END ------*/
1937 // invalid status check
1938 if (iomux_conn_receiving != iom->status &&
1939 iomux_conn_block != iom->status &&
1940 iomux_conn_busy != iom->status &&
1941 iomux_conn_sending != iom->status &&
1942 iomux_conn_sending_busy != iom->status) {
1943 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,59, "error / invalid status(%d)", iom->status);
1944 l7vs_conn_destroy(conn);
1945 /*-------- DEBUG LOG --------*/
1946 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1947 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,183,
1948 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1951 /*------ DEBUG LOG END ------*/
1955 // switch by current status
1956 switch (iom->status) {
1957 case iomux_conn_receiving:
1958 if (!l7vs_conn_realserver_receiving(iom)) {
1959 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,27, "error / rs_callback/realserver receiving failed");
1960 l7vs_conn_destroy(conn);
1961 /*-------- DEBUG LOG --------*/
1962 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1963 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,184,
1964 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1967 /*------ DEBUG LOG END ------*/
1970 if (iomux_conn_disconnected == iom->status) {
1971 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1972 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,185, "realserver connection disconnected");
1974 l7vs_conn_destroy(conn);
1977 case iomux_conn_block:
1978 if (!l7vs_conn_block(iom, conn->ciom)) {
1979 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,28, "error / rs_callback/block failed");
1980 l7vs_conn_destroy(conn);
1981 /*-------- DEBUG LOG --------*/
1982 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1983 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,186,
1984 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
1987 /*------ DEBUG LOG END ------*/
1991 case iomux_conn_busy:
1992 if (!l7vs_conn_busy(iom)) {
1993 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,29, "error / rs_callback/busy failed");
1994 l7vs_conn_destroy(conn);
1995 /*-------- DEBUG LOG --------*/
1996 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
1997 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,187,
1998 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2001 /*------ DEBUG LOG END ------*/
2005 case iomux_conn_sending:
2006 if (!l7vs_conn_sending(iom, conn->ciom)) {
2007 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,30, "error / rs_callback/sending failed");
2008 l7vs_conn_destroy(conn);
2009 /*-------- DEBUG LOG --------*/
2010 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2011 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,188,
2012 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2015 /*------ DEBUG LOG END ------*/
2019 case iomux_conn_sending_busy:
2020 if (!l7vs_conn_sending(iom, conn->ciom)) {
2021 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,31, "error / rs_callback/sending_busy failed");
2022 l7vs_conn_destroy(conn);
2023 /*-------- DEBUG LOG --------*/
2024 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2025 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,189,
2026 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2029 /*------ DEBUG LOG END ------*/
2034 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,60, "error / invalid status(%d)", iom->status);
2035 l7vs_conn_destroy(conn);
2036 /*-------- DEBUG LOG --------*/
2037 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2038 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,190,
2039 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2042 /*------ DEBUG LOG END ------*/
2046 /*-------- DEBUG LOG --------*/
2047 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2048 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,191,
2049 "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
2052 /*------ DEBUG LOG END ------*/
2057 * realserver receiving
2059 * @param[in] iom connection iomux
2065 l7vs_conn_realserver_receiving(struct l7vs_iomux *iom)
2067 /*-------- DEBUG LOG --------*/
2068 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2069 char iom_str[DEBUG_STR_LEN] = {0};
2070 l7vs_iomux_c_str(iom_str, iom);
2071 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,192,
2072 "in_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2076 /*------ DEBUG LOG END ------*/
2078 struct l7vs_conn *conn = NULL;
2081 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,61, "error / iom is null");
2082 /*-------- DEBUG LOG --------*/
2083 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2084 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,193,
2085 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2088 /*------ DEBUG LOG END ------*/
2092 if (iomux_conn_receiving != iom->status) {
2093 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,62, "error / invalid status(%d)", iom->status);
2094 /*-------- DEBUG LOG --------*/
2095 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2096 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,194,
2097 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2100 /*------ DEBUG LOG END ------*/
2104 conn = (struct l7vs_conn *)iom->data;
2105 /*-------- DEBUG LOG --------*/
2106 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2107 char conn_str[DEBUG_STR_LEN] = {0};
2108 l7vs_conn_c_str(conn_str, conn);
2109 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,195,
2110 "pointer_assign: conn=%s",
2113 /*------ DEBUG LOG END ------*/
2115 // when the client is not set in read-blocked
2116 if (iomux_conn_block != conn->ciom->status && iomux_conn_busy != conn->ciom->status) {
2117 // set the real server in read-blocked
2118 /*-------- DEBUG LOG --------*/
2119 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2120 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,196,
2121 "conn->ciom->status change: %d->%d",
2122 conn->ciom->status, iomux_conn_block);
2124 /*------ DEBUG LOG END ------*/
2125 conn->ciom->status = iomux_conn_block;
2128 // receive realserver data
2129 if (!l7vs_conn_recv(iom, iom->fd)) {
2130 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,32, "error / recv failed");
2131 /*-------- DEBUG LOG --------*/
2132 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2133 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,197,
2134 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2137 /*------ DEBUG LOG END ------*/
2140 switch (iom->status) {
2141 case iomux_conn_receiving:
2142 // data still remain, epoll re-registration for read
2143 l7vs_iomux_mod(iom, iom_read);
2145 case iomux_conn_received:
2146 // all data is received, append the session infomation
2147 if (!l7vs_conn_realserver_modify_data(iom)) {
2148 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,33, "error / realserver modify data failed");
2149 /*-------- DEBUG LOG --------*/
2150 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2151 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,198,
2152 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2155 /*------ DEBUG LOG END ------*/
2158 /*-------- DEBUG LOG --------*/
2159 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2160 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,199,
2161 "iom->status change: %d->%d",
2162 iom->status, iomux_conn_block);
2164 /*------ DEBUG LOG END ------*/
2165 iom->status = iomux_conn_block;
2166 if (iomux_conn_busy == conn->ciom->status) {
2167 /*-------- DEBUG LOG --------*/
2168 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2169 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,200,
2170 "conn->ciom->status change: %d->%d",
2171 conn->ciom->status, iomux_conn_sending_busy);
2173 /*------ DEBUG LOG END ------*/
2174 conn->ciom->status = iomux_conn_sending_busy;
2176 /*-------- DEBUG LOG --------*/
2177 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2178 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,201,
2179 "conn->ciom->status change: %d->%d",
2180 conn->ciom->status, iomux_conn_sending);
2182 /*------ DEBUG LOG END ------*/
2183 conn->ciom->status = iomux_conn_sending;
2185 //epoll re-registration for write
2186 l7vs_iomux_mod(conn->ciom, iom_write);
2187 case iomux_conn_disconnected:
2188 // client connection was disconnected
2192 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,63, "error / invalid status(%d)", iom->status);
2193 /*-------- DEBUG LOG --------*/
2194 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2195 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,202,
2196 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2199 /*------ DEBUG LOG END ------*/
2203 /*-------- DEBUG LOG --------*/
2204 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2205 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,203,
2206 "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
2209 /*------ DEBUG LOG END ------*/
2214 * realserver modify data
2216 * @param[in] iom connection iomux
2222 l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom)
2224 /*-------- DEBUG LOG --------*/
2225 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2226 char iom_str[DEBUG_STR_LEN] = {0};
2227 l7vs_iomux_c_str(iom_str, iom);
2228 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,204,
2229 "in_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2233 /*------ DEBUG LOG END ------*/
2234 struct l7vs_conn *conn = NULL;
2235 char *newbuf = NULL;
2236 int (*relayf)(struct l7vs_service *, struct l7vs_conn *, char *, size_t *) = NULL;
2241 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,64, "error / iom is null");
2242 /*-------- DEBUG LOG --------*/
2243 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2244 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,205,
2245 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2248 /*------ DEBUG LOG END ------*/
2252 if (iomux_conn_received != iom->status) {
2253 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,65, "error / invalid status(%d)", iom->status);
2254 /*-------- DEBUG LOG --------*/
2255 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2256 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,206,
2257 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2260 /*------ DEBUG LOG END ------*/
2264 conn = (struct l7vs_conn *)iom->data;
2265 /*-------- DEBUG LOG --------*/
2266 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2267 char conn_str[DEBUG_STR_LEN] = {0};
2268 l7vs_conn_c_str(conn_str, conn);
2269 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,207,
2270 "pointer_assign: conn=%s",
2273 /*------ DEBUG LOG END ------*/
2275 //set the function pointer that modify the real server data
2277 relayf = conn->srv->pm->analyze_rsdata;
2278 /*-------- DEBUG LOG --------*/
2279 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2280 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,208,
2281 "pointer_assign: relayf=%p",
2284 /*------ DEBUG LOG END ------*/
2288 len_ret = conn->cldata_len;
2289 newbuf = (char *)realloc(conn->cldata, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2291 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,10, "error / realloc failed");
2292 iom->status = iomux_conn_buffer_realloc_error;
2293 /*-------- DEBUG LOG --------*/
2294 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2295 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,209,
2296 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2299 /*------ DEBUG LOG END ------*/
2302 /*-------- DEBUG LOG --------*/
2303 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2304 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,210,
2305 "realloc: newbuf=%p: size=%zu",
2306 newbuf, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
2308 /*------ DEBUG LOG END ------*/
2309 conn->cldata = newbuf;
2311 ret = (*relayf)(conn->srv, conn, conn->cldata, &len_ret);
2313 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,34, "error / analyze rsdata failed");
2314 /*-------- DEBUG LOG --------*/
2315 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2316 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,211,
2317 "iom->status change: %d->%d",
2318 iom->status, iomux_conn_rsdata_modify_error);
2320 /*------ DEBUG LOG END ------*/
2321 iom->status = iomux_conn_rsdata_modify_error;
2322 /*-------- DEBUG LOG --------*/
2323 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2324 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,212,
2325 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2328 /*------ DEBUG LOG END ------*/
2331 if (L7VS_PROTOMOD_MAX_ADD_BUFSIZE < len_ret - conn->cldata_len) {
2332 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,35, "error / bufsize too long modified by protomod");
2333 /*-------- DEBUG LOG --------*/
2334 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2335 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,213,
2336 "iom->status change: %d->%d",
2337 iom->status, iomux_conn_rsdata_modify_error);
2339 /*------ DEBUG LOG END ------*/
2340 iom->status = iomux_conn_rsdata_modify_error;
2341 /*-------- DEBUG LOG --------*/
2342 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2343 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,214,
2344 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2347 /*------ DEBUG LOG END ------*/
2351 conn->cldata_len = len_ret;
2354 /*-------- DEBUG LOG --------*/
2355 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2356 char modify_data[DEBUG_STR_LEN] = {0};
2357 l7vs_conn_dump_data(modify_data, conn->cldata, conn->cldata_len);
2358 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,215,
2362 /*------ DEBUG LOG END ------*/
2364 /*-------- DEBUG LOG --------*/
2365 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2366 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,216,
2367 "iom->status change: %d->%d",
2368 iom->status, iomux_conn_rsdata_modified);
2370 /*------ DEBUG LOG END ------*/
2371 iom->status = iomux_conn_rsdata_modified;
2372 /*-------- DEBUG LOG --------*/
2373 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2374 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,217,
2375 "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
2378 /*------ DEBUG LOG END ------*/
2385 * @param[in] iom connection_iomux
2386 * @param[in] source_fd the filedescriptor to be read
2392 l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd)
2394 /*-------- DEBUG LOG --------*/
2395 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2396 char iom_str[DEBUG_STR_LEN] = {0};
2397 l7vs_iomux_c_str(iom_str, iom);
2398 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,218,
2399 "in_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2402 iom_str, source_fd);
2404 /*------ DEBUG LOG END ------*/
2406 struct l7vs_conn *conn = NULL;
2407 char read_buf[l7vs_conn_read_bufsize];
2408 // char *newbuf = NULL;
2411 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,66, "error / iom is null");
2412 /*-------- DEBUG LOG --------*/
2413 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2414 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,219,
2415 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2418 /*------ DEBUG LOG END ------*/
2422 if (0 > source_fd || INT_MAX == source_fd) {
2423 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,67, "error / source fd is not specified");
2424 /*-------- DEBUG LOG --------*/
2425 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2426 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,220,
2427 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2430 /*------ DEBUG LOG END ------*/
2434 if (iomux_conn_receiving != iom->status) {
2435 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,68, "error / invalid status(%d)", iom->status);
2436 /*-------- DEBUG LOG --------*/
2437 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2438 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,221,
2439 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2442 /*------ DEBUG LOG END ------*/
2446 conn = (struct l7vs_conn *)iom->data;
2447 /*-------- DEBUG LOG --------*/
2448 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2449 char conn_str[DEBUG_STR_LEN] = {0};
2450 l7vs_conn_c_str(conn_str, conn);
2451 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,222,
2452 "pointer_assign: conn=%s",
2455 /*------ DEBUG LOG END ------*/
2457 //QoS Control to server
2458 if( (source_fd == conn->ciom->fd) && !l7vs_conn_QoS_control( conn, QOS_UP ) ){
2459 /*-------- DEBUG LOG --------*/
2460 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2461 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
2462 "iom->status change: %d->%d",
2463 iom->status, iomux_conn_receiving);
2465 /*------ DEBUG LOG END ------*/
2466 iom->status = iomux_conn_receiving;
2467 /*-------- DEBUG LOG --------*/
2468 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2469 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
2470 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2473 /*------ DEBUG LOG END ------*/
2476 //QoS Control to client
2477 if( (source_fd == conn->riom->fd) && !l7vs_conn_QoS_control( conn, QOS_DOWN ) ){
2478 /*-------- DEBUG LOG --------*/
2479 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2480 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
2481 "iom->status change: %d->%d",
2482 iom->status, iomux_conn_receiving);
2484 /*------ DEBUG LOG END ------*/
2485 iom->status = iomux_conn_receiving;
2486 /*-------- DEBUG LOG --------*/
2487 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2488 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
2489 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2492 /*------ DEBUG LOG END ------*/
2496 /*-------- DEBUG LOG --------*/
2497 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2498 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,225,
2499 "recv param: source_fd=%d: len=%d: flags=%d",
2500 source_fd, (l7vs_conn_read_bufsize - 1), 0);
2502 /*------ DEBUG LOG END ------*/
2503 ret = recv(source_fd, read_buf, (l7vs_conn_read_bufsize - 1), 0);
2504 /*-------- DEBUG LOG --------*/
2505 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2506 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,226,
2507 "recv result: ret=%d",
2510 /*------ DEBUG LOG END ------*/
2511 /*-------- DEBUG LOG --------*/
2512 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2513 char recv_data[DEBUG_STR_LEN] = {0};
2514 l7vs_conn_dump_data(recv_data, read_buf, ret);
2515 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,227,
2519 /*------ DEBUG LOG END ------*/
2522 if (EAGAIN != errno) {
2523 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,12, "error / recv error(%s)", strerror(errno));
2524 /*-------- DEBUG LOG --------*/
2525 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2526 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,228,
2527 "iom->status change: %d->%d",
2528 iom->status, iomux_conn_receive_error);
2530 /*------ DEBUG LOG END ------*/
2531 iom->status = iomux_conn_receive_error;
2532 /*-------- DEBUG LOG --------*/
2533 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2534 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,229,
2535 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2538 /*------ DEBUG LOG END ------*/
2541 /*-------- DEBUG LOG --------*/
2542 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2543 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,230,
2544 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2547 /*------ DEBUG LOG END ------*/
2550 /*-------- DEBUG LOG --------*/
2551 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2552 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,231, "peer disconnected");
2553 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,232,
2554 "iom->status change: %d->%d",
2555 iom->status, iomux_conn_disconnected);
2557 /*------ DEBUG LOG END ------*/
2558 iom->status = iomux_conn_disconnected;
2559 /*-------- DEBUG LOG --------*/
2560 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2561 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,233,
2562 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2565 /*------ DEBUG LOG END ------*/
2567 // case L7VS_CONN_READ_BUFSIZE - 1:
2568 // // if the buffer is insufficient, realloc the buffer
2569 // conn->cldata_bufsize += L7VS_CONN_READ_BUFSIZE - 1;
2570 // newbuf = (char *)realloc(conn->cldata,
2571 // conn->cldata_bufsize);
2573 // LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,11, "error / realloc failed");
2574 // iom->status = iomux_conn_buffer_realloc_error;
2575 // /*-------- DEBUG LOG --------*/
2576 // if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2577 // LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,234,
2578 // "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2579 // "return_value: 0");
2581 // /*------ DEBUG LOG END ------*/
2584 // /*-------- DEBUG LOG --------*/
2585 // if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2586 // LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,235,
2587 // "realloc: newbuf=%p: size=%zu",
2588 // newbuf, conn->cldata_bufsize);
2590 // /*------ DEBUG LOG END ------*/
2591 // conn->cldata = newbuf;
2593 // // check the next data, and decide the status
2594 // if (!l7vs_conn_preread(iom, source_fd)) {
2595 // LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,36, "error / preread failed");
2596 // /*-------- DEBUG LOG --------*/
2597 // if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2598 // LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,236,
2599 // "iom->status change: %d->%d",
2600 // iom->status, iomux_conn_receive_error);
2602 // /*------ DEBUG LOG END ------*/
2603 // iom->status = iomux_conn_receive_error;
2604 // /*-------- DEBUG LOG --------*/
2605 // if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2606 // LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,237,
2607 // "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2608 // "return_value: 0");
2610 // /*------ DEBUG LOG END ------*/
2613 // if (iomux_conn_disconnected == iom->status) {
2614 // /*-------- DEBUG LOG --------*/
2615 // if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2616 // LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,238,
2617 // "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2618 // "return_value: 1");
2620 // /*------ DEBUG LOG END ------*/
2625 // reading data is finished
2626 /*-------- DEBUG LOG --------*/
2627 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2628 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,239,
2629 "iom->status change: %d->%d",
2630 iom->status, iomux_conn_received);
2632 /*------ DEBUG LOG END ------*/
2633 iom->status = iomux_conn_received;
2637 // register reveive information for QoS to server
2638 if( source_fd == conn->ciom->fd ){
2639 l7vs_conn_QoS_recvsize_register( conn, ret, QOS_UP );
2641 // register reveive information for QoS to client
2642 if( source_fd == conn->riom->fd ){
2643 l7vs_conn_QoS_recvsize_register( conn, ret, QOS_DOWN );
2645 // copy to conn_buffer
2646 memcpy(conn->cldata + conn->cldata_len, read_buf, ret);
2647 conn->cldata_len += ret;
2648 conn->cldata[conn->cldata_len] = '\0';
2650 /*-------- DEBUG LOG --------*/
2651 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2652 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,240,
2653 "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
2656 /*------ DEBUG LOG END ------*/
2661 * pre-read whether next data exists
2663 * @param[in] iom connection iomux
2664 * @param[in] source_fd source file description
2670 l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd)
2672 /*-------- DEBUG LOG --------*/
2673 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2674 char iom_str[DEBUG_STR_LEN] = {0};
2675 l7vs_iomux_c_str(iom_str, iom);
2676 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,241,
2677 "in_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2680 iom_str, source_fd);
2682 /*------ DEBUG LOG END ------*/
2683 int preread_ret = 0;
2684 char preread_buf[1] = {0};
2687 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,69, "error / iom is null");
2688 /*-------- DEBUG LOG --------*/
2689 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2690 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,242,
2691 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2694 /*------ DEBUG LOG END ------*/
2698 if (-1 == source_fd) {
2699 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,70, "error / source fd is not specified");
2700 /*-------- DEBUG LOG --------*/
2701 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2702 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,243,
2703 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2706 /*------ DEBUG LOG END ------*/
2710 if (iomux_conn_receiving != iom->status) {
2711 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,71, "error / invalid status(%d)", iom->status);
2712 /*-------- DEBUG LOG --------*/
2713 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2714 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,244,
2715 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2718 /*------ DEBUG LOG END ------*/
2722 /*-------- DEBUG LOG --------*/
2723 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2724 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,245,
2725 "recv param: source_fd=%d: len=1: flags=MSG_PEEK",
2728 /*------ DEBUG LOG END ------*/
2729 preread_ret = recv(source_fd, preread_buf, 1, MSG_PEEK);
2730 /*-------- DEBUG LOG --------*/
2731 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2732 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,246,
2733 "recv result: preread_ret=%d",
2736 /*------ DEBUG LOG END ------*/
2737 /*-------- DEBUG LOG --------*/
2738 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2739 char recv_data[DEBUG_STR_LEN] = {0};
2740 l7vs_conn_dump_data(recv_data, preread_buf, preread_ret);
2741 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,247,
2745 /*------ DEBUG LOG END ------*/
2746 switch (preread_ret) {
2748 if (EAGAIN != errno) {
2749 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,13, "error / recv error(%s)", strerror(errno));
2750 /*-------- DEBUG LOG --------*/
2751 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2752 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,248,
2753 "iom->status change: %d->%d",
2754 iom->status, iomux_conn_receive_error);
2756 /*------ DEBUG LOG END ------*/
2757 iom->status = iomux_conn_receive_error;
2758 /*-------- DEBUG LOG --------*/
2759 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2760 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,249,
2761 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2764 /*------ DEBUG LOG END ------*/
2767 // finished reading all data
2768 /*-------- DEBUG LOG --------*/
2769 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2770 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,250,
2771 "iom->status change: %d->%d",
2772 iom->status, iomux_conn_received);
2774 /*------ DEBUG LOG END ------*/
2775 iom->status = iomux_conn_received;
2778 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2779 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,251, "peer disconnected");
2781 /*-------- DEBUG LOG --------*/
2782 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2783 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,252,
2784 "iom->status change: %d->%d",
2785 iom->status, iomux_conn_disconnected);
2787 /*------ DEBUG LOG END ------*/
2788 iom->status = iomux_conn_disconnected;
2791 // the data that should be read remains
2792 // status does not change
2795 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,37, "error / preread error");
2796 /*-------- DEBUG LOG --------*/
2797 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2798 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,253,
2799 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2802 /*------ DEBUG LOG END ------*/
2805 /*-------- DEBUG LOG --------*/
2806 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2807 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,254,
2808 "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
2811 /*------ DEBUG LOG END ------*/
2818 * @param[in] iom connection_iomux
2819 * @param[in] dest_fd the filedescriptor to be write
2825 l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd)
2827 /*-------- DEBUG LOG --------*/
2828 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2829 char iom_str[DEBUG_STR_LEN] = {0};
2830 l7vs_iomux_c_str(iom_str, iom);
2831 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,255,
2832 "in_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2837 /*------ DEBUG LOG END ------*/
2840 struct l7vs_conn *conn = NULL;
2841 char *newbuf = NULL;
2842 size_t sent_len = 0;
2845 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,72, "error / iom is null");
2846 /*-------- DEBUG LOG --------*/
2847 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2848 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,256,
2849 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2852 /*------ DEBUG LOG END ------*/
2856 if (-1 == dest_fd) {
2857 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,73, "error / dest fd is not specified");
2858 /*-------- DEBUG LOG --------*/
2859 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2860 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,257,
2861 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2864 /*------ DEBUG LOG END ------*/
2868 if (iomux_conn_sending != iom->status &&
2869 iomux_conn_sending_busy != iom->status) {
2870 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,74, "error / invalid status(%d)", iom->status);
2871 /*-------- DEBUG LOG --------*/
2872 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2873 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,258,
2874 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2877 /*------ DEBUG LOG END ------*/
2881 conn = (struct l7vs_conn *)iom->data;
2882 /*-------- DEBUG LOG --------*/
2883 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2884 char conn_str[DEBUG_STR_LEN] = {0};
2885 l7vs_conn_c_str(conn_str, conn);
2886 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,259,
2887 "pointer_assign: conn=%s",
2890 /*------ DEBUG LOG END ------*/
2892 /*-------- DEBUG LOG --------*/
2893 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2894 char send_data[DEBUG_STR_LEN] = {0};
2895 l7vs_conn_dump_data(send_data, conn->cldata, conn->cldata_len);
2896 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,260,
2900 /*------ DEBUG LOG END ------*/
2902 /*-------- DEBUG LOG --------*/
2903 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2904 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,261,
2905 "send param: dest_fd=%d: len=%zu: flags=MSG_NOSIGNAL",
2906 dest_fd, conn->cldata_len);
2908 /*------ DEBUG LOG END ------*/
2909 ret = send(dest_fd, conn->cldata, conn->cldata_len, MSG_NOSIGNAL);
2910 /*-------- DEBUG LOG --------*/
2911 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2912 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,262,
2913 "send result: ret=%d",
2916 /*------ DEBUG LOG END ------*/
2918 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,14, "error / send error(%s)", strerror(errno));
2919 iom->status = iomux_conn_send_error;
2920 /*-------- DEBUG LOG --------*/
2921 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2922 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,263,
2923 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2926 /*------ DEBUG LOG END ------*/
2930 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2931 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,264, "sent %zu bytes", sent_len);
2934 // decide the status
2935 if (conn->cldata_len == sent_len) {
2936 // finished sending all data
2937 if (iomux_conn_sending == iom->status) {
2938 /*-------- DEBUG LOG --------*/
2939 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2940 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,265,
2941 "iom->status change: %d->%d",
2942 iom->status, iomux_conn_sent);
2944 /*------ DEBUG LOG END ------*/
2945 iom->status = iomux_conn_sent;
2947 /*-------- DEBUG LOG --------*/
2948 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2949 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,266,
2950 "iom->status change: %d->%d",
2951 iom->status, iomux_conn_sent_busy);
2953 /*------ DEBUG LOG END ------*/
2954 iom->status = iomux_conn_sent_busy;
2956 //cldata memory realloc
2957 conn->cldata_len = 0;
2958 conn->cldata_bufsize = l7vs_conn_read_bufsize;
2959 newbuf = (char *)malloc(conn->cldata_bufsize);
2961 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,12, "error / malloc failed");
2962 iom->status = iomux_conn_send_error;
2963 /*-------- DEBUG LOG --------*/
2964 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2965 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,267,
2966 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2969 /*------ DEBUG LOG END ------*/
2973 conn->cldata = newbuf;
2974 memset(conn->cldata, 0, l7vs_conn_read_bufsize);
2977 // shift data for next sending
2978 newbuf = (char *)malloc((conn->cldata_len - sent_len) + 1);
2980 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,13, "error / malloc failed");
2981 /*-------- DEBUG LOG --------*/
2982 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2983 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,268,
2984 "iom->status change: %d->%d",
2985 iom->status, iomux_conn_send_error);
2987 /*------ DEBUG LOG END ------*/
2988 iom->status = iomux_conn_send_error;
2989 /*-------- DEBUG LOG --------*/
2990 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
2991 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,269,
2992 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
2995 /*------ DEBUG LOG END ------*/
2998 memcpy(newbuf, (conn->cldata + sent_len), conn->cldata_len - sent_len);
3000 conn->cldata = newbuf;
3001 conn->cldata_len -= sent_len;
3002 conn->cldata[conn->cldata_len] = '\0';
3004 // the data that should be sent remains, status does not change
3007 /*-------- DEBUG LOG --------*/
3008 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3009 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,270,
3010 "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
3013 /*------ DEBUG LOG END ------*/
3019 * connect to real server
3021 * @param[in] conn connection
3022 * @param[in] dest destination
3028 l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
3030 /*-------- DEBUG LOG --------*/
3031 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3032 char conn_str[DEBUG_STR_LEN] = {0};
3033 char dest_str[DEBUG_STR_LEN] = {0};
3034 l7vs_conn_c_str(conn_str, conn);
3035 l7vs_dest_c_str(dest_str, dest);
3036 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,271,
3037 "in_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3040 conn_str, dest_str);
3042 /*------ DEBUG LOG END ------*/
3048 enum iomaction action;
3051 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,75, "error / conn is null");
3052 /*-------- DEBUG LOG --------*/
3053 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3054 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,272,
3055 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3058 /*------ DEBUG LOG END ------*/
3062 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,76, "error / dest is null");
3063 /*-------- DEBUG LOG --------*/
3064 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3065 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,273,
3066 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3069 /*------ DEBUG LOG END ------*/
3073 switch (conn->proto) {
3075 stype = SOCK_STREAM;
3081 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,15, "error / unknown socket type");
3082 /*-------- DEBUG LOG --------*/
3083 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3084 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,274,
3085 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3088 /*------ DEBUG LOG END ------*/
3092 /*-------- DEBUG LOG --------*/
3093 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3094 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,275,
3095 "socket param: family=PF_INET: type=%d: protocol=%d",
3096 stype, conn->proto);
3098 /*------ DEBUG LOG END ------*/
3099 s = socket(PF_INET, stype, conn->proto);
3101 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,16, "error / socket error(%s)", strerror(errno));
3102 /*-------- DEBUG LOG --------*/
3103 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3104 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,276,
3105 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3108 /*------ DEBUG LOG END ------*/
3112 /*-------- DEBUG LOG --------*/
3113 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3114 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,277,
3115 "fnctl param: s=%d: cmd=F_GETFL: flags=0",
3118 /*------ DEBUG LOG END ------*/
3119 flags = fcntl(s, F_GETFL, 0);
3121 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,17, "error / fcntl(s=%d,F_GETFL) error(%s)", s,strerror(errno));
3123 /*-------- DEBUG LOG --------*/
3124 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3125 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,278,
3126 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3129 /*------ DEBUG LOG END ------*/
3132 /*-------- DEBUG LOG --------*/
3133 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3134 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,279,
3135 "fnctl result: flags=%d",
3138 /*------ DEBUG LOG END ------*/
3140 /*-------- DEBUG LOG --------*/
3141 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3142 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,280,
3143 "fnctl param: s=%d: cmd=F_SETFL: flags=%d",
3144 s, (flags | O_NONBLOCK));
3146 /*------ DEBUG LOG END ------*/
3147 flags = fcntl(s, F_SETFL, flags | O_NONBLOCK);
3149 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,18, "error / fcntl(s=%d,F_SETFL) error(%s)", s,strerror(errno));
3151 /*-------- DEBUG LOG --------*/
3152 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3153 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,281,
3154 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3157 /*------ DEBUG LOG END ------*/
3160 /*-------- DEBUG LOG --------*/
3161 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3162 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,282,
3163 "fnctl result: flags=%d",
3166 /*------ DEBUG LOG END ------*/
3168 if (conn->cmss > 0) {
3169 /*-------- DEBUG LOG --------*/
3170 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3171 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,283,
3172 "setsockopt param: s=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: optval=%d: "
3174 s, conn->cmss, sizeof(int));
3176 /*------ DEBUG LOG END ------*/
3177 ret = setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &conn->cmss,
3180 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,19, "error / setsockopt(TCP_MAXSEG) error(%s)", strerror(errno));
3182 /*-------- DEBUG LOG --------*/
3183 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3184 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,284,
3185 "setsockopt result: ret=%d: len=%zu",
3188 /*------ DEBUG LOG END ------*/
3191 /*-------- DEBUG LOG --------*/
3192 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3193 char addr_str[DEBUG_STR_LEN] = {0};
3194 l7vs_conn_sockaddr_in_c_str(addr_str, &dest->addr);
3195 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,285,
3196 "connect param: s=%d: dest->addr=%s: len=%zu",
3197 s, addr_str, sizeof(struct sockaddr_in));
3199 /*------ DEBUG LOG END ------*/
3200 ret = connect(s, (struct sockaddr *)&dest->addr,
3201 sizeof(struct sockaddr_in));
3203 if (errno != EINPROGRESS) {
3204 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,20, "error / connect error(%s)", strerror(errno));
3206 /*-------- DEBUG LOG --------*/
3207 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3208 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,286,
3209 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3212 /*------ DEBUG LOG END ------*/
3216 /*-------- DEBUG LOG --------*/
3217 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3218 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,287,
3219 "connect result: ret=%d",
3222 /*------ DEBUG LOG END ------*/
3223 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3224 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,288, "dest %p nactive %d->%d",
3225 dest, dest->nactive,
3232 /*-------- DEBUG LOG --------*/
3233 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3234 char dest_str[DEBUG_STR_LEN] = {0};
3235 l7vs_dest_c_str(dest_str, conn->dest);
3236 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,289,
3237 "pointer_assign: conn->dest=%s",
3240 /*------ DEBUG LOG END ------*/
3242 conn->riom->callback = l7vs_conn_rs_callback;
3243 /*-------- DEBUG LOG --------*/
3244 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3245 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,290,
3246 "pointer_assign: conn->riom->callback=%p",
3247 conn->riom->callback);
3249 /*------ DEBUG LOG END ------*/
3250 conn->riom->data = conn;
3251 /*-------- DEBUG LOG --------*/
3252 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3253 char conn_str[DEBUG_STR_LEN] = {0};
3254 l7vs_conn_c_str(conn_str, conn);
3255 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,291,
3256 "pointer_assign: conn->riom->data=%s",
3259 /*------ DEBUG LOG END ------*/
3260 l7vs_iomux_add(conn->riom, action);
3262 /*-------- DEBUG LOG --------*/
3263 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3264 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,292,
3265 "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3270 /*-------- DEBUG LOG --------*/
3271 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3272 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
3273 "RealServer Connecting Count : nactive is %d",
3276 /*-------- DEBUG LOG --------*/
3278 /*-------- INFO LOG (Access Log) --------*/
3279 if (LOG_LV_INFO >= logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3280 char addr_str_tmp[ADDR_STR_LEN] = {0};
3281 memcpy(addr_str_tmp, inet_ntoa(conn->caddr.sin_addr), ADDR_STR_LEN);
3282 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,342,
3283 "[[AccessLog] (SRC)%s:%d -> (DST)%s:%d ]",
3285 ntohs(conn->caddr.sin_port),
3286 inet_ntoa(conn->dest->addr.sin_addr),
3287 ntohs(conn->dest->addr.sin_port));
3289 /*------ INFO LOG END (Access Log) ------*/
3292 /*------ DEBUG LOG END ------*/
3297 * close client socket
3299 * @param[in] conn connection
3303 l7vs_conn_close_csock(struct l7vs_conn *conn)
3305 /*-------- DEBUG LOG --------*/
3306 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3307 char conn_str[DEBUG_STR_LEN] = {0};
3308 l7vs_conn_c_str(conn_str, conn);
3309 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,293,
3310 "in_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3314 /*------ DEBUG LOG END ------*/
3317 /*-------- DEBUG LOG --------*/
3318 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3319 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,294,
3320 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3321 "return_value: void");
3323 /*------ DEBUG LOG END ------*/
3327 /*-------- DEBUG LOG --------*/
3328 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3329 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,295,
3330 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3331 "return_value: void");
3333 /*------ DEBUG LOG END ------*/
3336 if (-1 == conn->ciom->fd) {
3337 /*-------- DEBUG LOG --------*/
3338 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3339 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,296,
3340 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3341 "return_value: void");
3343 /*------ DEBUG LOG END ------*/
3347 l7vs_iomux_remove(conn->ciom);
3348 /*-------- DEBUG LOG --------*/
3349 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3350 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,297,
3351 "close: conn->ciom->fd=%d",
3354 /*------ DEBUG LOG END ------*/
3355 close(conn->ciom->fd);
3356 conn->ciom->fd = -1;
3358 /*-------- DEBUG LOG --------*/
3359 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3360 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,298,
3361 "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
3362 "return_value: void");
3364 /*------ DEBUG LOG END ------*/
3368 * close real server socket
3370 * @param[in] conn connection
3374 l7vs_conn_close_rsock(struct l7vs_conn *conn)
3376 /*-------- DEBUG LOG --------*/
3377 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3378 char conn_str[DEBUG_STR_LEN] = {0};
3379 l7vs_conn_c_str(conn_str, conn);
3380 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,299,
3381 "in_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3385 /*------ DEBUG LOG END ------*/
3388 /*-------- DEBUG LOG --------*/
3389 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3390 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,300,
3391 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3392 "return_value: void");
3394 /*------ DEBUG LOG END ------*/
3398 /*-------- DEBUG LOG --------*/
3399 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3400 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,301,
3401 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3402 "return_value: void");
3404 /*------ DEBUG LOG END ------*/
3407 if (-1 == conn->riom->fd) {
3408 /*-------- DEBUG LOG --------*/
3409 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3410 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,302,
3411 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3412 "return_value: void");
3414 /*------ DEBUG LOG END ------*/
3419 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3420 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,303, "dest %p nactive %d->%d",
3421 conn->dest, conn->dest->nactive,
3422 conn->dest->nactive - 1);
3424 conn->dest->nactive--;
3425 conn->dest->ninact++;
3426 if(conn->dest->ninact == INT_MAX) {
3427 conn->dest->ninact = 0;
3430 /*-------- DEBUG LOG --------*/
3431 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3432 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,343,
3433 "RealServer Connected Count : ninact is %d",
3434 conn->dest->ninact);
3436 /*------ DEBUG LOG END ------*/
3439 l7vs_iomux_remove(conn->riom);
3440 /*-------- DEBUG LOG --------*/
3441 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3442 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,304,
3443 "close: conn->riom->fd=%d",
3446 /*------ DEBUG LOG END ------*/
3447 close(conn->riom->fd);
3448 conn->riom->fd = -1;
3450 /*-------- DEBUG LOG --------*/
3451 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3452 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,305,
3453 "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
3454 "return_value: void");
3456 /*------ DEBUG LOG END ------*/
3460 * confirmation of whether conn is closed
3462 * @param[in] conn connection
3463 * @return closed or not
3464 * @retval 0 not closed
3468 l7vs_conn_closed(struct l7vs_conn *conn)
3470 /*-------- DEBUG LOG --------*/
3471 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3472 char conn_str[DEBUG_STR_LEN] = {0};
3473 l7vs_conn_c_str(conn_str, conn);
3474 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,306,
3475 "in_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3479 /*------ DEBUG LOG END ------*/
3482 /*-------- DEBUG LOG --------*/
3483 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3484 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,307,
3485 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3488 /*------ DEBUG LOG END ------*/
3491 if ((conn->ciom && -1 != conn->ciom->fd) || (conn->riom && -1 != conn->riom->fd)) {
3492 /*-------- DEBUG LOG --------*/
3493 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3494 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,308,
3495 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3498 /*------ DEBUG LOG END ------*/
3501 /*-------- DEBUG LOG --------*/
3502 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3503 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,309,
3504 "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
3507 /*------ DEBUG LOG END ------*/
3513 * Change connection to specified destination (to real-server or sorry-server).
3515 * @param[in] *conn connection pointer
3516 * @param[in] *dest destination pointer
3517 * @return int change connection result 0=NG, 1=OK
3519 static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
3521 /*-------- DEBUG LOG --------*/
3522 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3523 char conn_str[DEBUG_STR_LEN] = {0};
3524 char dest_str[DEBUG_STR_LEN] = {0};
3525 l7vs_conn_c_str(conn_str, conn);
3526 l7vs_dest_c_str(dest_str, dest);
3527 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,310,
3528 "in_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3531 conn_str, dest_str);
3533 /*------ DEBUG LOG END ------*/
3538 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,77, "error / conn is null");
3539 /*-------- DEBUG LOG --------*/
3540 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3541 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,311,
3542 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3545 /*------ DEBUG LOG END ------*/
3549 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,78, "error / dest is null");
3550 /*-------- DEBUG LOG --------*/
3551 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3552 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,312,
3553 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3556 /*------ DEBUG LOG END ------*/
3559 // save old destination
3560 conn->old_dest = conn->dest;
3561 /*-------- DEBUG LOG --------*/
3562 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3563 char old_dest_str[DEBUG_STR_LEN] = {0};
3564 l7vs_dest_c_str(old_dest_str, conn->old_dest);
3565 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
3566 "pointer_assign: conn->old_dest=%s",
3569 /*------ DEBUG LOG END ------*/
3570 // close real-server connection
3571 l7vs_conn_close_rsock(conn);
3572 // connect to new destination
3573 ret = l7vs_conn_connect_rs(conn, dest);
3575 /*-------- DEBUG LOG --------*/
3576 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3577 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,314,
3578 "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
3582 /*------ DEBUG LOG END ------*/
3587 * Judges from the data size received last time and recieve-interval
3589 * @param[in] *conn connection pointer
3590 * @param[in] direction traffic direction
3591 * @return int permitte for recv function call 0=NG(not permitted), 1=OK(permitted)
3594 l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction )
3596 /*-------- DEBUG LOG --------*/
3597 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3598 char conn_str[DEBUG_STR_LEN] = {0};
3599 l7vs_conn_c_str(conn_str, conn);
3600 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,315,
3601 "in_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3602 "conn=%s, direction=%d",
3603 conn_str, direction);
3605 /*------ DEBUG LOG END ------*/
3608 /*-------- DEBUG LOG --------*/
3609 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3610 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,316,
3611 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3614 /*------ DEBUG LOG END ------*/
3618 /*-------- DEBUG LOG --------*/
3619 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3620 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
3621 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3624 /*------ DEBUG LOG END ------*/
3628 struct timeval CurrTime;
3629 gettimeofday( &CurrTime, NULL );
3630 /*-------- DEBUG LOG --------*/
3631 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3632 char time_str[DEBUG_STR_LEN] = {0};
3633 snprintf(time_str, DEBUG_STR_LEN,
3638 , CurrTime.tv_usec);
3639 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
3640 "gettimeofday result: CurrTime=%s",
3643 /*------ DEBUG LOG END ------*/
3645 unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3646 l7vs_service_update_throughput(conn->srv, cur_recvtime);
3648 switch (direction) {
3650 //QoS Control check : to server
3651 conn->srv->throughput_to_server = conn->srv->cur_recvsize_from_client * 1000000ULL / throughput_interval;
3652 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3653 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,323, "QoS threshold to server:%lld ", conn->srv->qos_threshold_up);
3654 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,324, "(current throughput:%lld)", conn->srv->throughput_to_server);
3656 if( (conn->srv->qos_threshold_up) && (conn->srv->throughput_to_server + l7vs_conn_read_bufsize > conn->srv->qos_threshold_up) ){
3657 if (conn->srv->qos_up_flag == 0) {
3658 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,1, "Start QoS traffic control to server.");
3659 conn->srv->qos_up_flag = 1;
3661 /*-------- DEBUG LOG --------*/
3662 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3663 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,326,
3664 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3667 /*------ DEBUG LOG END ------*/
3670 if (conn->srv->qos_up_flag == 1) {
3671 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,2, "Stop QoS traffic control to server.");
3672 conn->srv->qos_up_flag = 0;
3676 //QoS Control check : to client
3677 conn->srv->throughput_to_client = conn->srv->cur_recvsize_from_server * 1000000ULL / throughput_interval;
3678 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3679 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,323, "QoS threshold to client:%lld ", conn->srv->qos_threshold_down);
3680 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,324, "(current throughput:%lld)", conn->srv->throughput_to_client);
3682 if( (conn->srv->qos_threshold_down) && (conn->srv->throughput_to_client + l7vs_conn_read_bufsize > conn->srv->qos_threshold_down) ){
3683 if (conn->srv->qos_down_flag == 0) {
3684 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,3, "Start QoS traffic control to client.");
3685 conn->srv->qos_down_flag = 1;
3687 /*-------- DEBUG LOG --------*/
3688 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3689 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,326,
3690 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3693 /*------ DEBUG LOG END ------*/
3696 if (conn->srv->qos_down_flag == 1) {
3697 LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK_QOS,4, "Stop QoS traffic control to client.");
3698 conn->srv->qos_down_flag = 0;
3702 /*-------- DEBUG LOG --------*/
3703 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3704 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
3705 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
3708 /*------ DEBUG LOG END ------*/
3712 /*-------- DEBUG LOG --------*/
3713 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3714 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,335,
3715 "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn ) "
3718 /*------ DEBUG LOG END ------*/
3723 * Regsiter recive time and recieved data size
3725 * @param[in] *conn connection pointer
3726 * @param[in] in_recvsize recieved size
3727 * @param[in] direction traffic direction
3731 l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction )
3733 /*-------- DEBUG LOG --------*/
3734 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3735 char conn_str[DEBUG_STR_LEN] = {0};
3736 l7vs_conn_c_str(conn_str, conn);
3737 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,336,
3738 "in_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3741 conn_str, in_recvsize);
3743 /*------ DEBUG LOG END ------*/
3746 /*-------- DEBUG LOG --------*/
3747 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3748 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,337,
3749 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3750 "return_value: void");
3752 /*------ DEBUG LOG END ------*/
3756 /*-------- DEBUG LOG --------*/
3757 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3758 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,338,
3759 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3760 "return_value: void");
3762 /*------ DEBUG LOG END ------*/
3765 struct timeval CurrTime;
3766 gettimeofday( &CurrTime, NULL );
3767 /*-------- DEBUG LOG --------*/
3768 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3769 char time_str[DEBUG_STR_LEN] = {0};
3770 snprintf(time_str, DEBUG_STR_LEN,
3775 , CurrTime.tv_usec);
3776 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
3777 "gettimeofday result: CurrTime=%s",
3780 /*------ DEBUG LOG END ------*/
3782 int throughput_interval = BPS_DEFAULT_INTERVAL;
3783 if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
3784 throughput_interval = parameter_get_int_value( PARAM_COMP_L7VSD, "calc_throughput_interval" );
3786 unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
3787 l7vs_service_update_throughput(conn->srv, cur_recvtime);
3789 switch (direction) {
3791 conn->srv->cur_recvsize_from_client += in_recvsize;
3794 conn->srv->cur_recvsize_from_server += in_recvsize;
3800 /*-------- DEBUG LOG --------*/
3801 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
3802 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,340,
3803 "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
3804 "return_value: void");
3806 /*------ DEBUG LOG END ------*/