Module: sip-router
Branch: mariuszbihlei/ipv6_fix
Commit: 4107cdd4a2e1c33617e3c1bb4551664b6668900c
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4107cdd…
Author: Marius Zbihlei <marius.zbihlei(a)1and1.ro>
Committer: Marius Zbihlei <marius.zbihlei(a)1and1.ro>
Date: Tue Oct 11 11:35:56 2011 +0300
core: added parameter to enable/disable automatic binding of ipv6 interfaces
TODO: documentation
---
cfg.lex | 4 ++++
cfg.y | 11 +++++++++++
cfg_core.c | 8 ++++++++
cfg_core.h | 5 +++++
socket_info.c | 18 +++++++++---------
5 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/cfg.lex b/cfg.lex
index ff35a8a..4a19fe1 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -370,6 +370,8 @@ DNS_CACHE_MAX_TTL dns_cache_max_ttl
DNS_CACHE_MEM dns_cache_mem
DNS_CACHE_GC_INT dns_cache_gc_interval
DNS_CACHE_DEL_NONEXP dns_cache_del_nonexp|dns_cache_delete_nonexpired
+/* ipv6 auto bind */
+AUTO_BIND_IPV6 auto_bind_ipv6
/* blacklist */
DST_BLST_INIT dst_blacklist_init
USE_DST_BLST use_dst_blacklist
@@ -751,6 +753,8 @@ IMPORTFILE "import_file"
return DNS_CACHE_GC_INT; }
<INITIAL>{DNS_CACHE_DEL_NONEXP} { count(); yylval.strval=yytext;
return DNS_CACHE_DEL_NONEXP; }
+<INITIAL>{AUTO_BIND_IPV6} { count(); yylval.strval=yytext;
+ return AUTO_BIND_IPV6; }
<INITIAL>{DST_BLST_INIT} { count(); yylval.strval=yytext;
return DST_BLST_INIT; }
<INITIAL>{USE_DST_BLST} { count(); yylval.strval=yytext;
diff --git a/cfg.y b/cfg.y
index 4290e41..ab9b126 100644
--- a/cfg.y
+++ b/cfg.y
@@ -164,6 +164,11 @@
if (rt!=ONSEND_ROUTE) yyerror( s " allowed only in onsend_routes");\
}while(0)
+#ifdef USE_IPV6
+ #define IF_AUTO_BIND_IPV6(x) x
+#else
+ #define IF_AUTO_BIND_IPV6(x) warn("IPV6 support not compiled");
+#endif
#ifdef USE_DNS_CACHE
#define IF_DNS_CACHE(x) x
@@ -419,6 +424,10 @@ extern char *finame;
%token DNS_CACHE_MEM
%token DNS_CACHE_GC_INT
%token DNS_CACHE_DEL_NONEXP
+
+/* ipv6 auto bind */
+%token AUTO_BIND_IPV6
+
/*blacklist*/
%token DST_BLST_INIT
%token USE_DST_BLST
@@ -877,6 +886,8 @@ assign_stm:
| DNS_CACHE_GC_INT error { yyerror("boolean value expected"); }
| DNS_CACHE_DEL_NONEXP EQUAL NUMBER {
IF_DNS_CACHE(default_core_cfg.dns_cache_del_nonexp=$3); }
| DNS_CACHE_DEL_NONEXP error { yyerror("boolean value expected"); }
+ | AUTO_BIND_IPV6 EQUAL NUMBER {IF_AUTO_BIND_IPV6(default_core_cfg.auto_bind_ipv6 =
$3);}
+ | AUTO_BIND_IPV6 error { yyerror("boolean value expected"); }
| DST_BLST_INIT EQUAL NUMBER { IF_DST_BLACKLIST(dst_blacklist_init=$3); }
| DST_BLST_INIT error { yyerror("boolean value expected"); }
| USE_DST_BLST EQUAL NUMBER {
diff --git a/cfg_core.c b/cfg_core.c
index 27a55b3..bd5a00d 100644
--- a/cfg_core.c
+++ b/cfg_core.c
@@ -105,6 +105,9 @@ struct cfg_group_core default_core_cfg = {
0, /*!< dns_cache_del_nonexp -- delete only expired entries by default */
0, /*!< dns_cache_rec_pref -- 0 by default, do not check the existing entries. */
#endif
+#ifdef USE_IPV6
+ 0, /*!< auto_bind_ipv6 -- off by default */
+#endif
#ifdef PKG_MALLOC
0, /*!< mem_dump_pkg */
#endif
@@ -272,6 +275,11 @@ cfg_def_t core_cfg_def[] = {
" 2 - prefer new records"
" 3 - prefer records with longer lifetime"},
#endif
+#ifdef USE_IPV6
+ {"auto_bind_ipv6", CFG_VAR_INT, 0, 1, 0, 0, 0,
+ "enable/disable auto binding of proxy to IPV6 interfaces."
+ "default is disabled 0"},
+#endif
#ifdef PKG_MALLOC
{"mem_dump_pkg", CFG_VAR_INT, 0, 0, 0, mem_dump_pkg_cb,
"dump process memory status, parameter: pid_number"},
diff --git a/cfg_core.h b/cfg_core.h
index 25f69ae..ada5b89 100644
--- a/cfg_core.h
+++ b/cfg_core.h
@@ -93,6 +93,11 @@ struct cfg_group_core {
int dns_cache_del_nonexp;
int dns_cache_rec_pref;
#endif
+
+#ifdef USE_IPV6
+ int auto_bind_ipv6;
+#endif
+
#ifdef PKG_MALLOC
int mem_dump_pkg;
#endif
diff --git a/socket_info.c b/socket_info.c
index 73a5cf3..4e7d27e 100644
--- a/socket_info.c
+++ b/socket_info.c
@@ -1712,9 +1712,9 @@ int fix_all_socket_lists()
if ( ( (add_interfaces(0, AF_INET, 0, PROTO_UDP, &ai_lst)==0)
#ifdef USE_IPV6
#ifdef __OS_linux
- && (add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_UDP, &ai_lst) == 0)
+ && (!(cfg_get(core, core_cfg, auto_bind_ipv6)) ||
add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_UDP, &ai_lst) == 0)
#else
- && (add_interfaces(0, AF_INET6, 0, PROTO_UDP, &ai_lst)==0) /*
add_interface does not work for IPv6 on Linux */
+ && ( !(cfg_get(core, core_cfg, auto_bind_ipv6)) || add_interfaces(0, AF_INET6,
0, PROTO_UDP, &ai_lst) !=0 ) /* add_interface does not work for IPv6 on Linux */
#endif /* __OS_linux */
#endif /* USE_IPV6 */
) && (addr_info_to_si_lst(ai_lst, 0, PROTO_UDP, 0, &udp_listen)==0)){
@@ -1726,12 +1726,12 @@ int fix_all_socket_lists()
if ( ((add_interfaces(0, AF_INET, 0, PROTO_TCP, &ai_lst)!=0)
#ifdef USE_IPV6
#ifdef __OS_linux
- || (add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_TCP, &ai_lst) != 0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) &&
add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_TCP, &ai_lst) != 0)
#else
- || (add_interfaces(0, AF_INET6, 0, PROTO_TCP, &ai_lst)!=0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) && add_interfaces(0, AF_INET6, 0,
PROTO_TCP, &ai_lst) !=0 )
#endif /* __OS_linux */
#endif /* USE_IPV6 */
- )|| (addr_info_to_si_lst(ai_lst, 0, PROTO_TCP, 0,
+ ) || (addr_info_to_si_lst(ai_lst, 0, PROTO_TCP, 0,
&tcp_listen)!=0))
goto error;
free_addr_info_lst(&ai_lst);
@@ -1742,9 +1742,9 @@ int fix_all_socket_lists()
&ai_lst)!=0)
#ifdef USE_IPV6
#ifdef __OS_linux
- || (add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_TLS, &ai_lst) != 0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) &&
add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_TLS, &ai_lst) != 0)
#else
- || (add_interfaces(0, AF_INET6, 0, PROTO_TLS, &ai_lst)!=0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) && add_interfaces(0, AF_INET6, 0,
PROTO_TLS, &ai_lst)!=0)
#endif /* __OS_linux */
#endif /* USE_IPV6 */
) || (addr_info_to_si_lst(ai_lst, 0, PROTO_TLS, 0,
@@ -1761,9 +1761,9 @@ int fix_all_socket_lists()
if (((add_interfaces(0, AF_INET, 0, PROTO_SCTP, &ai_lst)!=0)
#ifdef USE_IPV6
#ifdef __OS_linux
- || (add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_SCTP, &ai_lst) != 0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) &&
add_interfaces_via_netlink(0, AF_INET6, 0, PROTO_SCTP, &ai_lst) != 0)
#else
- || (add_interfaces(0, AF_INET6, 0, PROTO_SCTP, &ai_lst)!=0)
+ || (cfg_get(core, core_cfg, auto_bind_ipv6) && add_interfaces(0, AF_INET6, 0,
PROTO_SCTP, &ai_lst) != 0)
#endif /* __OS_linux */
#endif /* USE_IPV6 */
) || (addr_info_to_si_lst(ai_lst, 0, PROTO_SCTP, 0,