[asterisk-dev] DAHDI/MFCR2: handling remote clearing for outgoing calls ?

Richard Mudgett rmudgett at digium.com
Fri Oct 11 10:50:52 CDT 2013


On Fri, Oct 11, 2013 at 12:00 AM, Pavel Troller <patrol at sinus.cz> wrote:

> 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.


In a word: legacy.  The chan_dahdi channel driver was originally written
for analog lines in
early versions of Asterisk.  Later MFC/R2, PRI, and SS7 were forced into
the driver so they
for the most part do things the way the old analog code did it.

Richard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20131011/87120dd6/attachment.html>


More information about the asterisk-dev mailing list