From 1f3eabd15c1baa76471c0196f1bb1df2d1c2f6d5 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthony.minessale@gmail.com>
Date: Wed, 19 Sep 2007 15:28:16 +0000
Subject: [PATCH] add register-proxy option to gateways so you can send
 outbound reg to your local proxy dest for the outside

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5713 d0543943-73ff-0310-b7d9-9358b9ac24b2
---
 conf/directory.xml                      |  2 ++
 conf/sofia.conf.xml                     |  2 ++
 src/mod/endpoints/mod_sofia/mod_sofia.h |  1 +
 src/mod/endpoints/mod_sofia/sofia.c     | 22 +++++++++++++++-------
 src/mod/endpoints/mod_sofia/sofia_reg.c |  5 ++++-
 5 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/conf/directory.xml b/conf/directory.xml
index 0b93e075d4..101286fbc8 100644
--- a/conf/directory.xml
+++ b/conf/directory.xml
@@ -19,6 +19,8 @@
       <!--<param name="extension" value="cluecon"/>-->
       <!--/// proxy host: *optional* same as realm, if blank ///-->
       <!--<param name="proxy" value="asterlink.com"/>-->
+      <!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
+      <!--<param name="register-proxy" value="mysbc.com"/>-->
       <!--/// expire in seconds: *optional* 3600, if blank ///-->
       <!--<param name="expire-seconds" value="60"/>-->
       <!--/// do not register ///-->
diff --git a/conf/sofia.conf.xml b/conf/sofia.conf.xml
index a4fafabb06..2b56d22277 100644
--- a/conf/sofia.conf.xml
+++ b/conf/sofia.conf.xml
@@ -22,6 +22,8 @@
 	  <!--<param name="extension" value="cluecon"/>-->
 	  <!--/// proxy host: *optional* same as realm, if blank ///-->
 	  <!--<param name="proxy" value="asterlink.com"/>-->
+	  <!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
+	  <!--<param name="register-proxy" value="mysbc.com"/>-->
 	  <!--/// expire in seconds: *optional* 3600, if blank ///-->
 	  <!--<param name="expire-seconds" value="60"/>-->
 	  <!--/// do not register ///-->
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h
index 8b2178e1cf..b52dede84e 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.h
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.h
@@ -196,6 +196,7 @@ struct sofia_gateway {
 	char *register_proxy;
 	char *register_context;
 	char *expires_str;
+	char *register_url;
 	uint32_t freq;
 	time_t expires;
 	time_t retry;
diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index dd7f158167..406b176dfe 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -501,7 +501,8 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
 				*expire_seconds = "3600",
 				*retry_seconds = "30",
 				*from_domain = "",
-				*to_domain = "";
+				*to_domain = "",
+				*register_proxy = NULL;
 			
 			gateway->pool = profile->pool;
 			gateway->profile = profile;
@@ -539,13 +540,11 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
 					from_domain = val;
 				} else if (!strcmp(var, "to-domain")) {
 					to_domain = val;
+				} else if (!strcmp(var, "register-proxy")) {
+					register_proxy = val;
 				}
 			}
-
-			if (switch_strlen_zero(to_domain)) {
-				to_domain = proxy;
-			}
-
+			
 			if (switch_strlen_zero(realm)) {
 				realm = name;
 			}
@@ -563,7 +562,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
 			if (switch_strlen_zero(extension)) {
 				extension = username;
 			}
-
+			
 			if (switch_strlen_zero(proxy)) {
 				proxy = realm;
 			}
@@ -576,6 +575,14 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
 				from_domain = realm;
 			}
 
+			if (switch_strlen_zero(register_proxy)) {
+				register_proxy = proxy;
+			}
+
+			if (switch_strlen_zero(to_domain)) {
+				to_domain = proxy;
+			}
+
 			gateway->retry_seconds = atoi(retry_seconds);
 			if (gateway->retry_seconds < 10) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "INVALID: retry_seconds correcting the value to 30\n");
@@ -589,6 +596,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
 			if (switch_true(caller_id_in_from)) {
 				switch_set_flag(gateway, REG_FLAG_CALLERID);
 			}
+			gateway->register_url = switch_core_sprintf(gateway->pool, "sip:%s", register_proxy);
 			gateway->register_from = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, from_domain);
 			gateway->register_contact = switch_core_sprintf(gateway->pool, "sip:%s@%s:%d", extension,
 															profile->extsipip ? profile->extsipip : profile->sipip, profile->sip_port);
diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c
index 7d05816daf..22e715ecbe 100644
--- a/src/mod/endpoints/mod_sofia/sofia_reg.c
+++ b/src/mod/endpoints/mod_sofia/sofia_reg.c
@@ -73,6 +73,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
 
 		case REG_STATE_UNREGISTER:
 			nua_unregister(gateway_ptr->nh,
+						   NUTAG_URL(gateway_ptr->register_url),
 						   SIPTAG_FROM_STR(gateway_ptr->register_from),
 						   SIPTAG_CONTACT_STR(gateway_ptr->register_contact),
 						   SIPTAG_EXPIRES_STR(gateway_ptr->expires_str),
@@ -97,6 +98,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
 
 				if (now) {
 					nua_register(gateway_ptr->nh,
+								 NUTAG_URL(gateway_ptr->register_url),
 								 SIPTAG_FROM_STR(gateway_ptr->register_from),
 								 SIPTAG_CONTACT_STR(gateway_ptr->register_contact),
 								 SIPTAG_EXPIRES_STR(gateway_ptr->expires_str),
@@ -105,6 +107,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
 					gateway_ptr->retry = now + gateway_ptr->retry_seconds;
 				} else {
 					nua_unregister(gateway_ptr->nh,
+								   NUTAG_URL(gateway_ptr->register_url),
 								   SIPTAG_FROM_STR(gateway_ptr->register_from),
 								   SIPTAG_CONTACT_STR(gateway_ptr->register_contact),
 								   SIPTAG_EXPIRES_STR(gateway_ptr->expires_str),
@@ -700,7 +703,7 @@ void sofia_reg_handle_sip_r_challenge(int status,
 			goto cancel;
 		}
 	}
-	
+
 	snprintf(authentication, sizeof(authentication), "%s:%s:%s:%s", scheme, realm, gateway->register_username, gateway->register_password);
 
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Authenticating '%s' with '%s'.\n", profile->username, authentication);