diff options
-rw-r--r-- | channels/chan_dahdi.c | 40 | ||||
-rw-r--r-- | configs/chan_dahdi.conf.sample | 5 |
2 files changed, 34 insertions, 11 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 70830e024..2aaca7ca8 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -196,6 +196,12 @@ static const char tdesc[] = "DAHDI Telephony Driver" #define DCHAN_AVAILABLE (DCHAN_PROVISIONED | DCHAN_NOTINALARM | DCHAN_UP) +/* Overlap dialing option types */ +#define DAHDI_OVERLAPDIAL_NONE 0 +#define DAHDI_OVERLAPDIAL_OUTGOING 1 +#define DAHDI_OVERLAPDIAL_INCOMING 2 +#define DAHDI_OVERLAPDIAL_BOTH (DAHDI_OVERLAPDIAL_INCOMING|DAHDI_OVERLAPDIAL_OUTGOING) + static char defaultcic[64] = ""; static char defaultozz[64] = ""; @@ -4134,7 +4140,7 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast) ast_log(LOG_DEBUG, "Detected %sdigit '%c'\n", p->pulsedial ? "pulse ": "", res & 0xff); #ifdef HAVE_PRI - if (!p->proceeding && p->sig == SIG_PRI && p->pri && p->pri->overlapdial) { + if (!p->proceeding && p->sig == SIG_PRI && p->pri && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) { /* absorb event */ } else { #endif @@ -5321,7 +5327,9 @@ static struct ast_frame *dahdi_read(struct ast_channel *ast) } } else if (f->frametype == AST_FRAME_DTMF) { #ifdef HAVE_PRI - if (!p->proceeding && p->sig==SIG_PRI && p->pri && p->pri->overlapdial) { + if (!p->proceeding && p->sig==SIG_PRI && p->pri && p->pri->overlapdial && + ((!p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) || + (p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_OUTGOING)))) { /* Don't accept in-band DTMF when in overlap dial mode */ f->frametype = AST_FRAME_NULL; f->subclass = 0; @@ -9178,7 +9186,7 @@ static void *pri_dchannel(void *vpri) if (chanpos > -1) { ast_mutex_lock(&pri->pvts[chanpos]->lock); /* queue DTMF frame if the PBX for this call was already started (we're forwarding KEYPAD_DIGITs further on */ - if (pri->overlapdial && pri->pvts[chanpos]->call==e->digit.call && pri->pvts[chanpos]->owner) { + if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && pri->pvts[chanpos]->call==e->digit.call && pri->pvts[chanpos]->owner) { /* how to do that */ int digitlen = strlen(e->digit.digits); char digit; @@ -9206,7 +9214,7 @@ static void *pri_dchannel(void *vpri) if (chanpos > -1) { ast_mutex_lock(&pri->pvts[chanpos]->lock); /* queue DTMF frame if the PBX for this call was already started (we're forwarding INFORMATION further on */ - if (pri->overlapdial && pri->pvts[chanpos]->call==e->ring.call && pri->pvts[chanpos]->owner) { + if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && pri->pvts[chanpos]->call==e->ring.call && pri->pvts[chanpos]->owner) { /* how to do that */ int digitlen = strlen(e->ring.callednum); char digit; @@ -9329,7 +9337,7 @@ static void *pri_dchannel(void *vpri) pri->pvts[chanpos]->exten[1] = '\0'; } /* Make sure extension exists (or in overlap dial mode, can exist) */ - if ((pri->overlapdial && ast_canmatch_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) || + 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)) { /* Setup law */ int law; @@ -9349,7 +9357,7 @@ static void *pri_dchannel(void *vpri) res = set_actual_gain(pri->pvts[chanpos]->subs[SUB_REAL].dfd, 0, pri->pvts[chanpos]->rxgain, pri->pvts[chanpos]->txgain, law); if (res < 0) ast_log(LOG_WARNING, "Unable to set gains on channel %d\n", pri->pvts[chanpos]->channel); - if (e->ring.complete || !pri->overlapdial) { + if (e->ring.complete || !(pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) { /* Just announce proceeding */ pri->pvts[chanpos]->proceeding = 1; pri_proceeding(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 0); @@ -9363,7 +9371,7 @@ static void *pri_dchannel(void *vpri) pri->pvts[chanpos]->callingpres = e->ring.callingpres; /* Start PBX */ - if (!e->ring.complete && pri->overlapdial && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) { + 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)) { /* Release the PRI lock while we create the channel */ ast_mutex_unlock(&pri->lock); if (crv) { @@ -10018,8 +10026,8 @@ static int start_pri(struct dahdi_pri *pri) pri->dchans[i] = pri_new(pri->fds[i], pri->nodetype, pri->switchtype); /* Force overlap dial if we're doing GR-303! */ if (pri->switchtype == PRI_SWITCH_GR303_TMC) - pri->overlapdial = 1; - pri_set_overlapdial(pri->dchans[i],pri->overlapdial); + pri->overlapdial |= DAHDI_OVERLAPDIAL_BOTH; + pri_set_overlapdial(pri->dchans[i],(pri->overlapdial & DAHDI_OVERLAPDIAL_OUTGOING)?1:0); #ifdef HAVE_PRI_INBANDDISCONNECT pri_set_inbanddisconnect(pri->dchans[i], pri->inbanddisconnect); #endif @@ -10282,7 +10290,7 @@ static int handle_pri_show_span(int fd, int argc, char *argv[]) #else pri_dump_info(pris[span-1].pri); #endif - ast_cli(fd, "\n"); + ast_cli(fd, "Overlap Recv: %s\n\n", (pris[span-1].overlapdial & DAHDI_OVERLAPDIAL_INCOMING)?"Yes":"No"); } } return RESULT_SUCCESS; @@ -11814,7 +11822,17 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct } else if (!strcasecmp(v->name, "idledial")) { ast_copy_string(confp->pri.idledial, v->value, sizeof(confp->pri.idledial)); } else if (!strcasecmp(v->name, "overlapdial")) { - confp->pri.overlapdial = ast_true(v->value); + if (ast_true(v->value)) { + confp->pri.overlapdial = DAHDI_OVERLAPDIAL_BOTH; + } else if (!strcasecmp(v->value, "incoming")) { + confp->pri.overlapdial = DAHDI_OVERLAPDIAL_INCOMING; + } else if (!strcasecmp(v->value, "outgoing")) { + confp->pri.overlapdial = DAHDI_OVERLAPDIAL_OUTGOING; + } else if (!strcasecmp(v->value, "both") || ast_true(v->value)) { + confp->pri.overlapdial = DAHDI_OVERLAPDIAL_BOTH; + } else { + confp->pri.overlapdial = DAHDI_OVERLAPDIAL_NONE; + } #ifdef HAVE_PRI_INBANDDISCONNECT } else if (!strcasecmp(v->name, "inbanddisconnect")) { confp->pri.inbanddisconnect = ast_true(v->value); diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index fb5d68061..3eaf4e33b 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -114,6 +114,11 @@ switchtype=national ; ; Overlap dialing mode (sending overlap digits) ; +; incoming: incoming direction only +; outgoing: outgoing direction only +; no: neither direction +; yes or both: both directions +; ;overlapdial=yes ; ; Allow inband audio (progress) when a call is RELEASEd by the far end of a PRI |