3 * @bref listen socket control.
5 * L7VSD: Linux Virtual Server for Layer7 Load Balancing
6 * Copyright (C) 2005 NTT COMWARE Corporation.
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 **********************************************************************/
25 #include <sys/types.h>
26 #include <sys/socket.h>
27 #include <netinet/in.h>
28 #include <netinet/tcp.h>
29 #include <arpa/inet.h>
35 #include "logger_wrapper.h"
37 #include "l7vs_iomuxlist.h"
38 #include "l7vs_lsock.h"
39 #include "l7vs_module.h"
40 #include "l7vs_conn.h"
41 #include "l7vs_service.h"
42 #include "l7vs_sched.h"
44 /* static functions */
45 static int l7vs_lsock_accept(struct l7vs_lsock *lsock);
46 static void l7vs_lsock_table_add(struct l7vs_lsock *lsock);
47 static void l7vs_lsock_table_remove(struct l7vs_lsock *lsock);
48 static gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b);
49 static int l7vs_lsock_callback(struct l7vs_iomux *iom );
52 static GList *l7vs_lsock_list;
55 * inner function of fini.
60 void freeAllList( gpointer data, gpointer userdata ){
61 struct l7vs_lsock* lsock = (struct l7vs_lsock*)data;
63 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
64 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,2,
65 "lsock in_fuction freeAllList : lsock=%p",
73 * initialize functions
75 * @return everydays zero.
80 if(l7vs_lsock_list == NULL )
82 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
83 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,3,
84 "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
88 g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
89 g_list_free( l7vs_lsock_list );
90 l7vs_lsock_list = NULL;
92 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
93 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,4,
94 "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
101 * free list element memory.
107 l7vs_lsock_fini(void)
109 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
110 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,5,
111 "lsock in_fuction int l7vs_lsock_fini(void) : free l7vs_lsock_list = %p",
115 g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
116 g_list_free( l7vs_lsock_list );
117 l7vs_lsock_list = NULL;
121 * if target soket have link list then return having socket.
122 * else create new socket to return.
123 * @param[in] sin socket address struct( if ipv6 may be change this struct )
124 * @param[in] proto TCS/UDP select.
128 l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)
130 struct l7vs_lsock *lsock;
135 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
136 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,20,
137 "in_fuction: struct l7vs_lsock * l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)"
138 "*sin =%p :proto = %d :backlog = %d :",
147 lsock = l7vs_lsock_table_lookup(sin, proto);
150 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
151 char lsock_str[DEBUG_STR_LEN] = {0};
152 l7vs_lsock_c_str(lsock_str, lsock);
153 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,21,
154 "table look up: lsock=%s",
168 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,21, "Protocol number should be"
174 lsock = (struct l7vs_lsock *)calloc(1, sizeof(*lsock));
176 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,14, "Could not allocate lsock");
179 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
180 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,6,
181 "in function l7vs_lsock_get: allocate memory"
182 " : size=%zu ,pointer=%p",
183 sizeof(*lsock),lsock);
186 lsock->iom = l7vs_iomux_get_from_avail_list();
188 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_ENVIRONMENT,24, "can not get lsock_iomux");
192 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
193 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,22, "creating lsock %p", lsock);
195 lsock->proto = proto;
196 lsock->iom->fd = socket(PF_INET, stype, proto); //create a socket to get connection request from the client
197 if (lsock->iom->fd < 0) {
198 if (proto == IPPROTO_TCP) {
199 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,22,
200 "socket: Protocol is IPPROTO_TCP,SockType is SOCK_STREAM (%s)", strerror(errno));
203 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
204 "socket: Protocol is IPPROTO_UDP,SockType is SOCK_DGRAM (%s)", strerror(errno));
207 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
208 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,7,
209 "in function l7vs_lsock_get: free memory"
210 " : size=%zu ,pointer=%p",
211 sizeof(*lsock),lsock);
217 setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(int));
218 ret = bind(lsock->iom->fd, (struct sockaddr *)sin, sizeof(*sin)); //binding the socket for incoming client request
220 char addr_str[DEBUG_STR_LEN]={0};
222 l7vs_lsock_sockaddr_in_c_str(addr_str, (struct sockaddr_in *)sin);
223 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,23, "Could not bind socket: %s (%s)",
224 addr_str,strerror(errno));
225 close(lsock->iom->fd);
226 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
227 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,8,
228 "in function l7vs_lsock_get: free memory"
229 " : size=%zu ,pointer=%p",
230 sizeof(*lsock),lsock);
237 ret = listen(lsock->iom->fd, backlog); //listening for client requests
239 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,24, "Could not listen: %s (file descriptor :%d , backlog: %d)",
240 strerror(errno),lsock->iom->fd, backlog);
241 close(lsock->iom->fd);
242 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
243 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,9,
244 "in function l7vs_lsock_get: free memory"
245 " : size=%zu ,pointer=%p",
246 sizeof(*lsock),lsock);
253 lsock->fast_schedule = 1;
255 lsock->iom->callback = l7vs_lsock_callback;
256 lsock->iom->data = lsock;
257 lsock->iom->status = iomux_lsock_connect_waiting;
258 l7vs_lsock_table_add(lsock); //Add socket in the list. It may be used for maintaining session (Am not sure)
259 // l7vs_iomux_add(&lsock->iom, L7VS_IOMUX_READ);
261 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
262 char lsock_str[DEBUG_STR_LEN] = {0};
263 l7vs_lsock_c_str(lsock_str, lsock);
264 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,23,
268 l7vs_iomux_add( lsock->iom, iom_read );
273 * lisning socket remove list and iomuxlist.
274 * @param[in] lsock removing lisning socket
279 l7vs_lsock_put(struct l7vs_lsock *lsock)
283 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,25, "error / lsock is null");
287 lsock->iom->status = iomux_lsock_released;
289 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
290 char lsock_str[DEBUG_STR_LEN] = {0};
291 l7vs_lsock_c_str(lsock_str, lsock);
292 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,24,
293 "lsock removing : lsock=%s",
296 if (--lsock->refcnt > 0)
298 lsock->iom->status = iomux_lsock_connect_waiting;
299 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
300 char lsock_str[DEBUG_STR_LEN] = {0};
301 l7vs_lsock_c_str(lsock_str, lsock);
302 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,25,
303 "not removing : lsock=%s",
309 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
310 char lsock_str[DEBUG_STR_LEN] = {0};
311 l7vs_lsock_c_str(lsock_str, lsock);
312 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
313 "removing : lsock=%s",
317 lsock->iom->status = iomux_lsock_destroyed;
319 l7vs_iomux_remove(lsock->iom);
320 l7vs_lsock_table_remove(lsock);
322 if(lsock->iom->fd > 0)
324 close(lsock->iom->fd);
326 l7vs_iomux_put_to_avail_list(lsock->iom);
328 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
329 char lsock_str[DEBUG_STR_LEN] = {0};
330 l7vs_lsock_c_str(lsock_str, lsock);
331 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,10,
332 "in function l7vs_lsock_put : free lsock=%p",
339 * lsock_list append new lsock ponter
340 * @param[in] lsock to insert table lsock
344 l7vs_lsock_table_add(struct l7vs_lsock *lsock)
346 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
347 char lsock_str[DEBUG_STR_LEN] = {0};
348 l7vs_lsock_c_str(lsock_str, lsock);
349 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,27,
350 "in_function l7vs_lsock_table_add : add table lsock=%s",
353 l7vs_lsock_list = g_list_append(l7vs_lsock_list, (gpointer)lsock);
354 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
355 char lsock_str[DEBUG_STR_LEN] = {0};
356 l7vs_lsock_c_str(lsock_str, lsock);
357 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,28,
358 "out_function l7vs_lsock_table_add : add table lsock=%s",
364 * lsock_list remove lsock (don't free element)
365 * @param[in] to remove lsock
369 l7vs_lsock_table_remove(struct l7vs_lsock *lsock)
371 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
372 char lsock_str[DEBUG_STR_LEN] = {0};
373 l7vs_lsock_c_str(lsock_str, lsock);
374 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,29,
375 "in_function l7vs_lsock_table_remove : remove table lsock=%s",
378 l7vs_lsock_list = g_list_remove(l7vs_lsock_list, (gpointer)lsock);
379 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
380 char lsock_str[DEBUG_STR_LEN] = {0};
381 l7vs_lsock_c_str(lsock_str, lsock);
382 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,30,
383 "out_function l7vs_lsock_table_remove : remove table lsock=%s",
390 * look up table for lsock.
391 * @param[in] *sin socketaddr_in struct pointer (ex. to change then IPv6 target )
392 * @param[in] *proto port no
393 * @return *l7vs_lsock
396 l7vs_lsock_table_lookup(struct sockaddr_in *sin, uint8_t proto)
398 struct l7vs_lsock tmpl;
401 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
402 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,31,
403 "in_fuction: struct l7vs_lsock * l7vs_lsock_table_lookup(struct sockaddr_in *sin, uint8_t proto)"
404 "*sin =%p :proto = %d ",
416 l = g_list_find_custom(l7vs_lsock_list, (gpointer)&tmpl,
417 l7vs_lsock_addr_cmp);
420 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
421 char lsock_str[DEBUG_STR_LEN] = {0};
422 l7vs_lsock_c_str(lsock_str, (struct l7vs_lsock *)l->data);
423 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,32,
427 return (struct l7vs_lsock *)l->data; //for checking up and finding the socket in the list for a particular client socket(not sure)
431 * using foreach function from Compare
432 * @param a l7vs_lsock pointer
433 * @param b l7vs_lsock pointer
434 * @return compare pattern
437 l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)
439 struct l7vs_lsock *la = (struct l7vs_lsock *)a;
440 struct l7vs_lsock *lb = (struct l7vs_lsock *)b;
443 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
444 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,33,
445 "in_fuction: gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
450 if (la->addr.sin_addr.s_addr != lb->addr.sin_addr.s_addr)
451 return la->addr.sin_addr.s_addr - lb->addr.sin_addr.s_addr;
452 if (la->addr.sin_port != lb->addr.sin_port)
453 return la->addr.sin_port - lb->addr.sin_port;
454 if (la->proto != lb->proto)
455 return la->proto - lb->proto;
457 if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
458 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,34,
459 "out_fuction: gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
466 * select VertualService or SorryServer
467 * @param lsock l7vs_lsock pointer
468 * @param conn l7vs_conn pointer
469 * @param buf char pointer
471 * @param srv_ret l7vs_service pointer pointer
472 * @param dest_ret l7vs_dest pointer pointer
473 * @param tcps_ret int pointer
474 * @return int ok:1 error:-1
477 l7vs_lsock_select_service(struct l7vs_lsock *lsock,
478 struct l7vs_conn *conn,
481 struct l7vs_service **srv_ret,
482 struct l7vs_dest **dest_ret,
486 struct l7vs_service *srv;
487 struct l7vs_dest *dest;
490 struct l7vs_service *srv_tmp = NULL; //! temporary for srv
491 struct l7vs_dest *dest_tmp = NULL; //! temporary for dest
492 int tcps_tmp = 1; //! temporary for tcps
493 size_t len_tmp = 0; //! temporary for len
494 int sorry_save = 0; //! sorry dest save flag
495 struct l7vs_service *srv_tmp2 = NULL; //! temporary for srv when match_cldata NG
496 struct l7vs_dest *dest_tmp2 = NULL; //! temporary for dest when match_cldata NG
497 int tcps_tmp2 = 1; //! temporary for tcps when match_cldata NG
498 size_t len_tmp2 = 0; //! temporary for len when match_cldata NG
499 int sorry_save2 = 0; //! sorry dest save flag when match_cldata NG
501 if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
502 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,13,
503 "in_fuction: int l7vs_lsock_select_service(struct l7vs_lsock *lsock,"
504 "struct l7vs_conn *conn,"
507 "struct l7vs_service **srv_ret,"
508 "struct l7vs_dest **dest_ret,"
510 "lsock :%p, conn :%p buf : %p,len : %zu,",
517 srv = (struct l7vs_service *)l->data;
520 ret = srv->pm->match_cldata(srv, conn, buf, &len, &dest, &tcps);
522 // check sorry status if ret == 0
523 // sorry_check argument 1 means check connection count
524 if (l7vs_sched_sorry_check(srv, 1)) {
526 // save sorry dest to xxx_tmp only first time
534 // check cldata length if sorry_check != 1 (not sorry status)
535 if (len > conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE) {
536 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,1, "bufsize too long modified by protomod ");
538 // service and destination is decided
542 conn->cldata_len = len;
550 // when match_cldata NG
552 // save sorry dest to xxx_tmp2 only first time
559 // get next srv from srv_list
564 // saved sorry dest is exist
565 // set sorry-server destination
566 //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 1);
567 *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 0);
569 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,2, "sorry-server dest is NULL");
570 if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
571 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,14,
572 "in_fuction: int l7vs_lsock_select_service return -1");
577 *tcps_ret = tcps_tmp;
578 conn->cldata_len = len_tmp;
579 conn->sorry_conn_flag = 1;
581 } else if (sorry_save2) {
582 // saved sorry dest2 is exist
583 // set sorry-server destination
584 //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 1);
585 *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 0);
587 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,3, "sorry-server dest is NULL");
588 if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
589 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,15,
590 "in_fuction: int l7vs_lsock_select_service return -1");
595 *tcps_ret = tcps_tmp2;
596 conn->cldata_len = len_tmp2;
597 conn->sorry_conn_flag = 1;
600 // return val=1 service and destination is decided (to real-server or sorry-server)
601 // return val=-1 service and destination not decided (match_cldata result all NG)
602 if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
603 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,16,
604 "out_fuction: int l7vs_lsock_select_service return %d",val);
610 * table add service list
611 * append list memory.
616 l7vs_lsock_add_service(struct l7vs_lsock *lsock,
617 struct l7vs_service *srv)
619 if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
620 char lsock_str[DEBUG_STR_LEN] = {0};
621 l7vs_lsock_c_str(lsock_str, lsock);
623 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,94,
624 "in_fuction: void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
625 "lsock: %s,srv : %p",
628 lsock->srv_list = g_list_append(lsock->srv_list, srv);
629 if (lsock->fast_schedule) {
630 lsock->fast_schedule = srv->pm->fast_schedule;
632 if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
633 char lsock_str[DEBUG_STR_LEN] = {0};
634 l7vs_lsock_c_str(lsock_str, lsock);
636 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,95,
637 "out_fuction: void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
638 "lsock: %s,srv : %p",
644 * table remove from service list
645 * remove list memory.
650 l7vs_lsock_remove_service(struct l7vs_lsock *lsock,
651 struct l7vs_service *srv)
654 if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
655 char lsock_str[DEBUG_STR_LEN] = {0};
656 l7vs_lsock_c_str(lsock_str, lsock);
658 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,96,
659 "in_fuction: void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
660 "lsock: %s,srv : %p",
663 lsock->srv_list = g_list_remove(lsock->srv_list, srv);
664 lsock->fast_schedule = 1;
665 for (slist = g_list_first(lsock->srv_list); slist != NULL; slist = slist->next) {
666 struct l7vs_service* s = (struct l7vs_service*) slist->data;
667 if (s != NULL && s->pm != NULL && s->pm->fast_schedule == 0) {
668 lsock->fast_schedule = 0;
672 if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
673 char lsock_str[DEBUG_STR_LEN] = {0};
674 l7vs_lsock_c_str(lsock_str, lsock);
676 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,97,
677 "out_fuction: void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
678 "lsock: %s,srv : %p",
684 * socket acception function.
685 * @param[in] socket option
686 * @return success = 0 / false = -1
689 l7vs_lsock_accept(struct l7vs_lsock *lsock)
693 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,20, "error / lsock is null");
694 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
695 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,50,
696 "out_fuction: int l7vs_lsock_accept return -1");
700 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
701 char lsock_str[DEBUG_STR_LEN] = {0};
702 l7vs_lsock_c_str(lsock_str, lsock);
703 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,51,
704 "in_fuction: int l7vs_lsock_accept (struct l7vs_lsock *lsock)"
708 if (iomux_lsock_accepted != lsock->iom->status)
710 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,21, "error / invalid status(%d)", lsock->iom->status);
711 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
712 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,52,
713 "out_fuction: int l7vs_lsock_accept return -1");
718 if (!l7vs_conn_create(lsock->iom->fd, lsock))
720 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,22, "error / conn create failed");
721 lsock->iom->status = iomux_lsock_conn_create_error;
722 if(logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG){
723 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,8,
724 "out_fuction: int l7vs_lsock_accept return -1");
729 lsock->iom->status = iomux_lsock_conn_created;
730 if(logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG){
731 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,9,
732 "out_fuction: int l7vs_lsock_accept return 0");
738 * ListeningSocket call back function.
739 * @param[in] socket option
740 * @return success = 0 / false = -1
743 l7vs_lsock_callback(struct l7vs_iomux *iom )
750 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,23, "error / iom is null");
751 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
752 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,53,
753 "out_fuction: int l7vs_lsock_callback return -1");
758 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
759 char iomux_str[DEBUG_STR_LEN] = {0};
760 l7vs_iomux_c_str(iomux_str,iom);
761 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,54,
762 "in_fuction: int l7vs_lsock_callback (struct l7vs_iomux *iom)"
767 if (iomux_lsock_connect_waiting != iom->status)
769 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,24, "error / invalid status(%d)", iom->status);
770 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
771 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,55,
772 "out_fuction: int l7vs_lsock_callback return -1");
777 iom->status = iomux_lsock_accepted;
778 ret = l7vs_lsock_accept((struct l7vs_lsock *)iom->data); //for accepting data from clients
781 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,25, "error / lsock accept failed");
782 iom->status = iomux_lsock_connect_waiting;
783 l7vs_iomux_mod( iom, iom_read );
784 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
785 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,56,
786 "out_fuction: int l7vs_lsock_callback return -1");
791 iom->status = iomux_lsock_connect_waiting;
792 l7vs_iomux_mod( iom, iom_read );
793 if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
794 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,57,
795 "out_fuction: int l7vs_lsock_callback return 0");