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

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Dec 14 06:10:37 CST 2012


Author: oej
Date: Fri Dec 14 06:10:32 2012
New Revision: 378022

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=378022
Log:
Resetting branch to the current state of review 1471

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

Modified: team/oej/pine-multiple-externip-trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/CHANGES?view=diff&rev=378022&r1=378021&r2=378022
==============================================================================
--- team/oej/pine-multiple-externip-trunk/CHANGES (original)
+++ team/oej/pine-multiple-externip-trunk/CHANGES Fri Dec 14 06:10:32 2012
@@ -329,6 +329,7 @@
    name field if CID number exists without a CID name. This change improves
    compatibility with certain device features such as Avaya IP500's directory
    lookup service.
+ * Externaddr is now a valid setting for SIP devices in sip.conf
 
  * A new setting for autocreatepeer (autocreatepeer=persistent) allows peers
    created using that setting to not be removed during SIP reload.

Modified: team/oej/pine-multiple-externip-trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/channels/chan_sip.c?view=diff&rev=378022&r1=378021&r2=378022
==============================================================================
--- team/oej/pine-multiple-externip-trunk/channels/chan_sip.c (original)
+++ team/oej/pine-multiple-externip-trunk/channels/chan_sip.c Fri Dec 14 06:10:32 2012
@@ -3948,6 +3948,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:
@@ -3969,14 +3974,14 @@
 	ast_sockaddr_copy(&theirs, them);
 
 	if (ast_sockaddr_is_ipv6(&theirs)) {
-		if (localaddr && !ast_sockaddr_isnull(&externaddr) && !ast_sockaddr_is_any(&bindaddr)) {
+		if (localaddr && !ast_sockaddr_isnull(myexternaddr) && !ast_sockaddr_is_any(&bindaddr)) {
 			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");
 		}
 	} else {
 		want_remap = localaddr &&
-			!ast_sockaddr_isnull(&externaddr) &&
+			!ast_sockaddr_isnull(myexternaddr) &&
 			ast_apply_ha(localaddr, &theirs) == AST_SENSE_ALLOW ;
 	}
 
@@ -3989,13 +3994,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;
@@ -4003,7 +4008,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;
@@ -4011,8 +4016,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 {
 		/* no remapping, but we bind to a specific address, so use it. */
 		switch (p->socket.type) {
@@ -6125,6 +6130,12 @@
 	}
 	if (!dialog->portinuri) {
 		dialog->portinuri = peer->portinuri;
+	}
+	if (!ast_sockaddr_isnull(&peer->externaddr)) {
+		/* Use the peer externaddr first */
+		ast_sockaddr_copy(&dialog->externaddr, &peer->externaddr);
+	} else {
+		ast_sockaddr_copy(&dialog->externaddr, &externaddr);
 	}
 	dialog->chanvars = copy_vars(peer->chanvars);
 	if (peer->fromdomainport) {
@@ -18084,6 +18095,12 @@
 			ao2_t_ref(peer, 1, "copy pointer into (*authpeer)");
 			(*authpeer) = peer;	/* Add a ref to the object here, to keep it in memory a bit longer if it is realtime */
 		}
+		/* Check if we have externip setting for this peer. If so, reset our address */
+		if (!ast_sockaddr_isnull(&peer->externaddr)) {
+			ast_sockaddr_copy(&p->externaddr, &peer->externaddr);
+			/* Recalculate our side, and recalculate Call ID */
+			ast_sip_ouraddrfor(&p->sa, &p->ourip, p);
+		} 
 
 		if (!ast_strlen_zero(peer->username)) {
 			ast_string_field_set(p, username, peer->username);
@@ -29390,6 +29407,12 @@
 		ast_string_field_set(p, tohost, ast_sockaddr_stringify_host_remote(&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);
@@ -30453,6 +30476,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")) {
@@ -31679,7 +31710,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/oej/pine-multiple-externip-trunk/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/channels/sip/include/sip.h?view=diff&rev=378022&r1=378021&r2=378022
==============================================================================
--- team/oej/pine-multiple-externip-trunk/channels/sip/include/sip.h (original)
+++ team/oej/pine-multiple-externip-trunk/channels/sip/include/sip.h Fri Dec 14 06:10:32 2012
@@ -1129,6 +1129,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 */
@@ -1371,6 +1372,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;
 
 	struct ast_rtp_dtls_cfg dtls_cfg;

Modified: team/oej/pine-multiple-externip-trunk/configs/sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/configs/sip.conf.sample?view=diff&rev=378022&r1=378021&r2=378022
==============================================================================
--- team/oej/pine-multiple-externip-trunk/configs/sip.conf.sample (original)
+++ team/oej/pine-multiple-externip-trunk/configs/sip.conf.sample Fri Dec 14 06:10:32 2012
@@ -829,11 +829,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:
 ;
@@ -1227,6 +1232,7 @@
 ; keepalive
 ; defaultip
 ; defaultuser
+; externaddr
 ; rtptimeout
 ; rtpholdtimeout
 ; sendrpid




More information about the asterisk-commits mailing list