[asterisk-commits] dvossel: branch 1.6.2 r285563 - /branches/1.6.2/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Sep 8 16:47:37 CDT 2010


Author: dvossel
Date: Wed Sep  8 16:47:29 2010
New Revision: 285563

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=285563
Log:
Fixes interoperability problems with session timer behavior in Asterisk.

CHANGES:
1. Never put "timer" in "Require" header.  This is not to our benefit
and RFC 4028 section 7.1 even warns against it.  It is possible for one
endpoint to perform session-timer refreshes while the other endpoint does
not support them.  If in this case the end point performing the refreshing
puts "timer" in the Require field during a refresh, the dialog will
likely get terminated by the other end.

2. Change the behavior of 'session-timer=accept' in sip.conf (which is
the default behavior of Asterisk with no session timer configuration
specified) to only run session-timers as result of an incoming INVITE
request if the INVITE contains an "Session-Expires" header... Asterisk is
currently treating having the "timer" option in the "Supported" header as
a request for session timers by the UAC.  I do not agree with this.  Session
timers should only be negotiated in "accept" mode when the incoming INVITE
supplies a "Session-Expires" header, otherwise RFC 4028 says we should
treat a request containing no "Session-Expires" header as a session with
no expiration.

Below I have outlined some situations and what Asterisk's behavior is.
The table reflects the behavior changes implemented by this patch.

SITUATIONS:
-Asterisk as UAS
1. Incoming INVITE: NO  "Session-Expires"
2. Incoming INVITE: HAS "Session-Expires"

-Asterisk as UAC
3. Outgoing INVITE: NO  "Session-Expires". 200 Ok Response HAS "Session-Expires" header
4. Outgoing INVITE: NO  "Session-Expires". 200 Ok Response NO  "Session-Expires" header
5. Outgoing INVITE: HAS "Session-Expires".

Active   - Asterisk will have an active refresh timer regardless if the other endpoint does.
Inactive - Asterisk does not have an active refresh timer regardless if the other endpoint does.
XXXXXXX  - Not possible for mode.
______________________________________
|SITUATIONS | 'session-timer' MODES  |
|___________|________________________|
|           | originate  |  accept   |
|-----------|------------|-----------|
|1.         |   Active   | Inactive  |
|2.         |   Active   |  Active   |
|3.         | XXXXXXXX   | Active    |
|4.         | XXXXXXXX   | Inactive  |
|5.         |   Active   | XXXXXXXX  |
--------------------------------------


(closes issue #17005)
Reported by: alexrecarey


Modified:
    branches/1.6.2/channels/chan_sip.c

Modified: branches/1.6.2/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/chan_sip.c?view=diff&rev=285563&r1=285562&r2=285563
==============================================================================
--- branches/1.6.2/channels/chan_sip.c (original)
+++ branches/1.6.2/channels/chan_sip.c Wed Sep  8 16:47:29 2010
@@ -9547,7 +9547,6 @@
 		char se_hdr[256];
 		snprintf(se_hdr, sizeof(se_hdr), "%d;refresher=%s", p->stimer->st_interval, 
 			strefresher2str(p->stimer->st_ref));
-		add_header(resp, "Require", "timer");
 		add_header(resp, "Session-Expires", se_hdr);
 	}
 
@@ -17889,7 +17888,7 @@
 		/* Check for Session-Timers related headers */
 		if (st_get_mode(p) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
 			p_hdrval = (char*)get_header(req, "Session-Expires");
-        		if (!ast_strlen_zero(p_hdrval)) {
+			if (!ast_strlen_zero(p_hdrval)) {
 				/* UAS supports Session-Timers */
 				enum st_refresher tmp_st_ref = SESSION_TIMER_REFRESHER_AUTO;
 				int tmp_st_interval = 0;
@@ -20264,10 +20263,10 @@
 	}
 
 	/* Session-Timers */
-	if (p->sipoptions & SIP_OPT_TIMER) {
+	if ((p->sipoptions & SIP_OPT_TIMER) && !ast_strlen_zero(get_header(req, "Session-Expires"))) {
 		/* The UAC has requested session-timers for this session. Negotiate
 		the session refresh interval and who will be the refresher */
-		ast_debug(2, "Incoming INVITE with 'timer' option enabled\n");
+		ast_debug(2, "Incoming INVITE with 'timer' option supported and \"Session-Expires\" header.\n");
 
 		/* Allocate Session-Timers struct w/in the dialog */
 		if (!p->stimer)
@@ -20275,17 +20274,15 @@
 
 		/* Parse the Session-Expires header */
 		p_uac_se_hdr = get_header(req, "Session-Expires");
-		if (!ast_strlen_zero(p_uac_se_hdr)) {
-			rtn = parse_session_expires(p_uac_se_hdr, &uac_max_se, &st_ref);
-			if (rtn != 0) {
-				transmit_response_reliable(p, "400 Session-Expires Invalid Syntax", req);
-				p->invitestate = INV_COMPLETED;
-				if (!p->lastinvite) {
-					sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
-				}
-				res = -1;
-				goto request_invite_cleanup;
+		rtn = parse_session_expires(p_uac_se_hdr, &uac_max_se, &st_ref);
+		if (rtn != 0) {
+			transmit_response_reliable(p, "400 Session-Expires Invalid Syntax", req);
+			p->invitestate = INV_COMPLETED;
+			if (!p->lastinvite) {
+				sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
 			}
+			res = -1;
+			goto request_invite_cleanup;
 		}
 
 		/* Parse the Min-SE header */




More information about the asterisk-commits mailing list