aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_misdn.c4
-rw-r--r--channels/misdn/isdn_lib.c27
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");