aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorautomerge <automerge@f38db490-d61c-443f-a65b-d21fe96a405b>2006-12-20 20:11:07 +0000
committerautomerge <automerge@f38db490-d61c-443f-a65b-d21fe96a405b>2006-12-20 20:11:07 +0000
commitf9f34f15446cb2299f16cfbe98c54a7a24de0331 (patch)
tree2e67be23c490a50770b0ca157ecf8874217512cf
parent2731a4087d5d2dfed32253ed8a69000895352be4 (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.c3
-rw-r--r--channels/chan_misdn.c14
-rw-r--r--channels/chan_sip.c3
-rw-r--r--channels/misdn/isdn_lib.c98
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;
}