OSDN Git Service

Merge commit 'sfj/autotools-fix'; commit 'sfj/modulefix'; commit 'sfj/sslid-sslidleng...
authorTATEISHI Katsuyuki <kt@wheel.jp>
Tue, 4 Aug 2009 05:30:34 +0000 (14:30 +0900)
committerTATEISHI Katsuyuki <kt@wheel.jp>
Tue, 4 Aug 2009 05:30:34 +0000 (14:30 +0900)
16 files changed:
include/l7vs_lsock.h
include/l7vs_module.h
l7directord/l7directord
l7directord/t/01_main.t
l7directord/t/02_cmd.t
l7directord/t/05_config.t
module/protocol/module_sslid_hash_map.cpp
module/protocol/protomod_ip.c
module/protocol/protomod_pfilter.c
module/protocol/protomod_sessionless.c
module/protocol/protomod_sslid.c
module/protocol/protomod_sslid.h
module/protocol/protomod_url.c
src/conn.c
src/l7vsadm_main.c
src/lsock.c

index 47c7daa..e274db7 100644 (file)
@@ -61,8 +61,7 @@ extern        int             l7vs_lsock_select_service(
                                char*,
                                size_t,
                                struct l7vs_service**,
-                               struct l7vs_dest**,
-                               int* );
+                               struct l7vs_dest**);
 /*!
  * serialize struct sockaddr_in
  *
index 86c8468..dfafb26 100644 (file)
@@ -20,8 +20,8 @@
  * 02110-1301 USA
  *
  **********************************************************************/
-#ifndef        L7VS_MODULE_H
-#define        L7VS_MODULE_H
+#ifndef L7VS_MODULE_H
+#define L7VS_MODULE_H
 
 #include <stdint.h>
 #include <glib.h>
 #include "l7vs_service.h"
 #include "logger_wrapper.h"
 
-struct l7vs_conn;
-struct l7vs_service;
-struct l7vs_service_arg;
-struct l7vs_dest;
+struct l7vs_conn;
+struct l7vs_service;
+struct l7vs_service_arg;
+struct l7vs_dest;
 
-struct l7vs_protomod{
-       void*   handle;
-       char    modname[L7VS_MODNAME_LEN+1];
-       int     refcnt;
-       int     fast_schedule;
+struct l7vs_protomod{
+    void* handle;
+    char  modname[L7VS_MODNAME_LEN+1];
+    int   refcnt;
+    int   fast_schedule;
 
-       //member functions
-       int   ( *create )( void*, uint32_t );
-       int   ( *compare )( uint32_t, uint32_t );
-       int   ( *match_cldata )( struct l7vs_service*, struct l7vs_conn*, char*, size_t*, struct l7vs_dest**, int* );
-       int   ( *analyze_rsdata )( struct l7vs_service*, struct l7vs_conn*, char*, size_t* );
-       int   ( *destroy )( uint32_t );
-       void  ( *fini )();
-       void* ( *create_sa )( struct l7vs_service_arg* );
-       int   ( *service_arg )( struct l7vs_service_arg_multi*, uint32_t );
-       int   ( *parse )( void*, int, char** );
-       void  ( *destroy_sa )( void** );
-       int   ( *initialize )( struct l7vs_service*, struct l7vs_conn*, char*, size_t, struct l7vs_dest** );
-       int   ( *finalize )( struct l7vs_service*, struct l7vs_conn*, char*, size_t, struct l7vs_dest**, int );
-       enum LOG_LEVEL_TAG ( *get_log_level )( const enum LOG_CATEGORY_TAG );
-       void  ( *put_log_debug )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
-       void  ( *put_log_info )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
-       void  ( *put_log_warn )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
-       void  ( *put_log_error )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
-       void  ( *put_log_fatal )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
-       void*  ( *replication_pay_memory )( char*, unsigned int* );
+    //member functions
+    int   ( *create )( void*, uint32_t );
+    int   ( *compare )( uint32_t, uint32_t );
+    int   ( *select_dest )( struct l7vs_service*, struct l7vs_conn*, char*, size_t*, struct l7vs_dest** );
+    int   ( *analyze_cldata )( struct l7vs_service*, struct l7vs_conn*, char*, size_t* );
+    int   ( *analyze_rsdata )( struct l7vs_service*, struct l7vs_conn*, char*, size_t* );
+    int   ( *destroy )( uint32_t );
+    void  ( *fini )();
+    void* ( *create_sa )( struct l7vs_service_arg* );
+    int   ( *service_arg )( struct l7vs_service_arg_multi*, uint32_t );
+    int   ( *parse )( void*, int, char** );
+    void  ( *destroy_sa )( void** );
+    int   ( *initialize )( struct l7vs_service*, struct l7vs_conn*, char*, size_t, struct l7vs_dest** );
+    int   ( *finalize )( struct l7vs_service*, struct l7vs_conn*, char*, size_t, struct l7vs_dest**, int );
+    enum LOG_LEVEL_TAG ( *get_log_level )( const enum LOG_CATEGORY_TAG );
+    void  ( *put_log_debug )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
+    void  ( *put_log_info )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
+    void  ( *put_log_warn )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
+    void  ( *put_log_error )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
+    void  ( *put_log_fatal )( const enum LOG_CATEGORY_TAG, const unsigned int, char*, int, const char* );
+    void* ( *replication_pay_memory )( char*, unsigned int* );
 };
 
-extern char    l7vs_module_path[];
+extern char l7vs_module_path[];
 
 //
 // functions
 //
 
-extern struct l7vs_protomod*   l7vs_protomod_get( char* );
-extern void                    l7vs_protomod_put( struct l7vs_protomod* );
-extern struct l7vs_protomod*   l7vs_protomod_lookup( char* );
-extern int                     l7vs_module_init( char* );
-extern void                    l7vs_module_fini();
-extern void*                   l7vs_module_load( char*, char* );
-extern void                    l7vs_module_unload( void* );
-extern void                    l7vs_module_register( GList**, void* );
-extern void                    l7vs_module_remove( GList**, void* );
-extern void*                   l7vs_module_lookup( GList*, void*, GCompareFunc );
+extern struct l7vs_protomod* l7vs_protomod_get( char* );
+extern void  l7vs_protomod_put( struct l7vs_protomod* );
+extern struct l7vs_protomod* l7vs_protomod_lookup( char* );
+extern int   l7vs_module_init( char* );
+extern void  l7vs_module_fini();
+extern void* l7vs_module_load( char*, char* );
+extern void  l7vs_module_unload( void* );
+extern void  l7vs_module_register( GList**, void* );
+extern void  l7vs_module_remove( GList**, void* );
+extern void* l7vs_module_lookup( GList*, void*, GCompareFunc );
 
 #define PUT_LOG_FATAL(mod, cat, message_id, message, arg...) { \
         if (mod.get_log_level != NULL && mod.put_log_fatal != NULL && \
-       LOG_LV_FATAL >= mod.get_log_level(cat)) { \
+        LOG_LV_FATAL >= mod.get_log_level(cat)) { \
         char buf[BUF_LEN]; \
         snprintf(buf, BUF_LEN, message, ##arg); \
         mod.put_log_fatal(cat, message_id, __FILE__, __LINE__, buf); }}
@@ -114,13 +115,13 @@ extern void*                      l7vs_module_lookup( GList*, void*, GCompareFunc );
         mod.put_log_debug(cat, message_id, __FILE__, __LINE__, buf); }}
 
 template <typename T> enum LOG_LEVEL_TAG IS_DEBUG( const T &obj, enum LOG_CATEGORY_TAG tag ){
-       if( obj.get_log_level ){
-               return obj.get_log_level(tag);
-       }
-       if( obj.put_log_debug ){
-               obj.put_log_debug( tag, 0 , __FILE__, __LINE__, "opps pointer is NULL!!" );
-       }
-       return LOG_LV_DEBUG;
+    if( obj.get_log_level ){
+        return obj.get_log_level(tag);
+    }
+    if( obj.put_log_debug ){
+        obj.put_log_debug( tag, 0 , __FILE__, __LINE__, "oops pointer is NULL!!" );
+    }
+    return LOG_LV_DEBUG;
 }
 
 /*!
@@ -128,21 +129,21 @@ template <typename T> enum LOG_LEVEL_TAG IS_DEBUG( const T &obj, enum LOG_CATEGO
  * @param  string
  * @return l7vs_protomod struct
  */
