3 * @brief It is a code in which sets of iomux are managed.
4 * @brief An actual set is operated only by this code.
5 * @brief Moreover, epoll is operated by this code.
6 * @brief L7VSD: Linux Virtual Server for Layer7 Load Balancing
8 * Copyright (C) 2005 NTT COMWARE Corporation.
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25 **********************************************************************/
27 #include <sys/types.h>
29 #include <sys/epoll.h>
36 #include "parameter_wrapper.h"
37 #include "logger_wrapper.h"
39 #include "l7vs_conn.h"
40 #include "l7vs_iomuxlist.h"
44 #define MAXEVENTS 1024 //! epoll max event size
47 static int maxevents = 1024;
48 static struct l7vs_iomux* iomux_array = NULL; //! iomux array
49 static struct epoll_event* event_array = NULL; //! event list
51 static GHashTable* iomux_hash = NULL; //! fd hashtable
52 static GList* iomux_avail_list = NULL; //! iomux available list
53 static unsigned int iomux_avail_list_length; //! number of iomux available list
54 static int eventpoll = -1; //! epoll fd
57 static gboolean removeall( gpointer, gpointer, gpointer );
60 * initialize iomux_hash
70 /*-------- DEBUG LOG --------*/
71 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
72 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,1,
73 "in_function: int l7vs_iomux_init() ");
75 /*------ DEBUG LOG END ------*/
77 int ret = parameter_is_int_exist( PARAM_COMP_IOMUX, "max_events" );
79 int event = parameter_get_int_value( PARAM_COMP_IOMUX, "max_events" );
83 LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_EVENT,1,
84 "l7vsd uses default max_events = %d ,because your value is invalid ",maxevents);
88 LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_EVENT,2,
89 "max_events is not specified. l7vsd uses default max_events = %d ",maxevents);
92 iomux_avail_list_length = maxevents;
93 if (iomux_avail_list == NULL) {
94 iomux_array = (struct l7vs_iomux*) calloc(sizeof(struct l7vs_iomux), maxevents);
97 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,26, "error / calloc failed");
98 /*-------- DEBUG LOG --------*/
99 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
100 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,59,
101 "in_function: int l7vs_iomux_init() "
104 /*------ DEBUG LOG END ------*/
108 if (iomux_avail_list == NULL) {
109 event_array = (struct epoll_event*) calloc(sizeof(struct epoll_event), maxevents);
112 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,27, "error / calloc failed");
113 /*-------- DEBUG LOG --------*/
114 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
115 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,60,
116 "in_function: int l7vs_iomux_init() "
119 /*------ DEBUG LOG END ------*/
124 struct l7vs_iomux temp_iom = {-1, NULL, iomux_create, NULL};
126 if (-1 != eventpoll) {
127 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,4, "error / epoll already exist");
128 /*-------- DEBUG LOG --------*/
129 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
130 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,2,
131 "in_function: int l7vs_iomux_init() "
134 /*------ DEBUG LOG END ------*/
139 /*-------- DEBUG LOG --------*/
140 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
141 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,3,
142 "epoll_create : size=%d",
145 /*------ DEBUG LOG END ------*/
146 eventpoll = epoll_create(maxevents);
148 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,5, "error / epoll create error");
149 /*-------- DEBUG LOG --------*/
150 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
151 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,4,
152 "in_function: int l7vs_iomux_init() "
153 "return_value: %d", eventpoll);
155 /*------ DEBUG LOG END ------*/
161 iomux_hash = g_hash_table_new(&g_int_hash, &g_int_equal);
164 //init iomux_array and avail_list
165 if (!iomux_avail_list) {
166 for (i = 0; i < maxevents; ++i) {
167 memcpy(iomux_array + i, &temp_iom, sizeof(struct l7vs_iomux));
168 iomux_avail_list = g_list_append(iomux_avail_list, &iomux_array[i]);
172 /*-------- DEBUG LOG --------*/
173 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
174 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,5,
175 "in_function: int l7vs_iomux_init() "
178 /*------ DEBUG LOG END ------*/
183 * finalize iomux_hash
191 /*-------- DEBUG LOG --------*/
192 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
193 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,6,
194 "in_function: void l7vs_iomux_fini() ");
196 /*------ DEBUG LOG END ------*/
198 if (-1 == eventpoll) {
199 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,6, "error / epoll is not initialized");
200 /*-------- DEBUG LOG --------*/
201 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
202 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,7,
203 "out_function: void l7vs_iomux_fini() "
204 "return_value: void");
206 /*------ DEBUG LOG END ------*/
210 //all fd close and remove
211 l7vs_iomux_removeall();
213 //g_hashtable destroy
215 g_hash_table_destroy(iomux_hash);
220 if (iomux_avail_list) {
221 g_list_free(iomux_avail_list);
222 iomux_avail_list = NULL;
226 /*-------- DEBUG LOG --------*/
227 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
228 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,8,
229 "close: eventpoll=%d",
232 /*------ DEBUG LOG END ------*/
246 /*-------- DEBUG LOG --------*/
247 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
248 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,9,
249 "out_function: void l7vs_iomux_fini() "
250 "return_value: void");
252 /*------ DEBUG LOG END ------*/
256 * get available iom from avail_list
259 * @return available iom
262 l7vs_iomux_get_from_avail_list()
264 /*-------- DEBUG LOG --------*/
265 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
266 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,10,
267 "in_function: struct l7vs_iomux* l7vs_iomux_get_from_avail_list() ");
269 /*------ DEBUG LOG END ------*/
271 if (0 == iomux_avail_list_length) {
272 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,7, "warning / no iomux available");
273 /*-------- DEBUG LOG --------*/
274 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
275 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,11,
276 "out_function: struct l7vs_iomux* l7vs_iomux_get_from_avail_list() "
277 "return_value: iom=NULL");
279 /*------ DEBUG LOG END ------*/
283 struct l7vs_iomux *iom = (struct l7vs_iomux *)(g_list_first(iomux_avail_list))->data;
284 iomux_avail_list = g_list_remove(iomux_avail_list, (gpointer)iom);
285 --iomux_avail_list_length;
286 /*-------- DEBUG LOG --------*/
287 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
288 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,12,
289 "iomux_avail_list_length: %d",
290 iomux_avail_list_length);
292 /*------ DEBUG LOG END ------*/
294 /*-------- DEBUG LOG --------*/
295 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
296 char ret_iomux_str[DEBUG_STR_LEN] = {0};
297 l7vs_iomux_c_str(ret_iomux_str, iom);
298 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,13,
299 "out_function: struct l7vs_iomux* l7vs_iomux_get_from_avail_list() "
300 "return_value: iom=%s",
303 /*------ DEBUG LOG END ------*/
308 * put disuse iom to avail_list
310 * @param[in] iom return iom
314 l7vs_iomux_put_to_avail_list(struct l7vs_iomux *iom)
316 /*-------- DEBUG LOG --------*/
317 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
318 char iomux_str[DEBUG_STR_LEN] = {0};
319 l7vs_iomux_c_str(iomux_str, iom);
320 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,14,
321 "in_function: void l7vs_iomux_put_to_avail_list(struct l7vs_iomux *iom) "
325 /*------ DEBUG LOG END ------*/
328 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,8, "error / iom is null");
329 /*-------- DEBUG LOG --------*/
330 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
331 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,15,
332 "out_function: void l7vs_iomux_put_to_avail_list(struct l7vs_iomux *iom) "
333 "return_value: void");
335 /*------ DEBUG LOG END ------*/
340 iom->callback = NULL;
341 iom->status = iomux_create;
344 iomux_avail_list = g_list_append(iomux_avail_list, (gpointer)iom);
345 ++iomux_avail_list_length;
346 /*-------- DEBUG LOG --------*/
347 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
348 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,16,
349 "iomux_avail_list_length: %d",
350 iomux_avail_list_length);
352 /*------ DEBUG LOG END ------*/
354 /*-------- DEBUG LOG --------*/
355 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
356 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,17,
357 "out_function: void l7vs_iomux_put_to_avail_list(struct l7vs_iomux *iom) "
358 "return_value: void");
360 /*------ DEBUG LOG END ------*/
364 * iomux is added to hashtbale
366 * @param[in] *iom iompointer
367 * @param[in] action iom epoll action
371 l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action)
373 /*-------- DEBUG LOG --------*/
374 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
375 char iomux_str[DEBUG_STR_LEN] = {0};
376 l7vs_iomux_c_str(iomux_str, iom);
377 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,18,
378 "in_function: void l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action) "
383 /*------ DEBUG LOG END ------*/
386 struct epoll_event event;
389 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,9, "error / iom is null");
390 /*-------- DEBUG LOG --------*/
391 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
392 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,19,
393 "out_function: void l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action) "
394 "return_value: void");
396 /*------ DEBUG LOG END ------*/
400 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,10, "error / fd is not specified");
401 /*-------- DEBUG LOG --------*/
402 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
403 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,20,
404 "out_function: void l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action) "
405 "return_value: void");
407 /*------ DEBUG LOG END ------*/
411 event.data.ptr = iom;
414 event.events = EPOLLET | EPOLLIN | EPOLLHUP;
417 event.events = EPOLLET | EPOLLOUT | EPOLLHUP;
421 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,11, "error / invalid action");
422 /*-------- DEBUG LOG --------*/
423 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
424 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,21,
425 "out_function: void l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action) "
426 "return_value: void");
428 /*------ DEBUG LOG END ------*/
432 /*-------- DEBUG LOG --------*/
433 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
434 char iomux_str[DEBUG_STR_LEN] = {0};
435 l7vs_iomux_c_str(iomux_str, iom);
436 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,22,
437 "epoll_ctl : epfd=%d: op=EPOLL_CTL_ADD: fd=%d: event.events=%d: event.data=%s",
438 eventpoll, iom->fd, event.events, iomux_str);
440 /*------ DEBUG LOG END ------*/
441 ret = epoll_ctl( eventpoll, EPOLL_CTL_ADD, iom->fd, &event );
442 g_hash_table_insert(iomux_hash, &(iom->fd), iom );
444 /*-------- DEBUG LOG --------*/
445 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
446 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,23,
447 "out_function: void l7vs_iomux_add(struct l7vs_iomux* iom, enum iomaction action) "
448 "return_value: void");
450 /*------ DEBUG LOG END ------*/
454 * iomux is remove from hashtable
456 * @param[in] *iom iompointer
460 l7vs_iomux_remove(struct l7vs_iomux* iom)
462 /*-------- DEBUG LOG --------*/
463 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
464 char iomux_str[DEBUG_STR_LEN] = {0};
465 l7vs_iomux_c_str(iomux_str, iom);
466 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,24,
467 "in_function: void l7vs_iomux_remove(struct l7vs_iomux* iom) "
471 /*------ DEBUG LOG END ------*/
476 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,12, "error / iom is null");
477 /*-------- DEBUG LOG --------*/
478 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
479 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,25,
480 "out_function: void l7vs_iomux_remove(struct l7vs_iomux* iom) "
481 "return_value: void");
483 /*------ DEBUG LOG END ------*/
487 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,13, "error / fd is not specified");
488 /*-------- DEBUG LOG --------*/
489 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
490 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,26,
491 "out_function: void l7vs_iomux_remove(struct l7vs_iomux* iom) "
492 "return_value: void");
494 /*------ DEBUG LOG END ------*/
498 /*-------- DEBUG LOG --------*/
499 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
500 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,27,
501 "epoll_ctl : epfd=%d: op=EPOLL_CTL_DEL: fd=%d",
504 /*------ DEBUG LOG END ------*/
505 ret = epoll_ctl(eventpoll, EPOLL_CTL_DEL, iom->fd, NULL);
506 g_hash_table_remove(iomux_hash, &(iom->fd));
508 /*-------- DEBUG LOG --------*/
509 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
510 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,28,
511 "out_function: void l7vs_iomux_remove(struct l7vs_iomux* iom) "
512 "return_value: void");
514 /*------ DEBUG LOG END ------*/
518 * iomux modify epoll events
520 * @param[in] *iom iom pointer
521 * @param[in] action iom action mode
525 l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action)
527 /*-------- DEBUG LOG --------*/
528 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
529 char iomux_str[DEBUG_STR_LEN] = {0};
530 l7vs_iomux_c_str(iomux_str, iom);
531 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,29,
532 "in_function: void l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action) "
537 /*------ DEBUG LOG END ------*/
540 struct epoll_event event;
543 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,14, "error / iom is null");
544 /*-------- DEBUG LOG --------*/
545 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
546 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,30,
547 "out_function: void l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action) "
548 "return_value: void");
550 /*------ DEBUG LOG END ------*/
554 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,15, "error / fd is not specified");
555 /*-------- DEBUG LOG --------*/
556 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
557 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,31,
558 "out_function: void l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action) "
559 "return_value: void");
561 /*------ DEBUG LOG END ------*/
565 event.data.ptr = iom;
568 event.events = EPOLLET | EPOLLIN | EPOLLHUP;
571 event.events = EPOLLET | EPOLLOUT | EPOLLHUP;
574 event.events = EPOLLET | EPOLLHUP;
578 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,16, "error / invalid action");
579 /*-------- DEBUG LOG --------*/
580 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
581 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,32,
582 "out_function: void l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action) "
583 "return_value: void");
585 /*------ DEBUG LOG END ------*/
588 /*-------- DEBUG LOG --------*/
589 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
590 char iomux_str[DEBUG_STR_LEN] = {0};
591 l7vs_iomux_c_str(iomux_str, iom);
592 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,33,
593 "epoll_ctl : epfd=%d: op=EPOLL_CTL_MOD: fd=%d: event.events=%d: event.data=%s",
594 eventpoll, iom->fd, event.events, iomux_str);
596 /*------ DEBUG LOG END ------*/
597 ret = epoll_ctl(eventpoll, EPOLL_CTL_MOD, iom->fd, &event);
599 /*-------- DEBUG LOG --------*/
600 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
601 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,34,
602 "out_function: void l7vs_iomux_mod(struct l7vs_iomux* iom, enum iomaction action) "
603 "return_value: void");
605 /*------ DEBUG LOG END ------*/
609 * close all filedescriptor
611 * removeall() function is called l7vs_iomux_delall()
612 * GHashTable is don't all contenior;
613 * but function callback set all contenor;
616 removeall(gpointer key, gpointer value, gpointer userdata)
618 /*-------- DEBUG LOG --------*/
619 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
620 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,35,
621 "in_function: static gboolean removeall(gpointer key, gpointer value, gpointer userdata) "
625 key, value, userdata);
627 /*------ DEBUG LOG END ------*/
629 struct l7vs_iomux *iom = (struct l7vs_iomux *)value;
630 /*-------- DEBUG LOG --------*/
631 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
632 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,36,
633 "epoll_ctl : epfd=%d: op=EPOLL_CTL_DEL: fd=%d",
636 /*------ DEBUG LOG END ------*/
637 epoll_ctl(eventpoll, EPOLL_CTL_DEL, iom->fd, NULL);
638 /*-------- DEBUG LOG --------*/
639 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
640 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,37,
641 "out_function: static gboolean removeall(gpointer key, gpointer value, gpointer userdata) "
642 "return_value: TRUE");
644 /*------ DEBUG LOG END ------*/
649 * all contnior delete hash_table
654 l7vs_iomux_removeall()
656 /*-------- DEBUG LOG --------*/
657 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
658 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,38,
659 "in_function: void l7vs_iomux_removeall()");
661 /*------ DEBUG LOG END ------*/
662 g_hash_table_foreach_remove(iomux_hash, removeall, NULL);
663 /*-------- DEBUG LOG --------*/
664 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
665 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,39,
666 "out_function: void l7vs_iomux_removeall() "
667 "return_value: TRUE");
669 /*------ DEBUG LOG END ------*/
673 * polling function for epoll.
675 * @param[in] *timo waittime;
679 l7vs_iomux_poll(struct timeval *timo, int blocking)
681 /*-------- DEBUG LOG --------*/
682 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
684 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,40,
685 "in_function: int l7vs_iomux_poll(struct timeval *timo, int blocking) "
686 "timo=NULL, blocking = %d", blocking);
689 char time_str[DEBUG_STR_LEN] = {0};
690 snprintf(time_str, DEBUG_STR_LEN,
696 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,41,
697 "in_function: int l7vs_iomux_poll(struct timeval *timo) "
698 "timo=%s, blocking=%d",
702 /*------ DEBUG LOG END ------*/
707 struct l7vs_iomux *iom;
708 struct l7vs_conn *conn;
710 /*-------- DEBUG LOG --------*/
711 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
712 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,42,
713 "epoll_wait param: epfd=%d: maxevents=%d: timeout=0",
714 eventpoll, maxevents);
716 /*------ DEBUG LOG END ------*/
717 fdnum = epoll_wait(eventpoll, event_array, maxevents, blocking);
718 /*-------- DEBUG LOG --------*/
719 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
720 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,43,
721 "epoll_wait result: fdnum=%d",
724 /*------ DEBUG LOG END ------*/
725 for (i = 0; i < fdnum; ++i) {
726 if (event_array[i].data.ptr) {
727 iom = (struct l7vs_iomux *)event_array[i].data.ptr;
728 /*-------- DEBUG LOG --------*/
729 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
730 char iomux_str[DEBUG_STR_LEN] = {0};
731 l7vs_iomux_c_str(iomux_str, iom);
732 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,44,
733 "event_array[%d].data.ptr: %s",
736 /*------ DEBUG LOG END ------*/
737 if (iom->status != iomux_create) {
738 if (event_array[i].events & (EPOLLHUP | EPOLLERR)) {
739 // disconnect when sending
740 conn = (struct l7vs_conn *)iom->data;
741 /*-------- DEBUG LOG --------*/
742 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
743 char conn_str[DEBUG_STR_LEN] = {0};
744 l7vs_conn_c_str(conn_str, conn);
745 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,45,
746 "pointer_assign: conn=%s",
749 /*------ DEBUG LOG END ------*/
752 l7vs_conn_destroy(conn);
754 } else if (event_array[i].events & (EPOLLIN | EPOLLOUT)) {
755 if (iom->status != iomux_disabled) {
757 // if there is mismatch between status and events,
758 // read event will regist after, (when send was finished)
759 // therefore, through callback
760 if (!(event_array[i].events & EPOLLIN &&
761 (iomux_conn_sending == iom->status ||
762 iomux_conn_sending_busy == iom->status))) {
764 /*-------- DEBUG LOG --------*/
765 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
766 char ex_iomux_str[DEBUG_STR_LEN] = {0};
767 l7vs_iomux_c_str(ex_iomux_str, iom);
768 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,46,
769 "iom->callback: %p: iom=%s",
770 iom->callback, ex_iomux_str);
772 /*------ DEBUG LOG END ------*/
773 ret = iom->callback(iom);
774 /*-------- DEBUG LOG --------*/
775 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
776 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,47,
777 "iom->callback result: ret=%d",
780 /*------ DEBUG LOG END ------*/
784 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,17, "error / callback not bind");
788 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,18, "error / unkown event:%x", event_array[i].events);
791 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
792 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,48, "debug / invalid status:iomux_create");
796 LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,19, "error / epolldata.data.ptr is null");
800 /*-------- DEBUG LOG --------*/
801 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_EVENT)) {
802 LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,49,
803 "out_function: int l7vs_iomux_poll(struct timeval *timo) "
806 /*------ DEBUG LOG END ------*/