diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c index c9736387be..c6751f5550 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c @@ -4502,9 +4502,9 @@ session_timer_add_headers(struct session_timer *t, sip_add_tl(msg, sip, TAG_IF(expires != 0, SIPTAG_SESSION_EXPIRES(x)), - TAG_IF(min != 0 + TAG_IF((!uas || sip->sip_status->st_status == 422) && (min != 0 /* Min-SE: 0 is optional with initial INVITE */ - || !initial, + || !initial), SIPTAG_MIN_SE(min_se)), TAG_IF(autorequire && refresher == nua_remote_refresher && expires != 0, SIPTAG_REQUIRE_STR("timer")), TAG_END()); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 79d39072e0..31bdfaf575 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -2061,6 +2061,16 @@ void sofia_event_callback(nua_event_t event, case nua_i_notify: case nua_i_info: + + if (event == nua_i_invite) { + if (sip->sip_min_se && profile->minimum_session_expires) { + if (sip->sip_min_se->min_delta < profile->minimum_session_expires) { + nua_respond(nh, SIP_422_SESSION_TIMER_TOO_SMALL, NUTAG_MIN_SE(profile->minimum_session_expires), TAG_END()); + goto end; + } + } + } + if (!sofia_private) { if (sess_count >= sess_max || !sofia_test_pflag(profile, PFLAG_RUNNING) || !switch_core_ready_inbound()) { nua_respond(nh, 503, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), NUTAG_WITH_THIS(nua), TAG_END()); @@ -2801,6 +2811,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void #endif NUTAG_APPL_METHOD("MESSAGE"), + TAG_IF(profile->session_timeout && profile->minimum_session_expires, NUTAG_MIN_SE(profile->minimum_session_expires)), NUTAG_SESSION_TIMER(profile->session_timeout), NTATAG_MAX_PROCEEDING(profile->max_proceeding), TAG_IF(profile->pres_type, NUTAG_ALLOW("PUBLISH")),