From 2766eaf49e189c4f541da5717b36ff94d507c269 Mon Sep 17 00:00:00 2001 From: Sergey Khripchenko Date: Fri, 3 Jun 2016 05:30:01 -0700 Subject: [PATCH] FS-9225: [mod_sofia] Allow to force SIP REGISTER Expires: to be within configured range. Allow to force SIP REGISTER Expires: to be within MIN and MAX values. Not just to force it to one specific value using "sip-force-expires". New profile parameters: "sip-force-expires-min" "sip-force-expires-max" --- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 ++ src/mod/endpoints/mod_sofia/sofia.c | 16 ++++++++++++++++ src/mod/endpoints/mod_sofia/sofia_reg.c | 12 ++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 9a4dca3147..7ab1af53f1 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -738,6 +738,8 @@ struct sofia_profile { char *tls_verify_in_subjects_str; su_strlst_t *tls_verify_in_subjects; uint32_t sip_force_expires; + uint32_t sip_force_expires_min; + uint32_t sip_force_expires_max; uint32_t sip_expires_max_deviation; uint32_t sip_expires_late_margin; uint32_t sip_subscription_max_deviation; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index d7e58fc218..573ab9dacf 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -4260,6 +4260,8 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name) profile->dtmf_duration = 100; profile->rtp_digit_delay = 40; profile->sip_force_expires = 0; + profile->sip_force_expires_min = 0; + profile->sip_force_expires_max = 0; profile->sip_expires_max_deviation = 0; profile->sip_expires_late_margin = 60; profile->sip_subscription_max_deviation = 0; @@ -5514,6 +5516,20 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name) } else { profile->sip_expires_late_margin = 60; } + } else if (!strcasecmp(var, "sip-force-expires-min")) { + int32_t sip_force_expires_min = atoi(val); + if (sip_force_expires_min >= 0) { + profile->sip_force_expires_min = sip_force_expires_min; + } else { + profile->sip_force_expires_min = 0; + } + } else if (!strcasecmp(var, "sip-force-expires-max")) { + int32_t sip_force_expires_max = atoi(val); + if (sip_force_expires_max >= 0) { + profile->sip_force_expires_max = sip_force_expires_max; + } else { + profile->sip_force_expires_max = 0; + } } else if (!strcasecmp(var, "sip-force-expires")) { int32_t sip_force_expires = atoi(val); if (sip_force_expires >= 0) { diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index a4ee3c080a..7f7d8efba3 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1683,6 +1683,18 @@ uint8_t sofia_reg_handle_register_token(nua_t *nua, sofia_profile_t *profile, nu } } + if ( (( exp_var = atoi(switch_event_get_header_nil(*v_event, "sip-force-expires-min")) )) || + (( exp_var = profile->sip_force_expires_min )) ) { + if ( (exp_var > 0) && (exptime < exp_var) ) { + exptime = exp_var; + } + } + if ( (( exp_var = atoi(switch_event_get_header_nil(*v_event, "sip-force-expires-max")) )) || + (( exp_var = profile->sip_force_expires_max )) ) { + if ( (exp_var > 0) && (exptime > exp_var) ) { + exptime = exp_var; + } + } if ( (( exp_var = atoi(switch_event_get_header_nil(*v_event, "sip-force-expires")) )) || (( exp_var = profile->sip_force_expires )) ) { if (exp_var > 0) {