diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_misdn.c | 56 | ||||
-rw-r--r-- | channels/misdn/chan_misdn_config.h | 2 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.c | 51 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.h | 2 | ||||
-rw-r--r-- | channels/misdn_config.c | 5 |
5 files changed, 53 insertions, 63 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 59e21ffcf..1c2561a65 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -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"); } diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h index 722c4bb78..b119ffc65 100644 --- a/channels/misdn/chan_misdn_config.h +++ b/channels/misdn/chan_misdn_config.h @@ -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 }; diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index d2ae1440b..9cb689ce0 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -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); diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h index 9cd091e8a..26e618771 100644 --- a/channels/misdn/isdn_lib.h +++ b/channels/misdn/isdn_lib.h @@ -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 **********/ diff --git a/channels/misdn_config.c b/channels/misdn_config.c index 8d507a517..d1c6111ef 100644 --- a/channels/misdn_config.c +++ b/channels/misdn_config.c @@ -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. */ |