mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
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: https://origsvn.digium.com/svn/asterisk/trunk@72868 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user