added better L2 handling for ptp, if it's down we don't try to call on that port...
authorChristian Richter <christian.richter@beronet.com>
Thu, 29 Jun 2006 20:12:19 +0000 (20:12 +0000)
committerChristian Richter <christian.richter@beronet.com>
Thu, 29 Jun 2006 20:12:19 +0000 (20:12 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@36298 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/isdn_lib_intern.h
channels/misdn_config.c
configs/misdn.conf.sample

index e7aef82..84c8d0f 100644 (file)
@@ -691,6 +691,14 @@ static void reload_config(void)
                misdn_debug[i] = cfg_debug;
                misdn_debug_only[i] = 0;
        }
+
+       int ntflags=0;
+       char ntfile[BUFFERSIZE+1];
+
+       misdn_cfg_get( 0, MISDN_GEN_NTDEBUGFLAGS, &ntflags, sizeof(int));
+       misdn_cfg_get( 0, MISDN_GEN_NTDEBUGFILE, &ntfile, BUFFERSIZE);
+
+       misdn_lib_nt_debug_init(ntflags,ntfile);
 }
 
 static int misdn_reload (int fd, int argc, char *argv[])
@@ -4125,6 +4133,9 @@ static int load_module(void *mod)
        }
 
 
+
+       reload_config();
+
        {
                if (ast_channel_register(&misdn_tech)) {
                        ast_log(LOG_ERROR, "Unable to register channel class %s\n", misdn_type);
index 0be6d6a..d60ea69 100644 (file)
@@ -74,6 +74,8 @@ enum misdn_cfg_elements {
        MISDN_GEN_CRYPT_PREFIX,        /* char[] */
        MISDN_GEN_CRYPT_KEYS,          /* char[] */
        MISDN_GEN_L1_TIMEOUT,          /* int */
+       MISDN_GEN_NTDEBUGFLAGS,          /* int */
+       MISDN_GEN_NTDEBUGFILE,          /* char[] */
        MISDN_GEN_LAST
 };
 
index 632b2a0..9405f0d 100644 (file)
@@ -20,6 +20,7 @@ void misdn_split_conf(struct misdn_bchannel *bc, int conf_id);
 
 int queue_cleanup_bc(struct misdn_bchannel *bc) ;
 
+int misdn_lib_get_l2_up(struct misdn_stack *stack);
 
 struct misdn_stack* get_misdn_stack( void );
 
@@ -1642,12 +1643,21 @@ int misdn_lib_port_up(int port, int check)
                if ( !stack->ptp && !check) return 1;
                
                if (stack->port == port) {
-                       if (stack->l1link)
-                               return 1;
-                       else {
-                               cb_log(-1,port, "Port down [%s]\n",
-                                      stack->ptp?"PP":"PMP");
-                               return 0;
+                       if (stack->ptp ) {
+                               if (stack->l1link && stack->l2link) {
+                                       return 1;
+                               } else {
+                                       cb_log(-1,port, "Port Down L2:%d L1:%d\n",
+                                               stack->l2link, stack->l1link);
+                                       return 0;
+                               }
+                       } else {
+                               if ( stack->l1link)
+                                       return 1;
+                               else {
+                                       cb_log(-1,port, "Port down PMP\n");
+                                       return 0;
+                               }
                        }
                }
        }
@@ -1894,6 +1904,7 @@ handle_event_nt(void *dat, void *arg)
                {
                        cb_log(4, stack->port, "%% GOT L2 Activate Info.\n");
                        stack->l2link = 1;
+                       stack->l2upcnt=0;
                        
                        free_msg(msg);
                        return 0;
@@ -1904,9 +1915,19 @@ handle_event_nt(void *dat, void *arg)
                case DL_RELEASE | INDICATION:
                case DL_RELEASE | CONFIRM:
                {
-                       cb_log(4, stack->port, "%% GOT L2 DeActivate Info.\n");
-                       stack->l2link = 0;
+                       if (stack->ptp) {
+                               cb_log(-1 , stack->port, "%% GOT L2 DeActivate Info.\n");
+                               if (stack->l2upcnt>3) {
+                                       cb_log(-1 , stack->port, "!!! Could not Get the L2 up after 3 Attemps!!!\n");
+                               }  else {
+                                       misdn_lib_get_l2_up(stack);
+                                       stack->l2upcnt++;
+                               }
+                               
+                       } else 
+                               cb_log(4, stack->port, "%% GOT L2 DeActivate Info.\n");
                        
+                       stack->l2link = 0;
                        free_msg(msg);
                        return 0;
                }
@@ -1945,7 +1966,7 @@ handle_event_nt(void *dat, void *arg)
 
                                        } else {
 
-                                               bc->channel = find_free_chan_in_stack(stack, 0);
+                                               bc->channel = find_free_chan_in_stack(stack, bc, 0);
                                                if (!bc->channel) {
                                                        cb_log(-1, stack->port, " No free channel at the moment\n");
                                        
@@ -3604,6 +3625,21 @@ int misdn_lib_maxports_get() { /** BE AWARE WE HAVE NO CB_LOG HERE! **/
        return max;
 }
 
+
+void misdn_lib_nt_debug_init( int flags, char *file ) 
+{
+       int static init=0;
+
+       if (!init) {
+               debug_init( flags , file, file, file);
+               init=1;
+       } else {
+               debug_close();
+               debug_init( flags , file, file, file);
+       }
+}
+
+
 int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_data)
 {
        struct misdn_lib *mgr=calloc(1, sizeof(struct misdn_lib));
@@ -3619,13 +3655,9 @@ int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_dat
        glob_mgr = mgr;
   
        msg_init();
-#if 0
-       int flags=0xff;
-       flags &= ~DBGM_MSG;
-       debug_init( flags , NULL, NULL, NULL);
-#else
-       debug_init(0 , NULL, NULL, NULL);
-#endif 
+
+       misdn_lib_nt_debug_init(0,NULL);
+       
        if (!portlist || (*portlist == 0) ) return 1;
        
        init_flip_bits();
index 0178633..ef258f7 100644 (file)
@@ -347,6 +347,8 @@ struct misdn_lib_iface {
 
 /***** USER IFACE **********/
 
+void misdn_lib_nt_debug_init( int flags, char *file );
+
 int misdn_lib_init(char *portlist, struct misdn_lib_iface* iface, void *user_data);
 int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event );
 void misdn_lib_destroy(void);
index 8a96431..2b56576 100644 (file)
@@ -55,6 +55,8 @@ struct misdn_stack {
   
        int ptp;
 
+       int l2upcnt;
+
        int l2_id;
        int lower_id;
        int upper_id;
index 5024362..369f202 100644 (file)
@@ -136,8 +136,9 @@ static const struct misdn_cfg_spec gen_spec[] = {
        { "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 },
-       { "l1watcher_timeout", MISDN_GEN_L1_TIMEOUT, MISDN_CTYPE_INT, "0", NONE }
-       
+       { "l1watcher_timeout", MISDN_GEN_L1_TIMEOUT, MISDN_CTYPE_INT, "0", NONE },
+       { "ntdebugflags", MISDN_GEN_NTDEBUGFLAGS, MISDN_CTYPE_INT, "0", NONE },
+       { "ntdebugfile", MISDN_GEN_NTDEBUGFILE, MISDN_CTYPE_STR, "/var/log/misdn-nt.log", NONE }
 };
 
 /* array of port configs, default is at position 0. */
@@ -543,11 +544,18 @@ static int _parse (union misdn_cfg_pt *dest, char *value, enum misdn_cfg_type ty
                }
                break;
        case MISDN_CTYPE_INT:
-               if (sscanf(value, "%d", &tmp)) {
+       {
+               char *pat;
+               if (strchr(value,'x')) 
+                       pat="%x";
+               else
+                       pat="%d";
+               if (sscanf(value, pat, &tmp)) {
                        dest->num = (int *)malloc(sizeof(int));
                        memcpy(dest->num, &tmp, sizeof(int));
                } else
                        re = -1;
+       }
                break;
        case MISDN_CTYPE_BOOL:
                dest->num = (int *)malloc(sizeof(int));
index 1f7dacc..03df166 100644 (file)
@@ -25,6 +25,37 @@ misdn_init=/etc/misdn-init.conf
 debug=0
 
 
+
+; set debugging file and flags for mISDNuser (NT-Stack) 
+; 
+; flags can be or'ed with the following values:
+;
+; DBGM_NET        0x00000001
+; DBGM_MSG        0x00000002
+; DBGM_FSM        0x00000004
+; DBGM_TEI        0x00000010
+; DBGM_L2         0x00000020
+; DBGM_L3         0x00000040
+; DBGM_L3DATA     0x00000080
+; DBGM_BC         0x00000100
+; DBGM_TONE       0x00000200
+; DBGM_BCDATA     0x00000400
+; DBGM_MAN        0x00001000
+; DBGM_APPL       0x00002000
+; DBGM_ISDN       0x00004000
+; DBGM_SOCK       0x00010000
+; DBGM_CONN       0x00020000
+; DBGM_CDATA      0x00040000
+; DBGM_DDATA      0x00080000
+; DBGM_SOUND      0x00100000
+; DBGM_SDATA      0x00200000
+; DBGM_TOPLEVEL   0x40000000
+; DBGM_ALL        0xffffffff
+;
+
+ntdebugflags=0
+ntdebugfile=/var/log/misdn-nt.log
+
 ; the big trace
 ;
 ; default value: [not set]