summaryrefslogtreecommitdiff
path: root/channels/sig_pri.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/sig_pri.c')
-rw-r--r--channels/sig_pri.c87
1 files changed, 65 insertions, 22 deletions
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index 025117c8d..d153da1db 100644
--- a/channels/sig_pri.c
+++ b/channels/sig_pri.c
@@ -2137,10 +2137,10 @@ static void *pri_ss_thread(void *data)
/* Start the real PBX */
ast_channel_exten_set(chan, exten);
sig_pri_dsp_reset_and_flush_digits(p);
-#if defined(ISSUE_16789)
+#if defined(JIRA_ASTERISK_15594)
/*
- * Conditionaled out this code to effectively revert the Mantis
- * issue 16789 change. It breaks overlap dialing through
+ * Conditionaled out this code to effectively revert the JIRA
+ * ASTERISK-15594 change. It breaks overlap dialing through
* Asterisk. There is not enough information available at this
* point to know if dialing is complete. The
* ast_exists_extension(), ast_matchmore_extension(), and
@@ -2163,7 +2163,7 @@ static void *pri_ss_thread(void *data)
}
sig_pri_unlock_private(p);
}
-#endif /* defined(ISSUE_16789) */
+#endif /* defined(JIRA_ASTERISK_15594) */
sig_pri_set_echocanceller(p, 1);
ast_channel_lock(chan);
@@ -6435,6 +6435,9 @@ static void *pri_dchannel(void *vpri)
/* Make sure extension exists (or in overlap dial mode, can exist) */
if (((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && ast_canmatch_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) ||
ast_exists_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
+ int could_match_more;
+ int need_dialtone;
+
/* Select audio companding mode. */
switch (e->ring.layer1) {
case PRI_LAYER_1_ALAW:
@@ -6449,6 +6452,23 @@ static void *pri_dchannel(void *vpri)
break;
}
+ could_match_more = !e->ring.complete
+ && (pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
+ && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context,
+ pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num);
+
+ need_dialtone = could_match_more
+ /*
+ * Must explicitly check the digital capability this
+ * way instead of checking the pvt->digital flag
+ * because the flag hasn't been set yet.
+ */
+ && !(e->ring.ctype & AST_TRANS_CAP_DIGITAL)
+ && !pri->pvts[chanpos]->no_b_channel
+ && (!strlen(pri->pvts[chanpos]->exten)
+ || ast_ignore_pattern(pri->pvts[chanpos]->context,
+ pri->pvts[chanpos]->exten));
+
if (e->ring.complete || !(pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) {
/* Just announce proceeding */
pri->pvts[chanpos]->call_level = SIG_PRI_CALL_LEVEL_PROCEEDING;
@@ -6458,13 +6478,17 @@ static void *pri_dchannel(void *vpri)
pri_answer(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
} else {
pri->pvts[chanpos]->call_level = SIG_PRI_CALL_LEVEL_OVERLAP;
- pri_need_more_info(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
+#if defined(HAVE_PRI_SETUP_ACK_INBAND)
+ pri_setup_ack(pri->pri, e->ring.call,
+ PVT_TO_CHANNEL(pri->pvts[chanpos]), 1, need_dialtone);
+#else /* !defined(HAVE_PRI_SETUP_ACK_INBAND) */
+ pri_need_more_info(pri->pri, e->ring.call,
+ PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
+#endif /* !defined(HAVE_PRI_SETUP_ACK_INBAND) */
}
/* Start PBX */
- if (!e->ring.complete
- && (pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
- && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
+ if (could_match_more) {
/*
* Release the PRI lock while we create the channel so other
* threads can send D channel messages. We must also release
@@ -6549,12 +6573,9 @@ static void *pri_dchannel(void *vpri)
sig_pri_handle_subcmds(pri, chanpos, e->e, e->ring.subcmds,
e->ring.call);
- if (!pri->pvts[chanpos]->digital
- && !pri->pvts[chanpos]->no_b_channel) {
- /*
- * Call has a channel.
- * Indicate that we are providing dialtone.
- */
+#if !defined(HAVE_PRI_SETUP_ACK_INBAND)
+ if (need_dialtone) {
+ /* Indicate that we are providing dialtone. */
pri->pvts[chanpos]->progress = 1;/* No need to send plain PROGRESS again. */
#ifdef HAVE_PRI_PROG_W_CAUSE
pri_progress_with_cause(pri->pri, e->ring.call,
@@ -6564,6 +6585,7 @@ static void *pri_dchannel(void *vpri)
PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
#endif
}
+#endif /* !defined(HAVE_PRI_SETUP_ACK_INBAND) */
ast_channel_stage_snapshot_done(c);
}
if (c && !ast_pthread_create_detached(&threadid, NULL, pri_ss_thread, pri->pvts[chanpos])) {
@@ -6866,8 +6888,15 @@ static void *pri_dchannel(void *vpri)
if (!pri->pvts[chanpos]->progress
&& !pri->pvts[chanpos]->no_b_channel
#ifdef PRI_PROGRESS_MASK
- && (e->proceeding.progressmask
- & (PRI_PROG_CALL_NOT_E2E_ISDN | PRI_PROG_INBAND_AVAILABLE))
+ /*
+ * We only care about PRI_PROG_INBAND_AVAILABLE to open the
+ * voice path.
+ *
+ * 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.
+ */
+ && (e->proceeding.progressmask & PRI_PROG_INBAND_AVAILABLE)
#else
&& e->proceeding.progress == 8
#endif
@@ -6878,6 +6907,12 @@ static void *pri_dchannel(void *vpri)
sig_pri_set_dialing(pri->pvts[chanpos], 0);
sig_pri_open_media(pri->pvts[chanpos]);
} else if (pri->inband_on_proceeding) {
+ /*
+ * XXX This is to accomodate a broken switch that sends a
+ * PROCEEDING without any progress indication ie for
+ * inband audio. This should be part of the conditional
+ * test above to bring the voice path up.
+ */
sig_pri_set_dialing(pri->pvts[chanpos], 0);
}
sig_pri_unlock_private(pri->pvts[chanpos]);
@@ -7496,7 +7531,19 @@ static void *pri_dchannel(void *vpri)
if (!pri->pvts[chanpos]->progress
&& (pri->overlapdial & DAHDI_OVERLAPDIAL_OUTGOING)
&& !pri->pvts[chanpos]->digital
- && !pri->pvts[chanpos]->no_b_channel) {
+ && !pri->pvts[chanpos]->no_b_channel
+#if defined(HAVE_PRI_SETUP_ACK_INBAND)
+ /*
+ * We only care about PRI_PROG_INBAND_AVAILABLE to open the
+ * voice path.
+ *
+ * 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.
+ */
+ && (e->setup_ack.progressmask & PRI_PROG_INBAND_AVAILABLE)
+#endif /* defined(HAVE_PRI_SETUP_ACK_INBAND) */
+ ) {
/*
* Call has a channel.
* Indicate for overlap dialing that dialtone may be present.
@@ -8374,11 +8421,7 @@ int sig_pri_indicate(struct sig_pri_chan *p, struct ast_channel *chan, int condi
p->call_level = SIG_PRI_CALL_LEVEL_PROCEEDING;
if (p->pri && p->pri->pri) {
pri_grab(p, p->pri);
- pri_proceeding(p->pri->pri,p->call, PVT_TO_CHANNEL(p),
- p->no_b_channel || p->digital ? 0 : 1);
- if (!p->no_b_channel && !p->digital) {
- sig_pri_set_dialing(p, 0);
- }
+ pri_proceeding(p->pri->pri,p->call, PVT_TO_CHANNEL(p), 0);
pri_rel(p->pri);
}
}