From: Alec L Davis Date: Thu, 2 May 2013 07:20:54 +0000 (+0000) Subject: chan_sip: Honor Session-Expires in 200OK response when it's a RE-INVITE when asterisk... X-Git-Tag: 1.8.23.0-rc1~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d6b88f662788e887d3a00ff78ccb2ba8c3993c89;p=thirdparty%2Fasterisk.git chan_sip: Honor Session-Expires in 200OK response when it's a RE-INVITE when asterisk is the refresher. RFC 4028 Section 7.2 "UACs MUST be prepared to receive a Session-Expires header field in a response, even if none were present in the request." What changed After ASTERISK-20787, inbound calls to asterisk with no Session-Expires in the INVITE are now are offered a Session-Expires (1800 asterisk default) in the response, with asterisk as the refresher. Symptom: After 900 seconds (asterisk default refresher period 1800), asterisk RE-INVITEs the device, the device may respond with a much lower Session-Expires (180 in our case) value that it is now using. Asterisk ignores this response, as it's deemed both an INBOUND CALL, and a RE-INVITE. After 180 seconds the device times out and sends BYE (hangs up), asterisk is still working with the refresher period of 1800 as it ignored the 'Session Expires: 180' in the previous 200OK response. Fix: handle_response_invite() when 200OK, remove check for outbound and reinvite. (closes issue ASTERISK-21664) Reported by: alecdavis Tested by: alecdavis alecdavis (license 585) Review https://reviewboard.asterisk.org/r/2463/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@387312 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a47e97033c..0ea2c00f78 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -20970,7 +20970,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest } /* Check for Session-Timers related headers */ - if (st_get_mode(p, 0) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) { + if (st_get_mode(p, 0) != SESSION_TIMER_MODE_REFUSE) { p_hdrval = (char*)get_header(req, "Session-Expires"); if (!ast_strlen_zero(p_hdrval)) { /* UAS supports Session-Timers */