[sr-dev] git:master:600490c5: core: new global parameter bind_ipv6_link_local

Daniel-Constantin Mierla miconda at gmail.com
Thu Apr 25 21:03:10 CEST 2019


Module: kamailio
Branch: master
Commit: 600490c546502786eaef1f2bfbeb18a5bb2a2ee1
URL: https://github.com/kamailio/kamailio/commit/600490c546502786eaef1f2bfbeb18a5bb2a2ee1

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2019-04-25T21:01:12+02:00

core: new global parameter bind_ipv6_link_local

- if set to 1, try to bind also IPv6 link local addresses by discovering
the scope of the interface
- apply it for udp socket for now, to be added for the other cases

---

Modified: src/core/cfg.lex
Modified: src/core/cfg.y
Modified: src/core/globals.h
Modified: src/core/udp_server.c
Modified: src/main.c

---

Diff:  https://github.com/kamailio/kamailio/commit/600490c546502786eaef1f2bfbeb18a5bb2a2ee1.diff
Patch: https://github.com/kamailio/kamailio/commit/600490c546502786eaef1f2bfbeb18a5bb2a2ee1.patch

---

diff --git a/src/core/cfg.lex b/src/core/cfg.lex
index 706c1b05ce..dd1b935d8f 100644
--- a/src/core/cfg.lex
+++ b/src/core/cfg.lex
@@ -329,6 +329,7 @@ DNS_CACHE_DEL_NONEXP	dns_cache_del_nonexp|dns_cache_delete_nonexpired
 DNS_CACHE_REC_PREF	dns_cache_rec_pref
 /* ipv6 auto bind */
 AUTO_BIND_IPV6		auto_bind_ipv6
+BIND_IPV6_LINK_LOCAL	bind_ipv6_link_local
 /* blacklist */
 DST_BLST_INIT	dst_blacklist_init
 USE_DST_BLST		use_dst_blacklist
@@ -763,6 +764,8 @@ IMPORTFILE      "import_file"
 								return DNS_CACHE_REC_PREF; }
 <INITIAL>{AUTO_BIND_IPV6}	{ count(); yylval.strval=yytext;
 								return AUTO_BIND_IPV6; }
+<INITIAL>{BIND_IPV6_LINK_LOCAL}	{ count(); yylval.strval=yytext;
+								return BIND_IPV6_LINK_LOCAL; }
 <INITIAL>{DST_BLST_INIT}	{ count(); yylval.strval=yytext;
 								return DST_BLST_INIT; }
 <INITIAL>{USE_DST_BLST}	{ count(); yylval.strval=yytext;
diff --git a/src/core/cfg.y b/src/core/cfg.y
index 2610364481..4c7dcd1307 100644
--- a/src/core/cfg.y
+++ b/src/core/cfg.y
@@ -357,6 +357,7 @@ extern char *default_routename;
 
 /* ipv6 auto bind */
 %token AUTO_BIND_IPV6
+%token BIND_IPV6_LINK_LOCAL
 
 /*blacklist*/
 %token DST_BLST_INIT
@@ -867,6 +868,8 @@ assign_stm:
 	| DNS_CACHE_REC_PREF error { yyerror("boolean value expected"); }
 	| AUTO_BIND_IPV6 EQUAL NUMBER {IF_AUTO_BIND_IPV6(auto_bind_ipv6 = $3);}
 	| AUTO_BIND_IPV6 error { yyerror("boolean value expected"); }
+	| BIND_IPV6_LINK_LOCAL EQUAL NUMBER {sr_bind_ipv6_link_local = $3;}
+	| BIND_IPV6_LINK_LOCAL 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/src/core/globals.h b/src/core/globals.h
index 0e9e950c62..3790058075 100644
--- a/src/core/globals.h
+++ b/src/core/globals.h
@@ -140,6 +140,7 @@ extern char* mcast;
 #endif /* USE_MCAST */
 
 extern int auto_bind_ipv6;
+extern int sr_bind_ipv6_link_local;
 
 extern int tos;
 extern int pmtu_discovery;
diff --git a/src/core/udp_server.c b/src/core/udp_server.c
index 7017b85c7b..2b874ab2ed 100644
--- a/src/core/udp_server.c
+++ b/src/core/udp_server.c
@@ -49,6 +49,7 @@
 #include "receive.h"
 #include "mem/mem.h"
 #include "ip_addr.h"
+#include "socket_info.h"
 #include "cfg/cfg_struct.h"
 #include "events.h"
 #include "stun.h"
@@ -319,6 +320,11 @@ int udp_init(struct socket_info* sock_info)
 			LM_WARN("setsockopt v6 tos: %s\n", strerror(errno));
 			/* continue since this is not critical */
 		}
+		if(sr_bind_ipv6_link_local!=0) {
+			LM_INFO("setting scope of %s\n", sock_info->address_str.s);
+			addr->sin6.sin6_scope_id =
+					ipv6_get_netif_scope(sock_info->address_str.s);
+		}
 	}
 
 #if defined (__OS_linux) && defined(UDP_ERRORS)
@@ -397,8 +403,9 @@ int udp_init(struct socket_info* sock_info)
 				(unsigned)sockaddru_len(*addr),
 				sock_info->address_str.s,
 				strerror(errno));
-		if (addr->s.sa_family==AF_INET6)
-			LM_ERR("might be caused by using a link local address, try site local or global\n");
+		if (addr->s.sa_family==AF_INET6) {
+			LM_ERR("might be caused by using a link local address, is 'bind_ipv6_link_local' set?\n");
+		}
 		goto error;
 	}
 
diff --git a/src/main.c b/src/main.c
index d052ee4e97..6d6d390306 100644
--- a/src/main.c
+++ b/src/main.c
@@ -426,6 +426,7 @@ int tos = IPTOS_LOWDELAY;
 int pmtu_discovery = 0;
 
 int auto_bind_ipv6 = 0;
+int sr_bind_ipv6_link_local = 0;
 
 struct socket_info* udp_listen=0;
 #ifdef USE_TCP




More information about the sr-dev mailing list