-inline void l7vs_protomod_c_str(char* buf, struct l7vs_protomod* proto) {
-       if (proto == NULL) {
-               snprintf(buf, DEBUG_STR_LEN, "NULL");
-       }
-       else {
-               snprintf(buf, DEBUG_STR_LEN, "handle: %p, modname: %s, refcnt: %d, create: %p, compare: %p, "
-                   "match_cldata: %p, analyze_rsdata: %p, destroy: %p, fini: %p, create_sa: %p, service_arg: %p, "
-                   "parse: %p, destroy_sa: %p, initialize: %p, finalize: %p, get_log_level: %p, put_log_debug: %p, "
-                   "put_log_info: %p, put_log_warn: %p, put_log_error: %p, put_log_fatal: %p",
-                   proto->handle, proto->modname, proto->refcnt, proto->create, proto->compare, proto->match_cldata,
-                   proto->analyze_rsdata, proto->destroy, proto->fini, proto->create_sa, proto->service_arg,
-                   proto->parse, proto->destroy_sa, proto->initialize, proto->finalize, proto->get_log_level,
-                   proto->put_log_debug, proto->put_log_info, proto->put_log_warn, proto->put_log_error,
-                   proto->put_log_fatal);
-       }
+inline void l7vs_protomod_c_str(char* buf, struct l7vs_protomod* proto) {
+    if (proto == NULL) {
+        snprintf(buf, DEBUG_STR_LEN, "NULL");
+    }
+    else {
+        snprintf(buf, DEBUG_STR_LEN, "handle: %p, modname: %s, refcnt: %d, create: %p, compare: %p, "
+            "select_dest: %p, analyze_cldata: %p, analyze_rsdata: %p, destroy: %p, fini: %p, create_sa: %p, "
+            "service_arg: %p, parse: %p, destroy_sa: %p, initialize: %p, finalize: %p, get_log_level: %p, "
+            "put_log_debug: %p, put_log_info: %p, put_log_warn: %p, put_log_error: %p, put_log_fatal: %p",
+            proto->handle, proto->modname, proto->refcnt, proto->create, proto->compare, proto->select_dest,
+            proto->analyze_cldata, proto->analyze_rsdata, proto->destroy, proto->fini, proto->create_sa,
+            proto->service_arg, proto->parse, proto->destroy_sa, proto->initialize, proto->finalize,
+            proto->get_log_level, proto->put_log_debug, proto->put_log_info, proto->put_log_warn,
+            proto->put_log_error, proto->put_log_fatal);
+    }
 }
 
-#endif //L7VS_MODULE_H
+#endif //L7VS_MODULE_H
index d3e0f7d..59445a5 100755 (executable)
@@ -108,7 +108,7 @@ our %VIRTUAL = (
     maxconn             => 0,
     qosup               => 0,
     qosdown             => 0,
-    sorryserver         => undef,
+    sorryserver         => { ip => '0.0.0.0', port => 0 },
     request             => undef,
     receive             => undef,
     httpmethod          => 'GET',
@@ -297,9 +297,9 @@ sub initial_setting {
 sub search_config_file {
     my $config_file = undef;
     my @search_path = qw(
-        ./l7directord.cf
-        /etc/ha.d/l7directord.cf
         /etc/ha.d/conf/l7directord.cf
+        /etc/ha.d/l7directord.cf
+        ./l7directord.cf
         );
 
     if (@ARGV) {
@@ -328,9 +328,9 @@ sub search_config_file {
 sub search_l7vsadm_file {
     my $l7vsadm_file = undef;
     my @search_path = qw(
-        ./l7vsadm
         /usr/sbin/l7vsadm
         /sbin/l7vsadm
+        ./l7vsadm
         );
 
     for my $file (@search_path) {
@@ -411,20 +411,23 @@ sub cmd_stop {
         print {*STDERR} _message('WRN0003', $oldpid);
         return 3;
     }
+
+    # wait and see
+    while (1) {
+        read_pid() or last;
+        sleep 1;
+    }
     return 0;
 }
 
 # cmd_restart
 # Restart process
-# Called if command argument is try-restart
+# Called if command argument is restart
 # return: see cmd_start return
 sub cmd_restart {
     # stop and ignore result
     cmd_stop();
 
-    # wait for pid file
-    sleep 1;
-
     # start
     my $status = cmd_start();
 
@@ -444,9 +447,6 @@ sub cmd_try_restart {
         return $stop_result;
     }
 
-    # wait for pid file
-    sleep 1;
-
     # start
     my $status = cmd_start();
 
@@ -1783,8 +1783,6 @@ sub check_child_process {
             push @down_process_ids, $id;
             next;
         }
-        # non-blocking wait for zombie process
-        waitpid(-1, WNOHANG); # TODO should move to sigchld handler?
         # signal 0
         my $signaled = kill 0, $HEALTH_CHECK{$id}{pid};
         if ($signaled != 1) {
@@ -1913,6 +1911,9 @@ sub sleep_and_check_signal {
 
     my $sleeped = 0;
     while ($sec > $sleeped) {
+        # non-blocking wait for zombie process
+        waitpid(-1, WNOHANG); # TODO should move to sigchld handler?
+
         if ($is_child) {
             if ( defined $PROC_STAT{halt} ) { 
                 ld_log( _message( 'WRN0001', $CONFIG_FILE{path}, $PROC_STAT{halt} ) );
@@ -2060,7 +2061,7 @@ sub make_custom_func {
             local $SIG{__DIE__} = 'DEFAULT';
             local $SIG{ALRM} = sub { die "custom check timeout\n"; };
             eval {
-                alarm $v->{negotiatetimeout};
+                alarm $v->{checktimeout};
                 $res = system_wrapper($customcheck);
                 alarm 0;
             };
@@ -3756,7 +3757,7 @@ sub ld_getservbyname {
         return $name;
     }
 
-    my $port = ( getservbyname($name, $protocol) )[2] or return;
+    my $port = ( getservbyname($name, $protocol) )[2];
     return $port;
 }
 
@@ -3782,8 +3783,9 @@ sub ld_gethostservbyname {
     }
     my $ip   = $1;
     my $port = $2;
-    $ip   = ld_gethostbyname($ip)              or return;
-    $port = ld_getservbyname($port, $protocol) or return;
+    $ip   = ld_gethostbyname($ip) or return;
+    $port = ld_getservbyname($port, $protocol);
+    return if !defined $port;
 
     return {ip => $ip, port => $port};
 }
index f92e75c..be43915 100644 (file)
@@ -109,19 +109,36 @@ SKIP: {
 SKIP: {
     my $fail = 0;
     my $made = 0;
+    my $bak2 = 0;
+    my $bak3 = 0;
     if (!-f './l7directord.cf') {
         if (!open my $f, '>', './l7directord.cf') {
             $fail = 1;
         } else { $made = 1; close $f; }
     }
+    if (!$fail && -f '/etc/ha.d/conf/l7directord.cf') {
+        if (move '/etc/ha.d/conf/l7directord.cf', 'l7d.bak2') {
+            $bak2 = 1;
+        } else {
+            $fail = 1;
+        }
+    }
+    if (!$fail && -f '/etc/ha.d/l7directord.cf') {
+        if (move '/etc/ha.d/l7directord.cf', 'l7d.bak3') {
+            $bak3 = 1;
+        } else {
+            $fail = 1;
+        }
+    }
     if ($fail) {
-        if ($made) { unlink './l7directord.cf'; }
         skip 'cannot make ./l7directord.cf', 3;
     }
     test_argv('ARGV="reload"', 5, qw(reload));
     is $main::CONFIG_FILE{path}, abs_path('./l7directord.cf'), 'search config path(1)';
     is $main::CONFIG_FILE{filename}, 'l7directord', 'search config filename';
     if ($made) { unlink './l7directord.cf'; }
+    if ($bak2) { move 'l7d.bak2', '/etc/ha.d/conf/l7directord.cf'; }
+    if ($bak3) { move 'l7d.bak3', '/etc/ha.d/l7directord.cf'; }
 }
 
 SKIP: {
@@ -249,16 +266,43 @@ SKIP: {
 SKIP: {
     my $fail = 0;
     my $made = 0;
+    my $bak2 = 0;
+    my $bak3 = 0;
     if (!-f './l7vsadm') {
         if (!open my $f, '>', './l7vsadm') {
             $fail = 1;
         } else { $made = 1; close $f; }
     }
-    if (!-x './l7vsadm') {
+    if (!$fail && !-x './l7vsadm') {
         if (!chmod 0755, './l7vsadm') {
             $fail = 1;
         }
     }
+    if (!$fail && -f '/usr/sbin/l7vsadm') {
+        if (move '/usr/sbin/l7vsadm', 'l7v.bak2') {
+            $bak2 = 1;
+        } else {
+            $fail = 1;
+        }
+    }
+    if (!$fail && -f '/sbin/l7vsadm') {
+        if (move '/sbin/l7vsadm', 'l7v.bak3') {
+            $bak3 = 1;
+        } else {
+            $fail = 1;
+        }
+    }
+    if ($fail) {
+        if ($bak2) {
+            move 'l7v.bak2', '/usr/sbin/l7vsadm';
+            chmod '0755', '/usr/sbin/l7vsadm';
+        }
+        if ($bak3) {
+            move 'l7v.bak3', '/sbin/l7vsadm';
+            chmod '0755', '/sbin/l7vsadm';
+        }
+        skip 'cannot make ./l7vsadm', 2;
+    }
     skip 'cannot make ./l7vsadm', 2 if ($fail);
     test_argv('ARGV="stop"', 2, qw(stop));
     is $main::PROC_ENV{l7vsadm}, abs_path('./l7vsadm'), 'search l7vsadm(1)';
index d878df4..f869872 100644 (file)
@@ -14,6 +14,7 @@ default_value();
 our $signal = undef;
 our $read_config_called = 0;
 our $ld_log_called = 0;
+our @read_pid_return_first = ();
 our @read_pid_return = ();
 our @children_command = ();
 our $system_command = undef;
@@ -138,7 +139,8 @@ open  *STDERR, '>', '/dev/null';
 }
 {
     local $SIG{TERM} = sub { $signal = shift; };
-    local @read_pid_return = ($$);
+    local @read_pid_return_first = ($$);
+    local @read_pid_return;
     my $got = cmd_stop();
     is $got, 0, 'cmd_stop - running';
     is $signal, 'TERM', 'cmd_stop - signal send';
@@ -337,6 +339,11 @@ sub __ld_setup {
     $ld_setup_called++;
 }
 sub __read_pid {
+    if (@read_pid_return_first) {
+        my @return = @read_pid_return_first;
+        undef @read_pid_return_first;
+        return wantarray ? @return : $return[0];
+    }
     return wantarray ? @read_pid_return : $read_pid_return[0];
 }
 sub __write_pid {
index 251bd85..49ea81a 100644 (file)
@@ -175,7 +175,7 @@ CONFIG
                 'virtualhost' => undef,
                 'quiescent' => undef,
                 'realrecovercallback' => undef,
-                'sorryserver' => undef,
+                'sorryserver' => { ip => '0.0.0.0', port => 0 },
                 'service' => undef,
                 'login' => '',
                 'fallback' => undef,
@@ -206,7 +206,7 @@ CONFIG
                 'virtualhost' => undef,
                 'quiescent' => undef,
                 'realrecovercallback' => undef,
-                'sorryserver' => undef,
+                'sorryserver' => { ip => '0.0.0.0', port => 0 },
                 'service' => undef,
                 'login' => '',
                 'fallback' => undef,
@@ -272,7 +272,7 @@ CONFIG
                 'virtualhost' => undef,
                 'quiescent' => undef,
                 'realrecovercallback' => undef,
-                'sorryserver' => undef,
+                'sorryserver' => { ip => '0.0.0.0', port => 0 },
                 'service' => undef,
                 'login' => '',
                 'fallback' => undef,
@@ -2760,6 +2760,7 @@ CONFIG
     remove_config();
 }
 SKIP: {
+    skip 'various reason...', 2;
     my $input = <<"CONFIG";
 virtual=localhost:http
     module= 'cINSERT --cookie-name 'Monkey' --cookie-expire 864'
@@ -2808,6 +2809,7 @@ CONFIG
     remove_config();
 }
 SKIP: {
+    skip 'various reason...', 2;
     my $input = <<"CONFIG";
 virtual=localhost:http
     module=  'Cinsert --reschedule'
index 496b989..026fe08 100644 (file)
@@ -6,6 +6,7 @@
  * L7VSD: Linux Virtual Server for Layer7 Load Balancing
  * Copyright (C) 2008  NTT COMWARE Corporation.
  * Copyright (C) 2009  Shinya TAKEBAYASHI
+ * Copyright (C) 2009  NTT Resonant Inc. O.Nakayama, T.Motoda.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -124,12 +125,38 @@ void CSSLIDMap::setPointer(const void *keymap, const void *keylist, unsigned int
 }
 
 
+/*!
+ * Convert SSL session ID (hex to binary)   // 2009.4.9 T.Motoda@NTTR
+ * @param[out] id  SSL session ID
+ * @param[out] id_len a pointer to SSL session ID length
+ * @param[in]  buf hex string
+ */
+static void str_c_id(char *id, int *id_len, const char* buf) {
+        int i;
+       char hexbuf[3] = {0,0,0};
+       (*id_len) = 0;
+        if (buf == NULL) {
+                memset(id, 0, SSLID_LENGTH);
+        } else {
+                for (i = 0; i < SSLID_LENGTH; i++) {
+                       if ((hexbuf[0] = buf[i * 2 + 0]) > 0) {
+                               hexbuf[1] = buf[i * 2 + 1];
+                               id[i] = strtol(hexbuf, NULL, 16);
+                               (*id_len) ++;
+                       } else {
+                               break;
+                       }
+                }
+        }
+}
+
 void CSSLIDMap::construct_sessionlist(struct l7vs_sslid_service* sslid_service)
 {
   int pick = 0;
   IDMAP::const_iterator it;
   
   for (it = m->begin(); it != m->end(); it++, pick++) {
+    str_c_id((sslid_service->session + pick)->id, &((sslid_service->session + pick)->id_len), it->first.c_str());   // 2009.4.9 T.Motoda@NTTR
     memcpy((sslid_service->session + pick)->id, &(it->first), 32);
     memcpy(&(sslid_service->session + pick)->dest, &(it->second), sizeof(struct l7vs_dest));
 
@@ -147,6 +174,7 @@ void CSSLIDMap::rebuild_sessionlist(struct l7vs_sslid_service* sslid_service)
 
   for (pick = 0; pick < sslid_service->maxlist; pick++) {
     memset(&tmp_session, 0, sizeof (struct ssl_session));
+    tmp_session.id_len = (sslid_service->session + pick)->id_len;      // added by 2009.4.9 T.Motoda@NTTR
     memcpy(&(tmp_session.id), &(sslid_service->session + pick)->id, 32);
     memcpy(&(tmp_session.dest), &(sslid_service->session + pick)->dest, sizeof(struct l7vs_dest));
     add(tmp_session.id, tmp_session.dest);
index 0d649fd..b642a74 100644 (file)
@@ -34,7 +34,7 @@
 #include "module_http.h"
 
 #define SERVICE_ARG_MAXSIZE    (512)
-#define IP_SERVICE_NUMBER (128)
+#define IP_SERVICE_NUMBER      (128)
 #define X_FORWARDED_FOR_LENGTH (48)
 
 #define HASH_TABLE_BITS 8
 struct l7vs_ip_service {
     handle_t service_handle;
     struct sockaddr_in dest[HASH_TABLE_SIZE];
+    int expire[HASH_TABLE_SIZE];
+    int timeout;
     int forwarded_for;
     int reschedule;
 };
 
 struct  l7vs_ip_service_arg {
+    int timeout;
     int forwarded_for;
     int reschedule;
 };
@@ -58,8 +61,10 @@ static void  fini(void);
 static int   create(void*, handle_t);
 static void* create_sa(struct l7vs_service_arg*);
 static int   compare(handle_t, handle_t);
-static int   match_cldata(struct l7vs_service*, struct l7vs_conn*,
-        char*, size_t*, struct l7vs_dest**, int*);
+static int   select_dest(struct l7vs_service*, struct l7vs_conn*,
+        char*, size_t*, struct l7vs_dest**);
+static int   analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+        char*, size_t*);
 static int   analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
         char*, size_t*);
 static int   destroy(handle_t);
@@ -79,12 +84,13 @@ struct l7vs_ip_service *ip_service_list[IP_SERVICE_NUMBER];
 
 static struct l7vs_protomod ip_protomod = {
     NULL,           /* handle */
-    "ip",      /* modname */
+    "ip",           /* modname */
     0,              /* refcnt */
     1,              /* fast schedule */
     create,         /* create function */
     compare,        /* compare function */
-    match_cldata,   /* match_cldata function */
+    select_dest,    /* select_dest function */
+    analyze_cldata, /* analyze_cldata function */
     analyze_rsdata, /* analyze_rsdata function */
     destroy,        /* destroy function */
     fini,           /* fini function */
@@ -104,7 +110,7 @@ static struct l7vs_protomod ip_protomod = {
 
 /*!
  * Protocol module initialize function. This function run when dlopen and dlsym at first time.
- * @param[in] handle dlopen's handle
+ * @param[in] handle    dlopen's handle
  * @return l7vs_protomod struct
  */
 extern "C" struct l7vs_protomod *
@@ -192,8 +198,8 @@ fini(void)
 
 /*!
  * Create ip service struct.
- * @param[in] ip_arg    ip service argument struct
- * @param[in] service_handle a unique service ID
+ * @param[in] ip_arg            ip service argument struct
+ * @param[in] service_handle    a unique service ID
  * @retval 0  successfully create ip service.
  * @retval -1 some errors occur.
  */
@@ -251,6 +257,8 @@ create(void *ip_arg, handle_t service_handle)
 
     /* set service handle */
     ip_service->service_handle = service_handle;
+    /* set timeout */
+    ip_service->timeout = ip_service_arg->timeout;
     /* set x-forwarded-for flag */
     ip_service->forwarded_for = ip_service_arg->forwarded_for;
     /* set reschedule  */
@@ -271,7 +279,7 @@ create_out:
 
 /*!
  * Create ip service argument struct.
- * @param[out] srv_arg service argument struct
+ * @param[out] srv_arg  service argument struct
  * @return ip service argument struct
  */
 static void *
@@ -334,8 +342,8 @@ create_sa_out:
 
 /*!
  * Compare two service.
- * @param[in] srv_handle1 one of a unique service ID
- * @param[in] srv_handle2 one of a unique service ID
+ * @param[in] srv_handle1   one of a unique service ID
+ * @param[in] srv_handle2   one of a unique service ID
  * @retval 0  they matched perfectly.
  * @retval -1 they are different.
  */
@@ -350,12 +358,6 @@ compare(handle_t srv_handle1, handle_t srv_handle2)
         PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,258,
             "in_function: int compare(handle_t srv_handle1, handle_t srv_handle2):"
             "srv_handle1=%u, srv_handle2=%u", srv_handle1, srv_handle2);
-    }
-    /*------ DEBUG LOG END ------*/
-
-    /*-------- DEBUG LOG --------*/
-    if (ip_protomod.get_log_level != NULL &&
-        LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
         PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,259,
             "out_function: int compare(handle_t srv_handle1, handle_t srv_handle2):return_value=%d",
             return_value);
@@ -367,37 +369,32 @@ compare(handle_t srv_handle1, handle_t srv_handle2)
 
 /*!
  * Do not check the request packet.
- * @param[in]  srv service struct include service handle, protocol module and schedule module.
- * @param[in]  conn connection data.
- * @param[in]  request packet data from client
- * @param[in]  len length of packet data
- * @param[out] dest destination (real server) list
- * @param[out] tcps TCP Splicer flag
+ * @param[in]  srv      service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn     connection data.
+ * @param[in]  request  packet data from client
+ * @param[in]  len      length of packet data
+ * @param[out] dest     destination (real server) list
  * @retval 0  successfully check packet data
  * @retval -1 some errors occur.
  */
 static int
-match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
-      char *request, size_t *len, struct l7vs_dest **dest, int *tcps)
+select_dest(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len, struct l7vs_dest **dest)
 {
     struct l7vs_ip_service *ip_service;
     struct l7vs_dest destination;
     int ret;
-    int offset_length;
-    char *x_forwarded_value;
-    char *next_line = NULL;
-    char x_forwarded_for_header[X_FORWARDED_FOR_LENGTH];
-    size_t uri_len = 0;
     int return_value = 0;
     unsigned int hash;
+    time_t now;
 
     /*-------- DEBUG LOG --------*/
     if (ip_protomod.get_log_level != NULL &&
         LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
-        char srv_str[DEBUG_STR_LEN] = {0};
+        char srv_str[DEBUG_STR_LEN]  = {0};
         char conn_str[DEBUG_STR_LEN] = {0};
         char dest_str[DEBUG_STR_LEN] = {0};
-        char len_str[DEBUG_STR_LEN] = {0};
+        char len_str[DEBUG_STR_LEN]  = {0};
         l7vs_service_c_str(srv_str, srv);
         l7vs_conn_c_str(conn_str, conn);
         if (dest != NULL) {
@@ -413,10 +410,10 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
             strncpy(len_str, "NULL", DEBUG_STR_LEN);
         }
         PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,260,
-            "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-            "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
-            "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%d)",
-            srv_str, conn_str, request, len_str, dest_str, *tcps);
+            "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+            "char* request, size_t* len, struct l7vs_dest** dest):srv=&(%s), conn=&(%s), "
+            "request=\"%s\", len=&(%s), dest=&(&(%s))",
+            srv_str, conn_str, request, len_str, dest_str);
     }
     /*------ DEBUG LOG END ------*/
 
@@ -424,32 +421,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
     if (srv == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,221, "Arg(srv) is NULL pointer.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
     if (srv->pm == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,222, "Arg(srv->pm) is NULL pointer.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
     if (request == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,223, "Arg(request) is NULL pointer.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
     if (len == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,224, "Arg(len) is NULL pointer.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
     if (dest == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,225, "Arg(dest) is NULL pointer.");
         return_value = -1;
-        goto match_cldata_out;
-    }
-    if (tcps == NULL) {
-        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,226, "Arg(tcps) is NULL pointer.");
-        return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
 
     /* search service that has such a service ID */
@@ -468,7 +460,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
     if (ip_service == NULL) {
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,227, "Could not find such service handle's ip service.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
 
     /* initialize protocol module ... clear destination list */
@@ -476,15 +468,124 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
     if (ret != 0){
         PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,228, "Could not initialize protomod.");
         return_value = -1;
-        goto match_cldata_out;
+        goto select_dest_out;
     }
 
+    now  = time(NULL);
     hash = l7vs_ip_service_calc_hash(conn);
-    if (ip_service->dest[hash].sin_addr.s_addr &&
-        ip_service->dest[hash].sin_port) {
+    if (   ip_service->dest[hash].sin_addr.s_addr
+        && ip_service->dest[hash].sin_port
+        && (ip_service->timeout == 0 || now < ip_service->expire[hash])
+        ) {
         destination.addr.sin_addr.s_addr = ip_service->dest[hash].sin_addr.s_addr;
         destination.addr.sin_port = ip_service->dest[hash].sin_port;
-           *dest = &destination;
+        *dest = &destination;
+    }
+
+    /* finalize */
+    ret = srv->pm->finalize(srv, conn, request, *len, dest, ip_service->reschedule);
+    if (ret != 0){
+        PUT_LOG_INFO(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,17, "Could not finalize protomod. (Realserver decision failure)");
+        return_value = -1;
+        goto select_dest_out;
+    }
+
+select_dest_out:
+    /*-------- DEBUG LOG --------*/
+    if (ip_protomod.get_log_level != NULL &&
+        LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+        PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,262,
+            "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+            "char* request, size_t* len, struct l7vs_dest** dest):return_value=%d",
+            return_value);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    return return_value;
+}
+
+/*!
+ * Analyze and modify client packet
+ * @param[in]  srv      service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn     connection data.
+ * @param[in]  request  packet data from client
+ * @param[in]  len      length of packet data
+ * @retval 0  successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len)
+{
+    struct l7vs_ip_service *ip_service;
+    struct l7vs_dest destination;
+    int    offset_length;
+    char*  x_forwarded_value;
+    char*  next_line = NULL;
+    char   x_forwarded_for_header[X_FORWARDED_FOR_LENGTH];
+    size_t uri_len = 0;
+    int    return_value = 0;
+
+    /*-------- DEBUG LOG --------*/
+    if (ip_protomod.get_log_level != NULL &&
+        LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+        char srv_str[DEBUG_STR_LEN]  = {0};
+        char conn_str[DEBUG_STR_LEN] = {0};
+        char len_str[DEBUG_STR_LEN]  = {0};
+        l7vs_service_c_str(srv_str, srv);
+        l7vs_conn_c_str(conn_str, conn);
+        if (len != NULL) {
+            snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+        }
+        else {
+            strncpy(len_str, "NULL", DEBUG_STR_LEN);
+        }
+        PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,260,
+            "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+            "char* request, size_t* len):srv=&(%s), conn=&(%s), request=\"%s\", len=&(%s)",
+            srv_str, conn_str, request, len_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    /* check null */
+    if (srv == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,221, "Arg(srv) is NULL pointer.");
+        return_value = -1;
+        goto analyze_cldata_out;
+    }
+    if (srv->pm == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,222, "Arg(srv->pm) is NULL pointer.");
+        return_value = -1;
+        goto analyze_cldata_out;
+    }
+    if (request == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,223, "Arg(request) is NULL pointer.");
+        return_value = -1;
+        goto analyze_cldata_out;
+    }
+    if (len == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,224, "Arg(len) is NULL pointer.");
+        return_value = -1;
+        goto analyze_cldata_out;
+    }
+
+    /* search service that has such a service ID */
+    ip_service = l7vs_protomod_ip_search_service(srv->handle);
+
+    /*-------- DEBUG LOG --------*/
+    if (ip_protomod.get_log_level != NULL &&
+        LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+        char ip_str[DEBUG_STR_LEN] = {0};
+        l7vs_ip_service_c_str(ip_str, ip_service);
+        PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,261, "pointer assign: ip_service=&(%s)",
+            ip_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (ip_service == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,227, "Could not find such service handle's ip service.");
+        return_value = -1;
+        goto analyze_cldata_out;
     }
 
     /* set X-Forwarded-For field */
@@ -492,7 +593,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
         uri_len = *len;
         /* check request */
         if (http_check_request_method(request, &uri_len) == NULL)
-            goto match_cldata_finalize;
+            goto analyze_cldata_out;
 
         x_forwarded_value = http_search_header_field(request, "X-Forwarded-For");
 
@@ -530,26 +631,13 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
         }
     }
 
-match_cldata_finalize:
-    *tcps = 0;
-
-       /* finalize */
-    ret = srv->pm->finalize(srv, conn, request, *len, dest, ip_service->reschedule);
-
-    if (ret != 0){
-        PUT_LOG_INFO(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,17, "Could not finalize protomod. (Realserver decision failure)");
-        return_value = -1;
-        goto match_cldata_out;
-    }
-
-match_cldata_out:
+analyze_cldata_out:
     /*-------- DEBUG LOG --------*/
     if (ip_protomod.get_log_level != NULL &&
         LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
         PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,262,
-            "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-            "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
-            return_value);
+            "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+            "char* request, size_t* len):return_value=%d", return_value);
     }
     /*------ DEBUG LOG END ------*/
 
@@ -557,11 +645,11 @@ match_cldata_out:
 }
 
 /*!
- * Do nothing.
- * @param[in] srv service struct include service handle, protocol module and schedule module.
- * @param[in] conn connection data.
- * @param[in] response packet data from real server
- * @param[in] len length of packet data. it will be lengthened.
+ * Calculate source IP address's hash value and regist it with destination IP address.
+ * @param[in] srv       service struct include service handle, protocol module and schedule module.
+ * @param[in] conn      connection data.
+ * @param[in] response  packet data from real server
+ * @param[in] len       length of packet data. it will be lengthened.
  * @retval 0  successfully check packet data.
  * @retval -1 some errors occur.
  */
@@ -569,16 +657,17 @@ static int
 analyze_rsdata(struct l7vs_service *srv, struct l7vs_conn *conn,
     char *response, size_t *len)
 {
-       struct l7vs_ip_service *ip_service;
+    struct l7vs_ip_service *ip_service;
     unsigned int hash;
     int return_value = 0;
+    time_t now = 0;
 
     /*-------- DEBUG LOG --------*/
     if (ip_protomod.get_log_level != NULL &&
         LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
-        char srv_str[DEBUG_STR_LEN] = {0};
+        char srv_str[DEBUG_STR_LEN]  = {0};
         char conn_str[DEBUG_STR_LEN] = {0};
-        char len_str[DEBUG_STR_LEN] = {0};
+        char len_str[DEBUG_STR_LEN]  = {0};
         l7vs_service_c_str(srv_str, srv);
         l7vs_conn_c_str(conn_str, conn);
         if (len != NULL) {
@@ -632,28 +721,31 @@ analyze_rsdata(struct l7vs_service *srv, struct l7vs_conn *conn,
         goto analyze_rsdata_out;
     }
 
-       /* search service that has such a service ID */
-       ip_service = l7vs_protomod_ip_search_service(srv->handle);
+    /* search service that has such a service ID */
+    ip_service = l7vs_protomod_ip_search_service(srv->handle);
 
-       /*-------- DEBUG LOG --------*/
-       if (ip_protomod.get_log_level != NULL &&
-           LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
-               char ip_str[DEBUG_STR_LEN];
-               l7vs_ip_service_c_str(ip_str, ip_service);
-               PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,265, "pointer assign: ip_service=&(%s)",
-                   ip_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (ip_protomod.get_log_level != NULL &&
+        LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+        char ip_str[DEBUG_STR_LEN];
+        l7vs_ip_service_c_str(ip_str, ip_service);
+        PUT_LOG_DEBUG(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,265, "pointer assign: ip_service=&(%s)",
+            ip_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
-       if (ip_service == NULL) {
-               PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,234,
-                   "Could not find such service handle's ip service.");
-               return_value = -1;
-               goto analyze_rsdata_out;
-       }
+    if (ip_service == NULL) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,234,
+            "Could not find such service handle's ip service.");
+        return_value = -1;
+        goto analyze_rsdata_out;
+    }
 
     hash = l7vs_ip_service_calc_hash(conn);
     memcpy(&ip_service->dest[hash], &conn->dest->addr, sizeof(struct sockaddr_in));
+    if (ip_service->timeout)
+        now = time(NULL);
+    ip_service->expire[hash] = now + ip_service->timeout;
 
 analyze_rsdata_out:
     /*-------- DEBUG LOG --------*/
@@ -670,7 +762,7 @@ analyze_rsdata_out:
 
 /*!
  * Destroy ip service
- * @param[in] srv_handle a unique service ID
+ * @param[in] srv_handle    a unique service ID
  * @retval 0  successfully check packet data.
  * @retval -1 some errors occur.
  */
@@ -728,7 +820,7 @@ destroy_out:
 
 /*!
  * Destroy ip service argument
- * @param[in] ip_arg ip service argument
+ * @param[in] ip_arg    ip service argument
  * @return void
  */
 static void
@@ -782,8 +874,8 @@ destroy_sa(void **ip_arg)
 
 /*!
  * Create strings for service list of l7vsadm
- * @param[out] srv_arg service argument struct
- * @param[in]  srv_handle a unique service ID
+ * @param[out] srv_arg      service argument struct
+ * @param[in]  srv_handle   a unique service ID
  * @retval 0  successfully create strings
  * @retval -1 some errors occur.
  */
@@ -792,8 +884,8 @@ service_arg(struct l7vs_service_arg_multi *srv_arg_mt, handle_t srv_handle)
 {
     struct l7vs_ip_service *ip_service;
     struct l7vs_ip_service_arg c_sarg;
-    char ip_argument[SERVICE_ARG_MAXSIZE];
-    int return_value = 0;
+    char   ip_argument[SERVICE_ARG_MAXSIZE];
+    int    return_value = 0;
 
     /*-------- DEBUG LOG --------*/
     if (ip_protomod.get_log_level != NULL &&
@@ -843,10 +935,12 @@ service_arg(struct l7vs_service_arg_multi *srv_arg_mt, handle_t srv_handle)
     strncpy(srv_arg_mt->srv_arg.protomod_key_string, "", 256);
 
     /* create verbose argument (l7vsadm option -V/-v) */
-    strncpy(srv_arg_mt->srv_arg.protomod_opt_string, "", 512);
     if (ip_service->forwarded_for) {
-        strncpy(srv_arg_mt->srv_arg.protomod_opt_string, "--forwarded-for", 512);
+        snprintf(ip_argument, SERVICE_ARG_MAXSIZE, "--timeout %d --forwarded-for", ip_service->timeout);
+    } else {
+        snprintf(ip_argument, SERVICE_ARG_MAXSIZE, "--timeout %d", ip_service->timeout);
     }
+    strncpy(srv_arg_mt->srv_arg.protomod_opt_string, ip_argument, 512);
 
     c_sarg.reschedule = ip_service->reschedule;
 
@@ -877,9 +971,9 @@ service_arg_out:
 
 /*!
  * Parse l7vsadm options to ip argument
- * @param[out] ip_arg ip service argument struct
- * @param[in]  argc number of l7vsadm argument
- * @param[in]  argv l7vsadm argument list
+ * @param[out] ip_arg   ip service argument struct
+ * @param[in]  argc     number of l7vsadm argument
+ * @param[in]  argv     l7vsadm argument list
  * @retval 0  successfully parse argument
  * @retval -1 some errors occur.
  */
@@ -888,21 +982,24 @@ parse(void *ip_arg, int argc, char *argv[])
 {
     struct l7vs_ip_service_arg *ip_service_arg;
     static struct option opt[] = {
+        {"timeout",       required_argument, NULL, 'T'},
         {"forwarded-for", no_argument,       NULL, 'F'},
         {"reschedule",    no_argument,       NULL, 'R'},
         {"no-reschedule", no_argument,       NULL, 'N'},
         {NULL,            0,                 NULL, 0  }
     };
     int c;
-    int return_value = 0;
+    int return_value       = 0;
+    int timeout_flag       = 0;
     int forwarded_for_flag = 0;
-    int reschedule_flag = 0;
+    int reschedule_flag    = 0;
+    unsigned long buffer;
 
     /*-------- DEBUG LOG --------*/
     if (ip_protomod.get_log_level != NULL &&
         LOG_LV_DEBUG == ip_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
         int i;
-        char argv_str[DEBUG_STR_LEN] = {0};
+        char argv_str[DEBUG_STR_LEN]   = {0};
         char ip_arg_str[DEBUG_STR_LEN] = {0};
         l7vs_ip_service_arg_c_str(ip_arg_str, (struct l7vs_ip_service_arg*) ip_arg);
         argv_str[0] = '\0';
@@ -938,8 +1035,26 @@ parse(void *ip_arg, int argc, char *argv[])
     optind = 0;
 
     /* check all argument */
-    while ((c = getopt_long(argc, argv, "FRN", opt, NULL)) != -1) {
+    while ((c = getopt_long(argc, argv, "T:FRN", opt, NULL)) != -1) {
         switch (c) {
+        /* --timeout / -T */
+        case 'T':
+            if (sscanf(optarg, "%lu", &buffer) == 0) {
+                PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,107,
+                    "-T/--timeout option value '%s' is invalid.", optarg);
+                return_value = -1;
+                goto parse_out;
+            }
+            if (buffer > INT_MAX) {
+                PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,108,
+                    "-T/--timeout option value '%s' is too large.", optarg);
+                return_value = -1;
+                goto parse_out;
+            }
+            else
+                ip_service_arg->timeout = buffer;
+            timeout_flag++;
+            break;
         /* --forwarded-for / -F */
         case 'F':
             /* x-forwarded-for on */
@@ -952,14 +1067,12 @@ parse(void *ip_arg, int argc, char *argv[])
             ip_service_arg->reschedule = 1;
             reschedule_flag++;
             break;
-
         /* --no-reschedule / -N */
         case 'N':
             /* reschedule off */
             ip_service_arg->reschedule = 0;
             reschedule_flag++;
             break;
-
         /* else error */
         default:
             PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,242, "Option error.");
@@ -975,12 +1088,21 @@ parse(void *ip_arg, int argc, char *argv[])
         return_value = -1;
         goto parse_out;
     }
-
+    /* same option */
+    if (timeout_flag > 1) {
+        PUT_LOG_ERROR(ip_protomod, LOG_CAT_L7VSD_PROTOCOL,113,
+            "Cannot set multiple option '--timeout/-T'.");
+        return_value = -1;
+        goto parse_out;
+    }
+    /* set default options */
+    if (timeout_flag == 0) {
+        ip_service_arg->timeout = 3600;
+    }
     /* set default no reschedule */
     if (reschedule_flag == 0) {
         ip_service_arg->reschedule = 0;
     }
-
     /* set default no forwarded_for */
     if (forwarded_for_flag == 0) {
         ip_service_arg->forwarded_for = 0;
@@ -1001,7 +1123,7 @@ parse_out:
 
 /*!
  * Search ip service from ip service list using service handle
- * @param[in] service_handle a unique service ID
+ * @param[in]   service_handle  a unique service ID
  * @return ip service struct when service was found. NULL when service was not found.
  */
 static struct l7vs_ip_service *
@@ -1164,31 +1286,31 @@ create_temp_service_out:
 
 /*!
  * Serialize struct l7vs_ip_service for debug log.
- * @param[out] buf   serialized string
- * @param[in]  ip l7vs_ip_service struct
+ * @param[out]  buf     serialized string
+ * @param[in]   ip      l7vs_ip_service struct
  */
 static void l7vs_ip_service_c_str(char* buf, struct l7vs_ip_service* ip) {
     if (ip == NULL) {
         snprintf(buf, DEBUG_STR_LEN, "NULL");
     }
     else {
-        snprintf(buf, DEBUG_STR_LEN, "service_handle=%d, forwarded_for=%d, reschedule=%d",
-            ip->service_handle, ip->forwarded_for, ip->reschedule);
+        snprintf(buf, DEBUG_STR_LEN, "service_handle=%d, timeout=%d, forwarded_for=%d, reschedule=%d",
+            ip->service_handle, ip->timeout, ip->forwarded_for, ip->reschedule);
     }
 }
 
 /*!
  * Serialize struct l7vs_ip_service_arg for debug log.
- * @param[out] buf       serialized string
- * @param[in]  ip_arg l7vs_ip_service_arg struct
+ * @param[out]  buf     serialized string
+ * @param[in]   ip_arg  l7vs_ip_service_arg struct
  */
 void l7vs_ip_service_arg_c_str(char* buf, struct l7vs_ip_service_arg* ip_arg) {
     if (ip_arg == NULL) {
         snprintf(buf, DEBUG_STR_LEN, "NULL");
     }
     else {
-        snprintf(buf, DEBUG_STR_LEN, "forwarded_for=%d, reschedule=%d",
-            ip_arg->forwarded_for, ip_arg->reschedule);
+        snprintf(buf, DEBUG_STR_LEN, "timeout=%d, forwarded_for=%d, reschedule=%d",
+            ip_arg->timeout, ip_arg->forwarded_for, ip_arg->reschedule);
     }
 }
 
@@ -1196,3 +1318,4 @@ unsigned int l7vs_ip_service_calc_hash(struct l7vs_conn* conn) {
     unsigned int hash = ntohl(conn->caddr.sin_addr.s_addr) * GOLDEN_RATIO_PRIME;
     return hash >> 32 - HASH_TABLE_BITS;
 }
+// vim:et:ts=4:foldmethod=marker:foldmarker=LOG\ -,LOG\ END\ -:
index 9697067..1182f4b 100644 (file)
@@ -69,8 +69,10 @@ static void  fini(void);
 static int   create(void*, handle_t);
 static void* create_sa(struct l7vs_service_arg*);
 static int   compare(handle_t, handle_t);
-static int   match_cldata(struct l7vs_service*, struct l7vs_conn*,
-       char*, size_t*, struct l7vs_dest**, int*);
+static int   select_dest(struct l7vs_service*, struct l7vs_conn*,
+       char*, size_t*, struct l7vs_dest**);
+static int   analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+       char*, size_t*);
 static int   analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
        char*, size_t*);
 static int   destroy(handle_t);
@@ -94,7 +96,8 @@ static struct l7vs_protomod pfilter_protomod = {
        0,              /* fast schedule */
        create,         /* create function */
        compare,        /* compare function */
-       match_cldata,   /* match_cldata function */
+       select_dest,    /* select_dest function */
+       analyze_cldata, /* analyze_cldata function */
        analyze_rsdata, /* analyze_rsdata function */
        destroy,        /* destroy function */
        fini,           /* fini function */
@@ -436,19 +439,18 @@ compare_out:
 }
 
 /*!
- * Check the client packet and determine a real server.
+ * Determine a real server.
  * @param[in]  srv service struct include service handle, protocol module and schedule module.
  * @param[in]  conn connection data.
  * @param[in]  request packet data from client
  * @param[in]  len length of packet data
  * @param[out] dest destination (real server) list
- * @param[out] tcps TCP Splicer flag
  * @retval 0  successfully check packet data
  * @retval -1 some errors occur.
  */
 static int
-match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
-      char *request, size_t *len, struct l7vs_dest **dest, int *tcps)
+select_dest(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len, struct l7vs_dest **dest)
 {
        struct l7vs_pfilter_service *pfilter_service;
        int ret;
@@ -462,7 +464,6 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                char conn_str[DEBUG_STR_LEN] = {0};
                char dest_str[DEBUG_STR_LEN] = {0};
                char len_str[DEBUG_STR_LEN] = {0};
-               char tcps_str[DEBUG_STR_LEN] = {0};
                l7vs_service_c_str(srv_str, srv);
                l7vs_conn_c_str(conn_str, conn);
                if (dest != NULL) {
@@ -477,17 +478,11 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                else {
                        strncpy(len_str, "NULL", DEBUG_STR_LEN);
                }
-               if (tcps != NULL) {
-                       snprintf(tcps_str, DEBUG_STR_LEN, "%d", *tcps);
-               }
-               else {
-                       strncpy(tcps_str, "NULL", DEBUG_STR_LEN);
-               }
                PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,296,
-                   "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
-                   "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%s)",
-                   srv_str, conn_str, request, len_str, dest_str, tcps_str);
+                   "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s), dest=&(&(%s))",
+                   srv_str, conn_str, request, len_str, dest_str);
        }
        /*------ DEBUG LOG END ------*/
 
@@ -495,32 +490,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (srv == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,253, "Arg(srv) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (srv->pm == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,254, "Arg(srv->pm) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (request == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,255, "Arg(request) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (len == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,256, "Arg(len) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (dest == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,257, "Arg(dest) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
-       }
-       if (tcps == NULL) {
-               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,258, "Arg(tcps) is NULL pointer.");
-               return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* search service that has such a service ID */
@@ -539,7 +529,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (pfilter_service == NULL) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,259, "Could not find such service handle's pfilter service.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* initialize protocol module ... clear destination list */
@@ -547,14 +537,117 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (ret != 0) {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,260, "Could not initialize protomod.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
+       }
+
+       /* finalize */
+       ret = srv->pm->finalize(srv, conn, request, *len, dest, pfilter_service->reschedule);
+       if (ret != 0) {
+               PUT_LOG_INFO(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,18, "Could not finalize protomod. (Realserver decision failure)");
+               return_value = -1;
+               goto select_dest_out;
+       }
+
+select_dest_out:
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,298,
+                   "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):return_value=%d",
+                   return_value);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       return return_value;
+}
+
+/*!
+ * Check the client packet
+ * @param[in]  srv service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn connection data.
+ * @param[in]  request packet data from client
+ * @param[in]  len length of packet data
+ * @retval 0  successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len)
+{
+       struct l7vs_pfilter_service *pfilter_service;
+       int ret;
+       int return_value = 0;
+    std::string packet_data;
+
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char srv_str[DEBUG_STR_LEN] = {0};
+               char conn_str[DEBUG_STR_LEN] = {0};
+               char len_str[DEBUG_STR_LEN] = {0};
+               l7vs_service_c_str(srv_str, srv);
+               l7vs_conn_c_str(conn_str, conn);
+               if (len != NULL) {
+                       snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+               }
+               else {
+                       strncpy(len_str, "NULL", DEBUG_STR_LEN);
+               }
+               PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,296,
+                   "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s))",
+                   srv_str, conn_str, request, len_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       /* check null */
+       if (srv == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,253, "Arg(srv) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (srv->pm == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,254, "Arg(srv->pm) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (request == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,255, "Arg(request) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (len == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,256, "Arg(len) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+       /* search service that has such a service ID */
+       pfilter_service = l7vs_protomod_pfilter_search_service(srv->handle);
+
+       /*-------- DEBUG LOG --------*/
+       if (pfilter_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char pfilter_str[DEBUG_STR_LEN] = {0};
+               l7vs_pfilter_service_c_str(pfilter_str, pfilter_service);
+               PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,297, "pointer assign: pfilter_service=&(%s)",
+                   pfilter_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       if (pfilter_service == NULL) {
+               PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,259, "Could not find such service handle's pfilter service.");
+               return_value = -1;
+               goto analyze_cldata_out;
        }
 
        /* check pattern_match != 0 */
        if (pfilter_service->pattern_match[0] == '\0') {
                PUT_LOG_ERROR(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,261, "Pattern match is NULL pointer");
                return_value = -1;
-               goto match_cldata_out;
+               goto analyze_cldata_out;
        }
 
        /* check pattern match */
@@ -571,26 +664,16 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if ( boost::regex_search(packet_data, pfilter_service->regex) ) {
 #endif
                return_value = -1;
-               goto match_cldata_out;
-       }
-
-       *tcps = 0;
-
-       /* finalize */
-       ret = srv->pm->finalize(srv, conn, request, *len, dest, pfilter_service->reschedule);
-       if (ret != 0) {
-               PUT_LOG_INFO(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,18, "Could not finalize protomod. (Realserver decision failure)");
-               return_value = -1;
-               goto match_cldata_out;
+               goto analyze_cldata_out;
        }
 
-match_cldata_out:
+analyze_cldata_out:
        /*-------- DEBUG LOG --------*/
        if (pfilter_protomod.get_log_level != NULL &&
            LOG_LV_DEBUG == pfilter_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                PUT_LOG_DEBUG(pfilter_protomod, LOG_CAT_L7VSD_PROTOCOL,298,
-                   "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
+                   "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):return_value=%d",
                    return_value);
        }
        /*------ DEBUG LOG END ------*/
@@ -599,7 +682,7 @@ match_cldata_out:
 }
 
 /*!
- * Check the real server packet and insert a Set-Cookie field.
+ * Do nothing
  * @param[in] srv service struct include service handle, protocol module and schedule module.
  * @param[in] conn connection data.
  * @param[in] response packet data from real server
index 9786367..8163700 100644 (file)
@@ -52,8 +52,10 @@ static void  fini(void);
 static int   create(void*, handle_t);
 static void* create_sa(struct l7vs_service_arg*);
 static int   compare(handle_t, handle_t);
-static int   match_cldata(struct l7vs_service*, struct l7vs_conn*,
-           char*, size_t*, struct l7vs_dest**, int*);
+static int   select_dest(struct l7vs_service*, struct l7vs_conn*,
+           char*, size_t*, struct l7vs_dest**);
+static int   analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+           char*, size_t*);
 static int   analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
            char*, size_t*);
 static int   destroy(handle_t);
@@ -77,7 +79,8 @@ static struct l7vs_protomod sessionless_protomod = {
        1,              /* fast schedule */
        create,         /* create function */
        compare,        /* compare function */
-       match_cldata,   /* match_cldata function */
+       select_dest,    /* select_dest function */
+       analyze_cldata, /* analyze_cldata function */
        analyze_rsdata, /* analyze_rsdata function */
        destroy,        /* destroy function */
        fini,           /* fini function */
@@ -365,13 +368,12 @@ compare(handle_t srv_handle1, handle_t srv_handle2)
  * @param[in]  request packet data from client
  * @param[in]  len length of packet data
  * @param[out] dest destination (real server) list
- * @param[out] tcps TCP Splicer flag
  * @retval 0  successfully check packet data
  * @retval -1 some errors occur.
  */
 static int
-match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
-      char *request, size_t *len, struct l7vs_dest **dest, int *tcps)
+select_dest(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len, struct l7vs_dest **dest)
 {
        struct l7vs_sessionless_service *sessionless_service;
        int ret;
@@ -404,10 +406,10 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                        strncpy(len_str, "NULL", DEBUG_STR_LEN);
                }
                PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,70,
-                   "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
                    "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
-                   "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%d)",
-                   srv_str, conn_str, request, len_str, dest_str, *tcps);
+                   "request=\"%s\", len=&(%s), dest=&(&(%s))",
+                   srv_str, conn_str, request, len_str, dest_str);
        }
        /*------ DEBUG LOG END ------*/
 
@@ -415,32 +417,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (srv == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,55, "Arg(srv) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (srv->pm == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,56, "Arg(srv->pm) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (request == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,57, "Arg(request) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (len == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,58, "Arg(len) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (dest == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,59, "Arg(dest) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
-       }
-       if (tcps == NULL) {
-               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,60, "Arg(tcps) is NULL pointer.");
-               return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* search service that has such a service ID */
@@ -459,7 +456,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (sessionless_service == NULL) {
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,61, "Could not find such service handle's sessionless service.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* initialize protocol module ... clear destination list */
@@ -467,7 +464,113 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (ret != 0){
                PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,62, "Could not initialize protomod.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
+       }
+
+       /* finalize, always set reschedule flag */
+       ret = srv->pm->finalize(srv, conn, request, *len, dest, 1);
+       if (ret != 0){
+               PUT_LOG_INFO(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,10, "Could not finalize protomod. (Realserver decision failure)");
+               return_value = -1;
+               goto select_dest_out;
+       }
+
+select_dest_out:
+       /*-------- DEBUG LOG --------*/
+       if (sessionless_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,72,
+                   "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):return_value=%d",
+                   return_value);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       return return_value;
+}
+
+/*!
+ * Analyze and modify client packet
+ * @param[in]  srv service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn connection data.
+ * @param[in]  request packet data from client
+ * @param[in]  len length of packet data
+ * @retval 0  successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len)
+{
+       struct l7vs_sessionless_service *sessionless_service;
+       int ret;
+       int offset_length;
+       char *x_forwarded_value;
+       char *next_line = NULL;
+       char x_forwarded_for_header[X_FORWARDED_FOR_LENGTH];
+       size_t uri_len = 0;
+       int return_value = 0;
+
+       /*-------- DEBUG LOG --------*/
+       if (sessionless_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char srv_str[DEBUG_STR_LEN] = {0};
+               char conn_str[DEBUG_STR_LEN] = {0};
+               char len_str[DEBUG_STR_LEN] = {0};
+               l7vs_service_c_str(srv_str, srv);
+               l7vs_conn_c_str(conn_str, conn);
+               if (len != NULL) {
+                       snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+               }
+               else {
+                       strncpy(len_str, "NULL", DEBUG_STR_LEN);
+               }
+               PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,70,
+                   "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):srv=&(%s), conn=&(%s), request=\"%s\", len=&(%s)",
+                   srv_str, conn_str, request, len_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       /* check null */
+       if (srv == NULL) {
+               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,55, "Arg(srv) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (srv->pm == NULL) {
+               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,56, "Arg(srv->pm) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (request == NULL) {
+               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,57, "Arg(request) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (len == NULL) {
+               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,58, "Arg(len) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+       /* search service that has such a service ID */
+       sessionless_service = l7vs_protomod_sessionless_search_service(srv->handle);
+
+       /*-------- DEBUG LOG --------*/
+       if (sessionless_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char sessionless_str[DEBUG_STR_LEN] = {0};
+               l7vs_sessionless_service_c_str(sessionless_str, sessionless_service);
+               PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,71, "pointer assign: sessionless_service=&(%s)",
+                   sessionless_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       if (sessionless_service == NULL) {
+               PUT_LOG_ERROR(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,61, "Could not find such service handle's sessionless service.");
+               return_value = -1;
+               goto analyze_cldata_out;
        }
 
        /* set X-Forwarded-For field */
@@ -475,7 +578,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                uri_len = *len;
                /* check request */
                if (http_check_request_method(request, &uri_len) == NULL)
-                       goto match_cldata_finalize;
+                       goto analyze_cldata_out;
 
                x_forwarded_value = http_search_header_field(request, "X-Forwarded-For");
 
@@ -513,25 +616,13 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                }
        }
 
-match_cldata_finalize:
-       *tcps = 0;
-
-       /* finalize, always set reschedule flag */
-       ret = srv->pm->finalize(srv, conn, request, *len, dest, 1);
-
-       if (ret != 0){
-               PUT_LOG_INFO(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,10, "Could not finalize protomod. (Realserver decision failure)");
-               return_value = -1;
-               goto match_cldata_out;
-       }
-
-match_cldata_out:
+analyze_cldata_out:
        /*-------- DEBUG LOG --------*/
        if (sessionless_protomod.get_log_level != NULL &&
            LOG_LV_DEBUG == sessionless_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                PUT_LOG_DEBUG(sessionless_protomod, LOG_CAT_L7VSD_PROTOCOL,72,
-                   "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
+                   "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):return_value=%d",
                    return_value);
        }
        /*------ DEBUG LOG END ------*/
index 5af99c8..00f259c 100644 (file)
@@ -6,6 +6,7 @@
  * L7VSD: Linux Virtual Server for Layer7 Load Balancing
  * Copyright (C) 2008  NTT COMWARE Corporation.
  * Copyright (C) 2009  Shinya TAKEBAYASHI
+ * Copyright (C) 2009  NTT Resonant Inc. O.Nakayama, T.Motoda.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -45,8 +46,10 @@ static void  fini(void);
 static int   create(void*, handle_t);
 static void* create_sa(struct l7vs_service_arg*);
 static int   compare(handle_t, handle_t);
-static int   match_cldata(struct l7vs_service*, struct l7vs_conn*,
-                        char*, size_t*, struct l7vs_dest**, int*);
+static int   select_dest(struct l7vs_service*, struct l7vs_conn*,
+                        char*, size_t*, struct l7vs_dest**);
+static int   analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+                        char*, size_t*);
 static int   analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
                         char*, size_t*);
 static int   destroy(handle_t);
@@ -65,34 +68,35 @@ static void l7vs_sslid_service_c_str(char*, struct l7vs_sslid_service*);
 static void l7vs_sslid_service_arg_c_str(char*, struct l7vs_sslid_service_arg*);
 static void ssl_session_c_str(char*, struct ssl_session*);
 static void replication_header_c_str(char*, struct replication_header*);
-static void id_c_str(char*, char*);
+static void id_c_str(char*, char*, int);    /* add session id length param 2009.4.8 T.Motoda@NTTR */
 
 struct l7vs_sslid_service* sslid_service_list[SSLID_SERVICE_NUMBER];
 
 static struct l7vs_protomod sslid_protomod = {
-       NULL,           /* handle */
-       "sslid",        /* modname */
-       0,              /* refcnt */
-        0,              /* fast schedule */
-       create,         /* create function */
-       compare,        /* compare function */
-       match_cldata,   /* match_cldata function */
-       analyze_rsdata, /* analyze_rsdata function */
-       destroy,        /* destroy function */
-       fini,           /* fini function */
-       create_sa,      /* create_sa function */
-       service_arg,    /* service_arg function */
-       parse,          /* parse function */
-       destroy_sa,     /* destroy_sa function */
-       NULL,           /* initialize function */
-       NULL,           /* finalize function */
-       NULL,           /* get_log_level function */
-       NULL,           /* put_log_debug function */
-       NULL,           /* put_log_info function */
-       NULL,           /* put_log_warn function */
-       NULL,           /* put_log_error function */
-       NULL,           /* put_log_fatal function */
-       NULL            /* replication_pay_memory function */
+    NULL,           /* handle */
+    "sslid",        /* modname */
+    0,              /* refcnt */
+    0,              /* fast schedule */
+    create,         /* create function */
+    compare,        /* compare function */
+    select_dest,    /* select_dest function */
+    analyze_cldata, /* analyze_cldata function */
+    analyze_rsdata, /* analyze_rsdata function */
+    destroy,        /* destroy function */
+    fini,           /* fini function */
+    create_sa,      /* create_sa function */
+    service_arg,    /* service_arg function */
+    parse,          /* parse function */
+    destroy_sa,     /* destroy_sa function */
+    NULL,           /* initialize function */
+    NULL,           /* finalize function */
+    NULL,           /* get_log_level function */
+    NULL,           /* put_log_debug function */
+    NULL,           /* put_log_info function */
+    NULL,           /* put_log_warn function */
+    NULL,           /* put_log_error function */
+    NULL,           /* put_log_fatal function */
+    NULL            /* replication_pay_memory function */
 };
 
 /*!
@@ -414,8 +418,8 @@ compare(handle_t srv_handle1, handle_t srv_handle2)
  * @retval -1 some errors occur.
  */
 static int
-match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
-      char* request, size_t* len, struct l7vs_dest** dest, int* tcps)
+select_dest(struct l7vs_service* srv, struct l7vs_conn* conn,
+      char* request, size_t* len, struct l7vs_dest** dest)
 {
        struct l7vs_sslid_service* sslid_service;
        int i;
@@ -448,10 +452,10 @@ match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
                        strncpy(len_str, "NULL", DEBUG_STR_LEN);
                }
                PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,103,
-                   "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
-                   "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%d)",
-                   srv_str, conn_str, request, len_str, dest_str, *tcps);
+                   "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s), dest=&(&(%s))",
+                   srv_str, conn_str, request, len_str, dest_str);
        }
        /*------ DEBUG LOG END ------*/
 
@@ -459,32 +463,27 @@ match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
        if (srv == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,83, "Arg(srv) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (srv->pm == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,84, "Arg(srv->pm) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (request == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,85, "Arg(request) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (len == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,86, "Arg(len) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (dest == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,87, "Arg(dest) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
-       }
-       if (tcps == NULL) {
-               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,88, "Arg(tcps) is NULL pointer.");
-               return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* search service that has such a service ID */
@@ -503,13 +502,13 @@ match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
        if (sslid_service == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,89, "Could not find such service handle's sslid service.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (sslid_service->session == NULL) {
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,90,
                    "Service has NULL pointer session.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* read replication data */
@@ -523,31 +522,31 @@ match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
        if (ret != 0){
                PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,91, "Could not initialize protomod.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* check payload */
        if (
-           *len > 75 &&
+           *len > 44 &&        // Check if minimum length      2009.4.8 O.Nakayama@NTTR and T.Motoda@NTTR
            (
              (request[1] == 0x03 && request[2] == 0x00 && request[9] == 0x03 && request [10] == 0x00) || // SSL v3
              (request[1] == 0x03 && request[2] == 0x01 && request[9] == 0x03 && request [10] == 0x01)    // TLS v1
            ) &&
            request[5] == 0x01 && // Client Hello
-           request[43] == 0x20 // Session ID Length
+           (request[43] >= 1 && request[43] <= SSLID_LENGTH && *len > (43 + request[43]))      // Session ID Length (variable length from 1 to SSLID_LENGTH)   2009.4.8 O.Nakayama and T.Motoda@NTTR
           ) {
                /*-------- DEBUG LOG --------*/
                if (sslid_protomod.get_log_level != NULL &&
                    LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                        char id_str[DEBUG_STR_LEN] = {0};
-                       id_c_str(id_str, &request[44]);
+                       id_c_str(id_str, &request[44], request[43]);    // Add length parameter 2009.4.8 T.Motoda@NTTR
                        PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,105,
                            "Client Hello/SessionID=%s", id_str);
                }
                /*------ DEBUG LOG END ------*/
 
                hash_setPointer(sslid_service->hash_map, sslid_service->hash_list, sslid_service->maxlist);
-               id_c_str(id_str, &request[44]);
+               id_c_str(id_str, &request[44], request[43]);    // Add length parameter 2009.4.8 T.Motoda@NTTR
                searchret = hash_search(id_str, &tmpdest);
                
                if (searchret == 0) {
@@ -556,22 +555,20 @@ match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
                
        }
 
-       *tcps = 0;
-
-       /* finalize, always set reschedule flag */
+       /* finalize */
        ret = srv->pm->finalize(srv, conn, request, *len, dest, sslid_service->reschedule);
        if (ret != 0){
                PUT_LOG_INFO(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,11, "Could not finalize protomod. (Realserver decision failure)");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
-match_cldata_out:
+select_dest_out:
        /*-------- DEBUG LOG --------*/
        if (sslid_protomod.get_log_level != NULL &&
            LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,107,
-                   "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
                    "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
                    return_value);
        }
@@ -581,6 +578,105 @@ match_cldata_out:
 }
 
 /*!
+ * Do nothing
+ * @param[in]  srv     service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn    connection data.
+ * @param[in]  request packet data from client
+ * @param[in]  len     length of packet data
+ * @retval 0  successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn,
+      char* request, size_t* len)
+{
+       struct l7vs_sslid_service* sslid_service;
+       int return_value = 0;
+
+       /*-------- DEBUG LOG --------*/
+       if (sslid_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char srv_str[DEBUG_STR_LEN] = {0};
+               char conn_str[DEBUG_STR_LEN] = {0};
+               char dest_str[DEBUG_STR_LEN] = {0};
+               char len_str[DEBUG_STR_LEN] = {0};
+               l7vs_service_c_str(srv_str, srv);
+               l7vs_conn_c_str(conn_str, conn);
+               if (len != NULL) {
+                       snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+               }
+               else {
+                       strncpy(len_str, "NULL", DEBUG_STR_LEN);
+               }
+               PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,103,
+                   "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s)",
+                   srv_str, conn_str, request, len_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       /* check null */
+       if (srv == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,83, "Arg(srv) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (srv->pm == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,84, "Arg(srv->pm) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (request == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,85, "Arg(request) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (len == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,86, "Arg(len) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+       /* search service that has such a service ID */
+       sslid_service = l7vs_protomod_sslid_search_service(srv->handle);
+
+       /*-------- DEBUG LOG --------*/
+       if (sslid_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char sslid_str[DEBUG_STR_LEN] = {0};
+               l7vs_sslid_service_c_str(sslid_str, sslid_service);
+               PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,104, "pointer assign: sslid_service=&(%s)",
+                   sslid_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       if (sslid_service == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,89, "Could not find such service handle's sslid service.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (sslid_service->session == NULL) {
+               PUT_LOG_ERROR(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,90,
+                   "Service has NULL pointer session.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+analyze_cldata_out:
+       /*-------- DEBUG LOG --------*/
+       if (sslid_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,107,
+                   "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):return_value=%d", return_value);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       return return_value;
+}
+
+/*!
  * Check and modify response packet.
  * @param[in] srv      service struct include service handle, protocol module and schedule module.
  * @param[in] conn     connection data.
@@ -690,26 +786,26 @@ analyze_rsdata(struct l7vs_service* srv, struct l7vs_conn* conn,
 
        /* check payload */
        if (
-           *len > 75 &&
+           *len > 44 &&        // Check if minimum length      2009.4.8 O.Nakayama and T.Motoda@NTTR
            (
              (response[1] == 0x03 && response[2] == 0x00 && response[9] == 0x03 && response [10] == 0x00) || // SSL v3
              (response[1] == 0x03 && response[2] == 0x01 && response[9] == 0x03 && response [10] == 0x01)    // TLS v1
            ) &&
            response[5]  == 0x02 && // Server Hello
-           response[43] == 0x20 // Session ID Length
+           (response[43] >= 1 && response[43] <= SSLID_LENGTH && *len > (43 + response[43]))   // Session ID Length (variable length from 1 to SSLID_LENGTH)   2009.4.8 O.Nakayama and T.Motoda@NTTR
           ) {
                /*-------- DEBUG LOG --------*/
                if (sslid_protomod.get_log_level != NULL &&
                    LOG_LV_DEBUG == sslid_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                        char id_str[DEBUG_STR_LEN] = {0};
-                       id_c_str(id_str, &response[44]);
+                       id_c_str(id_str, &response[44], response[43]);  // Add length parameter 2009.4.8 T.Motoda@NTTR
                        PUT_LOG_DEBUG(sslid_protomod, LOG_CAT_L7VSD_PROTOCOL,111,
                            "Server Hello/SessionID=%s", id_str);
                }
                /*------ DEBUG LOG END ------*/
 
                hash_setPointer(sslid_service->hash_map, sslid_service->hash_list, sslid_service->maxlist);
-               id_c_str(id_str, &response[44]);
+               id_c_str(id_str, &response[44], response[43]);  // Add length parameter 2009.4.8 T.Motoda@NTTR
                hash_add(id_str, *conn->dest);
                if (sslid_service->replication_addr) {
                        hash_construct_sessionlist(sslid_service);
@@ -1586,7 +1682,7 @@ static void ssl_session_c_str(char* buf, struct ssl_session* session) {
                char dest_str[DEBUG_STR_LEN] = {0};
                char session_str[SSLID_LENGTH * 2 + 1];
                l7vs_dest_c_str(dest_str, &session->dest);
-               id_c_str(session_str, session->id);
+               id_c_str(session_str, session->id, session->id_len);    // Add length parameter 2009.4.8 T.Motoda@NTTR
                snprintf(buf, DEBUG_STR_LEN, "id=%s, dest=(%s), last_time=%d, valid=%d",
                    session_str, dest_str, (u_int) session->last_time, (int)session->valid);
        }
@@ -1611,15 +1707,17 @@ static void replication_header_c_str(char* buf, struct replication_header* head)
  * Convert SSL session ID (binary to hex)
  * @param[out] buf hex string
  * @param[in]  id  SSL session ID
+ * @param[in]  id_len SSL session ID length  2009.4.8 by T.Motoda@NTTR
  */
-static void id_c_str(char* buf, char* id) {
+static void id_c_str(char* buf, char* id, int id_len) {
        int i;
        if (id == NULL) {
                snprintf(buf, DEBUG_STR_LEN, "NULL");
        }
        else {
-               for (i = 0; i < SSLID_LENGTH; i++) {
-                       snprintf(buf + i * 2, DEBUG_STR_LEN - i * 2, "%02X", (unsigned int)id[i]);
+               for (i = 0; i < id_len; i++) {
+                       snprintf(buf + i * 2, DEBUG_STR_LEN - i * 2, "%02X", (unsigned char)id[i]);
+
                }
        }
 }
index b81d495..3ebcbc7 100644 (file)
@@ -6,6 +6,7 @@
  * L7VSD: Linux Virtual Server for Layer7 Load Balancing
  * Copyright (C) 2008  NTT COMWARE Corporation.
  * Copyright (C) 2009  Shinya TAKEBAYASHI
+ * Copyright (C) 2009  NTT Resonant Inc. O.Nakayama, T.Motoda.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -51,6 +52,7 @@ struct l7vs_sslid_service_arg {
 };
 
 struct ssl_session {
+       int  id_len;            /* Session id length 2009.4.8 T.Motoda@NTTR */
        char id[SSLID_LENGTH];
        struct l7vs_dest dest;
        time_t last_time;
index 6831f22..003bff1 100644 (file)
@@ -77,8 +77,10 @@ static void  fini(void);
 static int   create(void*, handle_t);
 static void* create_sa(struct l7vs_service_arg*);
 static int   compare(handle_t, handle_t);
-static int   match_cldata(struct l7vs_service*, struct l7vs_conn*,
-       char*, size_t*, struct l7vs_dest**, int*);
+static int   select_dest(struct l7vs_service*, struct l7vs_conn*,
+       char*, size_t*, struct l7vs_dest**);
+static int   analyze_cldata(struct l7vs_service*, struct l7vs_conn*,
+       char*, size_t*);
 static int   analyze_rsdata(struct l7vs_service*, struct l7vs_conn*,
        char*, size_t*);
 static int   destroy(handle_t);
@@ -102,7 +104,8 @@ static struct l7vs_protomod url_protomod = {
        0,              /* fast schedule */
        create,         /* create function */
        compare,        /* compare function */
-       match_cldata,   /* match_cldata function */
+       select_dest,    /* select_dest function */
+       analyze_cldata, /* analyze_cldata function */
        analyze_rsdata, /* analyze_rsdata function */
        destroy,        /* destroy function */
        fini,           /* fini function */
@@ -474,13 +477,12 @@ compare_out:
  * @param[in]  request packet data from client
  * @param[in]  len length of packet data
  * @param[out] dest destination (real server) list
- * @param[out] tcps TCP Splicer flag
  * @retval 0  successfully check packet data
  * @retval -1 some errors occur.
  */
 static int
-match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
-      char *request, size_t *len, struct l7vs_dest **dest, int *tcps)
+select_dest(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len, struct l7vs_dest **dest)
 {
        struct l7vs_url_service *url_service;
        int ret;
@@ -520,17 +522,11 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                else {
                        strncpy(len_str, "NULL", DEBUG_STR_LEN);
                }
-               if (tcps != NULL) {
-                       snprintf(tcps_str, DEBUG_STR_LEN, "%d", *tcps);
-               }
-               else {
-                       strncpy(tcps_str, "NULL", DEBUG_STR_LEN);
-               }
                PUT_LOG_DEBUG(url_protomod, LOG_CAT_L7VSD_PROTOCOL,148,
-                   "in_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
-                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):srv=&(%s), conn=&(%s), "
-                   "request=\"%s\", len=&(%s), dest=&(&(%s)), tcps=&(%s)",
-                   srv_str, conn_str, request, len_str, dest_str, tcps_str);
+                   "in_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s), dest=&(&(%s))",
+                   srv_str, conn_str, request, len_str, dest_str);
        }
        /*------ DEBUG LOG END ------*/
 
@@ -538,32 +534,27 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (srv == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,123, "Arg(srv) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (srv->pm == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,124, "Arg(srv->pm) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (request == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,125, "Arg(request) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (len == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,126, "Arg(len) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        if (dest == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,127, "Arg(dest) is NULL pointer.");
                return_value = -1;
-               goto match_cldata_out;
-       }
-       if (tcps == NULL) {
-               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,128, "Arg(tcps) is NULL pointer.");
-               return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* search service that has such a service ID */
@@ -582,7 +573,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (url_service == NULL) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,129, "Could not find such service handle's url service.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* initialize protocol module ... clear destination list */
@@ -590,13 +581,11 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (ret != 0) {
                PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,130, "Could not initialize protomod.");
                return_value = -1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
 
        /* check pattern_match length */
        if (url_service->pattern_match[0] != '\0') {
-// remove log because of add new key --uri-pattern-match, --host-pattern-match)
-//             PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,131, "Pattern match is NULL pointer");
                /* check the size of request data */
                pattern_len = strnlen(url_service->pattern_match, PATTERN_MATCH_MAXSIZE);
                /* When '*' is included in pattern_match, number of '*' is decreased from pattern_len */ 
@@ -609,7 +598,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                if (*len < (15 + pattern_len) ) {
                        PUT_LOG_INFO(url_protomod, LOG_CAT_L7VSD_PROTOCOL,6, "Request data is too short.");
                        return_value = 1;
-                       goto match_cldata_out;
+                       goto select_dest_out;
                }
        }
        
@@ -619,7 +608,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
        if (uri == NULL) {
                PUT_LOG_INFO(url_protomod, LOG_CAT_L7VSD_PROTOCOL,7, "Client message is not HTTP request.");
                return_value = 1;
-               goto match_cldata_out;
+               goto select_dest_out;
        }
        
        /* check keyword (URI/--uri-pattern-match)*/
@@ -631,7 +620,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                if ( !boost::regex_search(packet_data, url_service->uri_regex) ) {
 #endif
                        return_value = -1;
-                       goto match_cldata_out;
+                       goto select_dest_out;
                }
        }
        /* check keyword (URI/--pattern-match)*/
@@ -650,7 +639,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                if (host == NULL) {
                        PUT_LOG_INFO(url_protomod, LOG_CAT_L7VSD_PROTOCOL,8, "Could not find Host field.");
                        return_value = 1;
-                       goto match_cldata_out;
+                       goto select_dest_out;
                }
                else {  
                        next_line = http_skip_header_line(host);
@@ -668,7 +657,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                                        if ( !boost::regex_search(packet_data, url_service->host_regex) ) {
 #endif
                                                return_value = -1;
-                                               goto match_cldata_out;
+                                               goto select_dest_out;
                                        }
                                }
                                /* check keyword (HOST/--pattern-match) */
@@ -679,7 +668,7 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                                        *next_line = backup_char;
                                        if ( ret != 0 ) {
                                                return_value = 1;
-                                               goto match_cldata_out;
+                                               goto select_dest_out;
                                        }
                                }
                        }
@@ -687,6 +676,120 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                }
        }
 
+       /* finalize */
+       ret = srv->pm->finalize(srv, conn, request, *len, dest, url_service->reschedule);
+       if (ret != 0) {
+               PUT_LOG_INFO(url_protomod, LOG_CAT_L7VSD_PROTOCOL,12, "Could not finalize protomod. (Realserver decision failure)");
+               return_value = -1;
+               goto select_dest_out;
+       }
+
+select_dest_out:
+       /*-------- DEBUG LOG --------*/
+       if (url_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == url_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               PUT_LOG_DEBUG(url_protomod, LOG_CAT_L7VSD_PROTOCOL,150,
+                   "out_function: int select_dest(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
+                   return_value);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       return return_value;
+}
+
+/*!
+ * Analyze and modify client packet
+ * @param[in]  srv service struct include service handle, protocol module and schedule module.
+ * @param[in]  conn connection data.
+ * @param[in]  request packet data from client
+ * @param[in]  len length of packet data
+ * @retval 0  successfully check packet data
+ * @retval -1 some errors occur.
+ */
+static int
+analyze_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
+      char *request, size_t *len)
+{
+       struct l7vs_url_service *url_service;
+       int ret;
+       int i;
+       int asterisk_num = 0;
+       size_t pattern_len;
+       size_t uri_len;
+       char *uri, *host, pattern[PATTERN_MATCH_MAXSIZE + 2];
+       int offset_length;
+       char *x_forwarded_value;
+       char *next_line = NULL;
+       char x_forwarded_for_header[X_FORWARDED_FOR_LENGTH];
+       char backup_char;
+       int return_value = 0;
+
+       std::string packet_data;
+
+       /*-------- DEBUG LOG --------*/
+       if (url_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == url_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char srv_str[DEBUG_STR_LEN] = {0};
+               char conn_str[DEBUG_STR_LEN] = {0};
+               char len_str[DEBUG_STR_LEN] = {0};
+               l7vs_service_c_str(srv_str, srv);
+               l7vs_conn_c_str(conn_str, conn);
+               if (len != NULL) {
+                       snprintf(len_str, DEBUG_STR_LEN, "%lu", (unsigned long int) *len);
+               }
+               else {
+                       strncpy(len_str, "NULL", DEBUG_STR_LEN);
+               }
+               PUT_LOG_DEBUG(url_protomod, LOG_CAT_L7VSD_PROTOCOL,148,
+                   "in_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "char* request, size_t* len):srv=&(%s), conn=&(%s), "
+                   "request=\"%s\", len=&(%s)",
+                   srv_str, conn_str, request, len_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       /* check null */
+       if (srv == NULL) {
+               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,123, "Arg(srv) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (srv->pm == NULL) {
+               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,124, "Arg(srv->pm) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (request == NULL) {
+               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,125, "Arg(request) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+       if (len == NULL) {
+               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,126, "Arg(len) is NULL pointer.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
+       /* search service that has such a service ID */
+       url_service = l7vs_protomod_url_search_service(srv->handle);
+
+       /*-------- DEBUG LOG --------*/
+       if (url_protomod.get_log_level != NULL &&
+           LOG_LV_DEBUG == url_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
+               char url_str[DEBUG_STR_LEN] = {0};
+               l7vs_url_service_c_str(url_str, url_service);
+               PUT_LOG_DEBUG(url_protomod, LOG_CAT_L7VSD_PROTOCOL,149, "pointer assign: url_service=&(%s)",
+                   url_str);
+       }
+       /*------ DEBUG LOG END ------*/
+
+       if (url_service == NULL) {
+               PUT_LOG_ERROR(url_protomod, LOG_CAT_L7VSD_PROTOCOL,129, "Could not find such service handle's url service.");
+               return_value = -1;
+               goto analyze_cldata_out;
+       }
+
        /* add X-Forwarded-For field */
        if (url_service->forwarded_for) {
                x_forwarded_value = http_search_header_field(request, "X-Forwarded-For");
@@ -725,22 +828,12 @@ match_cldata(struct l7vs_service *srv, struct l7vs_conn *conn,
                }
        }
 
-       *tcps = 0;
-
-       /* finalize */
-       ret = srv->pm->finalize(srv, conn, request, *len, dest, url_service->reschedule);
-       if (ret != 0) {
-               PUT_LOG_INFO(url_protomod, LOG_CAT_L7VSD_PROTOCOL,12, "Could not finalize protomod. (Realserver decision failure)");
-               return_value = -1;
-               goto match_cldata_out;
-       }
-
-match_cldata_out:
+analyze_cldata_out:
        /*-------- DEBUG LOG --------*/
        if (url_protomod.get_log_level != NULL &&
            LOG_LV_DEBUG == url_protomod.get_log_level(LOG_CAT_L7VSD_PROTOCOL)) {
                PUT_LOG_DEBUG(url_protomod, LOG_CAT_L7VSD_PROTOCOL,150,
-                   "out_function: int match_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
+                   "out_function: int analyze_cldata(struct l7vs_service* srv, struct l7vs_conn* conn, "
                    "char* request, size_t* len, struct l7vs_dest** dest, int* tcps):return_value=%d",
                    return_value);
        }
index 9238003..b096496 100644 (file)
@@ -67,40 +67,40 @@ static int l7vs_conn_change_connect_rs(struct l7vs_conn*, struct l7vs_dest*);
 static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction );
 static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction );
 static void l7vs_conn_dump_data(char* str_data, const char* data, const size_t len);
-static int l7vs_conn_read_bufsize = 20480;                        //! conn read buffer size
-static int throughput_interval = BPS_DEFAULT_INTERVAL; //! throughput interval
+static int l7vs_conn_read_bufsize = 20480;              //! conn read buffer size
+static int throughput_interval = BPS_DEFAULT_INTERVAL;  //! throughput interval
 
 int
 l7vs_conn_init(void)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
-                       "in_function: int lvs_conn_init() ");
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
+            "in_function: int lvs_conn_init() ");
+    }
+    /*------ DEBUG LOG END ------*/
 
     int ret = parameter_is_int_exist( PARAM_COMP_CONN, "read_bufsize" );
     if (ret) {
         int bufsize = parameter_get_int_value( PARAM_COMP_CONN, "read_bufsize" );
         if (bufsize >= L7VS_CONN_READ_BUFSIZE_MIN && bufsize <= L7VS_CONN_READ_BUFSIZE_MAX)
             l7vs_conn_read_bufsize = bufsize;
-//             LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,5,
-//                             "l7vsd uses read_bufsize = %d ",bufsize);
+//            LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,5,
+//                "l7vsd uses read_bufsize = %d ",bufsize);
         else if (bufsize > L7VS_CONN_READ_BUFSIZE_MAX) {
-               l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MAX;
-                       LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,1,
-                               "Your read_bufsize is over maximum size. l7vsd uses maximum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MAX);
+            l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MAX;
+            LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,1,
+                "Your read_bufsize is over maximum size. l7vsd uses maximum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MAX);
         }
         else {
-               l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MIN;
-                       LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,2,
-                               "Your read_bufsize is under minimum size. l7vsd uses minimum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MIN);
+            l7vs_conn_read_bufsize = L7VS_CONN_READ_BUFSIZE_MIN;
+            LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,2,
+                "Your read_bufsize is under minimum size. l7vsd uses minimum read_bufsize = %d instead ",L7VS_CONN_READ_BUFSIZE_MIN);
         }
     }
     else {
-               LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,3,
-                       "read_bufsize is not specified. l7vsd uses default read_bufsize = %d ",l7vs_conn_read_bufsize);
+        LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSD_NETWORK,3,
+            "read_bufsize is not specified. l7vsd uses default read_bufsize = %d ",l7vs_conn_read_bufsize);
     }
 
     if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
@@ -108,2967 +108,2915 @@ l7vs_conn_init(void)
     }
 
     /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,345,
-                       "out_function: int lvs_conn_init() ");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,345,
+            "out_function: int lvs_conn_init() ");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
  * dump data
  *
- * @param[out] str_data        dump string
- * @param[in]  data            source data
- * @param[in]  len             source data length
- * @return     void
+ * @param[out]  str_data    dump string
+ * @param[in]   data        source data
+ * @param[in]   len         source data length
+ * @return      void
  */
 void l7vs_conn_dump_data(char* str_data, const char* data, const size_t len)
 {
-       if (!str_data) {
-               return;
-       }
-
-       if (!data) {
-               snprintf(str_data, DEBUG_STR_LEN, "(nil)");
-               return;
-       }
-
-       const char* table[] = {
-               "00 ", "01 ", "02 ", "03 ", "04 ", "05 ", "06 ", "07 ", "08 ", "09 ", "0a ", "0b ", "0c ", "0d ", "0e ", "0f ",
-               "10 ", "11 ", "12 ", "13 ", "14 ", "15 ", "16 ", "17 ", "18 ", "19 ", "1a ", "1b ", "1c ", "1d ", "1e ", "1f ",
-               "20 ", "21 ", "22 ", "23 ", "24 ", "25 ", "26 ", "27 ", "28 ", "29 ", "2a ", "2b ", "2c ", "2d ", "2e ", "2f ",
-               "30 ", "31 ", "32 ", "33 ", "34 ", "35 ", "36 ", "37 ", "38 ", "39 ", "3a ", "3b ", "3c ", "3d ", "3e ", "3f ",
-               "40 ", "41 ", "42 ", "43 ", "44 ", "45 ", "46 ", "47 ", "48 ", "49 ", "4a ", "4b ", "4c ", "4d ", "4e ", "4f ",
-               "50 ", "51 ", "52 ", "53 ", "54 ", "55 ", "56 ", "57 ", "58 ", "59 ", "5a ", "5b ", "5c ", "5d ", "5e ", "5f ",
-               "60 ", "61 ", "62 ", "63 ", "64 ", "65 ", "66 ", "67 ", "68 ", "69 ", "6a ", "6b ", "6c ", "6d ", "6e ", "6f ",
-               "70 ", "71 ", "72 ", "73 ", "74 ", "75 ", "76 ", "77 ", "78 ", "79 ", "7a ", "7b ", "7c ", "7d ", "7e ", "7f ",
-               "80 ", "81 ", "82 ", "83 ", "84 ", "85 ", "86 ", "87 ", "88 ", "89 ", "8a ", "8b ", "8c ", "8d ", "8e ", "8f ",
-               "90 ", "91 ", "92 ", "93 ", "94 ", "95 ", "96 ", "97 ", "98 ", "99 ", "9a ", "9b ", "9c ", "9d ", "9e ", "9f ",
-               "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "a6 ", "a7 ", "a8 ", "a9 ", "aa ", "ab ", "ac ", "ad ", "ae ", "af ",
-               "b0 ", "b1 ", "b2 ", "b3 ", "b4 ", "b5 ", "b6 ", "b7 ", "b8 ", "b9 ", "ba ", "bb ", "bc ", "bd ", "be ", "bf ",
-               "c0 ", "c1 ", "c2 ", "c3 ", "c4 ", "c5 ", "c6 ", "c7 ", "c8 ", "c9 ", "ca ", "cb ", "cc ", "cd ", "ce ", "cf ",
-               "d0 ", "d1 ", "d2 ", "d3 ", "d4 ", "d5 ", "d6 ", "d7 ", "d8 ", "d9 ", "da ", "db ", "dc ", "dd ", "de ", "df ",
-               "e0 ", "e1 ", "e2 ", "e3 ", "e4 ", "e5 ", "e6 ", "e7 ", "e8 ", "e9 ", "ea ", "eb ", "ec ", "ed ", "ee ", "ef ",
-               "f0 ", "f1 ", "f2 ", "f3 ", "f4 ", "f5 ", "f6 ", "f7 ", "f8 ", "f9 ", "fa ", "fb ", "fc ", "fd ", "fe ", "ff "
-       };
-       const int hx_len = 3;
-
-       size_t pos = 0;
-       for (size_t i = 0; i < len; ++i) {
-               if (DEBUG_STR_LEN <= pos + hx_len) {
-                       break;
-               }
-               strncpy(str_data + pos, table[(unsigned char)*(data + i)], hx_len);
-               pos += hx_len;
-       }
-       *(str_data + pos) = '\0';
+    if (!str_data) {
+        return;
+    }
+
+    if (!data) {
+        snprintf(str_data, DEBUG_STR_LEN, "(nil)");
+        return;
+    }
+
+    const char* table[] = {
+        "00 ", "01 ", "02 ", "03 ", "04 ", "05 ", "06 ", "07 ", "08 ", "09 ", "0a ", "0b ", "0c ", "0d ", "0e ", "0f ",
+        "10 ", "11 ", "12 ", "13 ", "14 ", "15 ", "16 ", "17 ", "18 ", "19 ", "1a ", "1b ", "1c ", "1d ", "1e ", "1f ",
+        "20 ", "21 ", "22 ", "23 ", "24 ", "25 ", "26 ", "27 ", "28 ", "29 ", "2a ", "2b ", "2c ", "2d ", "2e ", "2f ",
+        "30 ", "31 ", "32 ", "33 ", "34 ", "35 ", "36 ", "37 ", "38 ", "39 ", "3a ", "3b ", "3c ", "3d ", "3e ", "3f ",
+        "40 ", "41 ", "42 ", "43 ", "44 ", "45 ", "46 ", "47 ", "48 ", "49 ", "4a ", "4b ", "4c ", "4d ", "4e ", "4f ",
+        "50 ", "51 ", "52 ", "53 ", "54 ", "55 ", "56 ", "57 ", "58 ", "59 ", "5a ", "5b ", "5c ", "5d ", "5e ", "5f ",
+        "60 ", "61 ", "62 ", "63 ", "64 ", "65 ", "66 ", "67 ", "68 ", "69 ", "6a ", "6b ", "6c ", "6d ", "6e ", "6f ",
+        "70 ", "71 ", "72 ", "73 ", "74 ", "75 ", "76 ", "77 ", "78 ", "79 ", "7a ", "7b ", "7c ", "7d ", "7e ", "7f ",
+        "80 ", "81 ", "82 ", "83 ", "84 ", "85 ", "86 ", "87 ", "88 ", "89 ", "8a ", "8b ", "8c ", "8d ", "8e ", "8f ",
+        "90 ", "91 ", "92 ", "93 ", "94 ", "95 ", "96 ", "97 ", "98 ", "99 ", "9a ", "9b ", "9c ", "9d ", "9e ", "9f ",
+        "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "a6 ", "a7 ", "a8 ", "a9 ", "aa ", "ab ", "ac ", "ad ", "ae ", "af ",
+        "b0 ", "b1 ", "b2 ", "b3 ", "b4 ", "b5 ", "b6 ", "b7 ", "b8 ", "b9 ", "ba ", "bb ", "bc ", "bd ", "be ", "bf ",
+        "c0 ", "c1 ", "c2 ", "c3 ", "c4 ", "c5 ", "c6 ", "c7 ", "c8 ", "c9 ", "ca ", "cb ", "cc ", "cd ", "ce ", "cf ",
+        "d0 ", "d1 ", "d2 ", "d3 ", "d4 ", "d5 ", "d6 ", "d7 ", "d8 ", "d9 ", "da ", "db ", "dc ", "dd ", "de ", "df ",
+        "e0 ", "e1 ", "e2 ", "e3 ", "e4 ", "e5 ", "e6 ", "e7 ", "e8 ", "e9 ", "ea ", "eb ", "ec ", "ed ", "ee ", "ef ",
+        "f0 ", "f1 ", "f2 ", "f3 ", "f4 ", "f5 ", "f6 ", "f7 ", "f8 ", "f9 ", "fa ", "fb ", "fc ", "fd ", "fe ", "ff "
+    };
+    const int hx_len = 3;
+
+    size_t pos = 0;
+    for (size_t i = 0; i < len; ++i) {
+        if (DEBUG_STR_LEN <= pos + hx_len) {
+            break;
+        }
+        strncpy(str_data + pos, table[(unsigned char)*(data + i)], hx_len);
+        pos += hx_len;
+    }
+    *(str_data + pos) = '\0';
 }
 
 /*!
  * connection create
  *
- * @param[in]  lfd     listening socket fd
- * @param[in]  lsock   listening socket
- * @return     connection
+ * @param[in]   lfd     listening socket fd
+ * @param[in]   lsock   listening socket
+ * @return      connection
  */
 struct l7vs_conn *
 l7vs_conn_create(int lfd, struct l7vs_lsock *lsock)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char lsock_str[DEBUG_STR_LEN] = {0};
-               l7vs_lsock_c_str(lsock_str, lsock);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,50,
-                       "in_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
-                       "lfd=%d: "
-                       "lsock=%s",
-                       lfd, lsock_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,50,
+            "in_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
+            "lfd=%d: "
+            "lsock=%s",
+            lfd, lsock_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
         socklen_t len = 0;
         struct l7vs_conn *conn = NULL;
         int mss = 0;
         int ret = 0;
-       int flags = 0;
+    int flags = 0;
 
-       if (-1 == lfd) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,28, "error / lsock fd is not specified");
-               goto create_error;
-       }
+    if (-1 == lfd) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,28, "error / lsock fd is not specified");
+        goto create_error;
+    }
 
