diff options
author | crichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-14 13:03:49 +0000 |
---|---|---|
committer | crichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-14 13:03:49 +0000 |
commit | 8fb32d24384ed178a51df72fe9d4b89f31e34693 (patch) | |
tree | b03fe521973b32237bcd88814f0e13be77a99e53 /channels | |
parent | 93168b3fbf2217f64a63e57729e2b4a66b0a92df (diff) |
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: http://svn.digium.com/svn/asterisk/branches/1.2@48467 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_misdn.c | 4 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.c | 27 |
2 files changed, 23 insertions, 8 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 9049ba753..a40735236 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 72b7d8243..46be97954 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"); |