[svn-commits] crichter: branch 1.2 r72099 - in /branches/1.2/channels: ./ misdn/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Jun 27 08:22:38 CDT 2007
Author: crichter
Date: Wed Jun 27 08:22:37 2007
New Revision: 72099
URL: http://svn.digium.com/view/asterisk?view=rev&rev=72099
Log:
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.
Modified:
branches/1.2/channels/chan_misdn.c
branches/1.2/channels/misdn/isdn_lib.c
branches/1.2/channels/misdn/isdn_lib.h
branches/1.2/channels/misdn/isdn_msg_parser.c
Modified: branches/1.2/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/chan_misdn.c?view=diff&rev=72099&r1=72098&r2=72099
==============================================================================
--- branches/1.2/channels/chan_misdn.c (original)
+++ branches/1.2/channels/chan_misdn.c Wed Jun 27 08:22:37 2007
@@ -4476,8 +4476,10 @@
case EVENT_RESTART:
- stop_bc_tones(ch);
- release_chan(bc);
+ if (!bc->dummy) {
+ stop_bc_tones(ch);
+ release_chan(bc);
+ }
break;
Modified: branches/1.2/channels/misdn/isdn_lib.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/misdn/isdn_lib.c?view=diff&rev=72099&r1=72098&r2=72099
==============================================================================
--- branches/1.2/channels/misdn/isdn_lib.c (original)
+++ branches/1.2/channels/misdn/isdn_lib.c Wed Jun 27 08:22:37 2007
@@ -27,6 +27,19 @@
int misdn_lib_get_l2_up(struct misdn_stack *stack);
struct misdn_stack* get_misdn_stack( void );
+
+
+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)
{
@@ -584,6 +597,8 @@
void empty_bc(struct misdn_bchannel *bc)
{
+ bc->dummy=0;
+
bc->bframe_len=0;
bc->cw= 0;
@@ -1573,10 +1588,8 @@
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;
}
@@ -1902,10 +1915,7 @@
/** 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;
}
@@ -2005,12 +2015,8 @@
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 ) {
@@ -2547,6 +2553,7 @@
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);
@@ -2562,6 +2569,11 @@
}
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;
+ }
if (bc ) {
enum event_e event = isdn_msg_get_event(msgs_g, msg, 0);
@@ -2628,12 +2640,19 @@
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);
@@ -3609,10 +3628,7 @@
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;
@@ -3640,9 +3656,6 @@
stack->bc[cnt].in_use=0;
}
}
- empty_chan_in_stack(stack, i);
-
-
}
return 0;
@@ -3771,10 +3784,7 @@
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);
}
}
Modified: branches/1.2/channels/misdn/isdn_lib.h
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/misdn/isdn_lib.h?view=diff&rev=72099&r1=72098&r2=72099
==============================================================================
--- branches/1.2/channels/misdn/isdn_lib.h (original)
+++ branches/1.2/channels/misdn/isdn_lib.h Wed Jun 27 08:22:37 2007
@@ -215,6 +215,8 @@
struct misdn_bchannel {
struct send_lock *send_lock;
+ int dummy;
+
int nt;
int pri;
Modified: branches/1.2/channels/misdn/isdn_msg_parser.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/misdn/isdn_msg_parser.c?view=diff&rev=72099&r1=72098&r2=72099
==============================================================================
--- branches/1.2/channels/misdn/isdn_msg_parser.c (original)
+++ branches/1.2/channels/misdn/isdn_msg_parser.c Wed Jun 27 08:22:37 2007
@@ -782,15 +782,13 @@
#endif
{
- int exclusive, channel;
+ int exclusive;
dec_ie_channel_id(restart->CHANNEL_ID, (Q931_info_t *)restart, &exclusive, &bc->restart_channel, nt,bc);
- 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);
+ }
+
+}
+
msg_t *build_restart (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt)
{
int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;
More information about the svn-commits
mailing list