aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_dahdi.c40
-rw-r--r--configs/chan_dahdi.conf.sample5
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