[asterisk-bugs] [JIRA] (ASTERISK-24346) Using "r" option on Dial() command prevents Remote-party-ID from reaching caller

Richard Mudgett (JIRA) noreply at issues.asterisk.org
Mon Sep 22 10:41:29 CDT 2014


     [ https://issues.asterisk.org/jira/browse/ASTERISK-24346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Richard Mudgett updated ASTERISK-24346:
---------------------------------------

    Description: 
Background:

Customer was trying to use RPID in a two-PBX configuration with intra-company SIP trunk to provide caller with called party name. Upon testing customer found that RPID information was received by callee but caller display showed dialed number.

Configuration used to reproduce issue:

Extension A <-SIP-> PBX-A <-SIP-> PBX-B <-SIP-> Extension B

Options sendrpid=yes, trustrpid=yes defined where applicable.

Wireshark trace showed that due to Dial() command to extension B with "r" option, PBX-B sent early RINGING notification without RPID header to PBX-A. Second RINGING notification was sent to PBX-A after PBX-B received RINGING notification from Extension B. PBX-A only propagated first RINGING notification to Extension A, second RINGING notification was ignored by PBX-A.

Disabling "r" option on both systems allowed conforming SIP flow and RPID information was propagated properly to caller.

Code in question that appears to be responsible in apps/app_dial.c:
{noformat}
static struct ast_channel *wait_for_answer(struct ast_channel *in,
        struct dial_head *out_chans, int *to, struct ast_flags64 *peerflags,
        char *opt_args[],
        struct privacy_args *pa,
        const struct cause_args *num_in, int *result, char *dtmf_progress,
        const int ignore_cc,
        struct ast_party_id *forced_clid, struct ast_party_id *stored_clid)
{
  ...

  looping over frames
  ...

                        switch (f->frametype) {
                        case AST_FRAME_CONTROL:
                                switch (f->subclass.integer) {
  ...
                                case AST_CONTROL_RINGING:
                                        ++num_ringing;
                                        if (ignore_cc || cc_frame_received || num_ringing == numlines) {
                                                ast_verb(3, "%s is ringing\n", ast_channel_name(c));
                                                /* Setup early media if appropriate */
                                                if (single && !caller_entertained
                                                        && CAN_EARLY_BRIDGE(peerflags, in, c)) {
                                                        ast_channel_early_bridge(in, c);
                                                }
                                                if (!(pa->sentringing) && !ast_test_flag64(outgoing, OPT_MUSICBACK) && ast_strlen_zero(opt_args[OPT_ARG_RINGBACK])) {
                                                        ast_indicate(in, AST_CONTROL_RINGING);
                                                        pa->sentringing++;
                                                }
                                        }
                                        break;
{noformat}


  was:
Background:

Customer was trying to use RPID in a two-PBX configuration with intra-company SIP trunk to provide caller with called party name. Upon testing customer found that RPID information was received by callee but caller display showed dialed number.

Configuration used to reproduce issue:

Extension A <-SIP-> PBX-A <-SIP-> PBX-B <-SIP-> Extension B

Options sendrpid=yes, trustrpid=yes defined where applicable.

Wireshark trace showed that due to Dial() command to extension B with "r" option, PBX-B sent early RINGING notification without RPID header to PBX-A. Second RINGING notification was sent to PBX-A after PBX-B received RINGING notification from Extension B. PBX-A only propagated first RINGING notification to Extension A, second RINGING notification was ignored by PBX-A.

Disabling "r" option on both systems allowed conforming SIP flow and RPID information was propagated properly to caller.

Code in question that appears to be responsible in apps/app_dial.c:

static struct ast_channel *wait_for_answer(struct ast_channel *in,
        struct dial_head *out_chans, int *to, struct ast_flags64 *peerflags,
        char *opt_args[],
        struct privacy_args *pa,
        const struct cause_args *num_in, int *result, char *dtmf_progress,
        const int ignore_cc,
        struct ast_party_id *forced_clid, struct ast_party_id *stored_clid)
{
  ...

  looping over frames
  ...

                        switch (f->frametype) {
                        case AST_FRAME_CONTROL:
                                switch (f->subclass.integer) {
  ...
                                case AST_CONTROL_RINGING:
                                        ++num_ringing;
                                        if (ignore_cc || cc_frame_received || num_ringing == numlines) {
                                                ast_verb(3, "%s is ringing\n", ast_channel_name(c));
                                                /* Setup early media if appropriate */
                                                if (single && !caller_entertained
                                                        && CAN_EARLY_BRIDGE(peerflags, in, c)) {
                                                        ast_channel_early_bridge(in, c);
                                                }
                                                if (!(pa->sentringing) && !ast_test_flag64(outgoing, OPT_MUSICBACK) && ast_strlen_zero(opt_args[OPT_ARG_RINGBACK])) {
                                                        ast_indicate(in, AST_CONTROL_RINGING);
                                                        pa->sentringing++;
                                                }
                                        }
                                        break;



> Using "r" option on Dial() command prevents Remote-party-ID from reaching caller
> --------------------------------------------------------------------------------
>
>                 Key: ASTERISK-24346
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-24346
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: Applications/app_dial
>    Affects Versions: 11.11.0
>         Environment: Reproduced on generic CentOS 6.5 and Elastix 2.4.
>            Reporter: Dennis Buteyn
>            Severity: Minor
>
> Background:
> Customer was trying to use RPID in a two-PBX configuration with intra-company SIP trunk to provide caller with called party name. Upon testing customer found that RPID information was received by callee but caller display showed dialed number.
> Configuration used to reproduce issue:
> Extension A <-SIP-> PBX-A <-SIP-> PBX-B <-SIP-> Extension B
> Options sendrpid=yes, trustrpid=yes defined where applicable.
> Wireshark trace showed that due to Dial() command to extension B with "r" option, PBX-B sent early RINGING notification without RPID header to PBX-A. Second RINGING notification was sent to PBX-A after PBX-B received RINGING notification from Extension B. PBX-A only propagated first RINGING notification to Extension A, second RINGING notification was ignored by PBX-A.
> Disabling "r" option on both systems allowed conforming SIP flow and RPID information was propagated properly to caller.
> Code in question that appears to be responsible in apps/app_dial.c:
> {noformat}
> static struct ast_channel *wait_for_answer(struct ast_channel *in,
>         struct dial_head *out_chans, int *to, struct ast_flags64 *peerflags,
>         char *opt_args[],
>         struct privacy_args *pa,
>         const struct cause_args *num_in, int *result, char *dtmf_progress,
>         const int ignore_cc,
>         struct ast_party_id *forced_clid, struct ast_party_id *stored_clid)
> {
>   ...
>   looping over frames
>   ...
>                         switch (f->frametype) {
>                         case AST_FRAME_CONTROL:
>                                 switch (f->subclass.integer) {
>   ...
>                                 case AST_CONTROL_RINGING:
>                                         ++num_ringing;
>                                         if (ignore_cc || cc_frame_received || num_ringing == numlines) {
>                                                 ast_verb(3, "%s is ringing\n", ast_channel_name(c));
>                                                 /* Setup early media if appropriate */
>                                                 if (single && !caller_entertained
>                                                         && CAN_EARLY_BRIDGE(peerflags, in, c)) {
>                                                         ast_channel_early_bridge(in, c);
>                                                 }
>                                                 if (!(pa->sentringing) && !ast_test_flag64(outgoing, OPT_MUSICBACK) && ast_strlen_zero(opt_args[OPT_ARG_RINGBACK])) {
>                                                         ast_indicate(in, AST_CONTROL_RINGING);
>                                                         pa->sentringing++;
>                                                 }
>                                         }
>                                         break;
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list