[asterisk-commits] rmudgett: trunk r311298 - in /trunk: ./ channels/sig_pri.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Mar 17 22:00:43 CDT 2011


Author: rmudgett
Date: Thu Mar 17 22:00:39 2011
New Revision: 311298

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=311298
Log:
Merged revisions 311297 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r311297 | rmudgett | 2011-03-17 21:59:05 -0500 (Thu, 17 Mar 2011) | 12 lines
  
  Race condition when ISDN CallRerouting/CallDeflection invoked.
  
  The queued AST_CONTROL_BUSY could sometimes be processed before the
  call_forward dial string is recognized.
  
  * Moved setting the call_forwarding dial string after sending a response
  to the initiator and just queue an empty frame to wake up the media thread
  instead of an AST_CONTROL_BUSY.
  
  * Added check for empty rerouting/deflection number and respond with an
  error.
........

Modified:
    trunk/   (props changed)
    trunk/channels/sig_pri.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/sig_pri.c?view=diff&rev=311298&r1=311297&r2=311298
==============================================================================
--- trunk/channels/sig_pri.c (original)
+++ trunk/channels/sig_pri.c Thu Mar 17 22:00:39 2011
@@ -3927,16 +3927,35 @@
 				struct pri_party_redirecting pri_deflection;
 
 				if (!call_rsp) {
+					ast_log(LOG_WARNING,
+						"Span %d: %s tried CallRerouting/CallDeflection to '%s' without call!\n",
+						pri->span, owner->name, subcmd->u.rerouting.deflection.to.number.str);
 					ast_channel_unlock(owner);
-					ast_log(LOG_WARNING,
-						"CallRerouting/CallDeflection to '%s' without call!\n",
-						subcmd->u.rerouting.deflection.to.number.str);
 					break;
 				}
+				if (ast_strlen_zero(subcmd->u.rerouting.deflection.to.number.str)) {
+					ast_log(LOG_WARNING,
+						"Span %d: %s tried CallRerouting/CallDeflection to empty number!\n",
+						pri->span, owner->name);
+					pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
+						PRI_REROUTING_RSP_INVALID_NUMBER);
+					ast_channel_unlock(owner);
+					break;
+				}
+
+				ast_verb(3, "Span %d: %s is CallRerouting/CallDeflection to '%s'.\n",
+					pri->span, owner->name, subcmd->u.rerouting.deflection.to.number.str);
+
+				/*
+				 * Send back positive ACK to CallRerouting/CallDeflection.
+				 *
+				 * Note:  This call will be hungup by the core when it processes
+				 * the call_forward string.
+				 */
+				pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
+					PRI_REROUTING_RSP_OK_CLEAR);
 
 				pri_deflection = subcmd->u.rerouting.deflection;
-
-				ast_string_field_set(owner, call_forward, pri_deflection.to.number.str);
 
 				/* Adjust the deflecting to number based upon the subscription option. */
 				switch (subcmd->u.rerouting.subscription_option) {
@@ -3962,17 +3981,12 @@
 				ast_channel_set_redirecting(owner, &ast_redirecting, NULL);
 				ast_party_redirecting_free(&ast_redirecting);
 
-				/*
-				 * Send back positive ACK to CallRerouting/CallDeflection.
-				 *
-				 * Note:  This call will be hungup by the dial application when
-				 * it processes the call_forward string set above.
-				 */
-				pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
-					PRI_REROUTING_RSP_OK_CLEAR);
-
-				/* This line is BUSY to further attempts by this dialing attempt. */
-				ast_queue_control(owner, AST_CONTROL_BUSY);
+				/* Request the core to forward to the new number. */
+				ast_string_field_set(owner, call_forward,
+					subcmd->u.rerouting.deflection.to.number.str);
+
+				/* Wake up the channel. */
+				ast_queue_frame(owner, &ast_null_frame);
 
 				ast_channel_unlock(owner);
 			}




More information about the asterisk-commits mailing list