From f5c0cd2ddcca5b084b66fc367dbf4766f0db4795 Mon Sep 17 00:00:00 2001 From: Christian Richter <christian.richter@beronet.com> Date: Thu, 29 Jun 2006 20:12:19 +0000 Subject: [PATCH] added better L2 handling for ptp, if it's down we don't try to call on that port in groupdial anymore, also we try to get it up then. Additionally added the configoptions ntdebugflags and ntdebugfile to debug the mISDNuser NT Stack (should have done that ages before..). isdn_lib.c compiles again. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@36298 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_misdn.c | 11 +++++ channels/misdn/chan_misdn_config.h | 2 + channels/misdn/isdn_lib.c | 64 ++++++++++++++++++++++-------- channels/misdn/isdn_lib.h | 2 + channels/misdn/isdn_lib_intern.h | 2 + channels/misdn_config.c | 14 +++++-- configs/misdn.conf.sample | 31 +++++++++++++++ 7 files changed, 107 insertions(+), 19 deletions(-) diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index e7aef8298b..84c8d0fc06 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -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); diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h index 0be6d6a2ee..d60ea6973c 100644 --- a/channels/misdn/chan_misdn_config.h +++ b/channels/misdn/chan_misdn_config.h @@ -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 }; diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 632b2a043b..9405f0dafe 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -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(); diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h index 0178633cc5..ef258f7d08 100644 --- a/channels/misdn/isdn_lib.h +++ b/channels/misdn/isdn_lib.h @@ -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); diff --git a/channels/misdn/isdn_lib_intern.h b/channels/misdn/isdn_lib_intern.h index 8a964313c2..2b56576c54 100644 --- a/channels/misdn/isdn_lib_intern.h +++ b/channels/misdn/isdn_lib_intern.h @@ -55,6 +55,8 @@ struct misdn_stack { int ptp; + int l2upcnt; + int l2_id; int lower_id; int upper_id; diff --git a/channels/misdn_config.c b/channels/misdn_config.c index 5024362585..369f20265c 100644 --- a/channels/misdn_config.c +++ b/channels/misdn_config.c @@ -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)); diff --git a/configs/misdn.conf.sample b/configs/misdn.conf.sample index 1f7dacc389..03df166016 100644 --- a/configs/misdn.conf.sample +++ b/configs/misdn.conf.sample @@ -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] -- GitLab