]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 59623-59624,59639 via svnmerge from
authorChristian Richter <christian.richter@beronet.com>
Tue, 3 Apr 2007 07:20:27 +0000 (07:20 +0000)
committerChristian Richter <christian.richter@beronet.com>
Tue, 3 Apr 2007 07:20:27 +0000 (07:20 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r59623 | crichter | 2007-04-02 09:12:24 +0200 (Mo, 02 Apr 2007) | 1 line

we can now make 30 channels on a PRI (before we forgot chan 31..)
........
r59624 | crichter | 2007-04-02 09:25:54 +0200 (Mo, 02 Apr 2007) | 1 line

don't be verbose if no need
........
r59639 | crichter | 2007-04-02 14:08:12 +0200 (Mo, 02 Apr 2007) | 1 line

added option which allows us to accept incoming SETUP Messages without automatically sending Proceeding or Setup Acknowledge, this is useful with some broken switches and if you want to Release incoming calls without previously having acknowledged them. The new option is noautorespond_on_setup=yes|no default is no, so we don't break the existing behaviour
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@59774 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_misdn.c
channels/misdn/chan_misdn_config.h
channels/misdn/isdn_lib.c
channels/misdn_config.c

index 07e9af447c5af17f18fe265c35af9f888c12fe95..0f15ed366d677fcdaef7bb2ad7d773df39e186c5 100644 (file)
@@ -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");
index fc714853a39a095c0d54ef3d2b1ea2a8c8954d52..9e93a9ac847a6c30a7df463417a22419f74c2110 100644 (file)
@@ -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 */
index 607492bb15ac9d3ddfbb3ece2cb9d1fcae0ca82e..1459f109c9d85e250ba127db74f9c913d901920f 100644 (file)
@@ -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);
index 786ca5b01b15dc5ee8d91505626af7a78e516a02..a56fbad89df9390201fe750b9096a1f1bc0ae88d 100644 (file)
@@ -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,