mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	chan_dahdi: Add the chan_dahdi.conf force_restart_unavailable_chans option.
Some telco switches occasionally ignore ISDN RESTART requests. The fix for ASTERISK-19608 added an escape clause for B channels in the restarting state if the telco ignores a RESTART request. If the telco fails to acknowledge the RESTART then Asterisk will assume the telco acknowledged the RESTART on the second call attempt requesting the B channel by the telco. The escape clause is good for dealing with RESTART requests in general but it does cause the next call for the restarting B channel to be rejected if the telco insists the call must go on that B channel. chan_dahdi doesn't really need to issue a RESTART request in response to receiving a cause 44 (Requested channel not available) code. Sending the RESTART in such a situation is not required (nor prohibited) by the standards. I think chan_dahdi does this for historical reasons to deal with buggy peers to get channels unstuck in a similar fashion as the chan_dahdi.conf resetinterval option. * Add the chan_dahdi.conf force_restart_unavailable_chans compatability option that when disabled will prevent chan_dahdi from trying to RESTART the channel in response to a cause 44 code. ASTERISK-25034 #close Reported by: Richard Mudgett Change-Id: Ib8b17a438799920f4a2038826ff99a1884042f65
This commit is contained in:
		
				
					committed by
					
						 Joshua Colp
						Joshua Colp
					
				
			
			
				
	
			
			
			
						parent
						
							7fe923d20b
						
					
				
				
					commit
					03c51cf525
				
			| @@ -133,15 +133,6 @@ | ||||
|  */ | ||||
| //#define ALWAYS_PICK_CHANNEL	1 | ||||
|  | ||||
| /*! | ||||
|  * Define to force a RESTART on a channel that returns a cause | ||||
|  * code of PRI_CAUSE_REQUESTED_CHAN_UNAVAIL(44).  If the cause | ||||
|  * is because of a stuck channel on the peer and the channel is | ||||
|  * always the next channel we pick for an outgoing call then | ||||
|  * this can help. | ||||
|  */ | ||||
| #define FORCE_RESTART_UNAVAIL_CHANS		1 | ||||
|  | ||||
| #if defined(HAVE_PRI_CCSS) | ||||
| struct sig_pri_cc_agent_prv { | ||||
| 	/*! Asterisk span D channel control structure. */ | ||||
| @@ -7158,9 +7149,9 @@ static void *pri_dchannel(void *vpri) | ||||
| 					pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause); | ||||
| 					pri->pvts[chanpos]->call = NULL; | ||||
| 				} | ||||
| #if defined(FORCE_RESTART_UNAVAIL_CHANS) | ||||
| 				if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL | ||||
| 					&& pri->sig != SIG_BRI_PTMP && !pri->resetting | ||||
| 					&& pri->force_restart_unavailable_chans | ||||
| 					&& pri->pvts[chanpos]->resetting == SIG_PRI_RESET_IDLE) { | ||||
| 					ast_verb(3, | ||||
| 						"Span %d: Forcing restart of channel %d/%d since channel reported in use\n", | ||||
| @@ -7169,7 +7160,6 @@ static void *pri_dchannel(void *vpri) | ||||
| 					pri->pvts[chanpos]->resetting = SIG_PRI_RESET_ACTIVE; | ||||
| 					pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos])); | ||||
| 				} | ||||
| #endif	/* defined(FORCE_RESTART_UNAVAIL_CHANS) */ | ||||
| 				if (e->hangup.aoc_units > -1) | ||||
| 					ast_verb(3, "Channel %d/%d, span %d received AOC-E charging %d unit%s\n", | ||||
| 						pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s"); | ||||
| @@ -7307,9 +7297,9 @@ static void *pri_dchannel(void *vpri) | ||||
| 					pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause); | ||||
| 					pri->pvts[chanpos]->call = NULL; | ||||
| 				} | ||||
| #if defined(FORCE_RESTART_UNAVAIL_CHANS) | ||||
| 				if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL | ||||
| 					&& pri->sig != SIG_BRI_PTMP && !pri->resetting | ||||
| 					&& pri->force_restart_unavailable_chans | ||||
| 					&& pri->pvts[chanpos]->resetting == SIG_PRI_RESET_IDLE) { | ||||
| 					ast_verb(3, | ||||
| 						"Span %d: Forcing restart of channel %d/%d since channel reported in use\n", | ||||
| @@ -7318,7 +7308,6 @@ static void *pri_dchannel(void *vpri) | ||||
| 					pri->pvts[chanpos]->resetting = SIG_PRI_RESET_ACTIVE; | ||||
| 					pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos])); | ||||
| 				} | ||||
| #endif	/* defined(FORCE_RESTART_UNAVAIL_CHANS) */ | ||||
|  | ||||
| #ifdef SUPPORT_USERUSER | ||||
| 				if (!ast_strlen_zero(e->hangup.useruserinfo)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user