From afb00b2ecc8a9b049801f3f475c80e1111070fa8 Mon Sep 17 00:00:00 2001 From: Spencer Thomason 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;