[asterisk-commits] mjordan: branch 1.8 r335064 - in /branches/1.8: addons/ apps/ channels/ funcs...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Sep 9 11:09:17 CDT 2011


Author: mjordan
Date: Fri Sep  9 11:09:09 2011
New Revision: 335064

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=335064
Log:
Updated SIP 484 handling; added Incomplete control frame

When a SIP phone uses the dial application and receives a 484 Address 
Incomplete response, if overlapped dialing is enabled for SIP, then
the 484 Address Incomplete is forwarded back to the SIP phone and the
HANGUPCAUSE channel variable is set to 28.  Previously, the Incomplete
application dialplan logic was automatically triggered; now, explicit
dialplan usage of the application is required.

Additionally, this patch adds a new AST_CONTOL_FRAME type called
AST_CONTROL_INCOMPLETE.  If a channel driver receives this control frame,
it is an indication that the dialplan expects more digits back from the
device.  If the device supports overlap dialing it should attempt to 
notify the device that the dialplan is waiting for more digits; otherwise,
it can handle the frame in a manner appropriate to the channel driver.

(closes issue ASTERISK-17288)
Reported by: Mikael Carlsson
Tested by: Matthew Jordan

Review: https://reviewboard.asterisk.org/r/1416/


Modified:
    branches/1.8/addons/chan_ooh323.c
    branches/1.8/apps/app_dial.c
    branches/1.8/channels/chan_alsa.c
    branches/1.8/channels/chan_console.c
    branches/1.8/channels/chan_dahdi.c
    branches/1.8/channels/chan_h323.c
    branches/1.8/channels/chan_mgcp.c
    branches/1.8/channels/chan_misdn.c
    branches/1.8/channels/chan_oss.c
    branches/1.8/channels/chan_sip.c
    branches/1.8/channels/chan_skinny.c
    branches/1.8/channels/chan_unistim.c
    branches/1.8/channels/chan_usbradio.c
    branches/1.8/channels/sig_pri.c
    branches/1.8/channels/sig_ss7.c
    branches/1.8/funcs/func_frame_trace.c
    branches/1.8/include/asterisk/frame.h
    branches/1.8/main/channel.c
    branches/1.8/main/dial.c
    branches/1.8/main/features.c
    branches/1.8/main/pbx.c

Modified: branches/1.8/addons/chan_ooh323.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/addons/chan_ooh323.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/addons/chan_ooh323.c (original)
+++ branches/1.8/addons/chan_ooh323.c Fri Sep  9 11:09:09 2011
@@ -1226,21 +1226,24 @@
 	 
    	ast_mutex_lock(&p->lock);
 	switch (condition) {
+	case AST_CONTROL_INCOMPLETE:
+		/* While h323 does support overlapped dialing, this channel driver does not
+		 * at this time.  Treat a response of Incomplete as if it were congestion.
+		 */
 	case AST_CONTROL_CONGESTION:
 		if (!ast_test_flag(p, H323_ALREADYGONE)) {
-            		ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED, 
-						AST_CAUSE_SWITCH_CONGESTION);
+			ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED, AST_CAUSE_SWITCH_CONGESTION);
 			ast_set_flag(p, H323_ALREADYGONE);
 		}
 		break;
 	case AST_CONTROL_BUSY:
 		if (!ast_test_flag(p, H323_ALREADYGONE)) {
-            		ooHangCall(callToken, OO_REASON_LOCAL_BUSY, AST_CAUSE_USER_BUSY);
+			ooHangCall(callToken, OO_REASON_LOCAL_BUSY, AST_CAUSE_USER_BUSY);
 			ast_set_flag(p, H323_ALREADYGONE);
 		}
 		break;
 	case AST_CONTROL_HOLD:
-		ast_moh_start(ast, data, NULL);		
+		ast_moh_start(ast, data, NULL);
 		break;
 	case AST_CONTROL_UNHOLD:
 		ast_moh_stop(ast);

Modified: branches/1.8/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_dial.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/apps/app_dial.c (original)
+++ branches/1.8/apps/app_dial.c Fri Sep  9 11:09:09 2011
@@ -2423,14 +2423,6 @@
 		} else { /* Nobody answered, next please? */
 			res = 0;
 		}
