[prev in list] [next in list] [prev in thread] [next in thread]
List: asterisk-dev
Subject: [asterisk-dev] DAHDI/MFCR2: handling remote clearing for outgoing calls ?
From: Pavel Troller <patrol () sinus ! cz>
Date: 2013-10-11 5:00:14
Message-ID: 20131011050014.GA32509 () tangens ! sinus ! cz
[Download RAW message or body]
Hi!
I'm preparing an Asterisk installation serving as a gateway to the legacy
CAS/MFCR2 exchange. All seems to work well, except that almost any clear \
cause occuring during outgoing connection setup to the remote exchange is \
presented as Congestion (Clear Cause 34) to the originator.
I was searching through the code of chan_dahdi.c and found this part, in \
the dahdi_r2_on_call_disconnect() function:
...
} else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
/* being the forward side we must report what happened to \
the call to whoever requested it */ switch (cause) {
case OR2_CAUSE_BUSY_NUMBER:
p->subs[SUB_REAL].needbusy = 1;
break;
case OR2_CAUSE_NETWORK_CONGESTION:
case OR2_CAUSE_OUT_OF_ORDER:
case OR2_CAUSE_UNALLOCATED_NUMBER:
case OR2_CAUSE_NO_ANSWER:
case OR2_CAUSE_UNSPECIFIED:
case OR2_CAUSE_NORMAL_CLEARING:
p->subs[SUB_REAL].needcongestion = 1;
break;
default:
ast_channel_softhangup_internal_flag_add(p->owner, \
AST_SOFTHANGUP_DEV); }
ast_mutex_unlock(&p->lock);
} else {
ast_mutex_unlock(&p->lock);
/* being the backward side and not UP yet, we only need to \
request hangup */
/* TODO: what about doing this same thing when were \
AST_STATE_UP? */
ast_queue_hangup_with_cause(p->owner, \
dahdi_r2_cause_to_ast_cause(cause)); }
...
Setting needcongestion causes that dahdi_read() sends the
AST_CONTROL_CONGESTION frame towards the originator, causing it to initiate
hangup with obvious Congestion clear cause (34).
But what I don't understand, is, WHY we are sending the congestion frame
instead of simply initiating the hangup by ourself with a proper cause ?
Because I didn't find a trick how to propagate a proper cause code to the
originator, I've changed the code to the following:
} else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
/* being the forward side we must report what happened to \
the call to whoever requested it */ switch (cause) {
case OR2_CAUSE_BUSY_NUMBER:
p->subs[SUB_REAL].needbusy = 1;
break;
case OR2_CAUSE_NETWORK_CONGESTION:
case OR2_CAUSE_OUT_OF_ORDER:
case OR2_CAUSE_UNSPECIFIED:
p->subs[SUB_REAL].needcongestion = 1;
break;
case OR2_CAUSE_UNALLOCATED_NUMBER:
case OR2_CAUSE_NO_ANSWER:
case OR2_CAUSE_NORMAL_CLEARING:
ast_mutex_unlock(&p->lock);
ast_queue_hangup_with_cause(p->owner, \
dahdi_r2_cause_to_ast_cause(cause)); return;
break;
default:
ast_channel_softhangup_internal_flag_add(p->owner, \
AST_SOFTHANGUP_DEV); }
ast_mutex_unlock(&p->lock);
} else {
In this case, it is chan_dahdi, who initiates the hangup, and it can set \
the clear cause using the standard set of cause values (for selected clear \
cases). From the user's point of view, I can't find anything wrong with \
this solution. Now the connection attempt is cleared as before, but with \
the proper cause code (tested on UNALLOCATED).
By the way, there is probably a bug in the mapping function, \
dahdi_r2_cause_to_ast_cause(). OR2_CAUSE_UNALLOCATED_NUMBER is mapped to \
AST_CAUSE_UNREGISTERED, while it must be mapped to AST_CAUSE_UNALLOCATED.
I would like to hear, why the hangup handling was written in such a \
strange way, and whether we need a different handling for forward and \
backward connections at all - for me it seems superfluous.
With regards,
Pavel
--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic