diff --git a/UPGRADE.txt b/UPGRADE.txt index 2a4c1ded44..f79f048b34 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -20,7 +20,7 @@ === =========================================================== -from 11.10.0 to 11.11.0 +from 11.10.2 to 11.11.0 - Added a compatibility option for chan_sip, 'websocket_write_timeout'. When a websocket connection exists where Asterisk writes a substantial amount of data to the connected client, and the connected client is slow @@ -41,6 +41,10 @@ from 11.10.0 to 11.11.0 hash to be specified for the DTLS fingerprint placed in SDP. Supported values are 'sha-1' and 'sha-256' with 'sha-256' being the default. + - Added the inband_on_setup_ack compatibility option to chan_dahdi.conf to + deal with switches that don't send an inband progress indication in the + SETUP ACKNOWLEDGE message. + from 11.10.0 to 11.10.1 - MixMonitor AMI actions now require users to have authorization classes. * MixMonitor - system diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 3a37087d9d..5610b00443 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -1409,6 +1409,7 @@ static struct dahdi_chan_conf dahdi_chan_conf_default(void) .localdialplan = PRI_NATIONAL_ISDN + 1, .nodetype = PRI_CPE, .qsigchannelmapping = DAHDI_CHAN_MAPPING_PHYSICAL, + .inband_on_setup_ack = 1, .inband_on_proceeding = 1, #if defined(HAVE_PRI_CCSS) @@ -12960,6 +12961,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, pris[span].pri.layer1_ignored = 0; } pris[span].pri.append_msn_to_user_tag = conf->pri.pri.append_msn_to_user_tag; + pris[span].pri.inband_on_setup_ack = conf->pri.pri.inband_on_setup_ack; pris[span].pri.inband_on_proceeding = conf->pri.pri.inband_on_proceeding; ast_copy_string(pris[span].pri.initial_user_tag, conf->chan.cid_tag, sizeof(pris[span].pri.initial_user_tag)); ast_copy_string(pris[span].pri.msn_list, conf->pri.pri.msn_list, sizeof(pris[span].pri.msn_list)); @@ -18334,6 +18336,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct #endif /* defined(HAVE_PRI_MWI) */ } else if (!strcasecmp(v->name, "append_msn_to_cid_tag")) { confp->pri.pri.append_msn_to_user_tag = ast_true(v->value); + } else if (!strcasecmp(v->name, "inband_on_setup_ack")) { + confp->pri.pri.inband_on_setup_ack = ast_true(v->value); } else if (!strcasecmp(v->name, "inband_on_proceeding")) { confp->pri.pri.inband_on_proceeding = ast_true(v->value); #if defined(HAVE_PRI_DISPLAY_TEXT) diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 1d9067adf8..3e231f6249 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -1516,6 +1516,9 @@ static int pri_fixup_principle(struct sig_pri_span *pri, int principle, q931_cal #if defined(HAVE_PRI_CALL_WAITING) new_chan->is_call_waiting = old_chan->is_call_waiting; #endif /* defined(HAVE_PRI_CALL_WAITING) */ +#if defined(HAVE_PRI_SETUP_ACK_INBAND) + new_chan->no_dialed_digits = old_chan->no_dialed_digits; +#endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */ #if defined(HAVE_PRI_AOC_EVENTS) old_chan->aoc_s_request_invoke_id_valid = 0; @@ -1531,6 +1534,9 @@ static int pri_fixup_principle(struct sig_pri_span *pri, int principle, q931_cal #if defined(HAVE_PRI_CALL_WAITING) old_chan->is_call_waiting = 0; #endif /* defined(HAVE_PRI_CALL_WAITING) */ +#if defined(HAVE_PRI_SETUP_ACK_INBAND) + old_chan->no_dialed_digits = 0; +#endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */ /* More stuff to transfer to the new channel. */ new_chan->call_level = old_chan->call_level; @@ -7363,8 +7369,19 @@ static void *pri_dchannel(void *vpri) * We explicitly DO NOT want to check PRI_PROG_CALL_NOT_E2E_ISDN * because it will mess up ISDN to SIP interoperability for * the ALERTING message. + * + * Q.931 Section 5.1.3 says that in scenarios with overlap + * dialing where no called digits are received and the tone + * option requires dialtone, the switch MAY send an inband + * progress indication ie to indicate dialtone presence in + * the SETUP ACKNOWLEDGE. Therefore, if we did not send any + * digits with the SETUP then we must assume that dialtone + * is present and open the voice path. Fortunately when + * interoperating with SIP, we should be sending digits. */ - && (e->setup_ack.progressmask & PRI_PROG_INBAND_AVAILABLE) + && ((e->setup_ack.progressmask & PRI_PROG_INBAND_AVAILABLE) + || pri->inband_on_setup_ack + || pri->pvts[chanpos]->no_dialed_digits) #endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */ ) { /* @@ -7977,7 +7994,12 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, const char *rd if (!keypad || !ast_strlen_zero(c + p->stripmsd + dp_strip)) #endif /* defined(HAVE_PRI_SETUP_KEYPAD) */ { - pri_sr_set_called(sr, c + p->stripmsd + dp_strip, pridialplan, s ? 1 : 0); + char *called = c + p->stripmsd + dp_strip; + + pri_sr_set_called(sr, called, pridialplan, s ? 1 : 0); +#if defined(HAVE_PRI_SETUP_ACK_INBAND) + p->no_dialed_digits = !called[0]; +#endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */ } #if defined(HAVE_PRI_SUBADDR) diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 43acb12697..e9a699ffff 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -343,6 +343,10 @@ struct sig_pri_chan { /*! \brief TRUE if this is a call waiting call */ unsigned int is_call_waiting:1; #endif /* defined(HAVE_PRI_CALL_WAITING) */ +#if defined(HAVE_PRI_SETUP_ACK_INBAND) + /*! TRUE if outgoing SETUP had no called digits */ + unsigned int no_dialed_digits:1; +#endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */ struct ast_channel *owner; @@ -470,6 +474,8 @@ struct sig_pri_span { * appended to the initial_user_tag[]. */ unsigned int append_msn_to_user_tag:1; + /*! TRUE if a SETUP ACK message needs to open the audio path. */ + unsigned int inband_on_setup_ack:1; /*! TRUE if a PROCEEDING message needs to unsquelch the received audio. */ unsigned int inband_on_proceeding:1; #if defined(HAVE_PRI_MCID) diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index be9381624a..dfd6e5280d 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -196,6 +196,23 @@ context=public ; ;resetinterval = 3600 ; +; Assume inband audio may be present when a SETUP ACK message is received. +; Q.931 Section 5.1.3 says that in scenarios with overlap dialing, when a +; dialtone is sent from the network side, progress indicator 8 "Inband info +; now available" MAY be sent to the CPE if no digits were received with +; the SETUP. It is thus implied that the ie is mandatory if digits came +; with the SETUP and dialtone is needed. +; This option should be enabled, when the network sends dialtone and you +; want to hear it, but the network doesn't send the progress indicator when +; needed. +; +; NOTE: For Q.SIG setups this option should be enabled when outgoing overlap +; dialing is also enabled because Q.SIG does not send the progress indicator +; with the SETUP ACK. +; Default yes in current release branches for backward compatibility. +; +;inband_on_setup_ack=yes +; ; Assume inband audio may be present when a PROCEEDING message is received. ; Q.931 Section 5.1.2 says the network cannot assume that the CPE side has ; attached to the B channel at this time without explicitly sending the