-       if (!lsock) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,29, "error / lsock is null");
-               goto create_error;
-       }
+    if (!lsock) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,29, "error / lsock is null");
+        goto create_error;
+    }
        
         conn = (struct l7vs_conn*)malloc(sizeof(struct l7vs_conn));
         if (!conn) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,8, "error / can not allocate memory");
-               goto create_error;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,51,
-                       "malloc: conn=%p: size=%zu",
-                       conn, sizeof(struct l7vs_conn));
-       }
-       /*------ DEBUG LOG END ------*/
-       memset(conn, 0, sizeof(struct l7vs_conn));
-
-       conn->ciom = l7vs_iomux_get_from_avail_list();
-       if (!conn->ciom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,7, "error / can not get client iom");
-               goto create_error;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char ciom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(ciom_str, conn->ciom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,52,
-                       "iom_get: conn->ciom=%s",
-                       ciom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       conn->riom = l7vs_iomux_get_from_avail_list();
-       if (!conn->riom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,8, "error / can not get realserver iom");
-               goto create_error;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char riom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(riom_str, conn->riom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,53,
-                       "iom_get: conn->riom=%s",
-                       riom_str);
-       }
-       /*------ DEBUG LOG END ------*/
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,8, "error / can not allocate memory");
+        goto create_error;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,51,
+            "malloc: conn=%p: size=%zu",
+            conn, sizeof(struct l7vs_conn));
+    }
+    /*------ DEBUG LOG END ------*/
+    memset(conn, 0, sizeof(struct l7vs_conn));
+
+    conn->ciom = l7vs_iomux_get_from_avail_list();
+    if (!conn->ciom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,7, "error / can not get client iom");
+        goto create_error;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char ciom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(ciom_str, conn->ciom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,52,
+            "iom_get: conn->ciom=%s",
+            ciom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    conn->riom = l7vs_iomux_get_from_avail_list();
+    if (!conn->riom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,8, "error / can not get realserver iom");
+        goto create_error;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char riom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(riom_str, conn->riom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,53,
+            "iom_get: conn->riom=%s",
+            riom_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
         conn->cldata_len = 0;
         conn->cldata_bufsize = l7vs_conn_read_bufsize;
         conn->cldata = (char *)malloc(conn->cldata_bufsize);
         if (!conn->cldata) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,9, "error / can not allocate memory for buffer");
-               goto create_error;
-        }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,54,
-                       "malloc: conn->cldata=%p: size=%zu",
-                       conn->cldata, conn->cldata_bufsize);
-       }
-       /*------ DEBUG LOG END ------*/
-       memset(conn->cldata, 0, conn->cldata_bufsize);
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,9, "error / can not allocate memory for buffer");
+        goto create_error;
+        }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,54,
+            "malloc: conn->cldata=%p: size=%zu",
+            conn->cldata, conn->cldata_bufsize);
+    }
+    /*------ DEBUG LOG END ------*/
+    memset(conn->cldata, 0, conn->cldata_bufsize);
 
         len = sizeof(struct sockaddr_in);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char caddr_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,55,
