From afb00b2ecc8a9b049801f3f475c80e1111070fa8 Mon Sep 17 00:00:00 2001
From: Spencer Thomason <spencer@whiteskycommunications.com>
Date: Tue, 16 Sep 2014 19:53:12 +0000
Subject: [PATCH] Force rport on ADTRAN TA Devices

ADTRAN Total Access devices do not support sending the rport parameter in
the Via header. This allows us to detect the device and force rport when
using the "safe" parameter, enabling the device to be used behind NAT.

FS-6823 #resolve
---
 libs/sofia-sip/libsofia-sip-ua/nta/nta.c | 4 +++-
 src/mod/endpoints/mod_sofia/sofia_reg.c  | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
index 98d1ad25e1..bb68025749 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
@@ -3188,7 +3188,9 @@ int agent_check_request_via(nta_agent_t *agent,
   else if (agent->sa_server_rport == 2 ||
 		   (agent->sa_server_rport == 3 && sip && sip->sip_user_agent &&
 			sip->sip_user_agent->g_string &&
-			(!strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20)))) {
+			(!strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) ||
+			 !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20) ||
+			 !strncasecmp(sip->sip_user_agent->g_string, "ADTRAN_Total_Access", 19)))) {
     rport = su_sprintf(msg_home(msg), "rport=%u", ntohs(from->su_port));
     msg_header_replace_param(msg_home(msg), v->v_common, rport);
   }
diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c
index 053ddd9a9e..9eacc1f576 100644
--- a/src/mod/endpoints/mod_sofia/sofia_reg.c
+++ b/src/mod/endpoints/mod_sofia/sofia_reg.c
@@ -1499,7 +1499,9 @@ uint8_t sofia_reg_handle_register_token(nua_t *nua, sofia_profile_t *profile, nu
 			if (!is_tcp && !is_tls && (zstr(network_ip) || !switch_check_network_list_ip(network_ip, profile->local_network)) &&
 				profile->server_rport_level >= 2 && sip->sip_user_agent &&
 				sip->sip_user_agent->g_string &&
-				( !strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20) )) {
+				( !strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) ||
+				  !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20) ||
+				  !strncasecmp(sip->sip_user_agent->g_string, "ADTRAN_Total_Access", 19) )) {
 				if (sip && sip->sip_via) {
 					const char *host = sip->sip_via->v_host;
 					const char *c_port = sip->sip_via->v_port;