From: Christian Richter Date: Thu, 14 Dec 2006 13:03:49 +0000 (+0000) Subject: removed FIXUP state. added check for channel allocation conflict when we create a... X-Git-Tag: 1.2.15~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9bddd30638983d5f6644887d74fc26ed4269aaa;p=thirdparty%2Fasterisk.git removed FIXUP state. added check for channel allocation conflict when we create a setup while the other site creates a setup on the same channel, besides the check we resolve this conflict. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@48467 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 9049ba753b..a40735236f 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -124,7 +124,6 @@ enum misdn_chan_state { /* misdn_hangup */ MISDN_HOLDED, /*!< if this chan is holded */ MISDN_HOLD_DISCONNECT, /*!< if this chan is holded */ - MISDN_FIXUP/*!< if this chan is holded */ }; @@ -684,7 +683,6 @@ static struct state_struct state_array[] = { {MISDN_HUNGUP_FROM_MISDN,"HUNGUP_FROM_MISDN"}, /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */ {MISDN_HOLDED,"HOLDED"}, /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */ {MISDN_HOLD_DISCONNECT,"HOLD_DISCONNECT"}, /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */ - {MISDN_FIXUP,"FIXUP"}, /**/ {MISDN_HUNGUP_FROM_AST,"HUNGUP_FROM_AST"} /* when DISCONNECT/RELEASE/REL_COMP came out of */ /* misdn_hangup */ }; @@ -1831,7 +1829,6 @@ static int misdn_fixup(struct ast_channel *oldast, struct ast_channel *ast) chan_misdn_log(1, p->bc?p->bc->port:0, "* IND: Got Fixup State:%s L3id:%x\n", misdn_get_ch_state(p), p->l3id); p->ast = ast ; - p->state=MISDN_FIXUP; return 0; } @@ -1998,7 +1995,6 @@ static int misdn_hangup(struct ast_channel *ast) if (ast->_state == AST_STATE_RESERVED || p->state == MISDN_NOTHING || p->state == MISDN_HOLDED || - p->state == MISDN_FIXUP || p->state == MISDN_HOLD_DISCONNECT ) { CLEAN_CH: diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 72b7d82439..46be979543 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -667,9 +667,15 @@ int set_chan_in_stack(struct misdn_stack *stack, int channel) cb_log(4,stack->port,"set_chan_in_stack: %d\n",channel); if (channel >=1 ) { - stack->channels[channel-1] = 1; + if (!stack->channels[channel-1]) + stack->channels[channel-1] = 1; + else { + cb_log(0,stack->port,"channel already in use:%d\n", channel ); + return -1; + } } else { cb_log(0,stack->port,"couldn't set channel %d in\n", channel ); + return -1; } return 0; @@ -1479,7 +1485,13 @@ int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_t *frm) } if (bc->channel >0 && bc->channel<255) { - set_chan_in_stack(stack ,bc->channel); + int ret=set_chan_in_stack(stack ,bc->channel); + if (event == EVENT_SETUP && ret<0){ + /* empty bchannel */ + bc->channel=0; + bc->out_cause=44; + misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); + } } #if 0 @@ -2024,9 +2036,16 @@ handle_event_nt(void *dat, void *arg) switch (event) { case EVENT_SETUP: if (bc->channel>0 && bc->channel<255) { + if (stack->ptp) { + int ret=set_chan_in_stack(stack, bc->channel); + if (event==EVENT_SETUP && ret<0){ + /* empty bchannel */ + bc->channel=0; + bc->out_cause=44; + misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); + } - if (stack->ptp) - set_chan_in_stack(stack, bc->channel); + } else cb_log(3,stack->port," --> PTMP but channel requested\n");