From d41694350fd99524834b29dae5772d13280ecd54 Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Sun, 23 Oct 2022 22:46:24 +0000 Subject: [PATCH] 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 --- channels/chan_dahdi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index e9527963b0..5607eb01b7 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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;