-                       "accept param: lfd=%d: conn->caddr=%s: len=%d",
-                       lfd, caddr_str, len);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char caddr_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,55,
+            "accept param: lfd=%d: conn->caddr=%s: len=%d",
+            lfd, caddr_str, len);
+    }
+    /*------ DEBUG LOG END ------*/
         conn->ciom->fd = accept(lfd, (struct sockaddr *)&conn->caddr, &len);
         if (conn->ciom->fd < 0) {
-               char caddr_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,8,
-                       "error / accept error accept param: lfd=%d: conn->caddr=%s: len=%d (%s)",
-                       lfd, caddr_str, len,strerror(errno));
-               goto create_error;
-        }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,56,
-                       "accept result: conn->ciom->fd=%d",
-                       conn->ciom->fd);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // get current flag
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,57,
-                       "fnctl param: conn->ciom->fd=%d: cmd=F_GETFL: flags=0",
-                       conn->ciom->fd);
-       }
-       /*------ DEBUG LOG END ------*/
-       flags = fcntl(conn->ciom->fd, F_GETFL, 0);
-       if (0 > flags) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,9,
-                        "error / fcntl((conn->ciom->fd=%d),F_GETFL) error(%s)",
-                        conn->ciom->fd,strerror(errno));
-               goto create_error;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,58,
-                       "fnctl result: flags=%d",
-                       flags);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // set nonblocking
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,59,
-                       "fnctl param: conn->ciom->fd=%d: cmd=F_SETFL: flags=%d",
-                       conn->ciom->fd, (flags | O_NONBLOCK));
-       }
-       /*------ DEBUG LOG END ------*/
-       flags = fcntl(conn->ciom->fd, F_SETFL, flags | O_NONBLOCK);
-       if (0 > flags) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,10,
-                       "error / fcntl((conn->ciom->fd=%d),F_SETFL) error(%s)",
-                       conn->ciom->fd,strerror(errno));
-               goto create_error;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,60,
-                       "fnctl result: flags=%d",
-                       flags);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // get client mss
+        char caddr_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_sockaddr_in_c_str(caddr_str, &conn->caddr);
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,8,
+            "error / accept error accept param: lfd=%d: conn->caddr=%s: len=%d (%s)",
+            lfd, caddr_str, len,strerror(errno));
+        goto create_error;
+        }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,56,
+            "accept result: conn->ciom->fd=%d",
+            conn->ciom->fd);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // get current flag
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,57,
+            "fnctl param: conn->ciom->fd=%d: cmd=F_GETFL: flags=0",
+            conn->ciom->fd);
+    }
+    /*------ DEBUG LOG END ------*/
+    flags = fcntl(conn->ciom->fd, F_GETFL, 0);
+    if (0 > flags) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,9,
+             "error / fcntl((conn->ciom->fd=%d),F_GETFL) error(%s)",
+             conn->ciom->fd,strerror(errno));
+        goto create_error;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,58,
+            "fnctl result: flags=%d",
+            flags);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // set nonblocking
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,59,
+            "fnctl param: conn->ciom->fd=%d: cmd=F_SETFL: flags=%d",
+            conn->ciom->fd, (flags | O_NONBLOCK));
+    }
+    /*------ DEBUG LOG END ------*/
+    flags = fcntl(conn->ciom->fd, F_SETFL, flags | O_NONBLOCK);
+    if (0 > flags) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,10,
+            "error / fcntl((conn->ciom->fd=%d),F_SETFL) error(%s)",
+            conn->ciom->fd,strerror(errno));
+        goto create_error;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,60,
+            "fnctl result: flags=%d",
+            flags);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // get client mss
         len = sizeof(int);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,61,
-                       "getsockopt param: conn->ciom->fd=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: "
-                       "len=%d",
-                       conn->ciom->fd, len);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,61,
+            "getsockopt param: conn->ciom->fd=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: "
+            "len=%d",
+            conn->ciom->fd, len);
+    }
+    /*------ DEBUG LOG END ------*/
         ret = getsockopt(conn->ciom->fd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
         if (0 > ret) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,11, "error / getsockopt TCP_MAXSEG error(%s)", strerror(errno));
-               goto create_error;
-        }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,62,
-                       "getsockopt result: mss=%d: len=%d",
-                       mss, len);
-       }
-       /*------ DEBUG LOG END ------*/
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,11, "error / getsockopt TCP_MAXSEG error(%s)", strerror(errno));
+        goto create_error;
+        }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,62,
+            "getsockopt result: mss=%d: len=%d",
+            mss, len);
+    }
+    /*------ DEBUG LOG END ------*/
         conn->cmss = mss;
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,63, "client %s mss %d",
-                                           inet_ntoa(conn->caddr.sin_addr), mss);
-       }
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,63, "client %s mss %d",
+            inet_ntoa(conn->caddr.sin_addr), mss);
+    }
 
         conn->lsock = lsock;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char lsock_str[DEBUG_STR_LEN] = {0};
-               l7vs_lsock_c_str(lsock_str, lsock);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,64,
-                       "pointer_assign: conn->lsock=%s",
-                       lsock_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,64,
+            "pointer_assign: conn->lsock=%s",
+            lsock_str);
+    }
+    /*------ DEBUG LOG END ------*/
         conn->proto = lsock->proto;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,65,
-                       "conn->ciom->status change: %d->%d",
-                       conn->ciom->status, iomux_conn_receiving);
-       }
-       /*------ DEBUG LOG END ------*/
-       conn->ciom->status = iomux_conn_receiving;
-       conn->ciom->callback = l7vs_conn_cl_callback;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,66,
-                       "pointer_assign: conn->ciom->callback=%p",
-                       l7vs_conn_cl_callback);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,65,
+            "conn->ciom->status change: %d->%d",
+            conn->ciom->status, iomux_conn_receiving);
+    }
+    /*------ DEBUG LOG END ------*/
+    conn->ciom->status = iomux_conn_receiving;
+    conn->ciom->callback = l7vs_conn_cl_callback;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,66,
+            "pointer_assign: conn->ciom->callback=%p",
+            l7vs_conn_cl_callback);
+    }
+    /*------ DEBUG LOG END ------*/
         conn->ciom->data = conn;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,67,
-                       "pointer_assign: conn->ciom->data=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       conn->sorry_conn_flag = 0;
-       conn->old_dest = NULL;
-       l7vs_iomux_add(conn->ciom, iom_read);
-
-       // connect real server immediately if all lsock services are fast schedule.
-       if (lsock->fast_schedule) {
-               struct l7vs_service* srv;
-               struct l7vs_dest* dest;
-               conn->ciom->status = iomux_conn_received;
-               if (!l7vs_conn_is_rs_connected(conn->ciom, conn, &srv, &dest)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
-               }
-               else {
-                       switch (conn->ciom->status) {
-                       case iomux_conn_block:
-                               //already decided real server
-                               break;
-                       case iomux_conn_service_selected:
-                               //service and destination were selected then attempt to connect the real server
-                               if (!l7vs_conn_connection_establish(conn->ciom, conn, srv, dest)) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
-                               }
-                               break;
-                       default:
-                               //invalid status
-                               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", conn->ciom->status);
-                               break;
-                       }
-               }
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char ret_conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(ret_conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,68,
-                       "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
-                       "return_value: conn=%s",
-                       ret_conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,67,
+            "pointer_assign: conn->ciom->data=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    conn->sorry_conn_flag = 0;
+    conn->old_dest = NULL;
+    l7vs_iomux_add(conn->ciom, iom_read);
+
+    // connect real server immediately if all lsock services are fast schedule.
+    if (lsock->fast_schedule) {
+        struct l7vs_service* srv;
+        struct l7vs_dest* dest;
+        conn->ciom->status = iomux_conn_received;
+        if (!l7vs_conn_is_rs_connected(conn->ciom, conn, &srv, &dest)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
+        }
+        else {
+            switch (conn->ciom->status) {
+            case iomux_conn_block:
+                //already decided real server
+                break;
+            case iomux_conn_service_selected:
+                //service and destination were selected then attempt to connect the real server
+                if (!l7vs_conn_connection_establish(conn->ciom, conn, srv, dest)) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
+                }
+                break;
+            default:
+                //invalid status
+                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", conn->ciom->status);
+                break;
+            }
+        }
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char ret_conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(ret_conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,68,
+            "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
+            "return_value: conn=%s",
+            ret_conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
         return conn;
 
 create_error:
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,69,
-                       "entering: create_error_label");
-       }
-       /*------ DEBUG LOG END ------*/
-       if (conn) {
-               if (conn->ciom) {
-                       if (-1 != conn->ciom->fd) {
-                               /*-------- DEBUG LOG --------*/
-                               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,70,
-                                               "close: conn->ciom->fd=%d",
-                                               conn->ciom->fd);
-                               }
-                               /*------ DEBUG LOG END ------*/
-                               close(conn->ciom->fd);
-                       }
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               char put_ciom_str[DEBUG_STR_LEN] = {0};
-                               l7vs_iomux_c_str(put_ciom_str, conn->ciom);
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,71,
-                                       "iom_put: conn->ciom=%s",
-                                       put_ciom_str);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       l7vs_iomux_put_to_avail_list(conn->ciom);
-               }
-               if (conn->riom) {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               char put_riom_str[DEBUG_STR_LEN] = {0};
-                               l7vs_iomux_c_str(put_riom_str, conn->riom);
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,72,
-                                       "iom_put: conn->riom=%s",
-                                       put_riom_str);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       l7vs_iomux_put_to_avail_list(conn->riom);
-               }
-               if (conn->cldata) {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,73,
-                                       "free: conn->cldata=%p",
-                                       conn->cldata);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       free(conn->cldata);
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,74,
-                               "free: conn=%p",
-                               conn);
-               }
-               /*------ DEBUG LOG END ------*/
-               free(conn);
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,75,
-                       "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
-                       "return_value: conn=NULL");
-       }
-       /*------ DEBUG LOG END ------*/
-       return NULL;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,69,
+            "entering: create_error_label");
+    }
+    /*------ DEBUG LOG END ------*/
+    if (conn) {
+        if (conn->ciom) {
+            if (-1 != conn->ciom->fd) {
+                /*-------- DEBUG LOG --------*/
+                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,70,
+                        "close: conn->ciom->fd=%d",
+                        conn->ciom->fd);
+                }
+                /*------ DEBUG LOG END ------*/
+                close(conn->ciom->fd);
+            }
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                char put_ciom_str[DEBUG_STR_LEN] = {0};
+                l7vs_iomux_c_str(put_ciom_str, conn->ciom);
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,71,
+                    "iom_put: conn->ciom=%s",
+                    put_ciom_str);
+            }
+            /*------ DEBUG LOG END ------*/
+            l7vs_iomux_put_to_avail_list(conn->ciom);
+        }
+        if (conn->riom) {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                char put_riom_str[DEBUG_STR_LEN] = {0};
+                l7vs_iomux_c_str(put_riom_str, conn->riom);
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,72,
+                    "iom_put: conn->riom=%s",
+                    put_riom_str);
+            }
+            /*------ DEBUG LOG END ------*/
+            l7vs_iomux_put_to_avail_list(conn->riom);
+        }
+        if (conn->cldata) {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,73,
+                    "free: conn->cldata=%p",
+                    conn->cldata);
+            }
+            /*------ DEBUG LOG END ------*/
+            free(conn->cldata);
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,74,
+                "free: conn=%p",
+                conn);
+        }
+        /*------ DEBUG LOG END ------*/
+        free(conn);
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,75,
+            "out_function: struct l7vs_conn* lvs_conn_create(int fd, struct l7vs_lsock *lsock) "
+            "return_value: conn=NULL");
+    }
+    /*------ DEBUG LOG END ------*/
+    return NULL;
 }
 
 /*!
  * connection destroy
  *
- * @param[in]  conn    connection
- * @return     void
+ * @param[in]   conn    connection
+ * @return      void
  */
 void
 l7vs_conn_destroy(struct l7vs_conn *conn)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,76,
-                       "in_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
-                       "conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,77,
-                               "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-
-       if (conn->srv) {
-               l7vs_service_remove_conn(conn->srv, conn);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,78,
-                               "pointer_assign: conn->srv=NULL");
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->srv = NULL;
-       }
-
-       if (conn->ciom) {
-               if (-1 != conn->ciom->fd) {
-                       l7vs_conn_close_csock(conn);
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       char put_ciom_str[DEBUG_STR_LEN] = {0};
-                       l7vs_iomux_c_str(put_ciom_str, conn->ciom);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,79,
-                               "iom_put: conn->ciom=%s",
-                               put_ciom_str);
-               }
-               /*------ DEBUG LOG END ------*/
-               l7vs_iomux_put_to_avail_list(conn->ciom);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,80,
-                               "pointer_assign: conn->ciom=NULL");
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->ciom = NULL;
-       }
-
-       if (conn->riom) {
-               if (-1 != conn->riom->fd) {
-                       l7vs_conn_close_rsock(conn);
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       char put_riom_str[DEBUG_STR_LEN] = {0};
-                       l7vs_iomux_c_str(put_riom_str, conn->riom);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,81,
-                               "iom_put: conn->riom=%s",
-                               put_riom_str);
-               }
-               /*------ DEBUG LOG END ------*/
-               l7vs_iomux_put_to_avail_list(conn->riom);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,82,
-                               "pointer_assign: conn->riom=NULL");
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->riom = NULL;
-       }
-
-       if (conn->cldata) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,83,
-                               "free: conn->cldata=%p",
-                               conn->cldata);
-               }
-               /*------ DEBUG LOG END ------*/
-               free(conn->cldata);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,84,
-                               "pointer_assign: conn->cldata=NULL");
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->cldata = NULL;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,85,
-                       "free: conn=%p",
-                       conn);
-       }
-       /*------ DEBUG LOG END ------*/
-       free(conn);     
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,86,
-                       "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
-                       "return_value: void");
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,76,
+            "in_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
+            "conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,77,
+                "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+
+    if (conn->srv) {
+        l7vs_service_remove_conn(conn->srv, conn);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,78,
+                "pointer_assign: conn->srv=NULL");
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->srv = NULL;
+    }
+
+    if (conn->ciom) {
+        if (-1 != conn->ciom->fd) {
+            l7vs_conn_close_csock(conn);
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            char put_ciom_str[DEBUG_STR_LEN] = {0};
+            l7vs_iomux_c_str(put_ciom_str, conn->ciom);
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,79,
+                "iom_put: conn->ciom=%s",
+                put_ciom_str);
+        }
+        /*------ DEBUG LOG END ------*/
+        l7vs_iomux_put_to_avail_list(conn->ciom);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,80,
+                "pointer_assign: conn->ciom=NULL");
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->ciom = NULL;
+    }
+
+    if (conn->riom) {
+        if (-1 != conn->riom->fd) {
+            l7vs_conn_close_rsock(conn);
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            char put_riom_str[DEBUG_STR_LEN] = {0};
+            l7vs_iomux_c_str(put_riom_str, conn->riom);
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,81,
+                "iom_put: conn->riom=%s",
+                put_riom_str);
+        }
+        /*------ DEBUG LOG END ------*/
+        l7vs_iomux_put_to_avail_list(conn->riom);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,82,
+                "pointer_assign: conn->riom=NULL");
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->riom = NULL;
+    }
+
+    if (conn->cldata) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,83,
+                "free: conn->cldata=%p",
+                conn->cldata);
+        }
+        /*------ DEBUG LOG END ------*/
+        free(conn->cldata);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,84,
+                "pointer_assign: conn->cldata=NULL");
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->cldata = NULL;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,85,
+            "free: conn=%p",
+            conn);
+    }
+    /*------ DEBUG LOG END ------*/
+    free(conn);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,86,
+            "out_function: void l7vs_conn_destroy(struct l7vs_conn *conn) "
+            "return_value: void");
+    }
+    /*------ DEBUG LOG END ------*/
 }
 
 /*!
  * client connection callback
  *
- * @param[in]  iom     connection iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom     connection iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
 l7vs_conn_cl_callback(struct l7vs_iomux *iom )
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,87,
-                       "in_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       struct l7vs_conn* conn = NULL;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,30, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,88,
-                               "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,89,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // invalid status check
-       if (iomux_conn_receiving != iom->status &&
-           iomux_conn_block != iom->status &&
-           iomux_conn_busy != iom->status && 
-           iomux_conn_sending != iom->status && 
-           iomux_conn_sending_busy != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,31, "error / invalid status(%d)", iom->status);
-               l7vs_conn_destroy(conn);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,90,
-                               "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // switch by current status
-       switch (iom->status) {
-       case iomux_conn_receiving:
-               if (!l7vs_conn_client_receiving(iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,9, "error / cl_callback/client receiving failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,91,
-                                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               if (iomux_conn_disconnected == iom->status) {
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,92, "client connection disconnected");
-                       }
-                       l7vs_conn_destroy(conn);
-               }
-               break;
-       case iomux_conn_block:
-               if (!l7vs_conn_block(iom, conn->riom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,10, "error / cl_callback/block failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,93,
-                                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       case iomux_conn_busy:
-               if (!l7vs_conn_busy(iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,11, "error / cl_callback/busy failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,94,
-                                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;       
-               }
-               break;          
-       case iomux_conn_sending:
-               if (!l7vs_conn_sending(iom, conn->riom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,12, "error / cl_callback/sending failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,95,
-                                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       case iomux_conn_sending_busy:
-               if (!l7vs_conn_sending(iom, conn->riom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,13, "error / cl_callback/sending_busy failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,96,
-                                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       default:
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,14, "error / invalid status(%d)", iom->status);
-               l7vs_conn_destroy(conn);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,97,
-                               "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,98,
-                       "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,87,
+            "in_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    struct l7vs_conn* conn = NULL;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,30, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,88,
+                "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,89,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // invalid status check
+    if (iomux_conn_receiving != iom->status &&
+        iomux_conn_block != iom->status &&
+        iomux_conn_busy != iom->status && 
+        iomux_conn_sending != iom->status && 
+        iomux_conn_sending_busy != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,31, "error / invalid status(%d)", iom->status);
+        l7vs_conn_destroy(conn);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,90,
+                "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // switch by current status
+    switch (iom->status) {
+    case iomux_conn_receiving:
+        if (!l7vs_conn_client_receiving(iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,9, "error / cl_callback/client receiving failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,91,
+                    "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        if (iomux_conn_disconnected == iom->status) {
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,92, "client connection disconnected");
+            }
+            l7vs_conn_destroy(conn);
+        }
+        break;
+    case iomux_conn_block:
+        if (!l7vs_conn_block(iom, conn->riom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,10, "error / cl_callback/block failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,93,
+                    "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_busy:
+        if (!l7vs_conn_busy(iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,11, "error / cl_callback/busy failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,94,
+                    "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_sending:
+        if (!l7vs_conn_sending(iom, conn->riom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,12, "error / cl_callback/sending failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,95,
+                    "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_sending_busy:
+        if (!l7vs_conn_sending(iom, conn->riom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,13, "error / cl_callback/sending_busy failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,96,
+                    "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    default:
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,14, "error / invalid status(%d)", iom->status);
+        l7vs_conn_destroy(conn);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,97,
+                "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,98,
+            "out_function: static int l7vs_conn_cl_callback(struct l7vs_iomux *iom ) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
  * client receiving
  *
- * @param[in]  iom     connection iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom     connection iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
 l7vs_conn_client_receiving(struct l7vs_iomux *iom)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,99,
-                       "in_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       struct l7vs_conn *conn = NULL;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,99,
+            "in_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    struct l7vs_conn *conn = NULL;
         struct l7vs_service *srv = NULL;
         struct l7vs_dest *dest = NULL;
 
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,32, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,100,
-                               "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_receiving != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,33, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,101,
-                               "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,102,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // when the real server is not set in read-blocked
-       if (iomux_conn_block != conn->riom->status && iomux_conn_busy != conn->riom->status) {
-               // set the real server in read-blocked
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,103,
-                               "conn->riom->status change: %d->%d",
-                               conn->riom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->riom->status = iomux_conn_block;
-       }
-
-       // receive client data
-       if (!l7vs_conn_recv(iom, iom->fd)) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,15, "error / recv failed");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,104,
-                               "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       switch (iom->status) {
-       case iomux_conn_receiving:
-               // data still remain, epoll re-registration for read
-               l7vs_iomux_mod(iom, iom_read);
-               break;
-       case iomux_conn_received:
-               // all data is received, service is selected by using the received data
-               if (!l7vs_conn_is_rs_connected(iom, conn, &srv, &dest)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,105,
-                                       "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               switch (iom->status) {
-               case iomux_conn_block:
-                       //already decided real server
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,106,
-                                       "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                                       "return_value: 1");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 1;
-               case iomux_conn_service_selected:
-                       //service and destination were selected then attempt to connect the real server
-                       if (!l7vs_conn_connection_establish(iom, conn, srv, dest)) {
-                               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
-                               /*-------- DEBUG LOG --------*/
-                               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,107,
-                                               "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                                               "return_value: 0");
-                               }
-                               /*------ DEBUG LOG END ------*/
-                               return 0;
-                       }
-                       l7vs_conn_QoS_recvsize_register( conn, conn->cldata_len, QOS_UP );
-                       break;
-               default:
-                       //invalid status
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", iom->status);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,108,
-                                       "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       case iomux_conn_disconnected:
-               // client connection was disconnected
-               break;
-       default:
-               //invalid status
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,35, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,109,
-                               "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,110,
-                       "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,32, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,100,
+                "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
 
