diff options
author | crichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-02 09:23:08 +0000 |
---|---|---|
committer | crichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-02 09:23:08 +0000 |
commit | e4c97852845b3fe11c0a4d4060e4d25ea7a507d6 (patch) | |
tree | d1723b8116ec23e149722d7a7a9dda8bc01a9d1f /channels | |
parent | 1b1439e80e5738a0b2c15da756fe63ce93e6dbc9 (diff) |
Merged revisions 72851 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
................
r72851 | crichter | 2007-07-02 10:27:19 +0200 (Mo, 02 Jul 2007) | 9 lines
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/trunk@72868 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_misdn.c | 6 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.c | 58 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.h | 2 | ||||
-rw-r--r-- | channels/misdn/isdn_msg_parser.c | 8 |
4 files changed, 40 insertions, 34 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index fc1309a7c..b4ef3e69c 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -4657,8 +4657,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; default: diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index dfa6bc6d7..bd428400f 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; } +static 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; @@ -1585,10 +1596,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; } @@ -1895,10 +1904,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 <port> <channel>'\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); @@ -3619,10 +3634,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; @@ -3650,9 +3662,6 @@ int misdn_lib_send_restart(int port, int channel) stack->bc[cnt].in_use=0; } } - empty_chan_in_stack(stack, i); - - } return 0; @@ -3782,10 +3791,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 b05383dbd..43b9e3dda 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 de3974184..24c2fb3aa 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); } - } |