aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_misdn.c11
-rw-r--r--channels/misdn/chan_misdn_config.h2
-rw-r--r--channels/misdn/isdn_lib.c64
-rw-r--r--channels/misdn/isdn_lib.h2
-rw-r--r--channels/misdn/isdn_lib_intern.h2
-rw-r--r--channels/misdn_config.c14
-rw-r--r--configs/misdn.conf.sample31
7 files changed, 107 insertions, 19 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index e7aef8298..84c8d0fc0 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 0be6d6a2e..d60ea6973 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 632b2a043..9405f0daf 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 0178633cc..ef258f7d0 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 8a964313c..2b56576c5 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 502436258..369f20265 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 1f7dacc38..03df16601 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]