diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 07e9af447c..0f15ed366d 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -114,6 +114,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 */ @@ -152,6 +153,8 @@ struct chan_list { int need_hangup; int need_busy; + int noautorespond_on_setup; + int orginator; int norxtone; @@ -946,6 +949,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 */ @@ -1710,6 +1714,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); @@ -2020,11 +2026,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 @@ -2404,6 +2410,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); @@ -3495,16 +3502,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->orginator==ORG_MISDN) && !ch->incoming_early_audio ) @@ -4066,8 +4077,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 { @@ -4125,14 +4140,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) { @@ -4162,7 +4182,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 fc714853a3..9e93a9ac84 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 607492bb15..1459f109c9 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 786ca5b01b..a56fbad89d 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,