浏览代码

core: new parameter ip_free_bind

- control if binding to non local ip should be attempted
- default is 0 (do not try to bind to non local ip address)
Daniel-Constantin Mierla 8 年之前
父节点
当前提交
66595f39a4
共有 7 个文件被更改,包括 13 次插入5 次删除
  1. 2 0
      src/core/cfg.lex
  2. 3 0
      src/core/cfg.y
  3. 1 0
      src/core/globals.h
  4. 2 0
      src/core/receive.c
  5. 2 2
      src/core/tcp_main.c
  6. 2 2
      src/core/udp_server.c
  7. 1 1
      src/modules/sctp/sctp_server.c

+ 2 - 0
src/core/cfg.lex

@@ -337,6 +337,7 @@ DST_BLST_TCP_IMASK	dst_blacklist_tcp_imask
 DST_BLST_TLS_IMASK	dst_blacklist_tls_imask
 DST_BLST_SCTP_IMASK	dst_blacklist_sctp_imask
 
+IP_FREE_BIND		ip_free_bind|ip_freebind|ipfreebind
 
 PORT	port
 STAT	statistics
@@ -758,6 +759,7 @@ IMPORTFILE      "import_file"
 								return DST_BLST_TLS_IMASK; }
 <INITIAL>{DST_BLST_SCTP_IMASK}	{ count(); yylval.strval=yytext;
 								return DST_BLST_SCTP_IMASK; }
+<INITIAL>{IP_FREE_BIND}	{ count(); yylval.strval=yytext; return IP_FREE_BIND; }
 <INITIAL>{PORT}	{ count(); yylval.strval=yytext; return PORT; }
 <INITIAL>{STAT}	{ count(); yylval.strval=yytext; return STAT; }
 <INITIAL>{MAXBUFFER}	{ count(); yylval.strval=yytext; return MAXBUFFER; }

+ 3 - 0
src/core/cfg.y

@@ -368,6 +368,7 @@ extern char *default_routename;
 %token DST_BLST_TCP_IMASK
 %token DST_BLST_TLS_IMASK
 %token DST_BLST_SCTP_IMASK
+%token IP_FREE_BIND
 
 %token PORT
 %token STAT
@@ -873,6 +874,8 @@ assign_stm:
 		IF_DST_BLACKLIST(default_core_cfg.blst_sctp_imask=$3);
 	}
 	| DST_BLST_SCTP_IMASK error { yyerror("number(flags) expected"); }
+	| IP_FREE_BIND EQUAL intno { _sr_ip_free_bind=$3; }
+	| IP_FREE_BIND EQUAL error { yyerror("int value expected"); }
 	| PORT EQUAL NUMBER   { port_no=$3; }
 	| STAT EQUAL STRING {
 		#ifdef STATS

+ 1 - 0
src/core/globals.h

@@ -201,6 +201,7 @@ extern int rt_timer1_policy; /* "fast" timer, SCHED_OTHER */
 extern int rt_timer2_policy; /* "slow" timer, SCHED_OTHER */
 
 extern int http_reply_parse;
+extern int _sr_ip_free_bind;
 
 #ifdef USE_DNS_CACHE
 extern int dns_cache_init; /* if 0, the DNS cache is not initialized at startup */

+ 2 - 0
src/core/receive.c

@@ -60,6 +60,8 @@
 #include <mem/dmalloc.h>
 #endif
 
+int _sr_ip_free_bind = 0;
+
 unsigned int msg_no=0;
 /* address preset vars */
 str default_global_address={0,0};

+ 2 - 2
src/core/tcp_main.c

@@ -2786,8 +2786,8 @@ int tcp_init(struct socket_info* sock_info)
 #if defined(IP_FREEBIND)
 	/* allow bind to non local address.
 	 * useful when daemon started before network initialized */
-	if (setsockopt(sock_info->socket, IPPROTO_IP, IP_FREEBIND,
-				(void*)&optval, sizeof(optval)) ==-1) {
+	if (_sr_ip_free_bind && setsockopt(sock_info->socket, IPPROTO_IP,
+				IP_FREEBIND, (void*)&optval, sizeof(optval)) ==-1) {
 		LM_WARN("setsockopt freebind failed: %s\n", strerror(errno));
 		/* continue since this is not critical */
 	}

+ 2 - 2
src/core/udp_server.c

@@ -343,8 +343,8 @@ int udp_init(struct socket_info* sock_info)
 	/* allow bind to non local address.
 	 * useful when daemon started before network initialized */
 	optval = 1;
-	if (setsockopt(sock_info->socket, IPPROTO_IP, IP_FREEBIND,
-				(void*)&optval, sizeof(optval)) ==-1) {
+	if (_sr_ip_free_bind && setsockopt(sock_info->socket, IPPROTO_IP,
+				IP_FREEBIND, (void*)&optval, sizeof(optval)) ==-1) {
 		LM_WARN("setsockopt freebind failed: %s\n", strerror(errno));
 		/* continue since this is not critical */
 	}

+ 1 - 1
src/modules/sctp/sctp_server.c

@@ -473,7 +473,7 @@ static int sctp_init_sock_opt_common(int s, int af)
 	/* allow bind to non local address.
 	 * useful when daemon started before network initialized */
 	optval = 1;
-	if (setsockopt(s, IPPROTO_IP, IP_FREEBIND,
+	if (_sr_ip_free_bind && setsockopt(s, IPPROTO_IP, IP_FREEBIND,
 				(void*)&optval, sizeof(optval)) ==-1) {
 		LM_WARN("setsockopt freebind failed: %s\n", strerror(errno));
 		/* continue since this is not critical */