-
-		/* SIP, in particular, sends back this error code to indicate an
-		 * overlap dialled number needs more digits. */
-		if (chan->hangupcause == AST_CAUSE_INVALID_NUMBER_FORMAT) {
-			res = AST_PBX_INCOMPLETE;
-		}
-
-		/* almost done, although the 'else' block is 400 lines */
 	} else {
 		const char *number;
 

Modified: branches/1.8/channels/chan_alsa.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_alsa.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_alsa.c (original)
+++ branches/1.8/channels/chan_alsa.c Fri Sep  9 11:09:09 2011
@@ -537,6 +537,7 @@
 	case AST_CONTROL_BUSY:
 	case AST_CONTROL_CONGESTION:
 	case AST_CONTROL_RINGING:
+	case AST_CONTROL_INCOMPLETE:
 	case -1:
 		res = -1;  /* Ask for inband indications */
 		break;

Modified: branches/1.8/channels/chan_console.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_console.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_console.c (original)
+++ branches/1.8/channels/chan_console.c Fri Sep  9 11:09:09 2011
@@ -610,6 +610,7 @@
 	case AST_CONTROL_BUSY:
 	case AST_CONTROL_CONGESTION:
 	case AST_CONTROL_RINGING:
+	case AST_CONTROL_INCOMPLETE:
 	case -1:
 		res = -1;  /* Ask for inband indications */
 		break;

Modified: branches/1.8/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_dahdi.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_dahdi.c (original)
+++ branches/1.8/channels/chan_dahdi.c Fri Sep  9 11:09:09 2011
@@ -9315,13 +9315,18 @@
 				ast_setstate(chan, AST_STATE_RINGING);
 			}
 			break;
+		case AST_CONTROL_INCOMPLETE:
+			ast_debug(1, "Received AST_CONTROL_INCOMPLETE on %s\n", chan->name);
+			/* act as a progress or proceeding, allowing the caller to enter additional numbers */
+			res = 0;
+			break;
 		case AST_CONTROL_PROCEEDING:
-			ast_debug(1,"Received AST_CONTROL_PROCEEDING on %s\n",chan->name);
+			ast_debug(1, "Received AST_CONTROL_PROCEEDING on %s\n", chan->name);
 			/* don't continue in ast_indicate */
 			res = 0;
 			break;
 		case AST_CONTROL_PROGRESS:
-			ast_debug(1,"Received AST_CONTROL_PROGRESS on %s\n",chan->name);
+			ast_debug(1, "Received AST_CONTROL_PROGRESS on %s\n", chan->name);
 			/* don't continue in ast_indicate */
 			res = 0;
 			break;

Modified: branches/1.8/channels/chan_h323.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_h323.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_h323.c (original)
+++ branches/1.8/channels/chan_h323.c Fri Sep  9 11:09:09 2011
@@ -900,6 +900,10 @@
 			res = 0;
 		}
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		/* While h323 does support overlapped dialing, this channel driver does not
+		 * at this time.  Treat a response of Incomplete as if it were congestion.
+		 */
 	case AST_CONTROL_CONGESTION:
 		if (c->_state != AST_STATE_UP) {
 			h323_answering_call(token, 1);

Modified: branches/1.8/channels/chan_mgcp.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_mgcp.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_mgcp.c (original)
+++ branches/1.8/channels/chan_mgcp.c Fri Sep  9 11:09:09 2011
@@ -1457,6 +1457,10 @@
 	case AST_CONTROL_BUSY:
 		transmit_notify_request(sub, "L/bz");
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		/* We do not currently support resetting of the Interdigit Timer, so treat
+		 * Incomplete control frames as a congestion response
+		 */
 	case AST_CONTROL_CONGESTION:
 		transmit_notify_request(sub, sub->parent->ncs ? "L/cg" : "G/cg");
 		break;

Modified: branches/1.8/channels/chan_misdn.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_misdn.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_misdn.c (original)
+++ branches/1.8/channels/chan_misdn.c Fri Sep  9 11:09:09 2011
@@ -6983,6 +6983,19 @@
 		chan_misdn_log(1, p->bc->port, " --> * IND :\tproceeding pid:%d\n", p->bc->pid);
 		misdn_lib_send_event(p->bc, EVENT_PROCEEDING);
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		chan_misdn_log(1, p->bc->port, " --> *\tincomplete pid:%d\n", p->bc->pid);
+		if (!p->overlap_dial) {
+			/* Overlapped dialing not enabled - send hangup */
+			p->bc->out_cause = AST_CAUSE_INVALID_NUMBER_FORMAT;
+			start_bc_tones(p);
+			misdn_lib_send_event(p->bc, EVENT_DISCONNECT);
+
+			if (p->bc->nt) {
+				hanguptone_indicate(p);
+			}
+		}
+		break;
 	case AST_CONTROL_CONGESTION:
 		chan_misdn_log(1, p->bc->port, " --> * IND :\tcongestion pid:%d\n", p->bc->pid);
 

Modified: branches/1.8/channels/chan_oss.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_oss.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_oss.c (original)
+++ branches/1.8/channels/chan_oss.c Fri Sep  9 11:09:09 2011
@@ -755,6 +755,7 @@
 	int res = 0;
 
 	switch (cond) {
+	case AST_CONTROL_INCOMPLETE:
 	case AST_CONTROL_BUSY:
 	case AST_CONTROL_CONGESTION:
 	case AST_CONTROL_RINGING:

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=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Fri Sep  9 11:09:09 2011
@@ -6677,6 +6677,20 @@
 		}
 		res = -1;
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		if (ast->_state != AST_STATE_UP) {
+			if (ast_test_flag(&p->flags[1], SIP_PAGE2_ALLOWOVERLAP)) {
+				transmit_response_reliable(p, "484 Address Incomplete", &p->initreq);
+			} else {
+				transmit_response_reliable(p, "404 Not Found", &p->initreq);
+			}
+			p->invitestate = INV_COMPLETED;
+			sip_alreadygone(p);
+			ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
+			break;
+		}
+		res = 0;
+		break;
 	case AST_CONTROL_PROCEEDING:
 		if ((ast->_state != AST_STATE_UP) &&
 		    !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
@@ -20618,6 +20632,15 @@
 				case 504: /* Server Timeout */
 					if (owner)
 						ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
+					break;
+				case 484: /* Address Incomplete */
+					if (owner && sipmethod != SIP_BYE) {
+						if (ast_test_flag(&p->flags[1], SIP_PAGE2_ALLOWOVERLAP)) {
+							ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
+						} else {
+							ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(404));
+						}
+					}
 					break;
 				default:
 					/* Send hangup */	

Modified: branches/1.8/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_skinny.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_skinny.c (original)
+++ branches/1.8/channels/chan_skinny.c Fri Sep  9 11:09:09 2011
@@ -4290,6 +4290,8 @@
 		return "Connected Line";
 	case AST_CONTROL_REDIRECTING:
 		return "Redirecting";
+	case AST_CONTROL_INCOMPLETE:
+		return "Incomplete";
 	case -1:
 		return "Stop tone";
 	default:
@@ -4423,6 +4425,8 @@
 			}
 		}
 		return -1; /* Tell asterisk to provide inband signalling */
