Merged revisions 46351-46353 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r46351 | crichter | 2006-10-27 11:49:20 +0200 (Fr, 27 Okt 2006) | 9 lines

Merged revisions 46176 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r46176 | crichter | 2006-10-25 10:41:59 +0200 (Mi, 25 Okt 2006) | 1 line

added nttimeout option to configure wether we disconnect calls on NT timeouts or not during an overlapdial session
........

................
r46352 | crichter | 2006-10-27 11:58:44 +0200 (Fr, 27 Okt 2006) | 1 line

fixed not compile issue, which was just introduced
................
r46353 | crichter | 2006-10-27 12:03:23 +0200 (Fr, 27 Okt 2006) | 9 lines

Merged revisions 46350 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r46350 | crichter | 2006-10-27 11:24:01 +0200 (Fr, 27 Okt 2006) | 1 line

fixed a bug which caused chan_misdn to try to allocate 2 times the same channel on high load, which then caused instability of mISDN. removed a useless function from isdn_lib.c
........

................


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@46354 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.0
Christian Richter 19 years ago
parent ebd08b4185
commit f19300635f

@ -199,6 +199,9 @@ struct chan_list {
int dropped_frame_cnt; int dropped_frame_cnt;
int far_alerting; int far_alerting;
int nttimeout;
int other_pid; int other_pid;
struct chan_list *other_ch; struct chan_list *other_ch;
@ -1650,6 +1653,7 @@ static int read_config(struct chan_list *ch, int orig) {
misdn_cfg_get( port, MISDN_CFG_SENDDTMF, &bc->send_dtmf, sizeof(int)); misdn_cfg_get( port, MISDN_CFG_SENDDTMF, &bc->send_dtmf, sizeof(int));
misdn_cfg_get( port, MISDN_CFG_NEED_MORE_INFOS, &bc->need_more_infos, sizeof(int)); misdn_cfg_get( port, MISDN_CFG_NEED_MORE_INFOS, &bc->need_more_infos, sizeof(int));
misdn_cfg_get( port, MISDN_CFG_NTTIMEOUT, &ch->nttimeout, sizeof(int));
misdn_cfg_get( port, MISDN_CFG_FAR_ALERTING, &ch->far_alerting, sizeof(int)); misdn_cfg_get( port, MISDN_CFG_FAR_ALERTING, &ch->far_alerting, sizeof(int));
@ -2741,11 +2745,14 @@ static enum ast_bridge_result misdn_bridge (struct ast_channel *c0,
*rc=who; *rc=who;
break; break;
} }
#if 0
if (f->frametype == AST_FRAME_VOICE) { if (f->frametype == AST_FRAME_VOICE) {
chan_misdn_log(1,0,"Got Voice frame in Bridged state..\n"); chan_misdn_log(1, ch1->bc->port, "I SEND: Splitting conference with Number:%d\n", ch1->bc->pid +1);
continue; continue;
} }
#endif
if (who == c0) { if (who == c0) {
ast_write(c1,f); ast_write(c1,f);
@ -4264,6 +4271,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ch->state=MISDN_CLEANING; ch->state=MISDN_CLEANING;
} }
break; break;
case EVENT_BCHAN_ERROR:
case EVENT_CLEANUP: case EVENT_CLEANUP:
{ {
stop_bc_tones(ch); stop_bc_tones(ch);
@ -4375,9 +4383,11 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
chan_misdn_log(1,bc->port,"--> state: %s\n",misdn_get_ch_state(ch)); chan_misdn_log(1,bc->port,"--> state: %s\n",misdn_get_ch_state(ch));
switch (ch->state) { switch (ch->state) {
case MISDN_CALLING:
case MISDN_DIALING: case MISDN_DIALING:
case MISDN_PROGRESS: case MISDN_PROGRESS:
if (bc->nt && !ch->nttimeout) break;
case MISDN_CALLING:
case MISDN_ALERTING: case MISDN_ALERTING:
case MISDN_PROCEEDING: case MISDN_PROCEEDING:
case MISDN_CALLING_ACKNOWLEDGE: case MISDN_CALLING_ACKNOWLEDGE:

@ -66,6 +66,7 @@ enum misdn_cfg_elements {
MISDN_CFG_BNEC_ADAPT, MISDN_CFG_BNEC_ADAPT,
#endif #endif
MISDN_CFG_NEED_MORE_INFOS, /* bool */ MISDN_CFG_NEED_MORE_INFOS, /* bool */
MISDN_CFG_NTTIMEOUT, /* bool */
MISDN_CFG_JITTERBUFFER, /* int */ MISDN_CFG_JITTERBUFFER, /* int */
MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, /* int */ MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, /* int */
MISDN_CFG_CALLGROUP, /* ast_group_t */ MISDN_CFG_CALLGROUP, /* ast_group_t */

@ -649,17 +649,12 @@ static int clean_up_bc(struct misdn_bchannel *bc)
cb_log(2, stack->port, "$$$ Cleaning up bc with stid :%x pid:%d\n", bc->b_stid, bc->pid); cb_log(2, stack->port, "$$$ Cleaning up bc with stid :%x pid:%d\n", bc->b_stid, bc->pid);
manager_bchannel_deactivate(bc);
manager_ec_disable(bc); manager_ec_disable(bc);
manager_bchannel_deactivate(bc);
mISDN_write_frame(stack->midev, buff, bc->layer_id|FLG_MSG_TARGET|FLG_MSG_DOWN, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); mISDN_write_frame(stack->midev, buff, bc->layer_id|FLG_MSG_TARGET|FLG_MSG_DOWN, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
/*mISDN_clear_stack(stack->midev, bc->b_stid);*/
bc->b_stid = 0; bc->b_stid = 0;
bc_state_change(bc, BCHAN_CLEANED); bc_state_change(bc, BCHAN_CLEANED);
@ -1032,6 +1027,7 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
bc_state_change(bc,BCHAN_ERROR); bc_state_change(bc,BCHAN_ERROR);
cb_event(EVENT_BCHAN_ERROR, bc, glob_mgr->user_data);
return(-EINVAL); return(-EINVAL);
} }
@ -1042,6 +1038,7 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
bc_state_change(bc,BCHAN_ERROR); bc_state_change(bc,BCHAN_ERROR);
cb_event(EVENT_BCHAN_ERROR, bc, glob_mgr->user_data);
return(-EINVAL); return(-EINVAL);
} }
@ -1054,6 +1051,8 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
bc_state_change(bc,BCHAN_ERROR); bc_state_change(bc,BCHAN_ERROR);
cb_event(EVENT_BCHAN_ERROR, bc, glob_mgr->user_data);
return (-EINVAL);
} }
manager_bchannel_activate(bc); manager_bchannel_activate(bc);
@ -1494,7 +1493,7 @@ static int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_
case EVENT_SETUP_ACKNOWLEDGE: case EVENT_SETUP_ACKNOWLEDGE:
setup_bc(bc); setup_bc(bc);
case EVENT_SETUP: case EVENT_SETUP:
{ {
@ -1538,22 +1537,6 @@ static int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_
return 0; return 0;
} }
static int handle_new_process(struct misdn_stack *stack, iframe_t *frm)
{
struct misdn_bchannel* bc=misdn_lib_get_free_bc(stack->port, 0, 1);
if (!bc) {
cb_log(0, stack->port, " --> !! lib: No free channel!\n");
return -1;
}
cb_log(7, stack->port, " --> new_process: New L3Id: %x\n",frm->dinfo);
bc->l3_id=frm->dinfo;
return 0;
}
static int handle_cr ( struct misdn_stack *stack, iframe_t *frm) static int handle_cr ( struct misdn_stack *stack, iframe_t *frm)
{ {
if (!stack) return -1; if (!stack) return -1;
@ -1561,9 +1544,15 @@ static int handle_cr ( struct misdn_stack *stack, iframe_t *frm)
switch (frm->prim) { switch (frm->prim) {
case CC_NEW_CR|INDICATION: case CC_NEW_CR|INDICATION:
cb_log(7, stack->port, " --> lib: NEW_CR Ind with l3id:%x on this port.\n",frm->dinfo); cb_log(7, stack->port, " --> lib: NEW_CR Ind with l3id:%x on this port.\n",frm->dinfo);
if (handle_new_process(stack, frm) <0) {
struct misdn_bchannel* bc=misdn_lib_get_free_bc(stack->port, 0, 1);
if (!bc) {
cb_log(0, stack->port, " --> !! lib: No free channel!\n");
return -1; return -1;
} }
cb_log(7, stack->port, " --> new_process: New L3Id: %x\n",frm->dinfo);
bc->l3_id=frm->dinfo;
return 1; return 1;
case CC_NEW_CR|CONFIRM: case CC_NEW_CR|CONFIRM:
return 1; return 1;
@ -1796,12 +1785,10 @@ handle_event_nt(void *dat, void *arg)
case CC_SETUP|INDICATION: case CC_SETUP|INDICATION:
{ {
iframe_t frm; /* fake te frm to add callref to global callreflist */ struct misdn_bchannel* bc=misdn_lib_get_free_bc(stack->port, 0, 1);
frm.dinfo = hh->dinfo; if (!bc)
frm.addr=stack->upper_id; ERR_NO_CHANNEL:
frm.prim = CC_NEW_CR|INDICATION; {
if (handle_cr(stack, &frm)< 0) {
msg_t *dmsg; msg_t *dmsg;
cb_log(4, stack->port, "Patch from MEIDANIS:Sending RELEASE_COMPLETE %x (No free Chan for you..)\n", hh->dinfo); cb_log(4, stack->port, "Patch from MEIDANIS:Sending RELEASE_COMPLETE %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); dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST,MT_RELEASE_COMPLETE, hh->dinfo,sizeof(RELEASE_COMPLETE_t), 1);
@ -1809,6 +1796,16 @@ handle_event_nt(void *dat, void *arg)
free_msg(msg); free_msg(msg);
return 0; return 0;
} }
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,0);
if (bc->channel<=0)
goto ERR_NO_CHANNEL;
}
} }
break; break;

@ -114,6 +114,7 @@ enum event_e {
EVENT_TONE_GENERATE, EVENT_TONE_GENERATE,
EVENT_BCHAN_DATA, EVENT_BCHAN_DATA,
EVENT_BCHAN_ACTIVATED, EVENT_BCHAN_ACTIVATED,
EVENT_BCHAN_ERROR,
EVENT_CLEANUP, EVENT_CLEANUP,
EVENT_PROCEEDING, EVENT_PROCEEDING,
EVENT_PROGRESS, EVENT_PROGRESS,

@ -1262,6 +1262,7 @@ char EVENT_NEW_CHANNEL_INFO[] = "NEW_CHANNEL";
char EVENT_BCHAN_DATA_INFO[] = "BCHAN_DATA"; char EVENT_BCHAN_DATA_INFO[] = "BCHAN_DATA";
char EVENT_BCHAN_ACTIVATED_INFO[] = "BCHAN_ACTIVATED"; char EVENT_BCHAN_ACTIVATED_INFO[] = "BCHAN_ACTIVATED";
char EVENT_TONE_GENERATE_INFO[] = "TONE_GENERATE"; char EVENT_TONE_GENERATE_INFO[] = "TONE_GENERATE";
char EVENT_BCHAN_ERROR_INFO[] = "BCHAN_ERROR";
char * isdn_get_info(struct isdn_msg msgs[], enum event_e event, int nt) char * isdn_get_info(struct isdn_msg msgs[], enum event_e event, int nt)
{ {
@ -1278,6 +1279,7 @@ char * isdn_get_info(struct isdn_msg msgs[], enum event_e event, int nt)
if (event == EVENT_BCHAN_ACTIVATED) return EVENT_BCHAN_ACTIVATED_INFO; if (event == EVENT_BCHAN_ACTIVATED) return EVENT_BCHAN_ACTIVATED_INFO;
if (event == EVENT_TONE_GENERATE) return EVENT_TONE_GENERATE_INFO; if (event == EVENT_TONE_GENERATE) return EVENT_TONE_GENERATE_INFO;
if (event == EVENT_PORT_ALARM) return EVENT_PORT_ALARM_INFO; if (event == EVENT_PORT_ALARM) return EVENT_PORT_ALARM_INFO;
if (event == EVENT_BCHAN_ERROR) return EVENT_BCHAN_ERROR_INFO;
return NULL; return NULL;
} }

@ -301,6 +301,9 @@ static const struct misdn_cfg_spec port_spec[] = {
"\tPossible values are positive integers or:\n" "\tPossible values are positive integers or:\n"
"\t yes (= 4 seconds)\n" "\t yes (= 4 seconds)\n"
"\t no (= 0 seconds = disabled)" }, "\t no (= 0 seconds = disabled)" },
{ "nttimeout", MISDN_CFG_NTTIMEOUT, MISDN_CTYPE_BOOL, "no", NONE ,
"Set this to yes if you want calls disconnected in overlap mode"
"when a timeout happens.\n"},
{ "msns", MISDN_CFG_MSNS, MISDN_CTYPE_MSNLIST, NO_DEFAULT, NONE, { "msns", MISDN_CFG_MSNS, MISDN_CTYPE_MSNLIST, NO_DEFAULT, NONE,
"MSN's for TE ports, listen on those numbers on the above ports, and\n" "MSN's for TE ports, listen on those numbers on the above ports, and\n"
"\tindicate the incoming calls to Asterisk.\n" "\tindicate the incoming calls to Asterisk.\n"

@ -223,6 +223,13 @@ reject_cause=16
; ;
need_more_infos=no need_more_infos=no
;
; set this to yes if you want to disconnect calls when a timeout occurs
; for example during the overlapdial phase
;
nttimeout=no
; set the method to use for channel selection: ; set the method to use for channel selection:
; standard - always choose the first free channel with the lowest number ; standard - always choose the first free channel with the lowest number
; round_robin - use the round robin algorithm to select a channel. use this ; round_robin - use the round robin algorithm to select a channel. use this

Loading…
Cancel
Save