[asterisk-commits] rmudgett: branch 1.8 r320883 - /branches/1.8/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed May 25 17:25:29 CDT 2011


Author: rmudgett
Date: Wed May 25 17:25:18 2011
New Revision: 320883

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=320883
Log:
Native SIP CCSS sends bad CC cancel SUBSCRIBE message.

The SUBSCRIBE message used to cancel a CC request has incorrect To/From
SIP headers.  They are reversed and the dialog tags are the same when they
should not be.  If pedantic mode was disabled, then the cancel would have
succeeded despite the incorrect message.

* The SIP_OUTGOING flag was not set correctly for the dialog and I had to
move some CC subscribe handling code as a result.

* Initialized the dialog subscribed type to CALL_COMPLETION earlier.  If a
CC request SUBSCRIBE message comes in and the CC instance is not found,
the 404 response was duplicated.

JIRA AST-568
JIRA SWP-3493

Modified:
    branches/1.8/channels/chan_sip.c

Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=320883&r1=320882&r2=320883
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Wed May 25 17:25:18 2011
@@ -1910,6 +1910,7 @@
 		ast_get_ccnr_available_timer(monitor->interface->config_params);
 
 	sip_pvt_lock(monitor_instance->subscription_pvt);
+	ast_set_flag(&monitor_instance->subscription_pvt->flags[0], SIP_OUTGOING);
 	create_addr(monitor_instance->subscription_pvt, monitor_instance->peername, 0, 1, NULL);
 	ast_sip_ouraddrfor(&monitor_instance->subscription_pvt->sa, &monitor_instance->subscription_pvt->ourip, monitor_instance->subscription_pvt);
 	monitor_instance->subscription_pvt->subscribed = CALL_COMPLETION;
@@ -19685,6 +19686,27 @@
 /* \brief Handle SIP response in SUBSCRIBE transaction */
 static void handle_response_subscribe(struct sip_pvt *p, int resp, const char *rest, struct sip_request *req, int seqno)
 {
+	if (p->subscribed == CALL_COMPLETION) {
+		struct sip_monitor_instance *monitor_instance;
+
+		if (resp < 300) {
+			return;
+		}
+
+		/* Final failure response received. */
+		monitor_instance = ao2_callback(sip_monitor_instances, 0,
+			find_sip_monitor_instance_by_subscription_pvt, p);
+		if (monitor_instance) {
+			ast_cc_monitor_failed(monitor_instance->core_id,
+				monitor_instance->device_name,
+				"Received error response to our SUBSCRIBE");
+		}
+		return;
+	}
+
+	if (p->subscribed != MWI_NOTIFICATION) {
+		return;
+	}
 	if (!p->mwi) {
 		return;
 	}
@@ -20414,16 +20436,6 @@
 			ast_string_field_set(p, theirtag, tag);
 		}
 
-		if (sipmethod == SIP_SUBSCRIBE && resp >= 400) {
-			struct sip_monitor_instance *monitor_instance = ao2_callback(sip_monitor_instances,
-					0, find_sip_monitor_instance_by_subscription_pvt, p);
-			if (monitor_instance) {
-				ast_cc_monitor_failed(monitor_instance->core_id, monitor_instance->device_name,
-						"Received error response to our SUBSCRIBE");
-				return;
-			}
-		}
-
 		switch(resp) {
 		case 200:
 			if (sipmethod == SIP_INVITE) {
@@ -23570,6 +23582,8 @@
 		*param_separator = '\0';
 	}
 
+	p->subscribed = CALL_COMPLETION;
+
 	if (!(agent = find_sip_cc_agent_by_subscribe_uri(uri))) {
 		if (!expires) {
 			/* Typically, if a 0 Expires reaches us and we can't find
@@ -23601,7 +23615,6 @@
 	agent_pvt->subscribe_pvt = dialog_ref(p, "SIP CC agent gains reference to subscription dialog");
 	ast_cc_agent_accept_request(agent->core_id, "SIP caller %s has requested CC via SUBSCRIBE",
 			agent->device_name);
-	p->subscribed = CALL_COMPLETION;
 
 	/* We don't send a response here. That is done in the agent's ack callback or in the
 	 * agent destructor, should a failure occur before we have responded




More information about the asterisk-commits mailing list