+	case AST_CONTROL_INCOMPLETE:
+		/* Support for incomplete not supported for chan_skinny; treat as congestion */
 	case AST_CONTROL_CONGESTION:
 		if (ast->_state != AST_STATE_UP) {
 			if (!d->earlyrtp) {

Modified: branches/1.8/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_unistim.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_unistim.c (original)
+++ branches/1.8/channels/chan_unistim.c Fri Sep  9 11:09:09 2011
@@ -4182,6 +4182,10 @@
 			break;
 		}
 		return -1;
+	case AST_CONTROL_INCOMPLETE:
+		/* Overlapped dialing is not currently supported for UNIStim.  Treat an indication
+		 * of incomplete as congestion
+		 */
 	case AST_CONTROL_CONGESTION:
 		if (ast->_state != AST_STATE_UP) {
 			sub->alreadygone = 1;

Modified: branches/1.8/channels/chan_usbradio.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_usbradio.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/chan_usbradio.c (original)
+++ branches/1.8/channels/chan_usbradio.c Fri Sep  9 11:09:09 2011
@@ -2119,7 +2119,9 @@
 		case AST_CONTROL_RINGING:
 			res = cond;
 			break;
-
+		case AST_CONTROL_INCOMPLETE:
+			res = AST_CONTROL_CONGESTION;
+			break;
 		case -1:
 #ifndef	NEW_ASTERISK
 			o->cursound = -1;

Modified: branches/1.8/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_pri.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/sig_pri.c (original)
+++ branches/1.8/channels/sig_pri.c Fri Sep  9 11:09:09 2011
@@ -6922,6 +6922,15 @@
 		/* don't continue in ast_indicate */
 		res = 0;
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		/* If we are connected or if we support overlap dialing, wait for additional digits */
+		if (p->call_level == SIG_PRI_CALL_LEVEL_CONNECT || (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) {
+			res = 0;
+			break;
+		}
+		/* Otherwise, treat as congestion */
+		chan->hangupcause = AST_CAUSE_INVALID_NUMBER_FORMAT;
+		/* Falls through */
 	case AST_CONTROL_CONGESTION:
 		if (p->priindication_oob || p->no_b_channel) {
 			/* There are many cause codes that generate an AST_CONTROL_CONGESTION. */

Modified: branches/1.8/channels/sig_ss7.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_ss7.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/channels/sig_ss7.c (original)
+++ branches/1.8/channels/sig_ss7.c Fri Sep  9 11:09:09 2011
@@ -1559,6 +1559,14 @@
 		/* don't continue in ast_indicate */
 		res = 0;
 		break;
+	case AST_CONTROL_INCOMPLETE:
+		/* If the channel is connected, wait for additional input */
+		if (p->call_level == SIG_SS7_CALL_LEVEL_CONNECT) {
+			res = 0;
+			break;
+		}
+		chan->hangupcause = AST_CAUSE_INVALID_NUMBER_FORMAT;
+		break;
 	case AST_CONTROL_CONGESTION:
 		chan->hangupcause = AST_CAUSE_CONGESTION;
 		break;

Modified: branches/1.8/funcs/func_frame_trace.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/funcs/func_frame_trace.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/funcs/func_frame_trace.c (original)
+++ branches/1.8/funcs/func_frame_trace.c Fri Sep  9 11:09:09 2011
@@ -312,6 +312,9 @@
 		case AST_CONTROL_AOC:
 			ast_verbose("SubClass: AOC\n");
 			break;
+		case AST_CONTROL_INCOMPLETE:
+			ast_verbose("SubClass: INCOMPLETE\n");
+			break;
 		}
 		if (frame->subclass.integer == -1) {
 			ast_verbose("SubClass: %d\n", frame->subclass.integer);

Modified: branches/1.8/include/asterisk/frame.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/include/asterisk/frame.h?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/include/asterisk/frame.h (original)
+++ branches/1.8/include/asterisk/frame.h Fri Sep  9 11:09:09 2011
@@ -334,6 +334,7 @@
 	AST_CONTROL_READ_ACTION = 27,	/*!< Tell ast_read to take a specific action */
 	AST_CONTROL_AOC = 28,			/*!< Advice of Charge with encoded generic AOC payload */
 	AST_CONTROL_END_OF_Q = 29,		/*!< Indicate that this position was the end of the channel queue for a softhangup. */
+	AST_CONTROL_INCOMPLETE = 30,	/*!< Indication that the extension dialed is incomplete */
 };
 
 enum ast_frame_read_action {

Modified: branches/1.8/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/channel.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/main/channel.c (original)
+++ branches/1.8/main/channel.c Fri Sep  9 11:09:09 2011
@@ -4293,6 +4293,7 @@
 	case AST_CONTROL_END_OF_Q:
 		break;
 
+	case AST_CONTROL_INCOMPLETE:
 	case AST_CONTROL_CONGESTION:
 	case AST_CONTROL_BUSY:
 	case AST_CONTROL_RINGING:
@@ -4449,6 +4450,7 @@
 	case AST_CONTROL_BUSY:
 		ts = ast_get_indication_tone(chan->zone, "busy");
 		break;
+	case AST_CONTROL_INCOMPLETE:
 	case AST_CONTROL_CONGESTION:
 		ts = ast_get_indication_tone(chan->zone, "congestion");
 		break;
@@ -5343,6 +5345,12 @@
 				case AST_CONTROL_BUSY:
 					ast_cdr_busy(chan->cdr);
 					*outstate = f->subclass.integer;
+					timeout = 0;
+					break;
+
+				case AST_CONTROL_INCOMPLETE:
+					ast_cdr_failed(chan->cdr);
+					*outstate = AST_CONTROL_CONGESTION;
 					timeout = 0;
 					break;
 

Modified: branches/1.8/main/dial.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/dial.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/main/dial.c (original)
+++ branches/1.8/main/dial.c Fri Sep  9 11:09:09 2011
@@ -397,6 +397,10 @@
 			ast_verb(3, "%s is circuit-busy\n", channel->owner->name);
 			ast_hangup(channel->owner);
 			channel->owner = NULL;
+			break;
+		case AST_CONTROL_INCOMPLETE:
+			ast_verb(3, "%s dialed Incomplete extension %s\n", channel->owner->name, channel->owner->exten);
+			ast_indicate(chan, AST_CONTROL_INCOMPLETE);
 			break;
 		case AST_CONTROL_RINGING:
 			ast_verb(3, "%s is ringing\n", channel->owner->name);

Modified: branches/1.8/main/features.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/features.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/main/features.c (original)
+++ branches/1.8/main/features.c Fri Sep  9 11:09:09 2011
@@ -3411,6 +3411,8 @@
 					ast_indicate(caller, AST_CONTROL_BUSY);
 					ast_frfree(f);
 					break;
+				} else if (f->subclass.integer == AST_CONTROL_INCOMPLETE) {
+					ast_verb(3, "%s dialed incomplete extension %s; ignoring\n", chan->name, chan->exten);
 				} else if (f->subclass.integer == AST_CONTROL_CONGESTION) {
 					state = f->subclass.integer;
 					ast_verb(3, "%s is congested\n", chan->name);

Modified: branches/1.8/main/pbx.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/pbx.c?view=diff&rev=335064&r1=335063&r2=335064
==============================================================================
--- branches/1.8/main/pbx.c (original)
+++ branches/1.8/main/pbx.c Fri Sep  9 11:09:09 2011
@@ -9226,6 +9226,8 @@
 		__ast_answer(chan, 0, 1);
 	}
 
+	ast_indicate(chan, AST_CONTROL_INCOMPLETE);
+
 	return AST_PBX_INCOMPLETE;
 }
 




More information about the asterisk-commits mailing list