tcp: config option to disable active connects
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Thu, 5 Mar 2009 17:21:30 +0000 (17:21 +0000)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Thu, 5 Mar 2009 17:21:30 +0000 (17:21 +0000)
- added new config option to disable active connects. If set ser
  will only accept new connection, it will not actively open new
  ones.
  The option can be set both in ser.cfg (tcp_no_connect=yes) or
  at runtime (sercmd cfg.set_now_int tcp no_connect 1).

NEWS
cfg.lex
cfg.y
core_cmd.c
tcp_main.c
tcp_options.c
tcp_options.h

diff --git a/NEWS b/NEWS
index ad12ca4..e889550 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -209,12 +209,15 @@ modules:
                         - t_set_retr(t1, t2) - changes the retransmissions
                            intervals on the fly, on a per transaction basis.
 core:
+             - most tcp config vars migrated to the dynamic config framework
+               (can be changed at runtime, e.g. 
+                 sercmd cfg.set_now_int tcp connection_lifetime 180 )
              - fallback to tcp or other congestion controlled transport 
                protocol if a forwarded udp sip request is greater then 
                udp_mtu (config). Default off. See udp_mtu and 
                udp_mtu_try_proto.
              - sctp support (one-to-many, work in progress, for now linux
-               only with no fallback to one-to-one on full send buffers)
+               and freebsd only)
              - partial cygwin (windows) support revived: core+static modules, 
                no ipv6, no tcp, no dynamic modules
              - most of the config variables can now be changed on the fly,
@@ -233,6 +236,9 @@ core:
                between the short name and long name in cache as CNAME record
 
 new config variables:
+  tcp_no_connect = yes/no - disable connects, ser will only accept new 
+                     connections, it will never try to open new ones.
+                     Default: no, can be changed at runtime.
   udp_mtu = number - fallback to another protocol (udp_mtu_try_proto must be
                      set also either globally or per packet) if the constructed
                      request size is greater then udp_mtu.
diff --git a/cfg.lex b/cfg.lex
index e36a625..b8d2877 100644 (file)
--- a/cfg.lex
+++ b/cfg.lex
@@ -298,6 +298,7 @@ TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
 TCP_CON_LIFETIME       "tcp_connection_lifetime"
 TCP_POLL_METHOD                "tcp_poll_method"
 TCP_MAX_CONNECTIONS    "tcp_max_connections"
+TCP_NO_CONNECT         "tcp_no_connect"
 TCP_SOURCE_IPV4                "tcp_source_ipv4"
 TCP_SOURCE_IPV6                "tcp_source_ipv6"
 TCP_OPT_FD_CACHE       "tcp_fd_cache"
@@ -592,6 +593,8 @@ EAT_ABLE    [\ \t\b\r]
                                                                        return TCP_POLL_METHOD; }
 <INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
                                                                        return TCP_MAX_CONNECTIONS; }
+<INITIAL>{TCP_NO_CONNECT}              { count(); yylval.strval=yytext;
+                                                                       return TCP_NO_CONNECT; }
 <INITIAL>{TCP_SOURCE_IPV4}             { count(); yylval.strval=yytext;
                                                                        return TCP_SOURCE_IPV4; }
 <INITIAL>{TCP_SOURCE_IPV6}             { count(); yylval.strval=yytext;
diff --git a/cfg.y b/cfg.y
index 1523af1..04d5d3e 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -351,6 +351,7 @@ static void free_socket_id_lst(struct socket_id* i);
 %token TCP_CON_LIFETIME
 %token TCP_POLL_METHOD
 %token TCP_MAX_CONNECTIONS
+%token TCP_NO_CONNECT
 %token TCP_SOURCE_IPV4
 %token TCP_SOURCE_IPV6
 %token TCP_OPT_FD_CACHE
@@ -839,6 +840,14 @@ assign_stm:
                #endif
        }
        | TCP_MAX_CONNECTIONS EQUAL error { yyerror("number expected"); }
+       | TCP_NO_CONNECT EQUAL NUMBER {
+               #ifdef USE_TCP
+                       tcp_default_cfg.no_connect=$3;
+               #else
+                       warn("tcp support not compiled in");
+               #endif
+       }
+       | TCP_NO_CONNECT EQUAL error { yyerror("boolean value expected"); }
        | TCP_SOURCE_IPV4 EQUAL ipv4 {
                #ifdef USE_TCP
                        if (tcp_set_src_addr($3)<0)
index d2d7aed..c22e59e 100644 (file)
@@ -565,11 +565,12 @@ static void core_tcp_options(rpc_t* rpc, void* c)
        if (!tcp_disable){
                tcp_options_get(&t);
                rpc->add(c, "{", &handle);
-               rpc->struct_add(handle, "dddddddddddddddddddddd",
+               rpc->struct_add(handle, "ddddddddddddddddddddddd",
                        "connect_timeout", t.connect_timeout_s,
                        "send_timeout",  t.send_timeout_s,
                        "connection_lifetime",  t.con_lifetime_s,
                        "max_connections(soft)", t.max_connections,
+                       "no_connect",   t.no_connect,
                        "fd_cache",             t.fd_cache,
                        "async",                t.async,
                        "connect_wait", t.tcp_connect_wait,
index 86fedb7..ecf9ebf 100644 (file)
@@ -1659,6 +1659,9 @@ int tcp_send(struct dest_info* dst, union sockaddr_union* from,
        }
 no_id:
                if (unlikely(c==0)){
+                       /* check if connect() is disabled */
+                       if (cfg_get(tcp, tcp_cfg, no_connect))
+                               return -1;
                        DBG("tcp_send: no open tcp connection found, opening new one\n");
                        /* create tcp connection */
                        if (likely(from==0)){
index f66a7ae..21591d1 100644 (file)
@@ -88,6 +88,8 @@ static cfg_def_t tcp_cfg_def[] = {
        { "max_connections", CFG_VAR_INT | CFG_ATOMIC, 0, (1U<<31)-1,
                                                                                                               fix_max_conns,    0,
                "maximum connection number, soft limit"},
+       { "no_connect",   CFG_VAR_INT | CFG_ATOMIC,      0,   1,      0,         0,
+               "if set only accept new connections, never actively open new ones"},
        { "fd_cache",     CFG_VAR_INT | CFG_READONLY,    0,   1,      0,         0,
                "file descriptor cache for tcp_send"},
        /* tcp async options */
index 7a05e59..24df41e 100644 (file)
@@ -115,6 +115,7 @@ struct cfg_group_tcp{
        int send_timeout_s; /* in s */
        int con_lifetime_s; /* in s */
        int max_connections;
+       int no_connect; /* do not open any new tcp connection (but accept them) */
        int fd_cache; /* on /off */
        /* tcp async options */
        int async; /* on / off */