-/*!
- * check realserver fd, and if real server not connected, call select_service function
- *
- * @param[in]  iom     connection_iomux
- * @param[in]  conn    connection
- * @param[out] srv     service
- * @param[out] dest    destination(real server)
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_is_rs_connected(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               char conn_str[DEBUG_STR_LEN] = {0};
-               char srv_str[DEBUG_STR_LEN] = {0};
-               char dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               l7vs_conn_c_str(conn_str, conn);
-               l7vs_service_c_str(srv_str, *srv);
-               l7vs_dest_c_str(dest_str, *dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,111,
-                       "in_function: static int l7vs_conn_is_rs_connected("
-                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                       "iom=%s: "
-                       "conn=%s: "
-                       "srv=%s: "
-                       "dest=%s",
-                       iom_str, conn_str, srv_str, dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       int ret = 0;
-       int temp_tcps = 0;
-       struct l7vs_dest *d;    // destination for sorry-server
-       int sorry_state;        // sorry state
-
-       struct l7vs_lsock *lsock = NULL;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,36, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,112,
-                               "out_function: static int l7vs_conn_is_rs_connected("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (!conn) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,37, "error / conn is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,113,
-                               "out_function: static int l7vs_conn_is_rs_connected("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_received != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,38, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,114,
-                               "out_function: static int l7vs_conn_is_rs_connected("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       lsock = conn->lsock;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char lsock_str[DEBUG_STR_LEN] = {0};
-               l7vs_lsock_c_str(lsock_str, lsock);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,115,
-                       "pointer_assign: lsock=%s",
-                       lsock_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       //is real server connected?
-       if (-1 != conn->riom->fd) {
-               // check sorry status of service
-               // argment 0 means no connection count check
-               sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
-               if (sorry_state) {
-                       // check connect to sorry-server now
-                       if (!conn->sorry_conn_flag) {
-                               // get sorry-server destination (argment 0)
-                               d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
-                               /*-------- DEBUG LOG --------*/
-                               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                       char sorry_dest_str1[DEBUG_STR_LEN] = {0};
-                                       l7vs_dest_c_str(sorry_dest_str1, d);
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
-                                               "pointer_assign: d=%s",
-                                               sorry_dest_str1);
-                               }
-                               /*------ DEBUG LOG END ------*/
-                               if (!d) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
-                                                       "iom->status change: %d->%d",
-                                                       iom->status, iomux_conn_rs_connect_error);
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       iom->status = iomux_conn_rs_connect_error;
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
-                                                       "out_function: static int l7vs_conn_is_rs_connected("
-                                                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                                                       "return_value: 0");
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       return 0;
-                               }
-                               conn->old_dest = conn->dest;
-                               /*-------- DEBUG LOG --------*/
-                               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                       char old_dest_str[DEBUG_STR_LEN] = {0};
-                                       l7vs_dest_c_str(old_dest_str, conn->old_dest);
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
-                                               "pointer_assign: conn->old_dest=%s",
-                                               old_dest_str);
-                               }
-                               /*------ DEBUG LOG END ------*/
-                               // change connection to sorry-server
-                               if (!l7vs_conn_change_connect_rs(conn, d)) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
-                                                       "iom->status change: %d->%d",
-                                                       iom->status, iomux_conn_rs_connect_error);
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       iom->status = iomux_conn_rs_connect_error;
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
-                                                       "out_function: static int l7vs_conn_is_rs_connected("
-                                                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                                                       "return_value: 0");
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       return 0;
-                               }
-                               conn->sorry_conn_flag = 1;
-                       }
-               } else {
-                       // check connect to sorry-server now
-                       if (conn->sorry_conn_flag) {
-                               // get old real-server destination (argment 1)
-                               d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
-                               /*-------- DEBUG LOG --------*/
-                               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                       char sorry_dest_str2[DEBUG_STR_LEN] = {0};
-                                       l7vs_dest_c_str(sorry_dest_str2, d);
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
-                                               "pointer_assign: d=%s",
-                                               sorry_dest_str2);
-                               }
-                               /*------ DEBUG LOG END ------*/
-                               if (!d) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
-                                                       "iom->status change: %d->%d",
-                                                       iom->status, iomux_conn_rs_connect_error);
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       iom->status = iomux_conn_rs_connect_error;
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
-                                                       "out_function: static int l7vs_conn_is_rs_connected("
-                                                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                                                       "return_value: 0");
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       return 0;
-                               }
-                               // change connection to real-server
-                               if (!l7vs_conn_change_connect_rs(conn, d)) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
-                                                       "iom->status change: %d->%d",
-                                                       iom->status, iomux_conn_rs_connect_error);
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       iom->status = iomux_conn_rs_connect_error;
-                                       /*-------- DEBUG LOG --------*/
-                                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
-                                                       "out_function: static int l7vs_conn_is_rs_connected("
-                                                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                                                       "return_value: 0");
-                                       }
-                                       /*------ DEBUG LOG END ------*/
-                                       return 0;
-                               }
-                               conn->sorry_conn_flag = 0;
-                       }
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,127,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_block;
-               if (iomux_conn_busy == conn->riom->status) {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,128,
-                                       "conn->riom->status change: %d->%d",
-                                       conn->riom->status, iomux_conn_sending_busy);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       conn->riom->status = iomux_conn_sending_busy;
-               }
-               else {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,129,
-                                       "conn->riom->status change: %d->%d",
-                                       conn->riom->status, iomux_conn_sending);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       conn->riom->status = iomux_conn_sending;
-               }
-               //epoll re-registration for write
-               l7vs_iomux_mod(conn->riom, iom_write);
-       }
-       else {
-               //select service
-               ret = l7vs_lsock_select_service(lsock, conn, conn->cldata,
-                                               conn->cldata_len, srv, dest, &temp_tcps);
-               if (0 >= ret) {
-                       *srv = NULL;
-                       *dest = NULL;
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,22, "error / no matching service found");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,130,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_receive_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_receive_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,131,
-                                       "out_function: static int l7vs_conn_is_rs_connected("
-                                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,132,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_service_selected);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_service_selected;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,133,
-                       "out_function: static int l7vs_conn_is_rs_connected("
-                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    if (iomux_conn_receiving != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,33, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,101,
+                "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
 
-/*!
- * connecction establish
- *
- * @param[in]  iom     connection_iomux
- * @param[in]  conn    connection
- * @param[in]  srv     service
- * @param[in]  dest    destination(real server)
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_connection_establish(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               char conn_str[DEBUG_STR_LEN] = {0};
-               char srv_str[DEBUG_STR_LEN] = {0};
-               char dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               l7vs_conn_c_str(conn_str, conn);
-               l7vs_service_c_str(srv_str, srv);
-               l7vs_dest_c_str(dest_str, dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,134,
-                       "in_function: static int l7vs_conn_connection_establish("
-                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                       "iom=%s: "
-                       "conn=%s: "
-                       "srv=%s: "
-                       "dest=%s",
-                       iom_str, conn_str, srv_str, dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       int ret = 0;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,39, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,135,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (!conn) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,40, "error / conn is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,136,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (!srv) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,41, "error / srv is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,137,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (!dest) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,42, "error / dest is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,138,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iom->status != iomux_conn_service_selected) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,43, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,139,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // connect to real server
-       if (!l7vs_conn_connect_rs(conn, dest)) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,23, "error / connect rs failed");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,140,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_rs_connect_error);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_rs_connect_error;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,141,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,142,
-                       "iom->status change: %d->%d",
-                       iom->status, iomux_conn_rs_connected);
-       }
-       /*------ DEBUG LOG END ------*/
-       iom->status = iomux_conn_rs_connected;
-
-       // set pointer for cross reference
-       conn->srv = srv;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char service_str[DEBUG_STR_LEN] = {0};
-               l7vs_service_c_str(service_str, conn->srv);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,143,
-                       "pointer_assign: conn->srv=%s",
-                       service_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       l7vs_service_register_conn(srv, conn);
-
-       // service establish
-       ret = l7vs_service_establish(conn->srv, conn);
-       if (0 > ret) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,24, "error / service establish failed");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,144,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_rs_connect_error);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_rs_connect_error;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,145,
-                               "out_function: static int l7vs_conn_connection_establish("
-                               "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       
-       // iom status set 
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,146,
-                       "iom->status change: %d->%d",
-                       iom->status, iomux_conn_block);
-       }
-       /*------ DEBUG LOG END ------*/
-       iom->status = iomux_conn_block;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,147,
-                       "conn->riom->status change: %d->%d",
-                       conn->riom->status, iomux_conn_sending);
-       }
-       /*------ DEBUG LOG END ------*/
-       conn->riom->status = iomux_conn_sending;
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,148,
-                       "out_function: static int l7vs_conn_connection_establish("
-                       "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,102,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
-/*!
- * block status:
- * when block status, arrived data turn next epoll reaction
- * and changes state to busy, expect the another iom is already busy
- *
- * @param[in]  iom             connection_iomux
- * @param[in]  another_iom     another side's iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               char a_iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               l7vs_iomux_c_str(a_iom_str, another_iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,149,
-                       "in_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                       "iom=%s: "
-                       "another_iom=%s",
-                       iom_str, a_iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,44, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,150,
-                               "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (!another_iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,45, "error / another_iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,151,
-                               "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_block != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,46, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,152,
-                               "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // epoll re-registraion for read
-       l7vs_iomux_mod(iom, iom_read);
-
-       // when another iom status is busy, do not change my status
-       if (iomux_conn_busy != another_iom->status &&
-           iomux_conn_sending_busy != another_iom->status &&
-           iomux_conn_sent_busy != another_iom->status) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,153,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_busy);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_busy;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,154,
-                       "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    // when the real server is not set in read-blocked
+    if (iomux_conn_block != conn->riom->status && iomux_conn_busy != conn->riom->status) {
+        // set the real server in read-blocked
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,103,
+                "conn->riom->status change: %d->%d",
+                conn->riom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->riom->status = iomux_conn_block;
+    }
+
+    // receive client data
+    if (!l7vs_conn_recv(iom, iom->fd)) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,15, "error / recv failed");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,104,
+                "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    switch (iom->status) {
+    case iomux_conn_receiving:
+        // data still remain, epoll re-registration for read
+        l7vs_iomux_mod(iom, iom_read);
+        break;
+    case iomux_conn_received:
+        // all data is received, service is selected by using the received data
+        if (!l7vs_conn_is_rs_connected(iom, conn, &srv, &dest)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,16, "error / is realserver connected failed");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,105,
+                    "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        switch (iom->status) {
+        case iomux_conn_block:
+            //already decided real server
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,106,
+                    "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                    "return_value: 1");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 1;
+        case iomux_conn_service_selected:
+            //service and destination were selected then attempt to connect the real server
+            if (!l7vs_conn_connection_establish(iom, conn, srv, dest)) {
+                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,17, "error / client connect rs failed");
+                /*-------- DEBUG LOG --------*/
+                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,107,
+                        "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                        "return_value: 0");
+                }
+                /*------ DEBUG LOG END ------*/
+                return 0;
+            }
+            l7vs_conn_QoS_recvsize_register( conn, conn->cldata_len, QOS_UP );
+            break;
+        default:
+            //invalid status
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,34, "error / invalid status(%d)", iom->status);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,108,
+                    "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_disconnected:
+        // client connection was disconnected
+        break;
+    default:
+        //invalid status
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,35, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,109,
+                "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,110,
+            "out_function: static int l7vs_conn_client_receiving(struct l7vs_iomux *iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
- * busy status:
- * when busy status, arrived data turn next epoll reaction and status keep busy
+ * check realserver fd, and if real server not connected, call select_service function
  *
- * @param[in]  iom     connection_iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom     connection_iomux
+ * @param[in]   conn    connection
+ * @param[out]  srv     service
+ * @param[out]  dest    destination(real server)
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
-l7vs_conn_busy(struct l7vs_iomux *iom)
+l7vs_conn_is_rs_connected(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,155,
-                       "in_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,47, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,156,
-                               "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_busy != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,48, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,157,
-                               "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       //epoll re-registration for read
-       // l7vs_iomux_mod(iom, iom_read);
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,158,
-                       "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        char conn_str[DEBUG_STR_LEN] = {0};
+        char srv_str[DEBUG_STR_LEN] = {0};
+        char dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        l7vs_conn_c_str(conn_str, conn);
+        l7vs_service_c_str(srv_str, *srv);
+        l7vs_dest_c_str(dest_str, *dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,111,
+            "in_function: static int l7vs_conn_is_rs_connected("
+            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+            "iom=%s: "
+            "conn=%s: "
+            "srv=%s: "
+            "dest=%s",
+            iom_str, conn_str, srv_str, dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
-/*!
- * sending status:
- * 
- * @param[in]  iom             connection_iomux
- * @param[in]  another_iom     another side's iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               char a_iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               l7vs_iomux_c_str(a_iom_str, another_iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,159,
-                       "in_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                       "iom=%s: "
-                       "another_iom=%s",
-                       iom_str, a_iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,49, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,160,
-                               "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0; 
-       }
-
-       if (!another_iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,50, "error / another_iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,161,
-                               "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0; 
-       }
-
-       if (iomux_conn_sending != iom->status && iomux_conn_sending_busy != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,51, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,162,
-                               "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // send to handling iom
-       if (!l7vs_conn_send(iom, iom->fd)) {
-               iom->status = iomux_conn_send_error;
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,25, "error / send failed");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,163,
-                               "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       if (iomux_conn_sent == iom->status || iomux_conn_sent_busy == iom->status) {
-               // when all data was sent, select the next state
-               if (!l7vs_conn_sent_next_state(another_iom, iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,26, "error / send next state failed");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,164,
-                                       "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               if (iomux_conn_receiving != iom->status && iomux_conn_block != iom->status) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,52, "error / invalid status(%d)", iom->status);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,165,
-                                       "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-       }
-       else if (iomux_conn_sending == iom->status || iomux_conn_sending_busy == iom->status) {
-               // data still remain
-               // epoll re-registration for write
-               l7vs_iomux_mod(iom, iom_write);
-       }
-       else  {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,53, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,166,
-                               "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,167,
-                       "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    int ret = 0;
+    struct l7vs_dest *d;    // destination for sorry-server
+    int sorry_state;        // sorry state
 
-/*!
- * decide sent next state
- *
- * @param[in,out]      src_iom         source connection_iomux
- * @param[in,out]      dest_iom        destionation connection_iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char s_iom_str[DEBUG_STR_LEN] = {0};
-               char d_iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(s_iom_str, src_iom);
-               l7vs_iomux_c_str(d_iom_str, dest_iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,168,
-                       "in_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                       "src_iom=%s: "
-                       "dest_iom=%s",
-                       s_iom_str, d_iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!src_iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,54, "error / src_iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,169,
-                               "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return  0;
-       }
-       if (!dest_iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,55, "error / dest_iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,170,
-                               "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return  0;
-       }
-
-       // when writing, the dest_status will be "sent" or "sent_busy"
-       if (iomux_conn_sent != dest_iom->status && iomux_conn_sent_busy != dest_iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,56, "error / invalid dest status(%d)", dest_iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,171,
-                               "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       // and the src_status will be "block" or "busy"
-       if (iomux_conn_block != src_iom->status && iomux_conn_busy != src_iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,57, "error / invalid src status(%d)", src_iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,172,
-                               "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // decide the next state
-       if (iomux_conn_sent_busy == dest_iom->status) {
-               // when receiving from source, request come to the destination, then destination has priority
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,173,
-                               "src_iom->status change: %d->%d",
-                               src_iom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               src_iom->status = iomux_conn_block;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,174,
-                               "dest_iom->status change: %d->%d",
-                               dest_iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               dest_iom->status = iomux_conn_receiving;
-       }
-       else if (iomux_conn_busy == src_iom->status) {
-               // when sending to destination, request come to the source, then source has priority
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,175,
-                               "src_iom->status change: %d->%d",
-                               src_iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               src_iom->status = iomux_conn_receiving;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,176,
-                               "dest_iom->status change: %d->%d",
-                               dest_iom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               dest_iom->status = iomux_conn_block;
-       }
-       else {
-               // request come to neither source nor destnation, ready to read both
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,177,
-                               "src_iom->status change: %d->%d",
-                               src_iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               src_iom->status = iomux_conn_receiving; 
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,178,
-                               "dest_iom->status change: %d->%d",
-                               dest_iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               dest_iom->status = iomux_conn_receiving;
-       }
-       l7vs_iomux_mod(src_iom, iom_read);
-       l7vs_iomux_mod(dest_iom, iom_read);
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,179,
-                       "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    struct l7vs_lsock *lsock = NULL;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,36, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,112,
+                "out_function: static int l7vs_conn_is_rs_connected("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (!conn) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,37, "error / conn is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,113,
+                "out_function: static int l7vs_conn_is_rs_connected("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_received != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,38, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,114,
+                "out_function: static int l7vs_conn_is_rs_connected("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    lsock = conn->lsock;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,115,
+            "pointer_assign: lsock=%s",
+            lsock_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    //is real server connected?
+    if (-1 != conn->riom->fd) {
+        // check sorry status of service
+        // argment 0 means no connection count check
+        sorry_state = l7vs_sched_sorry_check(conn->srv, 0);
+        if (sorry_state) {
+            // check connect to sorry-server now
+            if (!conn->sorry_conn_flag) {
+                // get sorry-server destination (argment 0)
+                d = l7vs_sched_sorry_dest(conn->srv, conn, 0);
+                /*-------- DEBUG LOG --------*/
+                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                    char sorry_dest_str1[DEBUG_STR_LEN] = {0};
+                    l7vs_dest_c_str(sorry_dest_str1, d);
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,116,
+                        "pointer_assign: d=%s",
+                        sorry_dest_str1);
+                }
+                /*------ DEBUG LOG END ------*/
+                if (!d) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,18, "error / sorry-server dest NG");
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,117,
+                            "iom->status change: %d->%d",
+                            iom->status, iomux_conn_rs_connect_error);
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    iom->status = iomux_conn_rs_connect_error;
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,118,
+                            "out_function: static int l7vs_conn_is_rs_connected("
+                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                            "return_value: 0");
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    return 0;
+                }
+                conn->old_dest = conn->dest;
+                /*-------- DEBUG LOG --------*/
+                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                    char old_dest_str[DEBUG_STR_LEN] = {0};
+                    l7vs_dest_c_str(old_dest_str, conn->old_dest);
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,119,
+                        "pointer_assign: conn->old_dest=%s",
+                        old_dest_str);
+                }
+                /*------ DEBUG LOG END ------*/
+                // change connection to sorry-server
+                if (!l7vs_conn_change_connect_rs(conn, d)) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,19, "error / change connection to Sorry NG");
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,120,
+                            "iom->status change: %d->%d",
+                            iom->status, iomux_conn_rs_connect_error);
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    iom->status = iomux_conn_rs_connect_error;
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,121,
+                            "out_function: static int l7vs_conn_is_rs_connected("
+                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                            "return_value: 0");
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    return 0;
+                }
+                conn->sorry_conn_flag = 1;
+            }
+        } else {
+            // check connect to sorry-server now
+            if (conn->sorry_conn_flag) {
+                // get old real-server destination (argment 1)
+                d = l7vs_sched_sorry_dest(conn->srv, conn, 1);
+                /*-------- DEBUG LOG --------*/
+                if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                    char sorry_dest_str2[DEBUG_STR_LEN] = {0};
+                    l7vs_dest_c_str(sorry_dest_str2, d);
+                    LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,122,
+                        "pointer_assign: d=%s",
+                        sorry_dest_str2);
+                }
+                /*------ DEBUG LOG END ------*/
+                if (!d) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,20, "error / old real-server dest NG");
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,123,
+                            "iom->status change: %d->%d",
+                            iom->status, iomux_conn_rs_connect_error);
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    iom->status = iomux_conn_rs_connect_error;
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,124,
+                            "out_function: static int l7vs_conn_is_rs_connected("
+                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                            "return_value: 0");
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    return 0;
+                }
+                // change connection to real-server
+                if (!l7vs_conn_change_connect_rs(conn, d)) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,21, "error / change connection to RS NG");
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,125,
+                            "iom->status change: %d->%d",
+                            iom->status, iomux_conn_rs_connect_error);
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    iom->status = iomux_conn_rs_connect_error;
+                    /*-------- DEBUG LOG --------*/
+                    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,126,
+                            "out_function: static int l7vs_conn_is_rs_connected("
+                            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                            "return_value: 0");
+                    }
+                    /*------ DEBUG LOG END ------*/
+                    return 0;
+                }
+                conn->sorry_conn_flag = 0;
+            }
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,127,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_block;
+        if (iomux_conn_busy == conn->riom->status) {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,128,
+                    "conn->riom->status change: %d->%d",
+                    conn->riom->status, iomux_conn_sending_busy);
+            }
+            /*------ DEBUG LOG END ------*/
+            conn->riom->status = iomux_conn_sending_busy;
+        }
+        else {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,129,
+                    "conn->riom->status change: %d->%d",
+                    conn->riom->status, iomux_conn_sending);
+            }
+            /*------ DEBUG LOG END ------*/
+            conn->riom->status = iomux_conn_sending;
+        }
+        //epoll re-registration for write
+        l7vs_iomux_mod(conn->riom, iom_write);
+    }
+    else {
+        //select service
+        ret = l7vs_lsock_select_service(lsock, conn, conn->cldata,
+                        conn->cldata_len, srv, dest);
+        if (0 >= ret) {
+            *srv = NULL;
+            *dest = NULL;
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,22, "error / no matching service found");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,130,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_receive_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_receive_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,131,
+                    "out_function: static int l7vs_conn_is_rs_connected("
+                    "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,132,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_service_selected);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_service_selected;
+    }
+
+    // analyze and modify client data
+    ret = conn->srv->pm->analyze_cldata(conn->srv, conn, conn->cldata, &conn->cldata_len);
+    if (ret != 0) {
+        // XXX
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,133,
+            "out_function: static int l7vs_conn_is_rs_connected("
+            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service **srv, struct l7vs_dest **dest) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
- * realserver connection callback
+ * connecction establish
  *
- * @param[in]  iom     connection iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom     connection_iomux
+ * @param[in]   conn    connection
+ * @param[in]   srv     service
+ * @param[in]   dest    destination(real server)
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
-l7vs_conn_rs_callback(struct l7vs_iomux *iom)
+l7vs_conn_connection_establish(struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,180,
-                       "in_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       struct l7vs_conn* conn = NULL;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,58, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,181,
-                               "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,182,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // invalid status check
-       if (iomux_conn_receiving != iom->status &&
-           iomux_conn_block != iom->status &&
-           iomux_conn_busy != iom->status && 
-           iomux_conn_sending != iom->status && 
-           iomux_conn_sending_busy != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,59, "error / invalid status(%d)", iom->status);
-               l7vs_conn_destroy(conn);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,183,
-                               "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       // switch by current status
-       switch (iom->status) {
-       case iomux_conn_receiving:
-               if (!l7vs_conn_realserver_receiving(iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,27, "error / rs_callback/realserver receiving failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,184,
-                                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               if (iomux_conn_disconnected == iom->status) {
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,185, "realserver connection disconnected");
-                       }
-                       l7vs_conn_destroy(conn);
-               }
-               break;
-       case iomux_conn_block:
-               if (!l7vs_conn_block(iom, conn->ciom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,28, "error / rs_callback/block failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,186,
-                                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       case iomux_conn_busy:
-               if (!l7vs_conn_busy(iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,29, "error / rs_callback/busy failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,187,
-                                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;       
-               }
-               break;          
-       case iomux_conn_sending:
-               if (!l7vs_conn_sending(iom, conn->ciom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,30, "error / rs_callback/sending failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,188,
-                                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       case iomux_conn_sending_busy:
-               if (!l7vs_conn_sending(iom, conn->ciom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,31, "error / rs_callback/sending_busy failed");
-                       l7vs_conn_destroy(conn);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,189,
-                                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               break;
-       default:
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,60, "error / invalid status(%d)", iom->status);
-               l7vs_conn_destroy(conn);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,190,
-                               "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,191,
-                       "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        char conn_str[DEBUG_STR_LEN] = {0};
+        char srv_str[DEBUG_STR_LEN] = {0};
+        char dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        l7vs_conn_c_str(conn_str, conn);
+        l7vs_service_c_str(srv_str, srv);
+        l7vs_dest_c_str(dest_str, dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,134,
+            "in_function: static int l7vs_conn_connection_establish("
+            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+            "iom=%s: "
+            "conn=%s: "
+            "srv=%s: "
+            "dest=%s",
+            iom_str, conn_str, srv_str, dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    int ret = 0;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,39, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,135,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (!conn) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,40, "error / conn is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,136,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (!srv) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,41, "error / srv is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,137,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (!dest) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,42, "error / dest is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,138,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iom->status != iomux_conn_service_selected) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,43, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,139,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // connect to real server
+    if (!l7vs_conn_connect_rs(conn, dest)) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,23, "error / connect rs failed");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,140,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_rs_connect_error);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_rs_connect_error;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,141,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,142,
+            "iom->status change: %d->%d",
+            iom->status, iomux_conn_rs_connected);
+    }
+    /*------ DEBUG LOG END ------*/
+    iom->status = iomux_conn_rs_connected;
+
+    // set pointer for cross reference
+    conn->srv = srv;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char service_str[DEBUG_STR_LEN] = {0};
+        l7vs_service_c_str(service_str, conn->srv);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,143,
+            "pointer_assign: conn->srv=%s",
+            service_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    l7vs_service_register_conn(srv, conn);
+
+    // service establish
+    ret = l7vs_service_establish(conn->srv, conn);
+    if (0 > ret) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,24, "error / service establish failed");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,144,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_rs_connect_error);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_rs_connect_error;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,145,
+                "out_function: static int l7vs_conn_connection_establish("
+                "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    
+    // iom status set 
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,146,
+            "iom->status change: %d->%d",
+            iom->status, iomux_conn_block);
+    }
+    /*------ DEBUG LOG END ------*/
+    iom->status = iomux_conn_block;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,147,
+            "conn->riom->status change: %d->%d",
+            conn->riom->status, iomux_conn_sending);
+    }
+    /*------ DEBUG LOG END ------*/
+    conn->riom->status = iomux_conn_sending;
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,148,
+            "out_function: static int l7vs_conn_connection_establish("
+            "struct l7vs_iomux *iom, struct l7vs_conn *conn, struct l7vs_service *srv, struct l7vs_dest *dest)"
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
- * realserver receiving 
+ * block status:
+ * when block status, arrived data turn next epoll reaction
+ * and changes state to busy, expect the another iom is already busy
  *
- * @param[in]  iom     connection iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom         connection_iomux
+ * @param[in]   another_iom another side's iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
-l7vs_conn_realserver_receiving(struct l7vs_iomux *iom)
+l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,192,
-                       "in_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       struct l7vs_conn *conn = NULL;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,61, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,193,
-                               "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_receiving != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,62, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,194,
-                               "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,195,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       // when the client is not set in read-blocked
-       if (iomux_conn_block != conn->ciom->status && iomux_conn_busy != conn->ciom->status) {
-               // set the real server in read-blocked
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,196,
-                               "conn->ciom->status change: %d->%d",
-                               conn->ciom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->ciom->status = iomux_conn_block;
-       }
-
-       // receive realserver data
-       if (!l7vs_conn_recv(iom, iom->fd)) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,32, "error / recv failed");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,197,
-                               "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       switch (iom->status) {
-       case iomux_conn_receiving:
-               // data still remain, epoll re-registration for read
-               l7vs_iomux_mod(iom, iom_read);
-               break;
-       case iomux_conn_received:
-               // all data is received, append the session infomation
-               if (!l7vs_conn_realserver_modify_data(iom)) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,33, "error / realserver modify data failed");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,198,
-                                       "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,199,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_block);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_block;
-               if (iomux_conn_busy == conn->ciom->status) {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,200,
-                                       "conn->ciom->status change: %d->%d",
-                                       conn->ciom->status, iomux_conn_sending_busy);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       conn->ciom->status = iomux_conn_sending_busy;
-               } else {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,201,
-                                       "conn->ciom->status change: %d->%d",
-                                       conn->ciom->status, iomux_conn_sending);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       conn->ciom->status = iomux_conn_sending;
-               }
-               //epoll re-registration for write
-               l7vs_iomux_mod(conn->ciom, iom_write);
-       case iomux_conn_disconnected:
-               // client connection was disconnected
-               break;
-       default:
-               //invalid status
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,63, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,202,
-                               "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,203,
-                       "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        char a_iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        l7vs_iomux_c_str(a_iom_str, another_iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,149,
+            "in_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+            "iom=%s: "
+            "another_iom=%s",
+            iom_str, a_iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,44, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,150,
+                "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (!another_iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,45, "error / another_iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,151,
+                "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_block != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,46, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,152,
+                "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // epoll re-registraion for read
+    l7vs_iomux_mod(iom, iom_read);
+
+    // when another iom status is busy, do not change my status
+    if (iomux_conn_busy != another_iom->status &&
+        iomux_conn_sending_busy != another_iom->status &&
+        iomux_conn_sent_busy != another_iom->status) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,153,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_busy);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_busy;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,154,
+            "out_function: static int l7vs_conn_block(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
- * realserver modify data
+ * busy status:
+ * when busy status, arrived data turn next epoll reaction and status keep busy
  *
- * @param[in]  iom     connection iomux
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
+ * @param[in]   iom     connection_iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
  */
 static int
