]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_dahdi: Fix unavailable channels returning busy.
authorNaveen Albert <asterisk@phreaknet.org>
Sun, 23 Oct 2022 22:46:24 +0000 (22:46 +0000)
committerGeorge Joseph <gjoseph@digium.com>
Wed, 26 Oct 2022 16:14:50 +0000 (11:14 -0500)
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

index e9527963b075c2a62bd428bf06e4c576787e257e..5607eb01b7b9dd9b37d33d5d84c496fc614cd99f 100644 (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;