chan_dahdi: Fix unavailable channels returning busy.
This fixes dahdi_request to properly set the cause code to CONGESTION instead of BUSY if no channels were actually available. Currently, the cause is erroneously set to busy if the channel itself is found, regardless of its current state. However, if the channel is not available (e.g. T1 down, card not operable, etc.), then the channel itself may not be in a functional state, in which case CHANUNAVAIL is the correct cause to use. This adds a simple check to ensure that busy tone is only returned if a channel is encountered that has an owner, since that is the only possible way that a channel could actually be busy. ASTERISK-30274 #close Change-Id: Iad5870223c081240c925b19df8d6af136953b994
This commit is contained in:
parent
9258d8212a
commit
180ca32565
|
@ -13652,6 +13652,7 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
|
|||
struct ast_channel *tmp = NULL;
|
||||
struct dahdi_pvt *exitpvt;
|
||||
int channelmatched = 0;
|
||||
int foundowner = 0;
|
||||
int groupmatched = 0;
|
||||
#if defined(HAVE_PRI) || defined(HAVE_SS7)
|
||||
int transcapdigital = 0;
|
||||
|
@ -13675,6 +13676,10 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
|
|||
if (start.roundrobin)
|
||||
round_robin[start.rr_starting_point] = p;
|
||||
|
||||
if (p->owner) {
|
||||
foundowner++;
|
||||
}
|
||||
|
||||
if (is_group_or_channel_match(p, start.span, start.groupmatch, &groupmatched, start.channelmatch, &channelmatched)
|
||||
&& available(&p, channelmatched)) {
|
||||
ast_debug(1, "Using channel %d\n", p->channel);
|
||||
|
@ -13793,7 +13798,7 @@ next:
|
|||
ast_mutex_unlock(&iflock);
|
||||
restart_monitor();
|
||||
if (cause && !tmp) {
|
||||
if (callwait || channelmatched) {
|
||||
if (callwait || (channelmatched && foundowner)) {
|
||||
*cause = AST_CAUSE_BUSY;
|
||||
} else if (groupmatched) {
|
||||
*cause = AST_CAUSE_CONGESTION;
|
||||
|
|
Loading…
Reference in New Issue