-l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom)
+l7vs_conn_busy(struct l7vs_iomux *iom)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,204,
-                       "in_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                       "iom=%s",
-                       iom_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       struct l7vs_conn *conn = NULL;
-        char *newbuf = NULL;
-       int (*relayf)(struct l7vs_service *, struct l7vs_conn *, char *, size_t *) = NULL;
-       int ret = 0;
-       size_t len_ret = 0;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,64, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,205,
-                               "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_received != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,65, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,206,
-                               "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,207,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       //set the function pointer that modify the real server data
-       if (conn->srv) {
-               relayf = conn->srv->pm->analyze_rsdata;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,208,
-                               "pointer_assign: relayf=%p",
-                               relayf);
-               }
-               /*------ DEBUG LOG END ------*/
-       }
-
-       if (relayf) {
-               len_ret = conn->cldata_len;
-               newbuf = (char *)realloc(conn->cldata, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
-               if (!newbuf) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,10, "error / realloc failed");
-                       iom->status = iomux_conn_buffer_realloc_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,209,
-                                       "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,210,
-                               "realloc: newbuf=%p: size=%zu",
-                               newbuf, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
-               }
-               /*------ DEBUG LOG END ------*/
-               conn->cldata = newbuf;
-
-               ret = (*relayf)(conn->srv, conn, conn->cldata, &len_ret);
-               if (0 != ret) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,34, "error / analyze rsdata failed");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,211,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_rsdata_modify_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_rsdata_modify_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,212,
-                                       "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               if (L7VS_PROTOMOD_MAX_ADD_BUFSIZE < len_ret - conn->cldata_len) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,35, "error / bufsize too long modified by protomod");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,213,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_rsdata_modify_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_rsdata_modify_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,214,
-                                       "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               else {
-                       conn->cldata_len = len_ret;
-               }
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char modify_data[DEBUG_STR_LEN] = {0};
-               l7vs_conn_dump_data(modify_data, conn->cldata, conn->cldata_len);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,215,
-                       "modify data: %s",
-                       modify_data);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,216,
-                       "iom->status change: %d->%d",
-                       iom->status, iomux_conn_rsdata_modified);
-       }
-       /*------ DEBUG LOG END ------*/
-       iom->status = iomux_conn_rsdata_modified;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,217,
-                       "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,155,
+            "in_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
-/*!
- * receive data
- *
- * @param[in]  iom             connection_iomux
- * @param[in]  source_fd       the filedescriptor to be read
- * @return     status
- * @retval     0       failed 
- * @retval     1       succeed
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,47, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,156,
+                "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_busy != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,48, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,157,
+                "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    //epoll re-registration for read
+    // l7vs_iomux_mod(iom, iom_read);
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,158,
+            "out_function: static int l7vs_conn_busy(struct l7vs_iomux *iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * sending status:
+ * 
+ * @param[in]   iom         connection_iomux
+ * @param[in]   another_iom another side's iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        char a_iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        l7vs_iomux_c_str(a_iom_str, another_iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,159,
+            "in_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+            "iom=%s: "
+            "another_iom=%s",
+            iom_str, a_iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,49, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,160,
+                "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0; 
+    }
+
+    if (!another_iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,50, "error / another_iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,161,
+                "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0; 
+    }
+
+    if (iomux_conn_sending != iom->status && iomux_conn_sending_busy != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,51, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,162,
+                "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // send to handling iom
+    if (!l7vs_conn_send(iom, iom->fd)) {
+        iom->status = iomux_conn_send_error;
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,25, "error / send failed");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,163,
+                "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    if (iomux_conn_sent == iom->status || iomux_conn_sent_busy == iom->status) {
+        // when all data was sent, select the next state
+        if (!l7vs_conn_sent_next_state(another_iom, iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,26, "error / send next state failed");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,164,
+                    "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        if (iomux_conn_receiving != iom->status && iomux_conn_block != iom->status) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,52, "error / invalid status(%d)", iom->status);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,165,
+                    "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+    }
+    else if (iomux_conn_sending == iom->status || iomux_conn_sending_busy == iom->status) {
+        // data still remain
+        // epoll re-registration for write
+        l7vs_iomux_mod(iom, iom_write);
+    }
+    else  {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,53, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,166,
+                "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,167,
+            "out_function: static int l7vs_conn_sending(struct l7vs_iomux *iom, struct l7vs_iomux *another_iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * decide sent next state
+ *
+ * @param[in,out]   src_iom     source connection_iomux
+ * @param[in,out]   dest_iom    destionation connection_iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char s_iom_str[DEBUG_STR_LEN] = {0};
+        char d_iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(s_iom_str, src_iom);
+        l7vs_iomux_c_str(d_iom_str, dest_iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,168,
+            "in_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+            "src_iom=%s: "
+            "dest_iom=%s",
+            s_iom_str, d_iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!src_iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,54, "error / src_iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,169,
+                "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return  0;
+    }
+    if (!dest_iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,55, "error / dest_iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,170,
+                "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return  0;
+    }
+
+    // when writing, the dest_status will be "sent" or "sent_busy"
+    if (iomux_conn_sent != dest_iom->status && iomux_conn_sent_busy != dest_iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,56, "error / invalid dest status(%d)", dest_iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,171,
+                "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    // and the src_status will be "block" or "busy"
+    if (iomux_conn_block != src_iom->status && iomux_conn_busy != src_iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,57, "error / invalid src status(%d)", src_iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,172,
+                "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // decide the next state
+    if (iomux_conn_sent_busy == dest_iom->status) {
+        // when receiving from source, request come to the destination, then destination has priority
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,173,
+                "src_iom->status change: %d->%d",
+                src_iom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        src_iom->status = iomux_conn_block;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,174,
+                "dest_iom->status change: %d->%d",
+                dest_iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        dest_iom->status = iomux_conn_receiving;
+    }
+    else if (iomux_conn_busy == src_iom->status) {
+        // when sending to destination, request come to the source, then source has priority
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,175,
+                "src_iom->status change: %d->%d",
+                src_iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        src_iom->status = iomux_conn_receiving;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,176,
+                "dest_iom->status change: %d->%d",
+                dest_iom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        dest_iom->status = iomux_conn_block;
+    }
+    else {
+        // request come to neither source nor destnation, ready to read both
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,177,
+                "src_iom->status change: %d->%d",
+                src_iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        src_iom->status = iomux_conn_receiving;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,178,
+                "dest_iom->status change: %d->%d",
+                dest_iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        dest_iom->status = iomux_conn_receiving;
+    }
+    l7vs_iomux_mod(src_iom, iom_read);
+    l7vs_iomux_mod(dest_iom, iom_read);
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,179,
+            "out_function: static int l7vs_conn_sent_next_state(struct l7vs_iomux *src_iom, struct l7vs_iomux *dest_iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * realserver connection callback
+ *
+ * @param[in]   iom     connection iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_rs_callback(struct l7vs_iomux *iom)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,180,
+            "in_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    struct l7vs_conn* conn = NULL;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,58, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,181,
+                "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,182,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // invalid status check
+    if (iomux_conn_receiving != iom->status &&
+        iomux_conn_block != iom->status &&
+        iomux_conn_busy != iom->status && 
+        iomux_conn_sending != iom->status && 
+        iomux_conn_sending_busy != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,59, "error / invalid status(%d)", iom->status);
+        l7vs_conn_destroy(conn);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,183,
+                "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    // switch by current status
+    switch (iom->status) {
+    case iomux_conn_receiving:
+        if (!l7vs_conn_realserver_receiving(iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,27, "error / rs_callback/realserver receiving failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,184,
+                    "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        if (iomux_conn_disconnected == iom->status) {
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,185, "realserver connection disconnected");
+            }
+            l7vs_conn_destroy(conn);
+        }
+        break;
+    case iomux_conn_block:
+        if (!l7vs_conn_block(iom, conn->ciom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,28, "error / rs_callback/block failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,186,
+                    "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_busy:
+        if (!l7vs_conn_busy(iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,29, "error / rs_callback/busy failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,187,
+                    "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_sending:
+        if (!l7vs_conn_sending(iom, conn->ciom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,30, "error / rs_callback/sending failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,188,
+                    "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    case iomux_conn_sending_busy:
+        if (!l7vs_conn_sending(iom, conn->ciom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,31, "error / rs_callback/sending_busy failed");
+            l7vs_conn_destroy(conn);
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,189,
+                    "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        break;
+    default:
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,60, "error / invalid status(%d)", iom->status);
+        l7vs_conn_destroy(conn);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,190,
+                "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,191,
+            "out_function: static int l7vs_conn_rs_callback(struct l7vs_iomux *iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * realserver receiving 
+ *
+ * @param[in]   iom     connection iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_realserver_receiving(struct l7vs_iomux *iom)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,192,
+            "in_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    struct l7vs_conn *conn = NULL;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,61, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,193,
+                "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_receiving != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,62, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,194,
+                "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,195,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    // when the client is not set in read-blocked
+    if (iomux_conn_block != conn->ciom->status && iomux_conn_busy != conn->ciom->status) {
+        // set the real server in read-blocked
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,196,
+                "conn->ciom->status change: %d->%d",
+                conn->ciom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->ciom->status = iomux_conn_block;
+    }
+
+    // receive realserver data
+    if (!l7vs_conn_recv(iom, iom->fd)) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,32, "error / recv failed");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,197,
+                "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    switch (iom->status) {
+    case iomux_conn_receiving:
+        // data still remain, epoll re-registration for read
+        l7vs_iomux_mod(iom, iom_read);
+        break;
+    case iomux_conn_received:
+        // all data is received, append the session infomation
+        if (!l7vs_conn_realserver_modify_data(iom)) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,33, "error / realserver modify data failed");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,198,
+                    "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,199,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_block);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_block;
+        if (iomux_conn_busy == conn->ciom->status) {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,200,
+                    "conn->ciom->status change: %d->%d",
+                    conn->ciom->status, iomux_conn_sending_busy);
+            }
+            /*------ DEBUG LOG END ------*/
+            conn->ciom->status = iomux_conn_sending_busy;
+        } else {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,201,
+                    "conn->ciom->status change: %d->%d",
+                    conn->ciom->status, iomux_conn_sending);
+            }
+            /*------ DEBUG LOG END ------*/
+            conn->ciom->status = iomux_conn_sending;
+        }
+        //epoll re-registration for write
+        l7vs_iomux_mod(conn->ciom, iom_write);
+    case iomux_conn_disconnected:
+        // client connection was disconnected
+        break;
+    default:
+        //invalid status
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,63, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,202,
+                "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,203,
+            "out_function: static int l7vs_conn_realserver_receiving(struct l7vs_iomux *iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * realserver modify data
+ *
+ * @param[in]   iom     connection iomux
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,204,
+            "in_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+            "iom=%s",
+            iom_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    struct l7vs_conn *conn = NULL;
+        char *newbuf = NULL;
+    int (*relayf)(struct l7vs_service *, struct l7vs_conn *, char *, size_t *) = NULL;
+    int ret = 0;
+    size_t len_ret = 0;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,64, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,205,
+                "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_received != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,65, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,206,
+                "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,207,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    //set the function pointer that modify the real server data
+    if (conn->srv) {
+        relayf = conn->srv->pm->analyze_rsdata;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,208,
+                "pointer_assign: relayf=%p",
+                relayf);
+        }
+        /*------ DEBUG LOG END ------*/
+    }
+
+    if (relayf) {
+        len_ret = conn->cldata_len;
+        newbuf = (char *)realloc(conn->cldata, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
+        if (!newbuf) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,10, "error / realloc failed");
+            iom->status = iomux_conn_buffer_realloc_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,209,
+                    "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,210,
+                "realloc: newbuf=%p: size=%zu",
+                newbuf, (conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE + 1));
+        }
+        /*------ DEBUG LOG END ------*/
+        conn->cldata = newbuf;
+
+        ret = (*relayf)(conn->srv, conn, conn->cldata, &len_ret);
+        if (0 != ret) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,34, "error / analyze rsdata failed");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,211,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_rsdata_modify_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_rsdata_modify_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,212,
+                    "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        if (L7VS_PROTOMOD_MAX_ADD_BUFSIZE < len_ret - conn->cldata_len) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,35, "error / bufsize too long modified by protomod");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,213,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_rsdata_modify_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_rsdata_modify_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,214,
+                    "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        else {
+            conn->cldata_len = len_ret;
+        }
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char modify_data[DEBUG_STR_LEN] = {0};
+        l7vs_conn_dump_data(modify_data, conn->cldata, conn->cldata_len);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,215,
+            "modify data: %s",
+            modify_data);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,216,
+            "iom->status change: %d->%d",
+            iom->status, iomux_conn_rsdata_modified);
+    }
+    /*------ DEBUG LOG END ------*/
+    iom->status = iomux_conn_rsdata_modified;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,217,
+            "out_function: static int l7vs_conn_realserver_modify_data(struct l7vs_iomux *iom) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * receive data
+ *
+ * @param[in]   iom         connection_iomux
+ * @param[in]   source_fd   the filedescriptor to be read
+ * @return      status
+ * @retval      0       failed 
+ * @retval      1       succeed
  */
 static int
 l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,218,
-                       "in_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                       "iom=%s: "
-                       "source_fd=%d",
-                       iom_str, source_fd);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,218,
+            "in_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+            "iom=%s: "
+            "source_fd=%d",
+            iom_str, source_fd);
+    }
+    /*------ DEBUG LOG END ------*/
         int ret = 0;
-       struct l7vs_conn *conn = NULL;
-       char read_buf[l7vs_conn_read_bufsize];
+    struct l7vs_conn *conn = NULL;
+    char read_buf[l7vs_conn_read_bufsize];
 //        char *newbuf = NULL;
 
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,66, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,219,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (0 > source_fd || INT_MAX == source_fd) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,67, "error / source fd is not specified");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,220,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_receiving != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,68, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,221,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,222,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       //QoS Control to server
-       if( (source_fd == conn->ciom->fd) && !l7vs_conn_QoS_control( conn, QOS_UP ) ){
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_receiving;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
-       //QoS Control to client
-       if( (source_fd == conn->riom->fd) && !l7vs_conn_QoS_control( conn, QOS_DOWN ) ){
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_receiving);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_receiving;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
-       // read the data
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,225,
-                       "recv param: source_fd=%d: len=%d: flags=%d",
-                       source_fd, (l7vs_conn_read_bufsize - 1), 0);
-       }
-       /*------ DEBUG LOG END ------*/
-       ret = recv(source_fd, read_buf, (l7vs_conn_read_bufsize - 1), 0);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,226,
-                       "recv result: ret=%d",
-                       ret);
-       }
-       /*------ DEBUG LOG END ------*/
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char recv_data[DEBUG_STR_LEN] = {0};
-               l7vs_conn_dump_data(recv_data, read_buf, ret);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,227,
-                       "recv data: %s",
-                       recv_data);
-       }
-       /*------ DEBUG LOG END ------*/
-       switch (ret) {
-       case -1:
-               if (EAGAIN != errno) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,12, "error / recv error(%s)", strerror(errno));
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,228,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_receive_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_receive_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,229,
-                                       "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,230,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       case 0:
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,231, "peer disconnected");
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,232,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_disconnected);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_disconnected;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,233,
-                               "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-//     case L7VS_CONN_READ_BUFSIZE - 1:
-//             // if the buffer is insufficient, realloc the buffer
-//             conn->cldata_bufsize += L7VS_CONN_READ_BUFSIZE - 1;
-//             newbuf = (char *)realloc(conn->cldata,
-//                                      conn->cldata_bufsize);
-//             if (!newbuf) {
-//                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,11, "error / realloc failed");
-//                     iom->status = iomux_conn_buffer_realloc_error;
-//                     /*-------- DEBUG LOG --------*/
-//                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-//                             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,234,
-//                                     "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-//                                     "return_value: 0");
-//                     }
-//                     /*------ DEBUG LOG END ------*/
-//                     return 0;
-//             }
-//             /*-------- DEBUG LOG --------*/
-//             if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-//                     LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,235,
-//                             "realloc: newbuf=%p: size=%zu",
-//                             newbuf, conn->cldata_bufsize);
-//             }
-//             /*------ DEBUG LOG END ------*/
-//             conn->cldata = newbuf;
-//
-//             // check the next data, and decide the status
-//             if (!l7vs_conn_preread(iom, source_fd)) {
-//                     LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,36, "error / preread failed");
-//                     /*-------- DEBUG LOG --------*/
-//                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-//                             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,236,
-//                                     "iom->status change: %d->%d",
-//                                     iom->status, iomux_conn_receive_error);
-//                     }
-//                     /*------ DEBUG LOG END ------*/
-//                     iom->status = iomux_conn_receive_error;
-//                     /*-------- DEBUG LOG --------*/
-//                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-//                             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,237,
-//                                     "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-//                                     "return_value: 0");
-//                     }
-//                     /*------ DEBUG LOG END ------*/
-//                     return 0;
-//             }
-//             if (iomux_conn_disconnected == iom->status) {
-//                     /*-------- DEBUG LOG --------*/
-//                     if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-//                             LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,238,
-//                                     "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-//                                     "return_value: 1");
-//                     }
-//                     /*------ DEBUG LOG END ------*/
-//                     return 1;
-//             }
-//             break;
-       default:
-               // reading data is finished
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,239,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_received);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_received;
-               break;
-       }
-       
-       // register reveive information for QoS to server
-       if( source_fd == conn->ciom->fd ){
-               l7vs_conn_QoS_recvsize_register( conn, ret, QOS_UP );
-       }
-       // register reveive information for QoS to client
-       if( source_fd == conn->riom->fd ){
-               l7vs_conn_QoS_recvsize_register( conn, ret, QOS_DOWN );
-       }
-       // copy to conn_buffer
-       memcpy(conn->cldata + conn->cldata_len, read_buf, ret);
-       conn->cldata_len += ret;
-       conn->cldata[conn->cldata_len] = '\0';
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,240,
-                       "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,66, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,219,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (0 > source_fd || INT_MAX == source_fd) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,67, "error / source fd is not specified");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,220,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_receiving != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,68, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,221,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,222,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    //QoS Control to server
+    if( (source_fd == conn->ciom->fd) && !l7vs_conn_QoS_control( conn, QOS_UP ) ){
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_receiving;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
+    //QoS Control to client
+    if( (source_fd == conn->riom->fd) && !l7vs_conn_QoS_control( conn, QOS_DOWN ) ){
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,223,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_receiving);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_receiving;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,224,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
+    // read the data
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,225,
+            "recv param: source_fd=%d: len=%d: flags=%d",
+            source_fd, (l7vs_conn_read_bufsize - 1), 0);
+    }
+    /*------ DEBUG LOG END ------*/
+    ret = recv(source_fd, read_buf, (l7vs_conn_read_bufsize - 1), 0);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,226,
+            "recv result: ret=%d",
+            ret);
+    }
+    /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char recv_data[DEBUG_STR_LEN] = {0};
+        l7vs_conn_dump_data(recv_data, read_buf, ret);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,227,
+            "recv data: %s",
+            recv_data);
+    }
+    /*------ DEBUG LOG END ------*/
+    switch (ret) {
+    case -1:
+        if (EAGAIN != errno) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,12, "error / recv error(%s)", strerror(errno));
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,228,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_receive_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_receive_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,229,
+                    "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,230,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    case 0:
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,231, "peer disconnected");
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,232,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_disconnected);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_disconnected;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,233,
+                "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    default:
+        // reading data is finished
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,239,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_received);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_received;
+        break;
+    }
+    
+    // register reveive information for QoS to server
+    if( source_fd == conn->ciom->fd ){
+        l7vs_conn_QoS_recvsize_register( conn, ret, QOS_UP );
+    }
+    // register reveive information for QoS to client
+    if( source_fd == conn->riom->fd ){
+        l7vs_conn_QoS_recvsize_register( conn, ret, QOS_DOWN );
+    }
+    // copy to conn_buffer
+    memcpy(conn->cldata + conn->cldata_len, read_buf, ret);
+    conn->cldata_len += ret;
+    conn->cldata[conn->cldata_len] = '\0';
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,240,
+            "out_function: static int l7vs_conn_recv(struct l7vs_iomux *iom, int source_fd) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
+}
+
+/*!
+ * pre-read whether next data exists
+ *
+ * @param[in]   iom         connection iomux
+ * @param[in]   source_fd   source file description
+ * @return      status
+ * @retval      0       failed
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,241,
+            "in_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+            "iom=%s: "
+            "source_fd=%d",
+            iom_str, source_fd);
+    }
+    /*------ DEBUG LOG END ------*/
+    int preread_ret = 0;
+    char preread_buf[1] = {0};
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,69, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,242,
+                "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (-1 == source_fd) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,70, "error / source fd is not specified");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,243,
+                "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_receiving != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,71, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,244,
+                "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,245,
+            "recv param: source_fd=%d: len=1: flags=MSG_PEEK",
+            source_fd);
+    }
+    /*------ DEBUG LOG END ------*/
+    preread_ret = recv(source_fd, preread_buf, 1, MSG_PEEK);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,246,
+            "recv result: preread_ret=%d",
+            preread_ret);
+    }
+    /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char recv_data[DEBUG_STR_LEN] = {0};
+        l7vs_conn_dump_data(recv_data, preread_buf, preread_ret);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,247,
+            "recv data: %s",
+            recv_data);
+    }
+    /*------ DEBUG LOG END ------*/
+    switch (preread_ret) {
+    case -1:
+        if (EAGAIN != errno) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,13, "error / recv error(%s)", strerror(errno));
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,248,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_receive_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_receive_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,249,
+                    "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        // finished reading all data
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,250,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_received);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status = iomux_conn_received;
+        break;
+    case 0:
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,251, "peer disconnected");
+        }
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,252,
+                "iom->status change: %d->%d",
+                iom->status, iomux_conn_disconnected);
+        }
+        /*------ DEBUG LOG END ------*/
+        iom->status =  iomux_conn_disconnected;
+        break;
+    case 1:
+        // the data that should be read remains
+        // status does not change
+        break;
+    default:
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,37, "error / preread error");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,253,
+                "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,254,
+            "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
-/*!
- * pre-read whether next data exists
- *
- * @param[in]  iom             connection iomux
- * @param[in]  source_fd       source file description
- * @return     status
- * @retval     0       failed
- * @retval     1       succeed
- */
-static int
-l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,241,
-                       "in_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                       "iom=%s: "
-                       "source_fd=%d",
-                       iom_str, source_fd);
-       }
-       /*------ DEBUG LOG END ------*/
-       int preread_ret = 0;
-       char preread_buf[1] = {0};
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,69, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,242,
-                               "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (-1 == source_fd) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,70, "error / source fd is not specified");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,243,
-                               "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_receiving != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,71, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,244,
-                               "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,245,
-                       "recv param: source_fd=%d: len=1: flags=MSG_PEEK",
-                       source_fd);
-       }
-       /*------ DEBUG LOG END ------*/
-       preread_ret = recv(source_fd, preread_buf, 1, MSG_PEEK);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,246,
-                       "recv result: preread_ret=%d",
-                       preread_ret);
-       }
-       /*------ DEBUG LOG END ------*/
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char recv_data[DEBUG_STR_LEN] = {0};
-               l7vs_conn_dump_data(recv_data, preread_buf, preread_ret);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,247,
-                       "recv data: %s",
-                       recv_data);
-       }
-       /*------ DEBUG LOG END ------*/
-       switch (preread_ret) {
-       case -1:
-               if (EAGAIN != errno) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,13, "error / recv error(%s)", strerror(errno));
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,248,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_receive_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_receive_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,249,
-                                       "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               // finished reading all data
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,250,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_received);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status = iomux_conn_received;
-               break;
-       case 0:
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,251, "peer disconnected");
-               }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,252,
-                               "iom->status change: %d->%d",
-                               iom->status, iomux_conn_disconnected);
-               }
-               /*------ DEBUG LOG END ------*/
-               iom->status =  iomux_conn_disconnected;
-               break;
-       case 1:
-               // the data that should be read remains
-               // status does not change
-               break;
-       default:
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_NETWORK,37, "error / preread error");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,253,
-                               "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,254,
-                       "out_function: static int l7vs_conn_preread(struct l7vs_iomux *iom, int source_fd) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
-}
+/*!
+ * send data
+ *
+ * @param[in]   iom         connection_iomux
+ * @param[in]   dest_fd     the filedescriptor to be write
+ * @return      status
+ * @retval      0       failed 
+ * @retval      1       succeed
+ */
+static int
+l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd)
+{
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char iom_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iom_str, iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,255,
+            "in_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+            "iom=%s: "
+            "dest_fd=%d",
+            iom_str, dest_fd);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    int ret = 0;
+    struct l7vs_conn *conn = NULL;
+    char *newbuf = NULL;
+    size_t sent_len = 0;
+
+    if (!iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,72, "error / iom is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,256,
+                "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (-1 == dest_fd) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,73, "error / dest fd is not specified");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,257,
+                "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    if (iomux_conn_sending != iom->status &&
+        iomux_conn_sending_busy != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,74, "error / invalid status(%d)", iom->status);
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,258,
+                "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+
+    conn = (struct l7vs_conn *)iom->data;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,259,
+            "pointer_assign: conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char send_data[DEBUG_STR_LEN] = {0};
+        l7vs_conn_dump_data(send_data, conn->cldata, conn->cldata_len);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,260,
+            "send data: %s",
+            send_data);
+    }
+    /*------ DEBUG LOG END ------*/
+    // write the data
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,261,
+            "send param: dest_fd=%d: len=%zu: flags=MSG_NOSIGNAL",
+            dest_fd, conn->cldata_len);
+    }
+    /*------ DEBUG LOG END ------*/
+    ret = send(dest_fd, conn->cldata, conn->cldata_len, MSG_NOSIGNAL);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,262,
+            "send result: ret=%d",
+            ret);
+    }
+    /*------ DEBUG LOG END ------*/
+    if (0 > ret) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,14, "error / send error(%s)", strerror(errno));
+        iom->status = iomux_conn_send_error;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,263,
+                "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    sent_len = ret;
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,264, "sent %zu bytes", sent_len);
+    }
+
+    // decide the status
+    if (conn->cldata_len == sent_len) {
+        // finished sending all data
+        if (iomux_conn_sending == iom->status) {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,265,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_sent);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_sent;
+        } else {
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,266,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_sent_busy);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_sent_busy;
+        }
+        //cldata memory realloc
+        conn->cldata_len = 0;
+        conn->cldata_bufsize = l7vs_conn_read_bufsize;
+        newbuf = (char *)malloc(conn->cldata_bufsize);
+        if (!newbuf) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,12, "error / malloc failed");
+            iom->status = iomux_conn_send_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,267,
+                    "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        free(conn->cldata);
+        conn->cldata = newbuf;
+        memset(conn->cldata, 0, l7vs_conn_read_bufsize);
+    }
+    else {
+        // shift data for next sending
+        newbuf = (char *)malloc((conn->cldata_len - sent_len) + 1);
+        if (!newbuf) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,13, "error / malloc failed");
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,268,
+                    "iom->status change: %d->%d",
+                    iom->status, iomux_conn_send_error);
+            }
+            /*------ DEBUG LOG END ------*/
+            iom->status = iomux_conn_send_error;
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,269,
+                    "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
+            return 0;
+        }
+        memcpy(newbuf, (conn->cldata + sent_len), conn->cldata_len - sent_len);
+        free(conn->cldata);
+        conn->cldata = newbuf;
+        conn->cldata_len -= sent_len;
+        conn->cldata[conn->cldata_len] = '\0';
+
+        // the data that should be sent remains, status does not change
+    }
 
-/*!
- * send data
- *
- * @param[in]  iom     connection_iomux
- * @param[in]  dest_fd the filedescriptor to be write
- * @return     status
- * @retval     0       failed 
- * @retval     1       succeed
- */
-static int
-l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd)
-{
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char iom_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iom_str, iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,255,
-                       "in_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                       "iom=%s: "
-                       "dest_fd=%d",
-                       iom_str, dest_fd);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       int ret = 0;
-       struct l7vs_conn *conn = NULL;
-       char *newbuf = NULL;
-       size_t sent_len = 0;
-
-       if (!iom) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,72, "error / iom is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,256,
-                               "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (-1 == dest_fd) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,73, "error / dest fd is not specified");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,257,
-                               "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       if (iomux_conn_sending != iom->status &&
-           iomux_conn_sending_busy != iom->status) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,74, "error / invalid status(%d)", iom->status);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,258,
-                               "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-
-       conn = (struct l7vs_conn *)iom->data;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,259,
-                       "pointer_assign: conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char send_data[DEBUG_STR_LEN] = {0};
-               l7vs_conn_dump_data(send_data, conn->cldata, conn->cldata_len);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,260,
-                       "send data: %s",
-                       send_data);
-       }
-       /*------ DEBUG LOG END ------*/
-       // write the data
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,261,
-                       "send param: dest_fd=%d: len=%zu: flags=MSG_NOSIGNAL",
-                       dest_fd, conn->cldata_len);
-       }
-       /*------ DEBUG LOG END ------*/
-       ret = send(dest_fd, conn->cldata, conn->cldata_len, MSG_NOSIGNAL);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,262,
-                       "send result: ret=%d",
-                       ret);
-       }
-       /*------ DEBUG LOG END ------*/
-       if (0 > ret) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,14, "error / send error(%s)", strerror(errno));
-               iom->status = iomux_conn_send_error;
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,263,
-                               "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       sent_len = ret;
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,264, "sent %zu bytes", sent_len);
-       }
-
-       // decide the status
-       if (conn->cldata_len == sent_len) {
-               // finished sending all data
-               if (iomux_conn_sending == iom->status) {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,265,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_sent);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_sent;
-               } else {
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,266,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_sent_busy);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_sent_busy;
-               }
-               //cldata memory realloc
-               conn->cldata_len = 0;
-               conn->cldata_bufsize = l7vs_conn_read_bufsize;
-               newbuf = (char *)malloc(conn->cldata_bufsize);
-               if (!newbuf) {  
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,12, "error / malloc failed");
-                       iom->status = iomux_conn_send_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,267,
-                                       "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               free(conn->cldata);
-               conn->cldata = newbuf;
-               memset(conn->cldata, 0, l7vs_conn_read_bufsize);
-       }
-       else {
-               // shift data for next sending
-               newbuf = (char *)malloc((conn->cldata_len - sent_len) + 1);
-               if (!newbuf) {  
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,13, "error / malloc failed");
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,268,
-                                       "iom->status change: %d->%d",
-                                       iom->status, iomux_conn_send_error);
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       iom->status = iomux_conn_send_error;
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,269,
-                                       "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
-                       return 0;
-               }
-               memcpy(newbuf, (conn->cldata + sent_len), conn->cldata_len - sent_len);
-               free(conn->cldata);
-               conn->cldata = newbuf;
-               conn->cldata_len -= sent_len;
-               conn->cldata[conn->cldata_len] = '\0';
-
-               // the data that should be sent remains, status does not change
-       }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,270,
-                       "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,270,
+            "out_function: static int l7vs_conn_send(struct l7vs_iomux *iom, int dest_fd) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 
 }
 
 /*!
  * connect to real server
  *
- * @param[in]  conn    connection
- * @param[in]  dest    destination
- * @return     status
- * @retval     0       failed 
- * @retval     1       succeed
+ * @param[in]   conn    connection
+ * @param[in]   dest    destination
+ * @return      status
+ * @retval      0       failed 
+ * @retval      1       succeed
  */
 int
 l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               char dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               l7vs_dest_c_str(dest_str, dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,271,
-                       "in_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                       "conn=%s: "
-                       "dest=%s",
-                       conn_str, dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        char dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        l7vs_dest_c_str(dest_str, dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,271,
+            "in_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+            "conn=%s: "
+            "dest=%s",
+            conn_str, dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
         int s;
         int stype;
         int flags;
         int ret;
-       enum iomaction  action;
-
-       if (!conn) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,75, "error / conn is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,272,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       if (!dest) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,76, "error / dest is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,273,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
+    enum iomaction action;
+
+    if (!conn) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,75, "error / conn is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,272,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    if (!dest) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,76, "error / dest is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,273,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
 
         switch (conn->proto) {
         case IPPROTO_TCP:
@@ -3078,569 +3026,569 @@ l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
                 stype = SOCK_DGRAM;
                 break;
         default:
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,15, "error / unknown socket type");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,274,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,15, "error / unknown socket type");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,274,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
                 return 0;
         }
 
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,275,
-                       "socket param: family=PF_INET: type=%d: protocol=%d",
-                       stype, conn->proto);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,275,
+            "socket param: family=PF_INET: type=%d: protocol=%d",
+            stype, conn->proto);
+    }
+    /*------ DEBUG LOG END ------*/
         s = socket(PF_INET, stype, conn->proto);  
         if (0 > s) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,16, "error / socket error(%s)", strerror(errno));
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,276,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,16, "error / socket error(%s)", strerror(errno));
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,276,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
                 return 0;
         }
         
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,277,
-                       "fnctl param: s=%d: cmd=F_GETFL: flags=0",
-                       s);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,277,
+            "fnctl param: s=%d: cmd=F_GETFL: flags=0",
+            s);
+    }
+    /*------ DEBUG LOG END ------*/
         flags = fcntl(s, F_GETFL, 0);
         if (0 > flags) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,17, "error / fcntl(s=%d,F_GETFL) error(%s)", s,strerror(errno));
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,17, "error / fcntl(s=%d,F_GETFL) error(%s)", s,strerror(errno));
                 close(s);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,278,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,278,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
                 return 0;
         }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,279,
-                       "fnctl result: flags=%d",
-                       flags);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,280,
-                       "fnctl param: s=%d: cmd=F_SETFL: flags=%d",
-                       s, (flags | O_NONBLOCK));
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,279,
+            "fnctl result: flags=%d",
+            flags);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,280,
+            "fnctl param: s=%d: cmd=F_SETFL: flags=%d",
+            s, (flags | O_NONBLOCK));
+    }
+    /*------ DEBUG LOG END ------*/
         flags = fcntl(s, F_SETFL, flags | O_NONBLOCK);
         if (0 > flags) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,18, "error / fcntl(s=%d,F_SETFL) error(%s)", s,strerror(errno));
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,18, "error / fcntl(s=%d,F_SETFL) error(%s)", s,strerror(errno));
                 close(s);
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,281,
-                               "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,281,
+                "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
                 return 0;
         }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,282,
-                       "fnctl result: flags=%d",
-                       flags);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,282,
+            "fnctl result: flags=%d",
+            flags);
+    }
+    /*------ DEBUG LOG END ------*/
 
         if (conn->cmss > 0) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,283,
