diff options
author | automerge <automerge@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-20 20:11:07 +0000 |
---|---|---|
committer | automerge <automerge@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-20 20:11:07 +0000 |
commit | f9f34f15446cb2299f16cfbe98c54a7a24de0331 (patch) | |
tree | 2e67be23c490a50770b0ca157ecf8874217512cf | |
parent | 2731a4087d5d2dfed32253ed8a69000895352be4 (diff) |
automerge commit
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@48657 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_dial.c | 3 | ||||
-rw-r--r-- | channels/chan_misdn.c | 14 | ||||
-rw-r--r-- | channels/chan_sip.c | 3 | ||||
-rw-r--r-- | channels/misdn/isdn_lib.c | 98 |
4 files changed, 67 insertions, 51 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c index 662a2142a..c7fe8762d 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1058,6 +1058,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags cur = rest; if (!cur) chan->hangupcause = cause; + free(tmp); continue; } pbx_builtin_setvar_helper(tmp->chan, "DIALEDPEERNUMBER", numsubst); @@ -1096,6 +1097,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags if (!tmp->chan) { HANDLE_CAUSE(cause, chan); cur = rest; + free(tmp); continue; } } @@ -1163,6 +1165,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags ast_hangup(tmp->chan); tmp->chan = NULL; cur = rest; + free(tmp); continue; } else { senddialevent(chan, tmp->chan); diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 9049ba753..65c15a166 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: @@ -2397,6 +2393,10 @@ static int dialtone_indicate(struct chan_list *cl) const struct tone_zone_sound *ts= NULL; struct ast_channel *ast=cl->ast; + if (!ast) { + chan_misdn_log(0,cl->bc->port,"No Ast in dialtone_indicate\n"); + return -1; + } int nd=0; misdn_cfg_get( cl->bc->port, MISDN_CFG_NODIALTONE, &nd, sizeof(nd)); @@ -2430,6 +2430,12 @@ static int hanguptone_indicate(struct chan_list *cl) static int stop_indicate(struct chan_list *cl) { struct ast_channel *ast=cl->ast; + + if (!ast) { + chan_misdn_log(0,cl->bc->port,"No Ast in stop_indicate\n"); + return -1; + } + chan_misdn_log(3,cl->bc->port," --> None\n"); misdn_lib_tone_generator_stop(cl->bc); ast_playtones_stop(ast); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 67005f690..5054a8b3f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2357,6 +2357,7 @@ static int hangup_sip2cause(int cause) case 502: return AST_CAUSE_DESTINATION_OUT_OF_ORDER; case 503: /* Service unavailable */ + case 504: /* Server timeout */ return AST_CAUSE_CONGESTION; default: return AST_CAUSE_NORMAL; @@ -10303,6 +10304,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_ case 400: /* Bad Request */ case 500: /* Server error */ case 503: /* Service Unavailable */ + case 504: /* Server Timeout */ if (owner) ast_queue_control(p->owner, AST_CONTROL_CONGESTION); break; @@ -10396,6 +10398,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_ case 603: /* Decline */ case 500: /* Server error */ case 503: /* Service Unavailable */ + case 504: /* Server timeout */ if (sipmethod == SIP_INVITE && !ignore) { /* re-invite failed */ sip_cancel_destroy(p); diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 72b7d8243..54a47753c 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -433,7 +433,6 @@ static int find_free_chan_in_stack(struct misdn_stack *stack, int channel) if (i != 15 && (channel < 0 || i == channel)) { /* skip E1 Dchannel ;) and work with chan preselection */ if (!stack->channels[i]) { cb_log (3, stack->port, " --> found chan%s: %d\n", channel>=0?" (preselected)":"", i+1); - stack->channels[i] = 1; return i+1; } } @@ -666,10 +665,17 @@ int set_chan_in_stack(struct misdn_stack *stack, int channel) { cb_log(4,stack->port,"set_chan_in_stack: %d\n",channel); + dump_chan_list(stack); 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; @@ -814,6 +820,8 @@ static int create_process (int midev, struct misdn_bchannel *bc) { free_chan = find_free_chan_in_stack(stack, bc->channel_preselected?bc->channel:0); if (!free_chan) return -1; bc->channel=free_chan; + + if (set_chan_in_stack(stack ,bc->channel)<0) return -1; cb_log(4,stack->port, " --> found channel: %d\n",free_chan); @@ -845,6 +853,7 @@ static int create_process (int midev, struct misdn_bchannel *bc) { if (!free_chan) return -1; bc->channel=free_chan; cb_log(2,stack->port, " --> found channel: %d\n",free_chan); + if (set_chan_in_stack(stack ,bc->channel)<0) return -1; } else { /* other phones could have made a call also on this port (ptmp) */ bc->channel=0xff; @@ -1468,27 +1477,27 @@ int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_t *frm) setup_bc(bc); case EVENT_SETUP: - { if (bc->channel == 0xff) { bc->channel=find_free_chan_in_stack(stack, 0); if (!bc->channel) { cb_log(0, stack->port, "Any Channel Requested, but we have no more!!\n"); - break; + bc->out_cause=34; + misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); + return -1; } - } + } if (bc->channel >0 && bc->channel<255) { - set_chan_in_stack(stack ,bc->channel); - } - -#if 0 - int ret=setup_bc(bc); - if (ret == -EINVAL){ - cb_log(0,bc->port,"handle_event: setup_bc failed\n"); - misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); + 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); + return -1; + } } -#endif } break; @@ -1790,12 +1799,6 @@ handle_event_nt(void *dat, void *arg) cb_log(7, stack->port, " --> new_process: New L3Id: %x\n",hh->dinfo); bc->l3_id=hh->dinfo; - if (bc->channel<=0) { - bc->channel=find_free_chan_in_stack(stack,0); - - if (bc->channel<=0) - goto ERR_NO_CHANNEL; - } } break; @@ -2023,32 +2026,22 @@ handle_event_nt(void *dat, void *arg) switch (event) { case EVENT_SETUP: - if (bc->channel>0 && bc->channel<255) { - - if (stack->ptp) - set_chan_in_stack(stack, bc->channel); - else - cb_log(3,stack->port," --> PTMP but channel requested\n"); - - } else { - - bc->channel = find_free_chan_in_stack(stack, 0); - if (!bc->channel) { - cb_log(0, stack->port, " No free channel at the moment\n"); - - msg_t *dmsg; - - cb_log(0, stack->port, "Releaseing call %x (No free Chan for you..)\n", hh->dinfo); - dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST,MT_RELEASE_COMPLETE, hh->dinfo,sizeof(RELEASE_COMPLETE_t), 1); - stack->nst.manager_l3(&stack->nst, dmsg); - free_msg(msg); - return 0; - } - + if (bc->channel<=0 || bc->channel==0xff) { + bc->channel=find_free_chan_in_stack(stack,0); + + if (bc->channel<=0) + goto ERR_NO_CHANNEL; + } else if (!stack->ptp) + cb_log(3,stack->port," --> PTMP but channel requested\n"); + + int ret=set_chan_in_stack(stack, bc->channel); + if (event==EVENT_SETUP && ret<0){ + /* empty bchannel */ + bc->channel=0; + bc->out_cause=44; + + goto ERR_NO_CHANNEL; } -#if 0 - setup_bc(bc); -#endif break; case EVENT_RELEASE: @@ -2592,7 +2585,12 @@ int handle_frm(msg_t *msg) isdn_msg_parse_event(msgs_g,msg,bc, 0); /** Preprocess some Events **/ - handle_event(bc, event, frm); + int ret=handle_event(bc, event, frm); + if (ret<0) { + cb_log(0,stack->port,"couldn't handle event\n"); + free_msg(msg); + return 1; + } /* shoot up event to App: */ cb_log(5, stack->port, "lib Got Prim: Addr %x prim %x dinfo %x\n",frm->addr, frm->prim, frm->dinfo); @@ -3206,7 +3204,13 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event ) bc->channel = find_free_chan_in_stack(stack, 0); if (!bc->channel) { cb_log(0, stack->port, " No free channel at the moment\n"); - + /*FIXME: add disconnect*/ + err=-ENOCHAN; + goto ERR; + } + + if (set_chan_in_stack(stack ,bc->channel)<0) { + /*FIXME: add disconnect*/ err=-ENOCHAN; goto ERR; } |