[asterisk-commits] oej: branch group/pine-multiple-externip-trunk r288959 - in /team/group/pine-...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Sep 27 13:31:18 CDT 2010


Author: oej
Date: Mon Sep 27 13:31:12 2010
New Revision: 288959

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=288959
Log:
...and the trunk version made in air between France and Sweden...

Modified:
    team/group/pine-multiple-externip-trunk/channels/chan_sip.c
    team/group/pine-multiple-externip-trunk/channels/sip/include/sip.h
    team/group/pine-multiple-externip-trunk/configs/sip.conf.sample

Modified: team/group/pine-multiple-externip-trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pine-multiple-externip-trunk/channels/chan_sip.c?view=diff&rev=288959&r1=288958&r2=288959
==============================================================================
--- team/group/pine-multiple-externip-trunk/channels/chan_sip.c (original)
+++ team/group/pine-multiple-externip-trunk/channels/chan_sip.c Mon Sep 27 13:31:12 2010
@@ -3166,6 +3166,11 @@
 static void ast_sip_ouraddrfor(const struct ast_sockaddr *them, struct ast_sockaddr *us, struct sip_pvt *p)
 {
 	struct ast_sockaddr theirs;
+	struct ast_sockaddr *myexternaddr;
+
+	/* Pick which externaddr to use. If the dialog has one configured, use it.
+	   Otherwise, use the default one. */
+	myexternaddr = !ast_sockaddr_isnull(&p->externaddr) ? &p->externaddr : &externaddr;
 
 	/* Set want_remap to non-zero if we want to remap 'us' to an externally
 	 * reachable IP address and port. This is done if:
@@ -3187,14 +3192,15 @@
 	ast_sockaddr_copy(&theirs, them);
 
 	if (ast_sockaddr_is_ipv6(&theirs)) {
-		if (localaddr && !ast_sockaddr_isnull(&externaddr)) {
+		if (localaddr && !ast_sockaddr_isnull(myexternaddr)) {
 			ast_log(LOG_WARNING, "Address remapping activated in sip.conf "
 				"but we're using IPv6, which doesn't need it. Please "
 				"remove \"localnet\" and/or \"externaddr\" settings.\n");
+				/* THIS IS VERY, VERY WRONG as IPv6 includes IPv4. */
 		}
 	} else {
 		want_remap = localaddr &&
-			!ast_sockaddr_isnull(&externaddr) &&
+			!ast_sockaddr_isnull(myexternaddr) &&
 			ast_apply_ha(localaddr, &theirs) == AST_SENSE_ALLOW ;
 	}
 
@@ -3207,13 +3213,13 @@
 			}
 			externexpire = time(NULL) + externrefresh;
 		}
