浏览代码

tcp: config option to disable active connects

- 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).
Andrei Pelinescu-Onciul 16 年之前
父节点
当前提交
de223f0173
共有 7 个文件被更改,包括 27 次插入2 次删除
  1. 7 1
      NEWS
  2. 3 0
      cfg.lex
  3. 9 0
      cfg.y
  4. 2 1
      core_cmd.c
  5. 3 0
      tcp_main.c
  6. 2 0
      tcp_options.c
  7. 1 0
      tcp_options.h

+ 7 - 1
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.

+ 3 - 0
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;

+ 9 - 0
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)

+ 2 - 1
core_cmd.c

@@ -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,

+ 3 - 0
tcp_main.c

@@ -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)){

+ 2 - 0
tcp_options.c

@@ -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 */

+ 1 - 0
tcp_options.h

@@ -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 */