added a l1watcher timeout, therefore removed the old behaviour of guessing the l1state.
authorChristian Richter <christian.richter@beronet.com>
Tue, 23 May 2006 19:40:16 +0000 (19:40 +0000)
committerChristian Richter <christian.richter@beronet.com>
Tue, 23 May 2006 19:40:16 +0000 (19:40 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29803 65c4cc65-6c06-0410-ace0-fbb531ad65f3

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

index 59e21ff..1c2561a 100644 (file)
@@ -656,39 +656,6 @@ static void reload_config(void)
                misdn_debug[i] = cfg_debug;
                misdn_debug_only[i] = 0;
        }
-
-#ifdef M_TIMER
-       if (misdn_sched) 
-               sched_context_destroy(misdn_sched);
-       
-       misdn_sched=sched_context_create();
-
-       if (!misdn_sched) {
-               ast_log(LOG_ERROR,"Couldn't create scheduler\n");
-               return -1;
-       }
-
-       /* Loop through all ports and find out which one should be 
-        * watched regarding the l1 */
-       int port; 
-       int dotimer=0;
-       for (   port=misdn_cfg_get_next_port(0);
-               port>0;
-               port=misdn_cfg_get_next_port(port)) {
-               int l1timer;
-               misdn_cfg_get( port, MISDN_CFG_L1_TIMER, &l1timer, sizeof(l1timer));
-               if (l1timer>0) {
-                       ast_sched_add(misdn_sched, l1timer*1000, l1_timer_cb, &port);
-                       dotimer=1;
-;              }
-       }
-
-       if (dotimer) {
-               /*start timer thread*/
-               pthread_create( &misdn_timer, NULL, (void*)misdn_timerd, NULL);
-       }
-#endif
-
 }
 
 static int misdn_reload (int fd, int argc, char *argv[])
@@ -3817,21 +3784,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
 
 /** TE STUFF END **/
 
-#ifdef M_TIMER
-/* timer thread */
-pthread_t misdn_timer;
-struct sched_context *misdn_sched;
-
-void misdn_timerd(void *arg)
-{
-
-       
-}
-
-
-/* timer thread end */
-#endif
-
 /******************************************
  *
  *   Asterisk Channel Endpoint END
@@ -3933,7 +3885,11 @@ static int load_module(void *mod)
 
        misdn_cfg_update_ptp();
        misdn_cfg_get_ports_string(ports);
-               
+
+
+       int l1watcher_timeout=0;
+       misdn_cfg_get( 0, MISDN_GEN_L1_TIMEOUT, &l1watcher_timeout, sizeof(int));
+       
        if (strlen(ports))
                chan_misdn_log(0, 0, "Got: %s from get_ports\n",ports);
        
@@ -3942,7 +3898,9 @@ static int load_module(void *mod)
                        .cb_event = cb_events,
                        .cb_log = chan_misdn_log,
                        .cb_jb_empty = chan_misdn_jb_empty,
+                       .l1watcher_timeout=l1watcher_timeout,
                };
+               
                if (misdn_lib_init(ports, &iface, NULL))
                        chan_misdn_log(0, 0, "No te ports initialized\n");
        }
index 722c4bb..b119ffc 100644 (file)
@@ -57,7 +57,6 @@ enum misdn_cfg_elements {
        MISDN_CFG_PICKUPGROUP,         /* ast_group_t */
        MISDN_CFG_MAX_IN,              /* int */
        MISDN_CFG_MAX_OUT,              /* int */
-       MISDN_CFG_L1_POLL,              /* int */
        MISDN_CFG_MSNS,                /* char[] */
        MISDN_CFG_PTP,                 /* int (bool) */
        MISDN_CFG_LAST,
@@ -73,6 +72,7 @@ enum misdn_cfg_elements {
        MISDN_GEN_DYNAMIC_CRYPT,       /* int (bool) */
        MISDN_GEN_CRYPT_PREFIX,        /* char[] */
        MISDN_GEN_CRYPT_KEYS,          /* char[] */
+       MISDN_GEN_L1_TIMEOUT,          /* int */
        MISDN_GEN_LAST
 };
 
