[svn-commits] mmichelson: branch 1.6.0 r187555 - /branches/1.6.0/channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Apr 9 15:14:37 CDT 2009


Author: mmichelson
Date: Thu Apr  9 15:14:33 2009
New Revision: 187555

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=187555
Log:
Merge revision 187488 to 1.6.0.

A note to all of you. Don't block revisions in a branch if you actually
meant to merge them. Two very old revisions somehow didn't get merged into
1.6.0 and this change was dependent on those two old revisions. What should have
taken 2 minutes has now wasted about 30 minutes of my time :(


Modified:
    branches/1.6.0/channels/chan_sip.c

Modified: branches/1.6.0/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/branches/1.6.0/channels/chan_sip.c?view=diff&rev=187555&r1=187554&r2=187555
==============================================================================
--- branches/1.6.0/channels/chan_sip.c (original)
+++ branches/1.6.0/channels/chan_sip.c Thu Apr  9 15:14:33 2009
@@ -17045,12 +17045,25 @@
 	}
 
 	if (!req->ignore && p->pendinginvite) {
-		/* We already have a pending invite. Sorry. You are on hold. */
-		p->glareinvite = seqno;     /* must hold on to this seqno to process ack and retransmit correctly */
-		transmit_response_reliable(p, "491 Request Pending", req);
-		ast_debug(1, "Got INVITE on call where we already have pending INVITE, deferring that - %s\n", p->callid);
-		/* Don't destroy dialog here */
-		return 0;
+		if (!ast_test_flag(&p->flags[0], SIP_OUTGOING) && ast_test_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED)) {
+			/* We have received a reINVITE on an incoming call to which we have sent a 200 OK but not yet received
+			 * an ACK. According to RFC 5407, Section 3.1.4, the proper way to handle this race condition is to accept
+			 * the reINVITE since we have established a dialog.
+			 */
+
+			/* Note that this will both clear the pendinginvite flag and cancel the 
+			 * retransmission of the 200 OK. Basically, we're accepting this reINVITE as both an ACK
+			 * and a reINVITE in one request.
+			 * */
+			__sip_ack(p, p->lastinvite, 1, 0);
+		} else {
+			/* We already have a pending invite. Sorry. You are on hold. */
+			p->glareinvite = seqno;
+			transmit_response_reliable(p, "491 Request Pending", req);
+			ast_debug(1, "Got INVITE on call where we already have pending INVITE, deferring that - %s\n", p->callid);
+			/* Don't destroy dialog here */
+			return 0;
+		}
 	}
 
 	p_replaces = get_header(req, "Replaces");




More information about the svn-commits mailing list