-                               "setsockopt param: s=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: optval=%d: "
-                               "len=%zu",
-                               s, conn->cmss, sizeof(int));
-               }
-               /*------ DEBUG LOG END ------*/
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,283,
+                "setsockopt param: s=%d: level=IPROTO_TCP: optname=TCP_MAXSEG: optval=%d: "
+                "len=%zu",
+                s, conn->cmss, sizeof(int));
+        }
+        /*------ DEBUG LOG END ------*/
                 ret = setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &conn->cmss,
                                  sizeof(int));
                 if (ret < 0) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,19, "error / setsockopt(TCP_MAXSEG) error(%s)", strerror(errno));
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,19, "error / setsockopt(TCP_MAXSEG) error(%s)", strerror(errno));
                 }
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,284,
-                               "setsockopt result: ret=%d: len=%zu",
-                               ret, sizeof(int));
-               }
-               /*------ DEBUG LOG END ------*/
-        }
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char addr_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_sockaddr_in_c_str(addr_str, &dest->addr);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,285,
-                       "connect param: s=%d: dest->addr=%s: len=%zu",
-                       s, addr_str, sizeof(struct sockaddr_in));
-       }
-       /*------ DEBUG LOG END ------*/
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,284,
+                "setsockopt result: ret=%d: len=%zu",
+                ret, sizeof(int));
+        }
+        /*------ DEBUG LOG END ------*/
+        }
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char addr_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_sockaddr_in_c_str(addr_str, &dest->addr);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,285,
+            "connect param: s=%d: dest->addr=%s: len=%zu",
+            s, addr_str, sizeof(struct sockaddr_in));
+    }
+    /*------ DEBUG LOG END ------*/
         ret = connect(s, (struct sockaddr *)&dest->addr,
                       sizeof(struct sockaddr_in)); 
         if (0 > ret) {
                 if (errno != EINPROGRESS) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,20, "error / connect error(%s)", strerror(errno));
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,20, "error / connect error(%s)", strerror(errno));
                         close(s);
-                       /*-------- DEBUG LOG --------*/
-                       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,286,
-                                       "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                                       "return_value: 0");
-                       }
-                       /*------ DEBUG LOG END ------*/
+            /*-------- DEBUG LOG --------*/
+            if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,286,
+                    "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                    "return_value: 0");
+            }
+            /*------ DEBUG LOG END ------*/
                         return 0;
                 }
-       }
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,287,
-                       "connect result: ret=%d",
-                       ret);
-       }
-       /*------ DEBUG LOG END ------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,288, "dest %p nactive %d->%d",
-                       dest, dest->nactive,
-                       dest->nactive + 1);
-       }
-
-       action = iom_write;
-       dest->nactive++;   
-       conn->dest = dest;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_dest_c_str(dest_str, conn->dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,289,
-                       "pointer_assign: conn->dest=%s",
-                       dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       conn->riom->fd = s;
-       conn->riom->callback = l7vs_conn_rs_callback;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,290,
-                       "pointer_assign: conn->riom->callback=%p",
-                       conn->riom->callback);
-       }
-       /*------ DEBUG LOG END ------*/
-       conn->riom->data = conn;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,291,
-                       "pointer_assign: conn->riom->data=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       l7vs_iomux_add(conn->riom, action);
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,292,
-                       "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                       "return_value: 1");
-       }
-
-       if ( dest ){
+    }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,287,
+            "connect result: ret=%d",
+            ret);
+    }
+    /*------ DEBUG LOG END ------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,288, "dest %p nactive %d->%d",
+            dest, dest->nactive,
+            dest->nactive + 1);
+    }
+
+    action = iom_write;
+    dest->nactive++;   
+    conn->dest = dest;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_dest_c_str(dest_str, conn->dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,289,
+            "pointer_assign: conn->dest=%s",
+            dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    conn->riom->fd = s;
+    conn->riom->callback = l7vs_conn_rs_callback;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,290,
+            "pointer_assign: conn->riom->callback=%p",
+            conn->riom->callback);
+    }
+    /*------ DEBUG LOG END ------*/
+    conn->riom->data = conn;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,291,
+            "pointer_assign: conn->riom->data=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    l7vs_iomux_add(conn->riom, action);
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,292,
+            "out_function: int l7vs_conn_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+            "return_value: 1");
+    }
+
+    if ( dest ){
                 /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
-                               "RealServer Connecting Count : nactive is %d",
-                               dest->nactive);
-               }
-               /*-------- DEBUG LOG --------*/
-
-               /*-------- INFO LOG (Access Log) --------*/
-               if (LOG_LV_INFO >= logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       char addr_str_tmp[ADDR_STR_LEN] = {0};
-                       memcpy(addr_str_tmp, inet_ntoa(conn->caddr.sin_addr), ADDR_STR_LEN);
-                       LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,342,
-                               "[[AccessLog] (SRC)%s:%d -> (DST)%s:%d ]",
-                               addr_str_tmp,
-                               ntohs(conn->caddr.sin_port),
-                               inet_ntoa(conn->dest->addr.sin_addr),
-                               ntohs(conn->dest->addr.sin_port));
-               }
-               /*------ INFO LOG END (Access Log) ------*/
-       }
-
-       /*------ DEBUG LOG END ------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,341,
+                "RealServer Connecting Count : nactive is %d",
+                dest->nactive);
+        }
+        /*-------- DEBUG LOG --------*/
+
+        /*-------- INFO LOG (Access Log) --------*/
+        if (LOG_LV_INFO >= logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            char addr_str_tmp[ADDR_STR_LEN] = {0};
+            memcpy(addr_str_tmp, inet_ntoa(conn->caddr.sin_addr), ADDR_STR_LEN);
+            LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_NETWORK,342,
+                "[[AccessLog] (SRC)%s:%d -> (DST)%s:%d ]",
+                addr_str_tmp,
+                ntohs(conn->caddr.sin_port),
+                inet_ntoa(conn->dest->addr.sin_addr),
+                ntohs(conn->dest->addr.sin_port));
+        }
+        /*------ INFO LOG END (Access Log) ------*/
+    }
+
+    /*------ DEBUG LOG END ------*/
         return 1;
 }
 
 /*!
  * close client socket 
  *
- * @param[in]  conn    connection
- * @return     void 
+ * @param[in]   conn    connection
+ * @return      void 
  */
 void
 l7vs_conn_close_csock(struct l7vs_conn *conn)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,293,
-                       "in_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
-                       "conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,294,
-                               "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       if (!conn->ciom) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,295,
-                               "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       if (-1 == conn->ciom->fd) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,296,
-                               "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-
-       l7vs_iomux_remove(conn->ciom);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,297,
-                       "close: conn->ciom->fd=%d",
-                       conn->ciom->fd);
-       }
-       /*------ DEBUG LOG END ------*/
-       close(conn->ciom->fd);
-       conn->ciom->fd = -1;
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,298,
-                       "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
-                       "return_value: void");
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,293,
+            "in_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
+            "conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,294,
+                "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    if (!conn->ciom) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,295,
+                "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    if (-1 == conn->ciom->fd) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,296,
+                "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+
+    l7vs_iomux_remove(conn->ciom);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,297,
+            "close: conn->ciom->fd=%d",
+            conn->ciom->fd);
+    }
+    /*------ DEBUG LOG END ------*/
+    close(conn->ciom->fd);
+    conn->ciom->fd = -1;
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,298,
+            "out_function: void l7vs_conn_close_csock(struct l7vs_conn *conn) "
+            "return_value: void");
+    }
+    /*------ DEBUG LOG END ------*/
 }
 
 /*!
  * close real server socket
  *
- * @param[in]  conn    connection
- * @return     void 
+ * @param[in]   conn    connection
+ * @return      void 
  */
 void
 l7vs_conn_close_rsock(struct l7vs_conn *conn)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,299,
-                       "in_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
-                       "conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,300,
-                               "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       if (!conn->riom) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,301,
-                               "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       if (-1 == conn->riom->fd) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,302,
-                               "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-
-       if (conn->dest) {
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,303, "dest %p nactive %d->%d",
-                               conn->dest, conn->dest->nactive,
-                               conn->dest->nactive - 1);
-               }
-               conn->dest->nactive--;
-               conn->dest->ninact++;
-               if(conn->dest->ninact == INT_MAX) {
-                       conn->dest->ninact = 0;
-               }
-
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,343,
-                               "RealServer Connected Count : ninact is %d",
-                               conn->dest->ninact);
-               }
-               /*------ DEBUG LOG END ------*/
-       }
-
-       l7vs_iomux_remove(conn->riom);
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,304,
-                       "close: conn->riom->fd=%d",
-                       conn->riom->fd);
-       }
-       /*------ DEBUG LOG END ------*/
-       close(conn->riom->fd);
-       conn->riom->fd = -1;
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,305,
-                       "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
-                       "return_value: void");
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,299,
+            "in_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
+            "conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,300,
+                "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    if (!conn->riom) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,301,
+                "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    if (-1 == conn->riom->fd) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,302,
+                "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+
+    if (conn->dest) {
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,303, "dest %p nactive %d->%d",
+                conn->dest, conn->dest->nactive,
+                conn->dest->nactive - 1);
+        }
+        conn->dest->nactive--;
+        conn->dest->ninact++;
+        if(conn->dest->ninact == INT_MAX) {
+            conn->dest->ninact = 0;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,343,
+                "RealServer Connected Count : ninact is %d",
+                conn->dest->ninact);
+        }
+        /*------ DEBUG LOG END ------*/
+    }
+
+    l7vs_iomux_remove(conn->riom);
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,304,
+            "close: conn->riom->fd=%d",
+            conn->riom->fd);
+    }
+    /*------ DEBUG LOG END ------*/
+    close(conn->riom->fd);
+    conn->riom->fd = -1;
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,305,
+            "out_function: void l7vs_conn_close_rsock(struct l7vs_conn *conn) "
+            "return_value: void");
+    }
+    /*------ DEBUG LOG END ------*/
 }
 
 /*!
  * confirmation of whether conn is closed
  *
- * @param[in]  conn    connection
- * @return     closed or not
- * @retval     0       not closed 
- * @retval     1       closed
+ * @param[in]   conn    connection
+ * @return      closed or not
+ * @retval      0       not closed 
+ * @retval      1       closed
  */
 int
 l7vs_conn_closed(struct l7vs_conn *conn)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,306,
-                       "in_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
-                       "conn=%s",
-                       conn_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,307,
-                               "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
-       if ((conn->ciom && -1 != conn->ciom->fd) || (conn->riom && -1 != conn->riom->fd)) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,308,
-                               "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       } else {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,309,
-                               "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,306,
+            "in_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
+            "conn=%s",
+            conn_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,307,
+                "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
+    if ((conn->ciom && -1 != conn->ciom->fd) || (conn->riom && -1 != conn->riom->fd)) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,308,
+                "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    } else {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,309,
+                "out_function: int l7vs_conn_closed(struct l7vs_conn *conn) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
 }
 
 /*!
  * Change connection to specified destination (to real-server or sorry-server).
  *
- * @param[in]  *conn           connection pointer
- * @param[in]  *dest           destination pointer
- * @return     int             change connection result 0=NG, 1=OK
+ * @param[in]   *conn   connection pointer
+ * @param[in]   *dest   destination pointer
+ * @return      int     change connection result 0=NG, 1=OK
  */
 static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest)
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               char dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               l7vs_dest_c_str(dest_str, dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,310,
-                       "in_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                       "conn=%s: "
-                       "dest=%s",
-                       conn_str, dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       int ret;
-
-       if (!conn) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,77, "error / conn is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,311,
-                               "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       if (!dest) {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,78, "error / dest is null");
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,312,
-                               "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                               "return_value: 0");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 0;
-       }
-       // save old destination
-       conn->old_dest = conn->dest;
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char old_dest_str[DEBUG_STR_LEN] = {0};
-               l7vs_dest_c_str(old_dest_str, conn->old_dest);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
-                       "pointer_assign: conn->old_dest=%s",
-                       old_dest_str);
-       }
-       /*------ DEBUG LOG END ------*/
-       // close real-server connection
-       l7vs_conn_close_rsock(conn);
-       // connect to new destination
-       ret = l7vs_conn_connect_rs(conn, dest);
-
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,314,
-                       "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
-                       "return_value: %d",
-                       ret);
-       }
-       /*------ DEBUG LOG END ------*/
-       return ret;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        char dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        l7vs_dest_c_str(dest_str, dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,310,
+            "in_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+            "conn=%s: "
+            "dest=%s",
+            conn_str, dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    int ret;
+
+    if (!conn) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,77, "error / conn is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,311,
+                "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    if (!dest) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_PROGRAM,78, "error / dest is null");
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,312,
+                "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+                "return_value: 0");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 0;
+    }
+    // save old destination
+    conn->old_dest = conn->dest;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char old_dest_str[DEBUG_STR_LEN] = {0};
+        l7vs_dest_c_str(old_dest_str, conn->old_dest);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,313,
+            "pointer_assign: conn->old_dest=%s",
+            old_dest_str);
+    }
+    /*------ DEBUG LOG END ------*/
+    // close real-server connection
+    l7vs_conn_close_rsock(conn);
+    // connect to new destination
+    ret = l7vs_conn_connect_rs(conn, dest);
+
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,314,
+            "out_function: static int l7vs_conn_change_connect_rs(struct l7vs_conn *conn, struct l7vs_dest *dest) "
+            "return_value: %d",
+            ret);
+    }
+    /*------ DEBUG LOG END ------*/
+    return ret;
 }
 
 /*!
  * Judges from the data size received last time and recieve-interval
  *
- * @param[in]  *conn           connection pointer
- * @param[in]  direction       traffic direction
- * @return     int             permitte for recv function call 0=NG(not permitted), 1=OK(permitted)
+ * @param[in]   *conn       connection pointer
+ * @param[in]   direction   traffic direction
+ * @return      int         permitte for recv function call 0=NG(not permitted), 1=OK(permitted)
  */
 static int
 l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction )
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,315,
-                       "in_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
-                       "conn=%s, direction=%d",
-                       conn_str, direction);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,316,
-                               "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
-       if (!conn->srv) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
-                               "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
-                               "return_value: 1");
-               }
-               /*------ DEBUG LOG END ------*/
-               return 1;
-       }
-
-       struct timeval CurrTime;
-       gettimeofday( &CurrTime, NULL );
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char time_str[DEBUG_STR_LEN] = {0};
-               snprintf(time_str, DEBUG_STR_LEN,
-                       "timeval="
-                       "{tv_sec=%ld: "
-                       "tv_usec=%ld}"
-                       , CurrTime.tv_sec
-                       , CurrTime.tv_usec);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
-                       "gettimeofday result: CurrTime=%s",
-                       time_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,315,
+            "in_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
+            "conn=%s, direction=%d",
+            conn_str, direction);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,316,
+                "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
+    if (!conn->srv) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,317,
+                "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction ) "
+                "return_value: 1");
+        }
+        /*------ DEBUG LOG END ------*/
+        return 1;
+    }
+
+    struct timeval CurrTime;
+    gettimeofday( &CurrTime, NULL );
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char time_str[DEBUG_STR_LEN] = {0};
+        snprintf(time_str, DEBUG_STR_LEN,
+            "timeval="
+            "{tv_sec=%ld: "
+            "tv_usec=%ld}"
+            , CurrTime.tv_sec
+            , CurrTime.tv_usec);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
+            "gettimeofday result: CurrTime=%s",
+            time_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
     unsigned long long cur_recvtime = (CurrTime.tv_sec * 1000000ULL + CurrTime.tv_usec) / throughput_interval;
     l7vs_service_update_throughput(conn->srv, cur_recvtime);
@@ -3709,75 +3657,75 @@ l7vs_conn_QoS_control( struct l7vs_conn *conn, int direction )
         return 1;
     }
 
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,335,
-                       "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn ) "
-                       "return_value: 1");
-       }
-       /*------ DEBUG LOG END ------*/
-       return 1;
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,335,
+            "out_function: static int l7vs_conn_QoS_control( struct l7vs_conn *conn ) "
+            "return_value: 1");
+    }
+    /*------ DEBUG LOG END ------*/
+    return 1;
 }
 
 /*!
  * Regsiter recive time and recieved data size
  *
- * @param[in]  *conn           connection pointer
- * @param[in]  in_recvsize     recieved size
- * @param[in]  direction   traffic direction
- * @return     void 
+ * @param[in]   *conn       connection pointer
+ * @param[in]   in_recvsize recieved size
+ * @param[in]   direction   traffic direction
+ * @return      void 
  */
 static void
 l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize, int direction )
 {
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char conn_str[DEBUG_STR_LEN] = {0};
-               l7vs_conn_c_str(conn_str, conn);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,336,
-                       "in_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
-                       "conn=%s: "
-                       "in_recvsize=%zu",
-                       conn_str, in_recvsize);
-       }
-       /*------ DEBUG LOG END ------*/
-
-       if (!conn) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,337,
-                               "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       if (!conn->srv) {
-               /*-------- DEBUG LOG --------*/
-               if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,338,
-                               "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
-                               "return_value: void");
-               }
-               /*------ DEBUG LOG END ------*/
-               return;
-       }
-       struct timeval CurrTime;
-       gettimeofday( &CurrTime, NULL );
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               char time_str[DEBUG_STR_LEN] = {0};
-               snprintf(time_str, DEBUG_STR_LEN,
-                       "timeval="
-                       "{tv_sec=%ld: "
-                       "tv_usec=%ld}"
-                       , CurrTime.tv_sec
-                       , CurrTime.tv_usec);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
-                       "gettimeofday result: CurrTime=%s",
-                       time_str);
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char conn_str[DEBUG_STR_LEN] = {0};
+        l7vs_conn_c_str(conn_str, conn);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,336,
+            "in_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
+            "conn=%s: "
+            "in_recvsize=%zu",
+            conn_str, in_recvsize);
+    }
+    /*------ DEBUG LOG END ------*/
+
+    if (!conn) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,337,
+                "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    if (!conn->srv) {
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,338,
+                "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
+                "return_value: void");
+        }
+        /*------ DEBUG LOG END ------*/
+        return;
+    }
+    struct timeval CurrTime;
+    gettimeofday( &CurrTime, NULL );
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        char time_str[DEBUG_STR_LEN] = {0};
+        snprintf(time_str, DEBUG_STR_LEN,
+            "timeval="
+            "{tv_sec=%ld: "
+            "tv_usec=%ld}"
+            , CurrTime.tv_sec
+            , CurrTime.tv_usec);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,339,
+            "gettimeofday result: CurrTime=%s",
+            time_str);
+    }
+    /*------ DEBUG LOG END ------*/
 
     int throughput_interval = BPS_DEFAULT_INTERVAL;
     if ( parameter_is_int_exist( PARAM_COMP_L7VSD, "calc_throughput_interval" ) ) {
@@ -3797,12 +3745,12 @@ l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsiz
         break;
     }
 
-       /*-------- DEBUG LOG --------*/
-       if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,340,
-                       "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
-                       "return_value: void");
-       }
-       /*------ DEBUG LOG END ------*/
+    /*-------- DEBUG LOG --------*/
+    if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_NETWORK)) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,340,
+            "out_function: static void l7vs_conn_QoS_recvsize_register( struct l7vs_conn *conn, const size_t in_recvsize ) "
+            "return_value: void");
+    }
+    /*------ DEBUG LOG END ------*/
 }
 
index ab79791..6cbeea6 100644 (file)
@@ -58,7 +58,7 @@ static int parse_option_snmp(int argc, char *argv[]);
 static int parse_option_parameter(int argc, char *argv[]);
 static int parse_option_help(int argc, char *argv[]);
 
-static int parse_endpoint(struct sockaddr_in *addr, const char *endpoint_str);
+static int parse_endpoint(struct sockaddr_in *addr, const char *endpoint_str, int allow_inaddr_any);
 static int parse_digit(const char *digit_str);
 static long long parse_qos(const char *qos_str);
 static int parse_option_protomod(int argc, char *argv[], int m_idx_begin, int m_idx_end);
@@ -516,7 +516,7 @@ parse_option_vs(int argc, char *argv[])
        if (strcmp(argv[idx], "-t") == 0 || strcmp(argv[idx], "--tcp-service") == 0) {
                idx++;
                ret = parse_endpoint(&l7vsadm_option_data.vs_addr,
-                                    argv[idx]);
+                                    argv[idx], TRUE);
                if (ret < 0) {
                        LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSADM_PARSE,7,
                                "Parse VirtualService endpoint error.");
@@ -813,7 +813,7 @@ parse_option_vs(int argc, char *argv[])
                                        }
                                        ret = parse_endpoint(
                                                (struct sockaddr_in *)(&l7vsadm_option_data.sorry_addr),
-                                               argv[idx]);
+                                               argv[idx], FALSE);
                                        if (ret < 0) {
                                                LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSADM_PARSE,20,
                                                        "Parse SorryServer endpoint error.");
@@ -1048,7 +1048,7 @@ parse_option_rs(int argc, char *argv[])
        if (strcmp(argv[idx], "-t") == 0 || strcmp(argv[idx], "--tcp-service") == 0) {
                idx++;
                ret = parse_endpoint(&l7vsadm_option_data.vs_addr,
-                                    argv[idx]);
+                                    argv[idx], TRUE);
                if (ret < 0) {
                        LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSADM_PARSE,30,
                                "Parse VirtualService endpoint error.");
@@ -1181,7 +1181,7 @@ parse_option_rs(int argc, char *argv[])
        }
 
        idx++;
-       ret = parse_endpoint(&l7vsadm_option_data.rs_addr, argv[idx]);
+       ret = parse_endpoint(&l7vsadm_option_data.rs_addr, argv[idx], FALSE);
        if (ret < 0) {
                LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSADM_PARSE,36,
                        "Parse RealServer endpoint error.");
@@ -2260,7 +2260,7 @@ parse_option_help(int argc, char *argv[])
  * @return     int     parse result OK=0, NG=-1
  */
 static int
-parse_endpoint(struct sockaddr_in *addr, const char *endpoint_str)
+parse_endpoint(struct sockaddr_in *addr, const char *endpoint_str, int allow_inaddr_any)
 {
        struct addrinfo *res, hints;
        struct sockaddr_in *sin;
@@ -2346,7 +2346,7 @@ parse_endpoint(struct sockaddr_in *addr, const char *endpoint_str)
         * which entry you want to specify if we have multiple entries.
         */
        sin = (struct sockaddr_in *)res->ai_addr;
-       if (sin->sin_addr.s_addr == htonl(INADDR_ANY)) {
+       if (!allow_inaddr_any && sin->sin_addr.s_addr == htonl(INADDR_ANY)) {
                LOGGER_PUT_LOG_WARN(LOG_CAT_L7VSADM_PARSE,73,
                        "You can't specify INADDR_ANY for endpoint.");
                fprintf(stderr, "PARSE ERROR : "
index bc455db..23b4026 100644 (file)
 #include "l7vs_sched.h"
 
 /* static functions */
-static int     l7vs_lsock_accept(struct l7vs_lsock *lsock);
-static void    l7vs_lsock_table_add(struct l7vs_lsock *lsock);
-static void    l7vs_lsock_table_remove(struct l7vs_lsock *lsock);
-static gint    l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b);
-static int     l7vs_lsock_callback(struct l7vs_iomux *iom );
+static int  l7vs_lsock_accept(struct l7vs_lsock *lsock);
+static void l7vs_lsock_table_add(struct l7vs_lsock *lsock);
+static void l7vs_lsock_table_remove(struct l7vs_lsock *lsock);
+static gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b);
+static int  l7vs_lsock_callback(struct l7vs_iomux *iom );
 
 //! l7vs_lsock list 
 static GList *l7vs_lsock_list;
@@ -54,424 +54,402 @@ static GList *l7vs_lsock_list;
 /*!
  * inner function of fini.
  * all element free.
- * @param[in]  void
- * @return     void
+ * @param[in]   void
+ * @return      void
  */
-void   freeAllList( gpointer data, gpointer userdata ){
-       struct l7vs_lsock*      lsock = (struct l7vs_lsock*)data;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,2,
-                                     "lsock in_fuction freeAllList : lsock=%p",
-                                      lsock);
-       }
-
-       free( lsock );
+void freeAllList( gpointer data, gpointer userdata ) {
+    struct l7vs_lsock* lsock = (struct l7vs_lsock*)data;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,2,
+            "lsock in_fuction freeAllList : lsock=%p", lsock);
+    }
+    free(lsock);
 }
 
 /*!
  * initialize functions
- * @param[in]  void
- * @return     everydays zero.
+ * @param[in]   void
+ * @return      everydays zero.
  */
 int
 l7vs_lsock_init(void)
 {       
-        if(l7vs_lsock_list == NULL )
-        {       
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,3,
-                                     "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
-               }
-                return 0;
+    if (l7vs_lsock_list == NULL) {       
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,3,
+                "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
         }
-        g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
-        g_list_free( l7vs_lsock_list );
-        l7vs_lsock_list = NULL;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,4,
-                                "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
-       }
         return 0;
+    }
+    g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
+    g_list_free( l7vs_lsock_list );
+    l7vs_lsock_list = NULL;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,4,
+            "lsock in_fuction int l7vs_lsock_init(void) : l7vs_lsock_list == NULL return 0");
+    }
+    return 0;
 }
 
 /*!
  * finalize function.
  *  free list element memory.
  *  drop list memory.
- * @param[in]  void
- * @return     void
+ * @param[in]   void
+ * @return      void
  */
 void
 l7vs_lsock_fini(void)
 {
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,5,
-                                "lsock in_fuction int l7vs_lsock_fini(void) : free l7vs_lsock_list = %p",
-                               l7vs_lsock_list);
-       }
-
-       g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
-       g_list_free( l7vs_lsock_list );
-       l7vs_lsock_list = NULL;
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,5,
+            "lsock in_fuction int l7vs_lsock_fini(void) : free l7vs_lsock_list = %p",
+            l7vs_lsock_list);
+    }
+
+    g_list_foreach( l7vs_lsock_list, freeAllList, NULL );
+    g_list_free( l7vs_lsock_list );
+    l7vs_lsock_list = NULL;
 }
+
 /*!
  * look up socket
  * if target soket have link list then return having socket.
  * else create new socket to return.
- * @param[in]  sin     socket address struct( if ipv6 may be change this struct ) 
- * @param[in]  proto   TCS/UDP select.
- * @param[in]  backlog 
+ * @param[in]   sin     socket address struct( if ipv6 may be change this struct ) 
+ * @param[in]   proto   TCS/UDP select.
+ * @param[in]   backlog
  */
 struct l7vs_lsock *
 l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)
 {
-        struct l7vs_lsock *lsock;
-        int stype;
-        int ret;
-        int on = 1;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,20,
-                    "in_fuction:  struct l7vs_lsock * l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)"
-                       "*sin =%p :proto = %d :backlog = %d :",
-                               sin,proto,backlog);
-       }
-
-       if(sin == NULL )
-       {
-               return NULL;
-       }
-
-        lsock = l7vs_lsock_table_lookup(sin, proto);
-        if (lsock != NULL) {
-                lsock->refcnt++;
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,21,
-                                       "table look up: lsock=%s",
-                                               lsock_str);
-               }
-                return lsock;
-        }
-                                                         
-        switch (proto) {
-        case IPPROTO_TCP:
-                stype = SOCK_STREAM;
-                break;
-        case IPPROTO_UDP:
-                stype = SOCK_DGRAM;
-                break;
-        default:
-                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,21, "Protocol number should be"
-                                          " TCP or UDP (%d)",
-                                          proto);
-                return NULL;
+    struct l7vs_lsock *lsock;
+    int stype;
+    int ret;
+    int on = 1;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,20,
+            "in_fuction:  struct l7vs_lsock * l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog)"
+            "*sin =%p :proto = %d :backlog = %d :",
+            sin,proto,backlog);
+    }
+
+    if (sin == NULL) {
+        return NULL;
+    }
+
+    lsock = l7vs_lsock_table_lookup(sin, proto);
+    if (lsock != NULL) {
+        lsock->refcnt++;
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+            char lsock_str[DEBUG_STR_LEN] = {0};
+            l7vs_lsock_c_str(lsock_str, lsock);
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,21,
+                "table look up: lsock=%s", lsock_str);
         }
-
-        lsock = (struct l7vs_lsock *)calloc(1, sizeof(*lsock));
-        if (lsock == NULL) {
-                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,14, "Could not allocate lsock");
-                return lsock;
+        return lsock;
+    }
+
+    switch (proto) {
+    case IPPROTO_TCP:
+        stype = SOCK_STREAM;
+        break;
+    case IPPROTO_UDP:
+        stype = SOCK_DGRAM;
+        break;
+    default:
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,21,
+            "Protocol number should be TCP or UDP (%d)", proto);
+        return NULL;
+    }
+
+    lsock = (struct l7vs_lsock *)calloc(1, sizeof(*lsock));
+    if (lsock == NULL) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_MEMORY,14, "Could not allocate lsock");
+        return lsock;
+    }
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,6,
+            "in function l7vs_lsock_get: allocate memory"
+            " : size=%zu ,pointer=%p", sizeof(*lsock),lsock);
+    }
+
+    lsock->iom = l7vs_iomux_get_from_avail_list();
+    if (!lsock->iom) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_ENVIRONMENT,24, "can not get lsock_iomux");
+        return NULL;
+    }
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,22, "creating lsock %p", lsock);
+    }
+    lsock->proto = proto;
+    lsock->iom->fd = socket(PF_INET, stype, proto);  //create a socket to get connection request from the client
+    if (lsock->iom->fd < 0) {
+        if (proto == IPPROTO_TCP) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,22,
+                "socket: Protocol is IPPROTO_TCP,SockType is SOCK_STREAM (%s)", strerror(errno));
         }
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,6,
-                                       "in function l7vs_lsock_get: allocate memory"
-                                       " : size=%zu ,pointer=%p",
-                                               sizeof(*lsock),lsock);
-       }
-
-       lsock->iom = l7vs_iomux_get_from_avail_list();
-        if (!lsock->iom) {
-                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_ENVIRONMENT,24, "can not get lsock_iomux");
-                return NULL;
+        else {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
+                "socket: Protocol is IPPROTO_UDP,SockType is SOCK_DGRAM (%s)", strerror(errno));
         }
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,22, "creating lsock %p", lsock);
-       }
-        lsock->proto = proto;
-        lsock->iom->fd = socket(PF_INET, stype, proto);  //create a socket to get connection request from the client
-        if (lsock->iom->fd < 0) {
-               if (proto == IPPROTO_TCP) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,22,
-                                "socket: Protocol is IPPROTO_TCP,SockType is SOCK_STREAM (%s)", strerror(errno));
-               }
-               else {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
-                                "socket: Protocol is IPPROTO_UDP,SockType is SOCK_DGRAM (%s)", strerror(errno));
-               }
  
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,7,
-                                               "in function l7vs_lsock_get: free memory"
-                                               " : size=%zu ,pointer=%p",
-                                                       sizeof(*lsock),lsock);
-               }
-                free(lsock);
-                return NULL;
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,7,
+                "in function l7vs_lsock_get: free memory"
+                " : size=%zu ,pointer=%p", sizeof(*lsock),lsock);
         }
