From ba4280e61f3bf2f033e3c483d207083a31fcdf65 Mon Sep 17 00:00:00 2001 From: Michael Jerris <mike@jerris.com> Date: Wed, 25 Apr 2012 15:15:15 -0400 Subject: [PATCH] try to add a tag to disable timer autorequire NUTAG_TIMER_AUTOREQUIRE(0) --- .../libsofia-sip-ua/nua/nua_params.c | 6 ++++++ .../libsofia-sip-ua/nua/nua_params.h | 3 +++ .../libsofia-sip-ua/nua/nua_session.c | 21 ++++++++++++------- libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c | 2 ++ .../libsofia-sip-ua/nua/sofia-sip/nua_tag.h | 5 +++++ 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c index 58b480440a..0f6a491dff 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c @@ -139,6 +139,7 @@ int nua_stack_set_defaults(nua_handle_t *nh, NHP_SET(nhp, only183_100rel, 0); NHP_SET(nhp, auto_answer, 0); NHP_SET(nhp, auto_ack, 1); + NHP_SET(nhp, timer_autorequire, 1); NHP_SET(nhp, invite_timeout, 120); nhp->nhp_session_timer = 1800; @@ -741,6 +742,10 @@ static int nhp_set_tags(su_home_t *home, else if (tag == nutag_autoack) { NHP_SET(nhp, auto_ack, value != 0); } + /* NUTAG_TIMER_AUTOREQUIRE(timer_autorequire) */ + else if (tag == nutag_timer_autorequire) { + NHP_SET(nhp, timer_autorequire, value != 0); + } /* NUTAG_INVITE_TIMER(invite_timeout) */ else if (tag == nutag_invite_timer) { NHP_SET(nhp, invite_timeout, (unsigned)value); @@ -1647,6 +1652,7 @@ int nua_stack_get_params(nua_t *nua, nua_handle_t *nh, nua_event_t e, TIF(NUTAG_ONLY183_100REL, only183_100rel), TIF(NUTAG_AUTOANSWER, auto_answer), TIF(NUTAG_AUTOACK, auto_ack), + TIF(NUTAG_TIMER_AUTOREQUIRE, timer_autorequire), TIF(NUTAG_INVITE_TIMER, invite_timeout), TIFD(NUTAG_SESSION_TIMER, session_timer), diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h b/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h index 1904a080c5..9fe4a98652 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h @@ -109,6 +109,8 @@ struct nua_handle_preferences /** Always include id with Event: refer */ unsigned nhp_refer_with_id:1; + + unsigned nhp_timer_autorequire:1; unsigned:0; /* Default lifetime for implicit subscriptions created by REFER */ @@ -207,6 +209,7 @@ struct nua_handle_preferences unsigned nhb_appl_method:1; unsigned nhb_initial_route:1; unsigned nhb_proxy:1; + unsigned nhb_timer_autorequire:1; unsigned :0; } set_bits; unsigned set_unsigned[2]; 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 1958b5645a..25ec7c9460 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c @@ -370,7 +370,8 @@ static int session_timer_check_min_se(msg_t *msg, sip_t *sip, static int session_timer_add_headers(struct session_timer *t, int initial, - msg_t *msg, sip_t *sip); + msg_t *msg, sip_t *sip, + nua_handle_t *nh); static void session_timer_negotiate(struct session_timer *t, int uas); @@ -791,7 +792,7 @@ static int nua_invite_client_request(nua_client_request_t *cr, /* Add session timer headers */ if (session_timer_is_supported(ss->ss_timer)) session_timer_add_headers(ss->ss_timer, ss->ss_state == nua_callstate_init, - msg, sip); + msg, sip, nh); ss->ss_100rel = NH_PGET(nh, early_media); ss->ss_precondition = sip_has_feature(sip->sip_require, "precondition"); @@ -2436,7 +2437,7 @@ int nua_invite_server_respond(nua_server_request_t *sr, tagi_t const *tags) NH_PGET(nh, min_se)); if (session_timer_is_supported(ss->ss_timer)) - session_timer_add_headers(ss->ss_timer, 0, msg, sip); + session_timer_add_headers(ss->ss_timer, 0, msg, sip, nh); } return nua_base_server_respond(sr, tags); @@ -3354,7 +3355,7 @@ static int nua_update_client_request(nua_client_request_t *cr, if (session_timer_is_supported(ss->ss_timer)) session_timer_add_headers(ss->ss_timer, ss->ss_state < nua_callstate_ready, - msg, sip); + msg, sip, nh); retval = nua_base_client_request(cr, msg, sip, NULL); @@ -3610,7 +3611,7 @@ int nua_update_server_respond(nua_server_request_t *sr, tagi_t const *tags) nua_server_request_t *sr0; int uas; - session_timer_add_headers(ss->ss_timer, 0, msg, sip); + session_timer_add_headers(ss->ss_timer, 0, msg, sip, nh); for (sr0 = nh->nh_ds->ds_sr; sr0; sr0 = sr0->sr_next) if (sr0->sr_method == sip_method_invite) @@ -4426,18 +4427,24 @@ static int session_timer_add_headers(struct session_timer *t, int initial, msg_t *msg, - sip_t *sip) + sip_t *sip, + nua_handle_t *nh) { unsigned long expires, min; sip_min_se_t min_se[1]; sip_session_expires_t x[1]; int uas; + int autorequire = 1; enum nua_session_refresher refresher = nua_any_refresher; static sip_param_t const x_params_uac[] = {"refresher=uac", NULL}; static sip_param_t const x_params_uas[] = {"refresher=uas", NULL}; + if ( !NH_PGET(nh, timer_autorequire) && NH_PISSET(nh, timer_autorequire)) { + autorequire = 0; + } + if (!t->local.supported) return 0; @@ -4491,7 +4498,7 @@ session_timer_add_headers(struct session_timer *t, /* Min-SE: 0 is optional with initial INVITE */ || !initial, SIPTAG_MIN_SE(min_se)), - //TAG_IF(refresher == nua_remote_refresher && expires != 0, SIPTAG_REQUIRE_STR("timer")), + //TAG_IF(autorequire && refresher == nua_remote_refresher && expires != 0, SIPTAG_REQUIRE_STR("timer")), TAG_END()); return 1; diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c index 96ca20baee..491d485731 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c @@ -1329,6 +1329,8 @@ tag_typedef_t nutag_autoanswer = BOOLTAG_TYPEDEF(autoAnswer); */ tag_typedef_t nutag_autoack = BOOLTAG_TYPEDEF(autoACK); +tag_typedef_t nutag_timer_autorequire = BOOLTAG_TYPEDEF(timerAutorequire); + /**@def NUTAG_AUTOACK_REF(x) * Reference tag for NUTAG_AUTOACK(). */ diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h b/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h index 9e710d052d..813e0d757a 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h +++ b/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h @@ -199,6 +199,11 @@ SOFIAPUBVAR tag_typedef_t nutag_autoack; #define NUTAG_AUTOACK_REF(x) nutag_autoack_ref, tag_bool_vr(&(x)) SOFIAPUBVAR tag_typedef_t nutag_autoack_ref; +#define NUTAG_TIMER_AUTOREQUIRE(x) nutag_timer_autorequire, tag_bool_v(x) +SOFIAPUBVAR tag_typedef_t nutag_timer_autorequire; +#define NUTAG_TIMER_AUTOREQUIRE_REF(x) nutag_timer_autorequire_ref, tag_bool_vr(&(x)) +SOFIAPUBVAR tag_typedef_t nutag_timer_autorequire_ref; + #define NUTAG_AUTOANSWER(x) nutag_autoanswer, tag_bool_v(x) SOFIAPUBVAR tag_typedef_t nutag_autoanswer; #define NUTAG_AUTOANSWER_REF(x) nutag_autoanswer_ref, tag_bool_vr(&(x))