-		if (!ast_sockaddr_isnull(&externaddr)) {
-			ast_sockaddr_copy(us, &externaddr);
+		if (!ast_sockaddr_isnull(myexternaddr)) {
+			ast_sockaddr_copy(us, myexternaddr);
 			switch (p->socket.type) {
 			case SIP_TRANSPORT_TCP:
-				if (!externtcpport && ast_sockaddr_port(&externaddr)) {
+				if (!externtcpport && ast_sockaddr_port(myexternaddr)) {
 					/* for consistency, default to the externaddr port */
-					externtcpport = ast_sockaddr_port(&externaddr);
+					externtcpport = ast_sockaddr_port(myexternaddr);
 				}
 				ast_sockaddr_set_port(us, externtcpport);
 				break;
@@ -3221,7 +3227,7 @@
 				ast_sockaddr_set_port(us, externtlsport);
 				break;
 			case SIP_TRANSPORT_UDP:
-				if (!ast_sockaddr_port(&externaddr)) {
+				if (!ast_sockaddr_port(myexternaddr)) {
 					ast_sockaddr_set_port(us, ast_sockaddr_port(&bindaddr));
 				}
 				break;
@@ -3229,8 +3235,8 @@
 				break;
 			}
 		}
-		ast_debug(1, "Target address %s is not local, substituting externaddr\n",
-			  ast_sockaddr_stringify(them));
+		ast_debug(1, "Target address %s is not local, substituting to externaddr %s\n",
+			  ast_sockaddr_stringify(them), ast_sockaddr_stringify(myexternaddr));
 	} else if (p) {
 		/* no remapping, but we bind to a specific address, so use it. */
 		switch (p->socket.type) {
@@ -4966,6 +4972,11 @@
 		ast_set_flag(&dialog->flags[0], SIP_CALL_LIMIT);
 	if (!dialog->portinuri)
 		dialog->portinuri = peer->portinuri;
+	if (!ast_sockaddr_isnull(&peer->externaddr)) {
+		ast_sockaddr_copy(&dialog->externaddr, &peer->externaddr);
+	} else {
+		ast_sockaddr_copy(&dialog->externaddr, &externaddr);
+	}
 	dialog->chanvars = copy_vars(peer->chanvars);
 	if (peer->fromdomainport)
 		dialog->fromdomainport = peer->fromdomainport;
@@ -16991,7 +17002,7 @@
 		msg = "Enabled using externaddr";
 	ast_cli(a->fd, "  SIP address remapping:  %s\n", msg);
 	ast_cli(a->fd, "  Externhost:             %s\n", S_OR(externhost, "<none>"));
-	ast_cli(a->fd, "  externaddr:               %s\n", ast_sockaddr_stringify(&externaddr));
+	ast_cli(a->fd, "  Externaddr:             %s\n", ast_sockaddr_stringify(&externaddr));
 	ast_cli(a->fd, "  Externrefresh:          %d\n", externrefresh);
 	{
 		struct ast_ha *d;
@@ -24863,6 +24874,12 @@
 	else
 		ast_string_field_set(p, tohost, ast_sockaddr_stringify_host(&peer->addr));
 
+	if (!ast_sockaddr_isnull(&peer->externaddr)) {
+		ast_sockaddr_copy(&p->externaddr, &peer->externaddr);
+	} else {
+		ast_sockaddr_copy(&p->externaddr, &externaddr);
+	}
+
 	/* Recalculate our side, and recalculate Call ID */
 	ast_sip_ouraddrfor(&p->sa, &p->ourip, p);
 	build_via(p);
@@ -25835,6 +25852,14 @@
 
 					if (!peer->default_outbound_transport) { /*!< The first transport listed should be default outbound */
 						peer->default_outbound_transport = peer->transports;
+					}
+				}
+			} else if (!strcasecmp(v->name, "externaddr")) {
+				if (localaddr == NULL) {
+					ast_log(LOG_ERROR, "Externaddr for peer %s not enabled, since we have no local networks configured in [general]\n", peer->name);
+				} else {
+					if (!ast_strlen_zero(v->value) && ast_parse_arg(v->value, PARSE_ADDR, &peer->externaddr)) {
+						ast_log(LOG_WARNING, "Invalid address for externaddr keyword: %s for peer %s\n", v->value, peer->name);
 					}
 				}
 			} else if (realtime && !strcasecmp(v->name, "regseconds")) {
@@ -26915,7 +26940,7 @@
 			if (ast_parse_arg(v->value, PARSE_ADDR, &media_address))
 				ast_log(LOG_WARNING, "Invalid address for media_address keyword: %s\n", v->value);
 		} else if (!strcasecmp(v->name, "externaddr") || !strcasecmp(v->name, "externip")) {
-			if (ast_parse_arg(v->value, PARSE_ADDR, &externaddr)) {
+			if (!ast_strlen_zero(v->value) && ast_parse_arg(v->value, PARSE_ADDR, &externaddr)) {
 				ast_log(LOG_WARNING,
 					"Invalid address for externaddr keyword: %s\n",
 					v->value);

Modified: team/group/pine-multiple-externip-trunk/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/group/pine-multiple-externip-trunk/channels/sip/include/sip.h?view=diff&rev=288959&r1=288958&r2=288959
==============================================================================
--- team/group/pine-multiple-externip-trunk/channels/sip/include/sip.h (original)
+++ team/group/pine-multiple-externip-trunk/channels/sip/include/sip.h Mon Sep 27 13:31:12 2010
@@ -1013,6 +1013,7 @@
 	struct ast_sockaddr redirip;         /*!< Where our RTP should be going if not to us */
 	struct ast_sockaddr vredirip;        /*!< Where our Video RTP should be going if not to us */
 	struct ast_sockaddr tredirip;        /*!< Where our Text RTP should be going if not to us */
+	struct ast_sockaddr externaddr;        /*!<  External IP to use for this dialog */
 	time_t lastrtprx;                   /*!< Last RTP received */
 	time_t lastrtptx;                   /*!< Last RTP sent */
 	int rtptimeout;                     /*!< RTP timeout time */
@@ -1236,6 +1237,7 @@
 	/*XXX Seems like we suddenly have two flags with the same content. Why? To be continued... */
 	enum sip_peer_type type; /*!< Distinguish between "user" and "peer" types. This is used solely for CLI and manager commands */
 	unsigned int disallowed_methods;
+	struct ast_sockaddr externaddr;        /*!<  External IP to use for peer's connections */
 	struct ast_cc_config_params *cc_params;
 };
 

Modified: team/group/pine-multiple-externip-trunk/configs/sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/group/pine-multiple-externip-trunk/configs/sip.conf.sample?view=diff&rev=288959&r1=288958&r2=288959
==============================================================================
--- team/group/pine-multiple-externip-trunk/configs/sip.conf.sample (original)
+++ team/group/pine-multiple-externip-trunk/configs/sip.conf.sample Mon Sep 27 13:31:12 2010
@@ -731,11 +731,16 @@
 ;                               ; externtcpport will default to the externaddr or externhost port if either one is set. 
 ;        externtlsport = 12600  ; The externally mapped tls port, when Asterisk is behind a static NAT or PAT.
 ;                               ; externtlsport port will default to the RFC designated port of 5061.	
+
+; 	The externaddr configuration is also valid for specific peers and is only
+;	used for IPv4 connections. The device configuration overrides the one in the
+;	[general] section of sip.conf
 ;
 ;   b. "externhost = hostname[:port]" is similar to "externaddr" except
 ;      that the hostname is looked up every "externrefresh" seconds
 ;      (default 10s). This can be useful when your NAT device lets you choose
 ;      the port mapping, but the IP address is dynamic.
+;      "externhost" ONLY works in the [general] section of sip.conf.
 ;      Beware, you might suffer from service disruption when the name server
 ;      resolution fails. Examples:
 ;
@@ -1068,6 +1073,7 @@
 ; qualify
 ; defaultip
 ; defaultuser
+; externaddr
 ; rtptimeout
 ; rtpholdtimeout
 ; sendrpid




More information about the asterisk-commits mailing list