-
-        setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(int));
-        ret = bind(lsock->iom->fd, (struct sockaddr *)sin, sizeof(*sin)); //binding the socket for incoming client request
-        if (ret < 0) {
-               char addr_str[DEBUG_STR_LEN]={0};
-
-               l7vs_lsock_sockaddr_in_c_str(addr_str, (struct sockaddr_in *)sin);
-                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,23, "Could not bind socket: %s (%s)",
-                                          addr_str,strerror(errno));
-                close(lsock->iom->fd);
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,8,
-                                               "in function l7vs_lsock_get: free memory"
-                                               " : size=%zu ,pointer=%p",
-                                                       sizeof(*lsock),lsock);
-               }
-                free(lsock);
-                return NULL;
+        free(lsock);
+        return NULL;
+    }
+
+    setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(int));
+    ret = bind(lsock->iom->fd, (struct sockaddr *)sin, sizeof(*sin)); //binding the socket for incoming client request
+    if (ret < 0) {
+        char addr_str[DEBUG_STR_LEN]={0};
+
+        l7vs_lsock_sockaddr_in_c_str(addr_str, (struct sockaddr_in *)sin);
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,23, "Could not bind socket: %s (%s)",
+            addr_str,strerror(errno));
+        close(lsock->iom->fd);
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,8,
+                "in function l7vs_lsock_get: free memory"
+                " : size=%zu ,pointer=%p", sizeof(*lsock),lsock);
         }
-        lsock->addr = *sin;
-
-        ret = listen(lsock->iom->fd, backlog); //listening for client requests
-        if (ret < 0) {
-                LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,24, "Could not listen: %s (file descriptor :%d , backlog: %d)",
-                                          strerror(errno),lsock->iom->fd, backlog);
-                close(lsock->iom->fd);
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,9,
-                                               "in function l7vs_lsock_get: free memory"
-                                               " : size=%zu ,pointer=%p",
-                                                       sizeof(*lsock),lsock);
-               }
-                free(lsock);
-                return NULL;
+        free(lsock);
+        return NULL;
+    }
+    lsock->addr = *sin;
+
+    ret = listen(lsock->iom->fd, backlog); //listening for client requests
+    if (ret < 0) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,24, "Could not listen: %s (file descriptor :%d , backlog: %d)",
+            strerror(errno),lsock->iom->fd, backlog);
+        close(lsock->iom->fd);
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,9,
+                "in function l7vs_lsock_get: free memory"
+                " : size=%zu ,pointer=%p", sizeof(*lsock),lsock);
         }
-
-        lsock->refcnt = 1;
-        lsock->fast_schedule = 1;
-
-        lsock->iom->callback = l7vs_lsock_callback;
-        lsock->iom->data = lsock;
-       lsock->iom->status = iomux_lsock_connect_waiting;
-        l7vs_lsock_table_add(lsock);  //Add socket in the list. It may be used for maintaining session (Am not sure)
-//        l7vs_iomux_add(&lsock->iom, L7VS_IOMUX_READ);
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                char lsock_str[DEBUG_STR_LEN] = {0};
-                l7vs_lsock_c_str(lsock_str, lsock);
-                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,23,
-                                      "creat: lsock=%s",
-                                       lsock_str);
-       }
-       l7vs_iomux_add( lsock->iom, iom_read );
-        return lsock;
+        free(lsock);
+        return NULL;
+    }
+
+    lsock->refcnt = 1;
+    lsock->fast_schedule = 1;
+
+    lsock->iom->callback = l7vs_lsock_callback;
+    lsock->iom->data = lsock;
+    lsock->iom->status = iomux_lsock_connect_waiting;
+    l7vs_lsock_table_add(lsock);  //Add socket in the list. It may be used for maintaining session (Am not sure)
+//    l7vs_iomux_add(&lsock->iom, L7VS_IOMUX_READ);
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,23,
+            "creat: lsock=%s", lsock_str);
+    }
+    l7vs_iomux_add( lsock->iom, iom_read );
+    return lsock;
 }
 
 /*!
  * lisning socket remove list and iomuxlist.
- * @param[in]  lsock   removing lisning socket
- * @return     void
+ * @param[in]   lsock   removing lisning socket
+ * @return      void
  */
 
 void
 l7vs_lsock_put(struct l7vs_lsock *lsock)
 {
-       if(lsock == NULL)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,25, "error / lsock is null");
-               return;
-       }
-
-       lsock->iom->status = iomux_lsock_released;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,24,
-                                     "lsock  removing : lsock=%s",
-                                      lsock_str);
-       }
-        if (--lsock->refcnt > 0)
-       {
-               lsock->iom->status = iomux_lsock_connect_waiting;
-               if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,25,
-                                      "not removing : lsock=%s",
-                                       lsock_str);
-               }
-                return;
-       }
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
-                                     "removing : lsock=%s",
-                                      lsock_str);
-       }
-
-       lsock->iom->status = iomux_lsock_destroyed;
-
-        l7vs_iomux_remove(lsock->iom);
-        l7vs_lsock_table_remove(lsock);
-
-       if(lsock->iom->fd > 0)
-       {
-               close(lsock->iom->fd);
-       }
-       l7vs_iomux_put_to_avail_list(lsock->iom);
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,10,
-                                     "in function l7vs_lsock_put  : free lsock=%p",
-                                      lsock);
-       }
-        free(lsock);
+    if (lsock == NULL) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SYSTEM_SOCKET,25, "error / lsock is null");
+        return;
+    }
+
+    lsock->iom->status = iomux_lsock_released;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,24,
+            "lsock  removing : lsock=%s", lsock_str);
+    }
+    if (--lsock->refcnt > 0) {
+        lsock->iom->status = iomux_lsock_connect_waiting;
+        if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+            char lsock_str[DEBUG_STR_LEN] = {0};
+            l7vs_lsock_c_str(lsock_str, lsock);
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,25,
+                "not removing : lsock=%s", lsock_str);
+        }
+        return;
+    }
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,26,
+            "removing : lsock=%s", lsock_str);
+    }
+
+    lsock->iom->status = iomux_lsock_destroyed;
+
+    l7vs_iomux_remove(lsock->iom);
+    l7vs_lsock_table_remove(lsock);
+
+    if (lsock->iom->fd > 0) {
+        close(lsock->iom->fd);
+    }
+    l7vs_iomux_put_to_avail_list(lsock->iom);
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_MEMORY) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_MEMORY,10,
+            "in function l7vs_lsock_put  : free lsock=%p", lsock);
+    }
+    free(lsock);
 }
 
 /*!
  * lsock_list append new lsock ponter
- * @param[in]  lsock   to insert table lsock
- * @return     void
+ * @param[in]   lsock   to insert table lsock
+ * @return      void
  */
 static void
 l7vs_lsock_table_add(struct l7vs_lsock *lsock)
 {
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,27,
-                                     "in_function l7vs_lsock_table_add : add table lsock=%s",
-                                      lsock_str);
-       }
-        l7vs_lsock_list = g_list_append(l7vs_lsock_list, (gpointer)lsock);
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,28,
-                                     "out_function l7vs_lsock_table_add : add table lsock=%s",
-                                      lsock_str);
-       }
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,27,
+            "in_function l7vs_lsock_table_add : add table lsock=%s",
+            lsock_str);
+    }
+    l7vs_lsock_list = g_list_append(l7vs_lsock_list, (gpointer)lsock);
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,28,
+            "out_function l7vs_lsock_table_add : add table lsock=%s",
+            lsock_str);
+    }
 }
 
 /*!
  * lsock_list remove lsock (don't free element)
- * @param[in]  to remove lsock
- * @return     void
+ * @param[in]   lsock   to remove lsock
+ * @return      void
  */
 static void
 l7vs_lsock_table_remove(struct l7vs_lsock *lsock)
 {
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,29,
-                                     "in_function l7vs_lsock_table_remove : remove table lsock=%s",
-                                      lsock_str);
-       }
-        l7vs_lsock_list = g_list_remove(l7vs_lsock_list, (gpointer)lsock);
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,30,
-                                     "out_function l7vs_lsock_table_remove : remove table lsock=%s",
-                                      lsock_str);
-       }
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,29,
+            "in_function l7vs_lsock_table_remove : remove table lsock=%s",
+            lsock_str);
+    }
+    l7vs_lsock_list = g_list_remove(l7vs_lsock_list, (gpointer)lsock);
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,30,
+            "out_function l7vs_lsock_table_remove : remove table lsock=%s",
+            lsock_str);
+    }
 }
 
 
 /*!
  * look up table for lsock.
- * @param[in]  *sin    socketaddr_in struct pointer (ex. to change then IPv6 target )
- * @param[in]  *proto  port no
- * @return     *l7vs_lsock
+ * @param[in]   *sin    socketaddr_in struct pointer (ex. to change then IPv6 target )
+ * @param[in]   *proto  port no
+ * @return      *l7vs_lsock
  */
 struct l7vs_lsock *
 l7vs_lsock_table_lookup(struct sockaddr_in *sin, uint8_t proto)
 {
-        struct l7vs_lsock tmpl;
-        GList *l;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,31,
-                    "in_fuction:  struct l7vs_lsock * l7vs_lsock_table_lookup(struct sockaddr_in *sin, uint8_t proto)"
-                               "*sin =%p :proto = %d ",
-                               sin,proto);
-       }
-
-       if(sin == NULL)
-       {
-               return NULL;
-       }
-
-        tmpl.addr = *sin;
-        tmpl.proto = proto;
-
-        l = g_list_find_custom(l7vs_lsock_list, (gpointer)&tmpl,
-                               l7vs_lsock_addr_cmp);
-        if (l == NULL)
-                return NULL;
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, (struct l7vs_lsock *)l->data);
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,32,
-                                     "return : lsock=%s",
-                                      lsock_str);
-       }
-        return (struct l7vs_lsock *)l->data;  //for checking up and finding the socket in the list for a particular client socket(not sure)
+    struct l7vs_lsock tmpl;
+    GList *l;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,31,
+            "in_fuction:  struct l7vs_lsock * l7vs_lsock_table_lookup(struct sockaddr_in *sin, uint8_t proto)"
+            "*sin =%p :proto = %d ", sin,proto);
+    }
+
+    if (sin == NULL) {
+        return NULL;
+    }
+
+    tmpl.addr = *sin;
+    tmpl.proto = proto;
+
+    l = g_list_find_custom(l7vs_lsock_list, (gpointer)&tmpl,
+        l7vs_lsock_addr_cmp);
+    if (l == NULL)
+        return NULL;
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, (struct l7vs_lsock *)l->data);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,32,
+            "return : lsock=%s", lsock_str);
+    }
+    return (struct l7vs_lsock *)l->data;  //for checking up and finding the socket in the list for a particular client socket(not sure)
 }
 
 /*!
  * using foreach function from Compare
- * @param      a l7vs_lsock pointer
- * @param      b l7vs_lsock pointer
- * @return     compare pattern 
+ * @param   a l7vs_lsock pointer
+ * @param   b l7vs_lsock pointer
+ * @return  compare pattern 
  */
 static gint
 l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)
 {
-        struct l7vs_lsock *la = (struct l7vs_lsock *)a;
-        struct l7vs_lsock *lb = (struct l7vs_lsock *)b;
-
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,33,
-                    "in_fuction:  gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
-                               "a =%p :b = %p ",
-                               a,b);
-       }
-
-        if (la->addr.sin_addr.s_addr != lb->addr.sin_addr.s_addr)
-                return la->addr.sin_addr.s_addr - lb->addr.sin_addr.s_addr;
-        if (la->addr.sin_port != lb->addr.sin_port)
-                return la->addr.sin_port - lb->addr.sin_port;
-        if (la->proto != lb->proto)
-                return la->proto - lb->proto;
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,34,
-                    "out_fuction:  gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
-                               "return = 0");
-       }
-        return 0;
+    struct l7vs_lsock *la = (struct l7vs_lsock *)a;
+    struct l7vs_lsock *lb = (struct l7vs_lsock *)b;
+
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,33,
+            "in_fuction:  gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
+            "a =%p :b = %p ", a, b);
+    }
+
+    if (la->addr.sin_addr.s_addr != lb->addr.sin_addr.s_addr)
+        return la->addr.sin_addr.s_addr - lb->addr.sin_addr.s_addr;
+    if (la->addr.sin_port != lb->addr.sin_port)
+        return la->addr.sin_port - lb->addr.sin_port;
+    if (la->proto != lb->proto)
+        return la->proto - lb->proto;
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_SYSTEM_SOCKET) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_SYSTEM_SOCKET,34,
+            "out_fuction:  gint l7vs_lsock_addr_cmp(gconstpointer a, gconstpointer b)"
+            "return = 0");
+    }
+    return 0;
 }
 
 /*!
  * select VertualService or SorryServer
- * @param      lsock l7vs_lsock pointer
- * @param      conn  l7vs_conn pointer
- * @param      buf   char pointer
- * @param      len   size_t
- * @param      srv_ret  l7vs_service pointer pointer
- * @param      dest_ret l7vs_dest pointer pointer
- * @param      tcps_ret int pointer
- * @return     int   ok:1 error:-1
+ * @param   lsock       l7vs_lsock pointer
+ * @param   conn        l7vs_conn pointer
+ * @param   buf         char pointer
+ * @param   len         size_t
+ * @param   srv_ret     l7vs_service pointer pointer
+ * @param   dest_ret    l7vs_dest pointer pointer
+ * @return  int         ok:1 error:-1
  */
 int
 l7vs_lsock_select_service(struct l7vs_lsock *lsock, 
@@ -479,322 +457,299 @@ l7vs_lsock_select_service(struct l7vs_lsock *lsock,
                           char *buf,
                           size_t len,
                           struct l7vs_service **srv_ret,
-                          struct l7vs_dest **dest_ret,
-                          int *tcps_ret)
+                          struct l7vs_dest **dest_ret)
 {
-        GList *l;
-        struct l7vs_service *srv;
-        struct l7vs_dest *dest;
-        int ret, val;
-        int tcps;
-       struct l7vs_service *srv_tmp = NULL;    //! temporary for srv
-       struct l7vs_dest *dest_tmp = NULL;      //! temporary for dest
-       int tcps_tmp = 1;                       //! temporary for tcps
-       size_t len_tmp = 0;                     //! temporary for len
-       int sorry_save = 0;                     //! sorry dest save flag
-       struct l7vs_service *srv_tmp2 = NULL;   //! temporary for srv when match_cldata NG
-       struct l7vs_dest *dest_tmp2 = NULL;     //! temporary for dest when match_cldata NG
-       int tcps_tmp2 = 1;                      //! temporary for tcps when match_cldata NG
-       size_t len_tmp2 = 0;                    //! temporary for len when match_cldata NG
-       int sorry_save2 = 0;                    //! sorry dest save flag when match_cldata NG
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,13,
-                    "in_fuction:  int l7vs_lsock_select_service(struct l7vs_lsock *lsock,"
-                       "struct l7vs_conn *conn,"
-                       "char *buf,"
-                       "size_t len,"
-                       "struct l7vs_service **srv_ret,"
-                       "struct l7vs_dest **dest_ret,"
-                       "int *tcps_ret)"
-                       "lsock :%p, conn :%p buf : %p,len : %zu,",
-                       lsock,conn,buf,len);
-                       
-       }
-        val = -1;
-        l = lsock->srv_list;
-        while (l != NULL) {
-                srv = (struct l7vs_service *)l->data;
-                dest = NULL;
-                tcps = 1;
-                ret = srv->pm->match_cldata(srv, conn, buf, &len, &dest, &tcps);
-                if (ret == 0) {
-                       // check sorry status if ret == 0
-                       // sorry_check argument 1 means check connection count
-                       if (l7vs_sched_sorry_check(srv, 1)) {
-                               if (!sorry_save) {
-                                       // save sorry dest to xxx_tmp only first time
-                                       srv_tmp = srv;
-                                       dest_tmp = dest;
-                                       tcps_tmp = tcps;
-                                       len_tmp = len;
-                                       sorry_save = 1;
-                               }
-                       } else {
-                               // check cldata length if sorry_check != 1 (not sorry status)
-                               if (len > conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE) {
-                                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,1, "bufsize too long modified by protomod ");
-                               } else {
-                                       // service and destination is decided
-                                       *srv_ret = srv;
-                                       *dest_ret = dest;
-                                       *tcps_ret = tcps;
-                                       conn->cldata_len = len;
-                                       sorry_save = 0;
-                                       sorry_save2 = 0;
-                                       val = 1;
-                                       break;
-                               }
-                       }
-               }
-               // when match_cldata NG
-               if (!sorry_save2) {
-                       // save sorry dest to xxx_tmp2 only first time
-                       srv_tmp2 = srv;
-                       dest_tmp2 = dest;
-                       tcps_tmp2 = tcps;
-                       len_tmp2 = len;
-                       sorry_save2 = 1;
-               }
-               // get next srv from srv_list
-                l = g_list_next(l);
+    GList *l;
+    struct l7vs_service *srv;
+    struct l7vs_dest *dest;
+    int ret, val;
+    struct l7vs_service *srv_tmp = NULL;    //! temporary for srv
+    struct l7vs_dest *dest_tmp   = NULL;    //! temporary for dest
+    size_t len_tmp = 0;                     //! temporary for len
+    int    sorry_save = 0;                  //! sorry dest save flag
+    struct l7vs_service *srv_tmp2 = NULL;   //! temporary for srv when select_dest NG
+    struct l7vs_dest *dest_tmp2   = NULL;   //! temporary for dest when select_dest NG
+    size_t len_tmp2 = 0;                    //! temporary for len when select_dest NG
+    int    sorry_save2 = 0;                 //! sorry dest save flag when select_dest NG
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,13,
+            "in_fuction:  int l7vs_lsock_select_service(struct l7vs_lsock *lsock,"
+            "struct l7vs_conn *conn,"
+            "char *buf,"
+            "size_t len,"
+            "struct l7vs_service **srv_ret,"
+            "struct l7vs_dest **dest_ret) "
+            "lsock :%p, conn :%p buf : %p,len : %zu,",
+            lsock,conn,buf,len);
+    }
+    val = -1;
+    l = lsock->srv_list;
+    while (l != NULL) {
+        srv = (struct l7vs_service *)l->data;
+        dest = NULL;
+        ret = srv->pm->select_dest(srv, conn, buf, &len, &dest);
+        if (ret == 0) {
+            // check sorry status if ret == 0
+            // sorry_check argument 1 means check connection count
+            if (l7vs_sched_sorry_check(srv, 1)) {
+                if (!sorry_save) {
+                    // save sorry dest to xxx_tmp only first time
+                    srv_tmp = srv;
+                    dest_tmp = dest;
+                    len_tmp = len;
+                    sorry_save = 1;
+                }
+            } else {
+                // check cldata length if sorry_check != 1 (not sorry status)
+                if (len > conn->cldata_len + L7VS_PROTOMOD_MAX_ADD_BUFSIZE) {
+                    LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,1, "bufsize too long modified by protomod ");
+                } else {
+                    // service and destination is decided
+                    *srv_ret = srv;
+                    *dest_ret = dest;
+                    conn->cldata_len = len;
+                    sorry_save = 0;
+                    sorry_save2 = 0;
+                    val = 1;
+                    break;
+                }
+            }
         }
-
-       if (sorry_save) {
-               // saved sorry dest is exist
-               // set sorry-server destination
-               //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 1);
-               *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 0);
-               if (!*dest_ret) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,2, "sorry-server dest is NULL");
-                       if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,14,
-                               "in_fuction:  int l7vs_lsock_select_service return -1");
-                       }
-                       return -1;
-               }
-               *srv_ret = srv_tmp;
-               *tcps_ret = tcps_tmp;
-               conn->cldata_len = len_tmp;
-               conn->sorry_conn_flag = 1;
-               val = 1;
-       } else if (sorry_save2) {
-               // saved sorry dest2 is exist
-               // set sorry-server destination
-               //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 1);
-               *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 0);
-               if (!*dest_ret) {
-                       LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,3, "sorry-server dest is NULL");
-                       if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
-                                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,15,
-                               "in_fuction:  int l7vs_lsock_select_service return -1");
-                       }
-                       return -1;
-               }
-               *srv_ret = srv_tmp2;
-               *tcps_ret = tcps_tmp2;
-               conn->cldata_len = len_tmp2;
-               conn->sorry_conn_flag = 1;
-               val = 1;
-       }
-       // return val=1 service and destination is decided (to real-server or sorry-server)
-       // return val=-1 service and destination not decided (match_cldata result all NG)
-       if(logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG){
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,16,
-                "out_fuction:  int l7vs_lsock_select_service return %d",val);
-       }
-        return val;
+        // when select_dest NG
+        if (!sorry_save2) {
+            // save sorry dest to xxx_tmp2 only first time
+            srv_tmp2 = srv;
+            dest_tmp2 = dest;
+            len_tmp2 = len;
+            sorry_save2 = 1;
+        }
+        // get next srv from srv_list
+        l = g_list_next(l);
+    }
+
+    if (sorry_save) {
+        // saved sorry dest is exist
+        // set sorry-server destination
+        //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 1);
+        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp, NULL, 0);
+        if (!*dest_ret) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,2, "sorry-server dest is NULL");
+            if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,14,
+                    "in_fuction:  int l7vs_lsock_select_service return -1");
+            }
+            return -1;
+        }
+        *srv_ret = srv_tmp;
+        conn->cldata_len = len_tmp;
+        conn->sorry_conn_flag = 1;
+        val = 1;
+    } else if (sorry_save2) {
+        // saved sorry dest2 is exist
+        // set sorry-server destination
+        //*dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 1);
+        *dest_ret = (struct l7vs_dest *)l7vs_sched_sorry_dest(srv_tmp2, NULL, 0);
+        if (!*dest_ret) {
+            LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_SORRY_SERVER,3, "sorry-server dest is NULL");
+            if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
+                LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,15,
+                    "in_fuction:  int l7vs_lsock_select_service return -1");
+            }
+            return -1;
+        }
+        *srv_ret = srv_tmp2;
+        conn->cldata_len = len_tmp2;
+        conn->sorry_conn_flag = 1;
+        val = 1;
+    }
+    // return val=1 service and destination is decided (to real-server or sorry-server)
+    // return val=-1 service and destination not decided (select_dest result all NG)
+    if (logger_get_log_level(LOG_CAT_L7VSD_REAL_SERVER) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_REAL_SERVER,16,
+            "out_fuction:  int l7vs_lsock_select_service return %d",val);
+    }
+    return val;
 }
 
 /*!
  * table add service list
  *  append list memory.
- * @param[in]  void
- * @return     void
+ * @param[in]   void
+ * @return      void
  */
 void
 l7vs_lsock_add_service(struct l7vs_lsock *lsock,
                        struct l7vs_service *srv)
 {
-       if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,94,
-                "in_fuction:  void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
-               "lsock: %s,srv : %p",
-               lsock_str,srv);
-       }
-       lsock->srv_list = g_list_append(lsock->srv_list, srv);
-       if (lsock->fast_schedule) {
-               lsock->fast_schedule = srv->pm->fast_schedule;
-       }
-       if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,95,
-                "out_fuction:  void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
-               "lsock: %s,srv : %p",
-               lsock_str,srv);
-       }
+    if (logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,94,
+            "in_fuction:  void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
+            "lsock: %s,srv : %p",
+            lsock_str,srv);
+    }
+    lsock->srv_list = g_list_append(lsock->srv_list, srv);
+    if (lsock->fast_schedule) {
+        lsock->fast_schedule = srv->pm->fast_schedule;
+    }
+    if (logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,95,
+            "out_fuction:  void l7vs_lsock_add_service(struct l7vs_lsock *lsock,struct l7vs_service *srv)"
+            "lsock: %s,srv : %p", lsock_str,srv);
+    }
 }
 
 /*!
  * table remove from service list
  *  remove list memory.
- * @param[in]  void
- * @return     void
+ * @param[in]   void
+ * @return      void
  */
 void
 l7vs_lsock_remove_service(struct l7vs_lsock *lsock,
                           struct l7vs_service *srv)
 {
-       GList* slist = NULL;
-       if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,96,
-                "in_fuction:  void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
-               "lsock: %s,srv : %p",
-               lsock_str,srv);
-       }
-        lsock->srv_list = g_list_remove(lsock->srv_list, srv);
-       lsock->fast_schedule = 1;
-       for (slist = g_list_first(lsock->srv_list); slist != NULL; slist = slist->next) {
-               struct l7vs_service* s = (struct l7vs_service*) slist->data;
-               if (s != NULL && s->pm != NULL && s->pm->fast_schedule == 0) {
-                       lsock->fast_schedule = 0;
-                       break;
-               }
-       }
-       if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,97,
-                "out_fuction:  void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
-               "lsock: %s,srv : %p",
-               lsock_str,srv);
-       }
+    GList* slist = NULL;
+    if (logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,96,
+            "in_fuction:  void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
+            "lsock: %s,srv : %p",
+            lsock_str,srv);
+    }
+    lsock->srv_list = g_list_remove(lsock->srv_list, srv);
+    lsock->fast_schedule = 1;
+    for (slist = g_list_first(lsock->srv_list); slist != NULL; slist = slist->next) {
+        struct l7vs_service* s = (struct l7vs_service*) slist->data;
+        if (s != NULL && s->pm != NULL && s->pm->fast_schedule == 0) {
+            lsock->fast_schedule = 0;
+            break;
+        }
+    }
+    if (logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,97,
+            "out_fuction:  void l7vs_lsock_remove_service (struct l7vs_lsock *lsock,struct l7vs_service *srv)"
+            "lsock: %s,srv : %p",
+            lsock_str,srv);
+    }
 }
 
 /*!
  * socket acception function.
- * @param[in]  socket option
- * @return     success = 0 / false = -1
+ * @param[in]   lsock   socket option
+ * @return      success = 0 / false = -1
  */
 static int
 l7vs_lsock_accept(struct l7vs_lsock *lsock)
 {
-       if(lsock == NULL)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,20, "error / lsock is null");
-               if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,50,
-                                "out_fuction:  int l7vs_lsock_accept return -1");
-               }
-               return -1;
-       }
-       if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       char lsock_str[DEBUG_STR_LEN] = {0};
-                       l7vs_lsock_c_str(lsock_str, lsock);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,51,
-                "in_fuction:  int l7vs_lsock_accept (struct l7vs_lsock *lsock)"
-               "lsock: %s",
-               lsock_str);
-       }
-       if (iomux_lsock_accepted != lsock->iom->status)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,21, "error / invalid status(%d)", lsock->iom->status);
-               if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,52,
-                                "out_fuction:  int l7vs_lsock_accept return -1");
-               }
-               return -1;
-       }
-
-        if (!l7vs_conn_create(lsock->iom->fd, lsock))
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,22, "error / conn create failed");
-               lsock->iom->status = iomux_lsock_conn_create_error;
-               if(logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,8,
-                                "out_fuction:  int l7vs_lsock_accept return -1");
-               }
-               return -1;
-       }
-
-       lsock->iom->status = iomux_lsock_conn_created;
-       if(logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG){
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,9,
-                "out_fuction:  int l7vs_lsock_accept return 0");
-       }
-       return 0;
+    if (lsock == NULL) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,20, "error / lsock is null");
+        if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,50,
+                "out_fuction:  int l7vs_lsock_accept return -1");
+        }
+        return -1;
+    }
+    if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+        char lsock_str[DEBUG_STR_LEN] = {0};
+        l7vs_lsock_c_str(lsock_str, lsock);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,51,
+            "in_fuction:  int l7vs_lsock_accept (struct l7vs_lsock *lsock)"
+            "lsock: %s", lsock_str);
+    }
+    if (iomux_lsock_accepted != lsock->iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,21, "error / invalid status(%d)", lsock->iom->status);
+        if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,52,
+                "out_fuction:  int l7vs_lsock_accept return -1");
+        }
+        return -1;
+    }
+
+    if (!l7vs_conn_create(lsock->iom->fd, lsock)) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,22, "error / conn create failed");
+        lsock->iom->status = iomux_lsock_conn_create_error;
+        if (logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,8,
+                "out_fuction:  int l7vs_lsock_accept return -1");
+        }
+        return -1;
+    }
+
+    lsock->iom->status = iomux_lsock_conn_created;
+    if (logger_get_log_level(LOG_CAT_L7VSD_ENVIRONMENT) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_ENVIRONMENT,9,
+            "out_fuction:  int l7vs_lsock_accept return 0");
+    }
+    return 0;
 }
 
 /*!
  * ListeningSocket call back function.
- * @param[in]  socket option
- * @return     success = 0 / false = -1
+ * @param[in]   iom socket option
+ * @return      success = 0 / false = -1
  */
 static int
 l7vs_lsock_callback(struct l7vs_iomux *iom )
 {
+    int ret;
 
-       int ret;
-
-       if(iom == NULL)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,23, "error / iom is null");
-               if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,53,
-                       "out_fuction:  int l7vs_lsock_callback return -1");
-               }
-               return -1;
-       }
-
-       if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       char iomux_str[DEBUG_STR_LEN] = {0};
-               l7vs_iomux_c_str(iomux_str,iom);
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,54,
-                "in_fuction:  int l7vs_lsock_callback (struct l7vs_iomux *iom)"
-               "iom: %s",
-               iomux_str);
-       }
-
-       if (iomux_lsock_connect_waiting != iom->status)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,24, "error / invalid status(%d)", iom->status);
-               if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,55,
-                       "out_fuction:  int l7vs_lsock_callback return -1");
-               }
-               return -1;
-       }
-
-       iom->status = iomux_lsock_accepted;
-        ret = l7vs_lsock_accept((struct l7vs_lsock *)iom->data); //for accepting data from clients
-       if (-1 == ret)
-       {
-               LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,25, "error / lsock accept failed");
-               iom->status = iomux_lsock_connect_waiting;
-               l7vs_iomux_mod( iom, iom_read );
-               if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-                       LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,56,
-                       "out_fuction:  int l7vs_lsock_callback return -1");
-               }
-               return -1;
-       }
-
-       iom->status = iomux_lsock_connect_waiting;
-       l7vs_iomux_mod( iom, iom_read );
-       if(logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG){
-               LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,57,
-               "out_fuction:  int l7vs_lsock_callback return 0");
-       }
-
-       return 0; 
-}
+    if (iom == NULL) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,23, "error / iom is null");
+        if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,53,
+                "out_fuction:  int l7vs_lsock_callback return -1");
+        }
+        return -1;
+    }
+
+    if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+        char iomux_str[DEBUG_STR_LEN] = {0};
+        l7vs_iomux_c_str(iomux_str,iom);
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,54,
+            "in_fuction:  int l7vs_lsock_callback (struct l7vs_iomux *iom)"
+            "iom: %s", iomux_str);
+    }
+
+    if (iomux_lsock_connect_waiting != iom->status) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,24, "error / invalid status(%d)", iom->status);
+        if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,55,
+                "out_fuction:  int l7vs_lsock_callback return -1");
+        }
+        return -1;
+    }
+
+    iom->status = iomux_lsock_accepted;
+    ret = l7vs_lsock_accept((struct l7vs_lsock *)iom->data); //for accepting data from clients
+    if (-1 == ret) {
+        LOGGER_PUT_LOG_ERROR(LOG_CAT_L7VSD_EVENT,25, "error / lsock accept failed");
+        iom->status = iomux_lsock_connect_waiting;
+        l7vs_iomux_mod( iom, iom_read );
+        if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+            LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,56,
+                "out_fuction:  int l7vs_lsock_callback return -1");
+        }
+        return -1;
+    }
+
+    iom->status = iomux_lsock_connect_waiting;
+    l7vs_iomux_mod( iom, iom_read );
+    if (logger_get_log_level(LOG_CAT_L7VSD_EVENT) == LOG_LV_DEBUG) {
+        LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_EVENT,57,
+            "out_fuction:  int l7vs_lsock_callback return 0");
+    }
 
+    return 0; 
+}