aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_misdn.c56
-rw-r--r--channels/misdn/chan_misdn_config.h1
-rw-r--r--channels/misdn/isdn_lib.c6
-rw-r--r--channels/misdn_config.c5
4 files changed, 47 insertions, 21 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 7b23e7bfc..2b759d203 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -117,6 +117,7 @@ enum misdn_chan_state {
MISDN_NOTHING=0, /*!< at beginning */
MISDN_WAITING4DIGS, /*!< when waiting for infos */
MISDN_EXTCANTMATCH, /*!< when asterisk couldnt match our ext */
+ MISDN_INCOMING_SETUP, /*!< for incoming setups*/
MISDN_DIALING, /*!< when pbx_start */
MISDN_PROGRESS, /*!< we got a progress */
MISDN_PROCEEDING, /*!< we got a progress */
@@ -156,7 +157,8 @@ struct chan_list {
int need_busy;
int originator;
-
+ int noautorespond_on_setup;
+
int norxtone;
int notxtone;
@@ -986,6 +988,7 @@ static struct state_struct state_array[] = {
{MISDN_NOTHING,"NOTHING"}, /* at beginning */
{MISDN_WAITING4DIGS,"WAITING4DIGS"}, /* when waiting for infos */
{MISDN_EXTCANTMATCH,"EXTCANTMATCH"}, /* when asterisk couldnt match our ext */
+ {MISDN_INCOMING_SETUP,"INCOMING SETUP"}, /* when pbx_start */
{MISDN_DIALING,"DIALING"}, /* when pbx_start */
{MISDN_PROGRESS,"PROGRESS"}, /* when pbx_start */
{MISDN_PROCEEDING,"PROCEEDING"}, /* when pbx_start */
@@ -1747,6 +1750,8 @@ static int read_config(struct chan_list *ch, int orig) {
misdn_cfg_get( port, MISDN_CFG_NEED_MORE_INFOS, &bc->need_more_infos, sizeof(int));
misdn_cfg_get( port, MISDN_CFG_NTTIMEOUT, &ch->nttimeout, sizeof(int));
+ misdn_cfg_get( port, MISDN_CFG_NOAUTORESPOND_ON_SETUP, &ch->noautorespond_on_setup, sizeof(int));
+
misdn_cfg_get( port, MISDN_CFG_FAR_ALERTING, &ch->far_alerting, sizeof(int));
misdn_cfg_get( port, MISDN_CFG_ALLOWED_BEARERS, &ch->allowed_bearers, BUFFERSIZE);
@@ -2059,11 +2064,11 @@ static int misdn_call(struct ast_channel *ast, char *dest, int timeout)
misdn_cfg_get( 0, MISDN_GEN_BRIDGING, &bridging, sizeof(int));
if (bridging && ch->other_ch) {
#ifdef MISDN_1_2
- chan_misdn_log(0, port, "Disabling EC (aka Pipeline) on both Sides\n");
+ chan_misdn_log(1, port, "Disabling EC (aka Pipeline) on both Sides\n");
*ch->bc->pipeline=0;
*ch->other_ch->bc->pipeline=0;
#else
- chan_misdn_log(0, port, "Disabling EC on both Sides\n");
+ chan_misdn_log(1, port, "Disabling EC on both Sides\n");
ch->bc->ec_enable=0;
ch->other_ch->bc->ec_enable=0;
#endif
@@ -2439,6 +2444,7 @@ static int misdn_hangup(struct ast_channel *ast)
chan_misdn_log(2, bc->port, " --> state:%s\n", misdn_get_ch_state(p));
switch (p->state) {
+ case MISDN_INCOMING_SETUP:
case MISDN_CALLING:
p->state=MISDN_CLEANING;
misdn_lib_send_event( bc, EVENT_RELEASE_COMPLETE);
@@ -3535,16 +3541,20 @@ static void do_immediate_setup(struct misdn_bchannel *bc,struct chan_list *ch ,
ch->state=MISDN_DIALING;
- if (bc->nt) {
- int ret;
- ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
- } else {
- int ret;
- if ( misdn_lib_is_ptp(bc->port)) {
+ if (!ch->noautorespond_on_setup) {
+ if (bc->nt) {
+ int ret;
ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
} else {
- ret = misdn_lib_send_event(bc, EVENT_PROCEEDING );
+ int ret;
+ if ( misdn_lib_is_ptp(bc->port)) {
+ ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
+ } else {
+ ret = misdn_lib_send_event(bc, EVENT_PROCEEDING );
+ }
}
+ } else {
+ ch->state = MISDN_INCOMING_SETUP;
}
if ( !bc->nt && (ch->originator==ORG_MISDN) && !ch->incoming_early_audio )
@@ -4106,8 +4116,12 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
/* Check for Pickup Request first */
if (!strcmp(chan->exten, ast_pickup_ext())) {
- int ret;/** Sending SETUP_ACK**/
- ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
+ if (!ch->noautorespond_on_setup) {
+ int ret;/** Sending SETUP_ACK**/
+ ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
+ } else {
+ ch->state = MISDN_INCOMING_SETUP;
+ }
if (ast_pickup_call(chan)) {
hangup_chan(ch);
} else {
@@ -4165,14 +4179,19 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
}
if (!ch->overlap_dial && ast_exists_extension(ch->ast, ch->context, bc->dad, 1, bc->oad)) {
- ch->state=MISDN_DIALING;
- if (bc->nt || (bc->need_more_infos && misdn_lib_is_ptp(bc->port)) ) {
- int ret;
- ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
+ if (!ch->noautorespond_on_setup) {
+ ch->state=MISDN_DIALING;
+
+ if (bc->nt || (bc->need_more_infos && misdn_lib_is_ptp(bc->port)) ) {
+ int ret;
+ ret = misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
+ } else {
+ int ret;
+ ret= misdn_lib_send_event(bc, EVENT_PROCEEDING );
+ }
} else {
- int ret;
- ret= misdn_lib_send_event(bc, EVENT_PROCEEDING );
+ ch->state = MISDN_INCOMING_SETUP;
}
if (pbx_start_chan(ch)<0) {
@@ -4202,7 +4221,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
}
} else {
-
int ret= misdn_lib_send_event(bc, EVENT_SETUP_ACKNOWLEDGE );
if (ret == -ENOCHAN) {
ast_log(LOG_WARNING,"Channel was catched, before we could Acknowledge\n");
diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h
index 0e0a7b9c4..47d767a46 100644
--- a/channels/misdn/chan_misdn_config.h
+++ b/channels/misdn/chan_misdn_config.h
@@ -65,6 +65,7 @@ enum misdn_cfg_elements {
MISDN_CFG_BNEC_ADAPT,
#endif
MISDN_CFG_NEED_MORE_INFOS, /* bool */
+ MISDN_CFG_NOAUTORESPOND_ON_SETUP, /* bool */
MISDN_CFG_NTTIMEOUT, /* bool */
MISDN_CFG_JITTERBUFFER, /* int */
MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, /* int */
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index 429242783..8b91937e5 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -443,9 +443,11 @@ static int find_free_chan_in_stack(struct misdn_stack *stack, struct misdn_bchan
}
channel--;
+
+ int bnums=stack->pri?stack->b_num:stack->b_num-1;
if (dec) {
- for (i = stack->b_num-1; i >=0; i--) {
+ for (i = bnums; i >=0; i--) {
if (i != 15 && (channel < 0 || i == channel)) { /* skip E1 Dchannel ;) and work with chan preselection */
if (!stack->channels[i]) {
cb_log (3, stack->port, " --> found chan%s: %d\n", channel>=0?" (preselected)":"", i+1);
@@ -455,7 +457,7 @@ static int find_free_chan_in_stack(struct misdn_stack *stack, struct misdn_bchan
}
}
} else {
- for (i = 0; i < stack->b_num; i++) {
+ for (i = 0; i <= bnums; i++) {
if (i != 15 && (channel < 0 || i == channel)) { /* skip E1 Dchannel ;) and work with chan preselection */
if (!stack->channels[i]) {
cb_log (3, stack->port, " --> found chan%s: %d\n", channel>=0?" (preselected)":"", i+1);
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 70f1c793c..f9450c07b 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -261,6 +261,11 @@ static const struct misdn_cfg_spec port_spec[] = {
"Send Setup_Acknowledge on incoming calls anyway (instead of PROCEEDING),\n"
"\tthis requests additional Infos, so we can waitfordigits without much\n"
"\tissues. This works only for PTP Ports" },
+ { "noautorespond_on_setup", MISDN_CFG_NOAUTORESPOND_ON_SETUP, MISDN_CTYPE_BOOL, "0", NONE,
+ "Do not send SETUP_ACKNOWLEDGE or PROCEEDING automatically to the calling Party.\n"
+ "Instead we directly jump into the dialplan. This might be useful for fast call\n"
+ "rejection, or for some broken switches, that need hangup causes like busy in the.\n"
+ "RELEASE_COMPLETE Message, instead of the DISCONNECT Message.\n"},
{ "jitterbuffer", MISDN_CFG_JITTERBUFFER, MISDN_CTYPE_INT, "4000", NONE,
"The jitterbuffer." },
{ "jitterbuffer_upper_threshold", MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, MISDN_CTYPE_INT, "0", NONE,