[svn-commits] oej: branch oej/darjeeling-prack-1.8 r369458 - /team/oej/darjeeling-prack-1.8...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jun 28 03:23:28 CDT 2012


Author: oej
Date: Thu Jun 28 03:23:25 2012
New Revision: 369458

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=369458
Log:
Getting close to action.

Modified:
    team/oej/darjeeling-prack-1.8/channels/chan_sip.c

Modified: team/oej/darjeeling-prack-1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/channels/chan_sip.c?view=diff&rev=369458&r1=369457&r2=369458
==============================================================================
--- team/oej/darjeeling-prack-1.8/channels/chan_sip.c (original)
+++ team/oej/darjeeling-prack-1.8/channels/chan_sip.c Thu Jun 28 03:23:25 2012
@@ -12201,7 +12201,15 @@
 }
 
 /*! 
- * \brief Build REFER/INVITE/OPTIONS/SUBSCRIBE message and transmit it
+ * \brief transmit SIP PRACK as a response to a provisional response with a Rseq and Require: 100rel header 
+ */
+static int transmit_prack(struct sip_pvt *p)
+{
+	return transmit_invite(p, SIP_PRACK, 0, 1, NULL);
+}
+
+/*! 
+ * \brief Build PRACK/REFER/INVITE/OPTIONS/SUBSCRIBE message and transmit it
  * \param p sip_pvt structure
  * \param sipmethod
  * \param sdp unknown
@@ -12253,6 +12261,12 @@
 		}
 		snprintf(buf, sizeof(buf), "%d", p->expiry);
 		add_header(&req, "Expires", buf);
+	} else if (sipmethod == SIP_PRACK) {
+		/* Place holder */
+		/* Add headers for PRACK */
+		char buf[SIPBUFSIZE/2];
+		snprintf(buf, sizeof(buf), "%d %d %s", p->irseq, p->lastinvite, "INVITE");
+		add_header(&req, "RAck", buf);
 	}
 
 	/* This new INVITE is part of an attended transfer. Make sure that the
@@ -12264,7 +12278,7 @@
 	}
 
 	/* Add Session-Timers related headers */
-	if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
+	if (sipmethod == SIP_INVITE && st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
 		char i2astr[10];
 
 		if (!p->stimer->st_interval) {
@@ -21131,10 +21145,13 @@
 	if (!ast_strlen_zero(required)) {
 		int activeextensions = parse_required_sip_options(required);
 		if (activeextensions & SIP_OPT_100REL) {
-			ast_debug(3, "!=!=!=!=!=! Response relies on PRACK! \n");
+			const char *rseq = get_header(req, "RSeq");
+			ast_debug(3, "!=!=!=!=!=! Response relies on PRACK! Rseq %s\n", rseq);
 			/* DO Something here !!! */
 			/* XXX If the response relies on PRACK, we need to start a PRACK transaction
 			 */
+			sscanf(get_header(req, "RSeq"), "%30u ", &p->irseq);
+			transmit_prack(p);
 		}
 		if (activeextensions & SIP_OPT_TIMER) {
 			ast_debug(3, "!=!=!=!=!=! The other side activated Session timers! \n");




More information about the svn-commits mailing list