index d2ae144..9cb689c 100644 (file)
@@ -93,9 +93,12 @@ struct misdn_lib {
        int midev;
        int midev_nt;
 
+       pthread_t l1watcher_thread;
        pthread_t event_thread;
        pthread_t event_handler_thread;
-  
+
+       int l1watcher_timeout;
+       
        void *user_data;
 
        msg_queue_t upqueue;
@@ -145,6 +148,7 @@ static struct misdn_lib *glob_mgr;
 unsigned char tone_425_flip[TONE_425_SIZE];
 unsigned char tone_silence_flip[TONE_SILENCE_SIZE];
 
+static void misdn_lib_isdn_l1watcher(void *arg);
 static void misdn_lib_isdn_event_catcher(void *arg);
 static int handle_event_nt(void *dat, void *arg);
 
@@ -2508,20 +2512,12 @@ int handle_mgmt(msg_t *msg)
                        break;
                case SSTATUS_L1_DEACTIVATED:
                        cb_log(1, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n");
-
-                       /*reopen L1 if down*/
-                       if (stack->l1link==2)
-                               stack->l1link--;
-                       else                    
-                               stack->l1link=0;
-                       
+                       stack->l1link=0;
                        break;
 
                case SSTATUS_L2_ESTABLISHED:
                        cb_log(1, stack->port, "MGMT: SSTATUS: L2_ESTABLISH \n");
                        stack->l2link=1;
-                       if ( !stack->ptp && !stack->nt )
-                               stack->l1link=2;
                        break;
                        
                case SSTATUS_L2_RELEASED:
@@ -2603,6 +2599,33 @@ msg_t *fetch_msg(int midev)
        return NULL;
 }
 
+static void misdn_lib_isdn_l1watcher(void *arg)
+{
+       struct misdn_lib *mgr = arg;
+       struct misdn_stack *stack;
+
+       while (1) {
+               sleep(mgr->l1watcher_timeout);
+               
+               /* look out for l1 which are down
+                  and try to pull the up.
+
+                  We might even try to pull the l2 up in the
+                  ptp case.
+               */
+               for (stack = mgr->stack_list;
+                    stack;
+                    stack = stack->next) {
+                       cb_log(4,stack->port,"Checking L1 State\n");    
+                       if (!stack->l1link) {
+                               cb_log(4,stack->port,"L1 State Down, trying to get it up again\n");     
+                               misdn_lib_get_short_status(stack);
+                               misdn_lib_get_l1_up(stack); 
+                               misdn_lib_get_l2_up(stack); 
+                       }
+               }
+       }
+}
 
 static void misdn_lib_isdn_event_catcher(void *arg)
 {
@@ -3447,7 +3470,13 @@ int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_dat
        pthread_create( &mgr->event_thread, NULL, (void*)misdn_lib_isdn_event_catcher, mgr);
   
        cb_log(4, 0, "Event Catcher started\n");
-  
+
+       if (iface->l1watcher_timeout > 0) {
+               mgr->l1watcher_timeout=iface->l1watcher_timeout;
+               cb_log(4, 0, "Starting L1 watcher\n");
+               pthread_create( &mgr->l1watcher_thread, NULL, (void*)misdn_lib_isdn_l1watcher, mgr);
+       }
+       
        global_state= MISDN_INITIALIZED; 
   
        return (mgr == NULL);
index 9cd091e..26e6187 100644 (file)
@@ -321,6 +321,8 @@ struct misdn_lib_iface {
        enum event_response_e (*cb_event)(enum event_e event, struct misdn_bchannel *bc, void *user_data);
        void (*cb_log)(int level, int port, char *tmpl, ...);
        int (*cb_jb_empty)(struct misdn_bchannel *bc, char *buffer, int len);
+       
+       int l1watcher_timeout;
 };
 
 /***** USER IFACE **********/
index 8d507a5..d1c6111 100644 (file)
@@ -118,7 +118,6 @@ static const struct misdn_cfg_spec port_spec[] = {
        { "pickupgroup", MISDN_CFG_PICKUPGROUP, MISDN_CTYPE_ASTGROUP, NO_DEFAULT, NONE },
        { "max_incoming", MISDN_CFG_MAX_IN, MISDN_CTYPE_INT, "-1", NONE },
        { "max_outgoing", MISDN_CFG_MAX_OUT, MISDN_CTYPE_INT, "-1", NONE },
-       { "l1_poll_timer", MISDN_CFG_L1_POLL, MISDN_CTYPE_INT, "-1", NONE },
        { "msns", MISDN_CFG_MSNS, MISDN_CTYPE_MSNLIST, NO_DEFAULT, NONE }
 };
 
@@ -131,7 +130,9 @@ static const struct misdn_cfg_spec gen_spec[] = {
        { "append_digits2exten", MISDN_GEN_APPEND_DIGITS2EXTEN, MISDN_CTYPE_BOOL, "yes", NONE },
        { "dynamic_crypt", MISDN_GEN_DYNAMIC_CRYPT, MISDN_CTYPE_BOOL, "no", NONE },
        { "crypt_prefix", MISDN_GEN_CRYPT_PREFIX, MISDN_CTYPE_STR, NO_DEFAULT, NONE },
-       { "crypt_keys", MISDN_GEN_CRYPT_KEYS, MISDN_CTYPE_STR, NO_DEFAULT, NONE }
+       { "crypt_keys", MISDN_GEN_CRYPT_KEYS, MISDN_CTYPE_STR, NO_DEFAULT, NONE },
+       { "l1watcher_timeout", MISDN_GEN_L1_TIMEOUT, MISDN_CTYPE_INT, "0", NONE }
+       
 };
 
 /* array of port configs, default is at position 0. */