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:
Naveen Albert 2022-10-23 22:46:24 +00:00 committed by George Joseph
parent 9258d8212a
commit 180ca32565
1 changed files with 6 additions and 1 deletions

View File

@ -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;