From 1aed11a32ad14459c5f4c9aac6df923995d46fb2 Mon Sep 17 00:00:00 2001 From: crichter Date: Mon, 2 Jul 2007 08:27:19 +0000 Subject: Merged revisions 72099 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r72099 | crichter | 2007-06-27 15:22:37 +0200 (Mi, 27 Jun 2007) | 1 line simplified generation for dummy bchannels, also we mark them as dummies, so they are not used later as real-bchannels, optimized the RESTART mechanisms, we block a channel now on cause:44, and send out a RESTART automatically, then on reception of RESTART_ACKNOWLEDGE we unblock the channel again. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@72851 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_misdn.c | 6 +++-- channels/misdn/isdn_lib.c | 58 ++++++++++++++++++++++------------------ channels/misdn/isdn_lib.h | 2 ++ channels/misdn/isdn_msg_parser.c | 8 ++---- 4 files changed, 40 insertions(+), 34 deletions(-) (limited to 'channels') diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 9c957afe0..78ff25873 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -4814,8 +4814,10 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) case EVENT_RESTART: - stop_bc_tones(ch); - release_chan(bc); + if (!bc->dummy) { + stop_bc_tones(ch); + release_chan(bc); + } break; diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index be0177e32..b892685bd 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -41,6 +41,15 @@ int misdn_lib_port_is_pri(int port) return -1; } +void make_dummy(struct misdn_bchannel *dummybc, int port, int l3id, int nt, int channel) +{ + memset (dummybc,0,sizeof(struct misdn_bchannel)); + dummybc->port=port; + dummybc->l3_id=l3id; + dummybc->nt=nt; + dummybc->dummy=1; + dummybc->channel=channel; +} int misdn_lib_port_block(int port) { @@ -597,6 +606,8 @@ static void bc_next_state_change(struct misdn_bchannel *bc, enum bchannel_state static void empty_bc(struct misdn_bchannel *bc) { + bc->dummy=0; + bc->bframe_len=0; bc->cw= 0; @@ -1583,10 +1594,8 @@ static int handle_cr ( struct misdn_stack *stack, iframe_t *frm) if (!bc) { cb_log(4, stack->port, " --> Didn't found BC so temporarly creating dummy BC (l3id:%x) on this port.\n", frm->dinfo); - memset (&dummybc,0,sizeof(dummybc)); - dummybc.port=stack->port; - dummybc.l3_id=frm->dinfo; - dummybc.nt=stack->nt; + make_dummy(&dummybc, stack->port, frm->dinfo, stack->nt, 0); + bc=&dummybc; } @@ -1893,10 +1902,7 @@ handle_event_nt(void *dat, void *arg) /** removing procid **/ if (!bc) { cb_log(4, stack->port, " --> Didn't found BC so temporarly creating dummy BC (l3id:%x) on this port.\n", hh->dinfo); - memset (&dummybc,0,sizeof(dummybc)); - dummybc.port=stack->port; - dummybc.l3_id=hh->dinfo; - dummybc.nt=stack->nt; + make_dummy(&dummybc, stack->port, hh->dinfo, stack->nt, 0); bc=&dummybc; } @@ -1996,12 +2002,8 @@ handle_event_nt(void *dat, void *arg) bc=find_bc_by_l3id(stack, hh->dinfo); if (!bc) { - cb_log(4, stack->port, " --> Didn't found BC so temporarly creating dummy BC (l3id:%x).\n", hh->dinfo); - memset (&dummybc,0,sizeof(dummybc)); - dummybc.port=stack->port; - dummybc.l3_id=hh->dinfo; - dummybc.nt=stack->nt; + make_dummy(&dummybc, stack->port, hh->dinfo, stack->nt, 0); bc=&dummybc; } if (bc ) { @@ -2539,6 +2541,7 @@ static int handle_frm(msg_t *msg) cb_log(4,stack?stack->port:0,"handle_frm: frm->addr:%x frm->prim:%x\n",frm->addr,frm->prim); { + struct misdn_bchannel dummybc; struct misdn_bchannel *bc; int ret=handle_cr(stack, frm); @@ -2554,6 +2557,11 @@ static int handle_frm(msg_t *msg) } bc=find_bc_by_l3id(stack, frm->dinfo); + + if (!bc && (frm->prim==(CC_RESTART|CONFIRM)) ) { + make_dummy(&dummybc, stack->port, MISDN_ID_GLOBAL, stack->nt, 0); + bc=&dummybc; + } handle_frm_bc: if (bc ) { @@ -2621,14 +2629,21 @@ handle_frm_bc: if (tmpcause == 44) { cb_log(0,stack->port,"**** Received CAUSE:44, so not cleaning up channel %d\n", channel); cb_log(0,stack->port,"**** This channel is now no longer available,\nplease try to restart it with 'misdn send restart '\n"); - set_chan_in_stack(stack,bc->channel); + set_chan_in_stack(stack, channel); + bc->channel=channel; + misdn_lib_send_restart(stack->port, channel); } else { if (channel>0) - empty_chan_in_stack(stack,channel); + empty_chan_in_stack(stack, channel); } bc->in_use=0; } + if (event == EVENT_RESTART) { + cb_log(0, stack->port, "**** Received RESTART_ACK channel:%d\n", bc->restart_channel); + empty_chan_in_stack(stack, bc->restart_channel); + } + cb_log(5, stack->port, "Freeing Msg on prim:%x \n",frm->prim); @@ -3622,10 +3637,7 @@ int misdn_lib_send_restart(int port, int channel) cb_log(0, port, "Sending Restarts on this port.\n"); struct misdn_bchannel dummybc; - memset (&dummybc,0,sizeof(dummybc)); - dummybc.port=stack->port; - dummybc.l3_id=MISDN_ID_GLOBAL; - dummybc.nt=stack->nt; + make_dummy(&dummybc, stack->port, MISDN_ID_GLOBAL, stack->nt, 0); /*default is all channels*/ int max=stack->pri?30:2; @@ -3653,9 +3665,6 @@ int misdn_lib_send_restart(int port, int channel) stack->bc[cnt].in_use=0; } } - empty_chan_in_stack(stack, i); - - } return 0; @@ -3784,10 +3793,7 @@ static void manager_event_handler(void *arg) else { if (frm->dinfo == MISDN_ID_GLOBAL) { struct misdn_bchannel dummybc; - memset (&dummybc,0,sizeof(dummybc)); - dummybc.port=stack->port; - dummybc.l3_id=MISDN_ID_GLOBAL; - dummybc.nt=stack->nt; + make_dummy(&dummybc, stack->port, MISDN_ID_GLOBAL, stack->nt, 0); send_msg(glob_mgr->midev, &dummybc, msg); } } diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h index 8e427d916..f8deb910f 100644 --- a/channels/misdn/isdn_lib.h +++ b/channels/misdn/isdn_lib.h @@ -201,6 +201,8 @@ enum layer_e { struct misdn_bchannel { struct send_lock *send_lock; + int dummy; + int nt; int pri; diff --git a/channels/misdn/isdn_msg_parser.c b/channels/misdn/isdn_msg_parser.c index 8534e4e74..a2e879fd0 100644 --- a/channels/misdn/isdn_msg_parser.c +++ b/channels/misdn/isdn_msg_parser.c @@ -816,14 +816,10 @@ static void parse_restart (struct isdn_msg msgs[], msg_t *msg, struct misdn_bcha #endif { - int exclusive, channel = 0; + int exclusive; dec_ie_channel_id(restart->CHANNEL_ID, (Q931_info_t *)restart, &exclusive, &bc->restart_channel, nt,bc); - /* XXX: this is broken... channel is not used */ - if (channel==0xff) /* any channel */ - channel=-1; - cb_log(3, stack->port, "CC_RESTART Request on channel:%d on this port.\n"); + cb_log(3, stack->port, "CC_RESTART Request on channel:%d on this port.\n", bc->restart_channel); } - } -- cgit v1.2.3