added a l1watcher timeout, therefore removed the old behaviour of guessing the l1state.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29803 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Christian Richter 20 years ago
parent 45107ed763
commit 39ac1a5b83

@ -656,39 +656,6 @@ static void reload_config(void)
misdn_debug[i] = cfg_debug; misdn_debug[i] = cfg_debug;
misdn_debug_only[i] = 0; 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[]) 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 **/ /** 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 * Asterisk Channel Endpoint END
@ -3933,7 +3885,11 @@ static int load_module(void *mod)
misdn_cfg_update_ptp(); misdn_cfg_update_ptp();
misdn_cfg_get_ports_string(ports); 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)) if (strlen(ports))
chan_misdn_log(0, 0, "Got: %s from get_ports\n",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_event = cb_events,
.cb_log = chan_misdn_log, .cb_log = chan_misdn_log,
.cb_jb_empty = chan_misdn_jb_empty, .cb_jb_empty = chan_misdn_jb_empty,
.l1watcher_timeout=l1watcher_timeout,
}; };
if (misdn_lib_init(ports, &iface, NULL)) if (misdn_lib_init(ports, &iface, NULL))
chan_misdn_log(0, 0, "No te ports initialized\n"); chan_misdn_log(0, 0, "No te ports initialized\n");
} }

@ -57,7 +57,6 @@ enum misdn_cfg_elements {
MISDN_CFG_PICKUPGROUP, /* ast_group_t */ MISDN_CFG_PICKUPGROUP, /* ast_group_t */
MISDN_CFG_MAX_IN, /* int */ MISDN_CFG_MAX_IN, /* int */
MISDN_CFG_MAX_OUT, /* int */ MISDN_CFG_MAX_OUT, /* int */
MISDN_CFG_L1_POLL, /* int */
MISDN_CFG_MSNS, /* char[] */ MISDN_CFG_MSNS, /* char[] */
MISDN_CFG_PTP, /* int (bool) */ MISDN_CFG_PTP, /* int (bool) */
MISDN_CFG_LAST, MISDN_CFG_LAST,
@ -73,6 +72,7 @@ enum misdn_cfg_elements {
MISDN_GEN_DYNAMIC_CRYPT, /* int (bool) */ MISDN_GEN_DYNAMIC_CRYPT, /* int (bool) */
MISDN_GEN_CRYPT_PREFIX, /* char[] */ MISDN_GEN_CRYPT_PREFIX, /* char[] */
MISDN_GEN_CRYPT_KEYS, /* char[] */ MISDN_GEN_CRYPT_KEYS, /* char[] */
MISDN_GEN_L1_TIMEOUT, /* int */
MISDN_GEN_LAST MISDN_GEN_LAST
}; };

@ -93,9 +93,12 @@ struct misdn_lib {
int midev; int midev;
int midev_nt; int midev_nt;
pthread_t l1watcher_thread;
pthread_t event_thread; pthread_t event_thread;
pthread_t event_handler_thread; pthread_t event_handler_thread;
int l1watcher_timeout;
void *user_data; void *user_data;
msg_queue_t upqueue; 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_425_flip[TONE_425_SIZE];
unsigned char tone_silence_flip[TONE_SILENCE_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 void misdn_lib_isdn_event_catcher(void *arg);
static int handle_event_nt(void *dat, void *arg); static int handle_event_nt(void *dat, void *arg);
@ -2508,20 +2512,12 @@ int handle_mgmt(msg_t *msg)
break; break;
case SSTATUS_L1_DEACTIVATED: case SSTATUS_L1_DEACTIVATED:
cb_log(1, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n"); cb_log(1, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n");
stack->l1link=0;
/*reopen L1 if down*/
if (stack->l1link==2)
stack->l1link--;
else
stack->l1link=0;
break; break;
case SSTATUS_L2_ESTABLISHED: case SSTATUS_L2_ESTABLISHED:
cb_log(1, stack->port, "MGMT: SSTATUS: L2_ESTABLISH \n"); cb_log(1, stack->port, "MGMT: SSTATUS: L2_ESTABLISH \n");
stack->l2link=1; stack->l2link=1;
if ( !stack->ptp && !stack->nt )
stack->l1link=2;
break; break;
case SSTATUS_L2_RELEASED: case SSTATUS_L2_RELEASED:
@ -2603,6 +2599,33 @@ msg_t *fetch_msg(int midev)
return NULL; 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) 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); pthread_create( &mgr->event_thread, NULL, (void*)misdn_lib_isdn_event_catcher, mgr);
cb_log(4, 0, "Event Catcher started\n"); 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; global_state= MISDN_INITIALIZED;
return (mgr == NULL); return (mgr == NULL);

@ -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); 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, ...); void (*cb_log)(int level, int port, char *tmpl, ...);
int (*cb_jb_empty)(struct misdn_bchannel *bc, char *buffer, int len); int (*cb_jb_empty)(struct misdn_bchannel *bc, char *buffer, int len);
int l1watcher_timeout;
}; };
/***** USER IFACE **********/ /***** USER IFACE **********/

@ -118,7 +118,6 @@ static const struct misdn_cfg_spec port_spec[] = {
{ "pickupgroup", MISDN_CFG_PICKUPGROUP, MISDN_CTYPE_ASTGROUP, NO_DEFAULT, NONE }, { "pickupgroup", MISDN_CFG_PICKUPGROUP, MISDN_CTYPE_ASTGROUP, NO_DEFAULT, NONE },
{ "max_incoming", MISDN_CFG_MAX_IN, MISDN_CTYPE_INT, "-1", NONE }, { "max_incoming", MISDN_CFG_MAX_IN, MISDN_CTYPE_INT, "-1", NONE },
{ "max_outgoing", MISDN_CFG_MAX_OUT, 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 } { "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 }, { "append_digits2exten", MISDN_GEN_APPEND_DIGITS2EXTEN, MISDN_CTYPE_BOOL, "yes", NONE },
{ "dynamic_crypt", MISDN_GEN_DYNAMIC_CRYPT, MISDN_CTYPE_BOOL, "no", 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_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. */ /* array of port configs, default is at position 0. */

Loading…
Cancel
Save