From 3834871e472b2171df66f5d303871775259027a3 Mon Sep 17 00:00:00 2001 From: Mike Jerris Date: Fri, 3 Mar 2017 11:01:12 -0600 Subject: [PATCH] FS-10067: [mod_sofia] add update-refresher profile param and sip_update_refresher channel var to use update for session timers Conflicts: src/mod/endpoints/mod_sofia/mod_sofia.h --- src/mod/endpoints/mod_sofia/mod_sofia.c | 9 +++++++++ src/mod/endpoints/mod_sofia/mod_sofia.h | 2 ++ src/mod/endpoints/mod_sofia/sofia.c | 6 ++++++ src/mod/endpoints/mod_sofia/sofia_glue.c | 6 +++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index b9de3efffa..55505056c4 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -900,10 +900,14 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) if ((tech_pvt->session_timeout = session_timeout)) { tech_pvt->session_refresher = switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND ? nua_local_refresher : nua_remote_refresher; + if (sofia_test_pflag(tech_pvt->profile, PFLAG_UPDATE_REFRESHER) || switch_channel_var_true(tech_pvt->channel, "sip_update_refresher")) { + tech_pvt->update_refresher = 1; + } } else { tech_pvt->session_refresher = nua_no_refresher; } + if (sofia_use_soa(tech_pvt)) { nua_respond(tech_pvt->nh, SIP_200_OK, NUTAG_AUTOANSWER(0), @@ -912,6 +916,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) TAG_IF(cid, SIPTAG_HEADER_STR(cid)), NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")), SOATAG_USER_SDP_STR(tech_pvt->mparams.local_sdp_str), @@ -931,6 +936,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) TAG_IF(cid, SIPTAG_HEADER_STR(cid)), NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")), SIPTAG_CONTENT_TYPE_STR("application/sdp"), @@ -1884,6 +1890,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_update(tech_pvt->nh, NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)), TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)), TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)), @@ -1899,6 +1906,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_update(tech_pvt->nh, NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)), TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)), TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)), @@ -1957,6 +1965,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_update(tech_pvt->nh, NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)), TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)), TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), TAG_END()); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 78a940110e..9ecdadb458 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -296,6 +296,7 @@ typedef enum { PFLAG_PROXY_HOLD, PFLAG_PROXY_INFO, PFLAG_PROXY_MESSAGE, + PFLAG_UPDATE_REFRESHER, /* No new flags below this line */ PFLAG_MAX @@ -832,6 +833,7 @@ struct private_object { sofia_cid_type_t cid_type; uint32_t session_timeout; enum nua_session_refresher session_refresher; + int update_refresher; char **watch_headers; char *respond_phrase; int respond_code; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 8adf94f8fd..4f4ec08ddd 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -5096,6 +5096,12 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name) } else { sofia_clear_pflag(profile, PFLAG_PRESENCE_PRIVACY); } + } else if (!strcasecmp(var, "update-refresher")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_UPDATE_REFRESHER); + } else { + sofia_clear_pflag(profile, PFLAG_UPDATE_REFRESHER); + } } else if (!strcasecmp(var, "manage-shared-appearance")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_MANAGE_SHARED_APPEARANCE); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 3302d20cd0..e56dd48470 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1285,11 +1285,13 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) if ((tech_pvt->session_timeout = session_timeout)) { tech_pvt->session_refresher = switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND ? nua_local_refresher : nua_remote_refresher; + if (sofia_test_pflag(tech_pvt->profile, PFLAG_UPDATE_REFRESHER) || switch_channel_var_true(tech_pvt->channel, "sip_update_refresher")) { + tech_pvt->update_refresher = 1; + } } else { tech_pvt->session_refresher = nua_no_refresher; } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "%s sending invite version: %s\nLocal SDP:\n%s\n", switch_channel_get_name(tech_pvt->channel), switch_version_full_human(), tech_pvt->mparams.local_sdp_str ? tech_pvt->mparams.local_sdp_str : "NO SDP PRESENT\n"); @@ -1313,6 +1315,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) NUTAG_AUTOACK(0), NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), TAG_IF(sofia_test_flag(tech_pvt, TFLAG_RECOVERED), NUTAG_INVITE_TIMER(UINT_MAX)), TAG_IF(invite_full_from, SIPTAG_FROM_STR(invite_full_from)), TAG_IF(invite_full_to, SIPTAG_TO_STR(invite_full_to)), @@ -1349,6 +1352,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) NUTAG_AUTOACK(0), NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), + NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), TAG_IF(sofia_test_flag(tech_pvt, TFLAG_RECOVERED), NUTAG_INVITE_TIMER(UINT_MAX)), TAG_IF(invite_full_from, SIPTAG_FROM_STR(invite_full_from)), TAG_IF(invite_full_to, SIPTAG_TO_STR(invite_full_to)),