diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-17 19:13:27 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-17 19:13:27 +0000 |
commit | b30b257613bc09f4be24810fdeab0022bf117826 (patch) | |
tree | 3419cf39eba83e24049061b4ce50c72f5db256bd | |
parent | 0691cdc20a9df461c2f7e169bba8b6b1370f3237 (diff) |
Enhance configuration option for overlapdial allowing direction choice
Previously overlap dialing could only be turned on or off for both incoming and
outgoing calls. New parameters incoming, outgoing, and both have been added to
allow further control. There is no change in default behavior with these new
options and allows in band DTMF to be accepted in one direction if required.
(closes issue #14471)
Reported by: eboscani
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@207092 f38db490-d61c-443f-a65b-d21fe96a405b
-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 |