From 964f76279afcf1e0404e5bd195d7e11c64c9d3ee Mon Sep 17 00:00:00 2001 From: crichter Date: Mon, 12 Nov 2007 11:23:57 +0000 Subject: added restart all interfaces Restart_Indicator, to automatically send a RESTART after the L2 of a PTP Port comes up. Also fixed some places where we have send a RELEASE without need for it. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@89172 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/misdn/isdn_lib.c | 41 ++++++++++++++++++++-------------------- channels/misdn/isdn_lib_intern.h | 3 +++ channels/misdn/isdn_msg_parser.c | 9 +++++++-- 3 files changed, 31 insertions(+), 22 deletions(-) (limited to 'channels/misdn') diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 638f8b0c0..e2003a190 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -766,15 +766,12 @@ static int misdn_lib_get_l1_down(struct misdn_stack *stack) /* Pull Up L1 */ iframe_t act; act.prim = PH_DEACTIVATE | REQUEST; - act.addr = (stack->upper_id | FLG_MSG_DOWN) ; - - + act.addr = stack->lower_id|FLG_MSG_DOWN; act.dinfo = 0; act.len = 0; + cb_log(1, stack->port, "SENDING PH_DEACTIVATE | REQ\n"); return mISDN_write(stack->midev, &act, mISDN_HEADER_LEN+act.len, TIMEOUT_1SEC); - - } @@ -1995,6 +1992,14 @@ handle_event_nt(void *dat, void *arg) cb_log(0, stack->port, "%% GOT L2 Activate Info. but we're activated already.. this l2 is faulty, blocking port\n"); cb_event(EVENT_PORT_ALARM, &stack->bc[0], glob_mgr->user_data); } + + if (stack->ptp && !stack->restart_sent) { + /* make sure we restart the interface of the + * other side */ + stack->restart_sent=1; + misdn_lib_send_restart(stack->port, -1); + + } /* when we get the L2 UP, the L1 is UP definitely too*/ stack->l1link = 1; @@ -3689,8 +3694,6 @@ int misdn_lib_pid_restart(int pid) /*Sends Restart message for every bchnanel*/ int misdn_lib_send_restart(int port, int channel) { - int max; - int i; struct misdn_bchannel dummybc; struct misdn_stack *stack=find_stack_by_port(port); cb_log(0, port, "Sending Restarts on this port.\n"); @@ -3698,26 +3701,24 @@ int misdn_lib_send_restart(int port, int channel) make_dummy(&dummybc, stack->port, MISDN_ID_GLOBAL, stack->nt, 0); /*default is all channels*/ - max=stack->pri?30:2; - i=1; - - /*if a channel is specified we restart only this one*/ - if (channel > 0) { - i=channel; - max=channel; + if (channel <0) { + dummybc.channel=-1; + cb_log(0, port, "Restarting and all Interfaces\n"); + misdn_lib_send_event(&dummybc, EVENT_RESTART); + + return 0; } - for (;i<=max;i++) { + /*if a channel is specified we restart only this one*/ + if (channel >0) { int cnt; - dummybc.channel=i; - cb_log(0, port, "Restarting and cleaning channel %d\n",i); + dummybc.channel=channel; + cb_log(0, port, "Restarting and cleaning channel %d\n",channel); misdn_lib_send_event(&dummybc, EVENT_RESTART); - /*do we need to wait before we get an EVENT_RESTART_ACK ?*/ - /* clean up chan in stack, to be sure we don't think it's * in use anymore */ for (cnt=0; cnt<=stack->b_num; cnt++) { - if (stack->bc[cnt].channel == i) { + if (stack->bc[cnt].channel == channel) { empty_bc(&stack->bc[cnt]); clean_up_bc(&stack->bc[cnt]); stack->bc[cnt].in_use=0; diff --git a/channels/misdn/isdn_lib_intern.h b/channels/misdn/isdn_lib_intern.h index 757e8e20b..050c86fee 100644 --- a/channels/misdn/isdn_lib_intern.h +++ b/channels/misdn/isdn_lib_intern.h @@ -78,6 +78,9 @@ struct misdn_stack { time_t l2establish; int l1link; + + int restart_sent; + int midev; int nt; diff --git a/channels/misdn/isdn_msg_parser.c b/channels/misdn/isdn_msg_parser.c index 4630c3780..a587f8eae 100644 --- a/channels/misdn/isdn_msg_parser.c +++ b/channels/misdn/isdn_msg_parser.c @@ -840,8 +840,13 @@ static msg_t *build_restart (struct isdn_msg msgs[], struct misdn_bchannel *bc, #if DEBUG printf("Building RESTART Msg\n"); #endif - enc_ie_channel_id(&restart->CHANNEL_ID, msg, 1,bc->channel, nt,bc); - enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x80, nt, bc); + + if (bc->channel > 0) { + enc_ie_channel_id(&restart->CHANNEL_ID, msg, 1,bc->channel, nt,bc); + enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x80, nt, bc); + } else { + enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x87, nt, bc); + } cb_log(0,bc->port, "Restarting channel %d\n", bc->channel); -- cgit v1.2.3