enum misdn_chan_state state;
int need_queue_hangup;
int need_hangup;
+ int need_busy;
int holded;
int orginator;
}
+static int misdn_port_block(int fd, int argc, char *argv[])
+{
+ int port;
+
+ if (argc != 4)
+ return RESULT_SHOWUSAGE;
+
+ port = atoi(argv[3]);
+
+ misdn_lib_port_block(port);
+
+ return 0;
+}
+
+static int misdn_port_unblock(int fd, int argc, char *argv[])
+{
+ int port;
+
+ if (argc != 4)
+ return RESULT_SHOWUSAGE;
+
+ port = atoi(argv[3]);
+
+ misdn_lib_port_unblock(port);
+
+ return 0;
+}
+
+
static int misdn_restart_port (int fd, int argc, char *argv[])
{
int port;
{MISDN_ALERTING,"ALERTING"}, /* when Alerting */
{MISDN_BUSY,"BUSY"}, /* when BUSY */
{MISDN_CONNECTED,"CONNECTED"}, /* when connected */
+ {MISDN_PRECONNECTED,"PRECONNECTED"}, /* when connected */
{MISDN_DISCONNECTED,"DISCONNECTED"}, /* when connected */
{MISDN_RELEASED,"RELEASED"}, /* when connected */
{MISDN_BRIDGED,"BRIDGED"}, /* when bridged */
static void reload_config(void)
{
int i, cfg_debug;
- chan_misdn_log(-1, 0, "Dynamic Crypting Activation is not support during reload at the moment\n");
free_robin_list();
misdn_cfg_reload();
complete_ch
};
+static struct ast_cli_entry cli_port_block=
+{ {"misdn","port","block", NULL},
+ misdn_port_block,
+ "Blocks the given port",
+ "Usage: misdn port block\n"
+};
+
+static struct ast_cli_entry cli_port_unblock=
+{ {"misdn","port","unblock", NULL},
+ misdn_port_unblock,
+ "Unblocks the given port",
+ "Usage: misdn port unblock\n"
+};
static struct ast_cli_entry cli_restart_port =
} else {
if (len <=100 || len > 8000) {
- chan_misdn_log(-1,bc->port,"config_jb: Jitterbuffer out of Bounds, setting to 1000\n");
+ chan_misdn_log(0,bc->port,"config_jb: Jitterbuffer out of Bounds, setting to 1000\n");
len=1000;
}
if ( threshold > len ) {
- chan_misdn_log(-1,bc->port,"config_jb: Jitterbuffer Threshold > Jitterbuffer setting to Jitterbuffer -1\n");
+ chan_misdn_log(0,bc->port,"config_jb: Jitterbuffer Threshold > Jitterbuffer setting to Jitterbuffer -1\n");
}
if ( ch->jb) {
ast_copy_string (ast->context,ch->context,sizeof(ast->context));
{
- int ec, ectr;
+ int ec;
misdn_cfg_get( port, MISDN_CFG_ECHOCANCEL, &ec, sizeof(int));
- misdn_cfg_get( port, MISDN_CFG_ECHOTRAINING, &ectr, sizeof(int));
if (ec == 1 ) {
bc->ec_enable=1;
} else if ( ec > 1 ) {
bc->ec_enable=1;
bc->ec_deftaps=ec;
}
+#ifdef WITH_ECHOTRAINING
+ int ectr;
+ misdn_cfg_get( port, MISDN_CFG_ECHOTRAINING, &ectr, sizeof(int));
if ( ectr >= 0 ) {
bc->ec_training=ectr;
}
+#endif
+
+#ifdef WITH_BEROEC
+ misdn_cfg_get(port, MISDN_CFG_BNECHOCANCEL,&bc->bnec_tail, sizeof(int));
+ misdn_cfg_get(port, MISDN_CFG_BNEC_ANTIHOWL, &bc->bnec_ah, sizeof(int));
+ misdn_cfg_get(port, MISDN_CFG_BNEC_NLP, &bc->bnec_nlp, sizeof(int));
+ misdn_cfg_get(port, MISDN_CFG_BNEC_TD, &bc->bnec_td, sizeof(int));
+ misdn_cfg_get(port, MISDN_CFG_BNEC_ADAPT, &bc->bnec_adapt, sizeof(int));
+ misdn_cfg_get(port, MISDN_CFG_BNEC_ZEROCOEFF, &bc->bnec_zero, sizeof(int));
+
+ if (bc->bnec_tail && bc->ec_enable) {
+ ast_log(LOG_WARNING,"Are you sure you wan't to mix BNEC with Zapec ? This might cause bad audio quality!\n");
+ bc->ec_enable=0;
+ }
+#endif
}
{
if (ext) {
opts=strtok_r(NULL,"/",&tokb);
} else {
- chan_misdn_log(-1,0,"misdn_call: No Extension given!\n");
+ chan_misdn_log(0,0,"misdn_call: No Extension given!\n");
return -1;
}
}
return 0;
}
+ p->need_hangup=0;
+ p->need_queue_hangup=0;
+ p->need_busy=0;
+
+
if (!p->bc->nt)
stop_bc_tones(p);
start_bc_tones(p);
hanguptone_indicate(p);
- if (bc->nt) {
- if (bc->need_disconnect)
- misdn_lib_send_event( bc, EVENT_DISCONNECT);
- } else {
- misdn_lib_send_event( bc, EVENT_RELEASE_COMPLETE);
- p->state=MISDN_CLEANING;
- }
+ if (bc->need_disconnect)
+ misdn_lib_send_event( bc, EVENT_DISCONNECT);
break;
case MISDN_CALLING_ACKNOWLEDGE:
misdn_lib_send_event( bc, EVENT_DISCONNECT);
break;
case MISDN_CONNECTED:
+ case MISDN_PRECONNECTED:
/* Alerting or Disconect */
if (p->bc->nt) {
start_bc_tones(p);
cl->orginator=orig;
cl->need_queue_hangup=1;
cl->need_hangup=1;
+ cl->need_busy=1;
cl->overlap_dial_task=-1;
return cl;
if (!strcasecmp(cfg_group, group)) {
int port_up;
- int check,checkl2;
+ int check;
misdn_cfg_get(port, MISDN_CFG_PMP_L1_CHECK, &check, sizeof(int));
- misdn_cfg_get(port, MISDN_CFG_PP_L2_CHECK, &checkl2, sizeof(int));
- check=checkl2?2:check;
-
port_up = misdn_lib_port_up(port, check);
if (check && !port_up)
chan_misdn_log(1,port,"L1 is not Up on this Port\n");
+ if (check && port_up<0) {
+ ast_log(LOG_WARNING,"This port (%d) is blocked\n", port);
+ }
+
- if ( port_up ) {
+ if ( port_up>0 ) {
newbc = misdn_lib_get_free_bc(port, robin_channel);
if (newbc) {
chan_misdn_log(4, port, " Success! Found port:%d channel:%d\n", newbc->port, newbc->channel);
} while (!newbc && robin_channel != rr->channel);
if (!newbc)
- chan_misdn_log(4, port, " Failed! No free channel in group %d!", group);
+ chan_misdn_log(-1, port, " Failed! No free channel in group %d!", group);
}
else {
chan_misdn_log(3,port, "Group [%s] Port [%d]\n", group, port);
if (!strcasecmp(cfg_group, group)) {
int port_up;
- int check,checkl2;
+ int check;
misdn_cfg_get(port, MISDN_CFG_PMP_L1_CHECK, &check, sizeof(int));
- misdn_cfg_get(port, MISDN_CFG_PP_L2_CHECK, &checkl2, sizeof(int));
- check=checkl2?2:check;
port_up = misdn_lib_port_up(port, check);
chan_misdn_log(4, port, "portup:%d\n", port_up);
- if ( port_up ) {
+ if ( port_up>0 ) {
newbc = misdn_lib_get_free_bc(port, 0);
if (newbc)
break;
return;
}
+ cb_log(1,ch->bc?ch->bc->port:0,"hangup_chan\n");
if (ch->need_hangup)
{
+ cb_log(1,ch->bc->port,"-> hangup\n");
send_cause2ast(ch->ast,ch->bc,ch);
ch->need_hangup=0;
ch->need_queue_hangup=0;
ch->need_queue_hangup=0;
if (ch->ast) {
send_cause2ast(ch->ast,ch->bc,ch);
- ast_queue_hangup(ch->ast);
+
+ if (ch->ast)
+ ast_queue_hangup(ch->ast);
+ cb_log(1,ch->bc->port,"-> queue_hangup\n");
} else {
cb_log(1,ch->bc->port,"Cannot hangup chan, no ast\n");
}
case 21:
case 17: /* user busy */
- chan_misdn_log(1, bc?bc->port:0, " --> * SEND: Queue Busy pid:%d\n", bc?bc->pid:-1);
ch->state=MISDN_BUSY;
+
+ if (!ch->need_busy) {
+ chan_misdn_log(1,bc?bc->port:0, "Queued busy already\n");
+ break;
+ }
+
+ chan_misdn_log(1, bc?bc->port:0, " --> * SEND: Queue Busy pid:%d\n", bc?bc->pid:-1);
+
ast_queue_control(ast, AST_CONTROL_BUSY);
+ ch->need_busy=0;
+
break;
}
}
struct chan_list *ch=find_chan_by_bc(cl_te, bc);
if (event != EVENT_BCHAN_DATA && event != EVENT_TONE_GENERATE) { /* Debug Only Non-Bchan */
- chan_misdn_log(1, bc->port, "I IND :%s oad:%s dad:%s pid:%d state:%s\n", manager_isdn_get_info(event), bc->oad, bc->dad, bc->pid, ch?misdn_get_ch_state(ch):"none");
- misdn_lib_log_ies(bc);
- chan_misdn_log(2,bc->port," --> bc_state:%s\n",bc_state2str(bc->bc_state));
+ int debuglevel=1;
+
+ if ( event==EVENT_CLEANUP && !user_data)
+ debuglevel=5;
+
+ chan_misdn_log(debuglevel, bc->port, "I IND :%s oad:%s dad:%s pid:%d state:%s\n", manager_isdn_get_info(event), bc->oad, bc->dad, bc->pid, ch?misdn_get_ch_state(ch):"none");
+ if (debuglevel==1) {
+ misdn_lib_log_ies(bc);
+ chan_misdn_log(4,bc->port," --> bc_state:%s\n",bc_state2str(bc->bc_state));
+ }
}
if (!ch) {
switch(event) {
case EVENT_SETUP:
case EVENT_DISCONNECT:
+ case EVENT_PORT_ALARM:
break;
case EVENT_RELEASE_COMPLETE:
chan_misdn_log(1, bc->port, " --> no Ch, so we've already released.\n");
switch (event) {
-
+ case EVENT_PORT_ALARM:
+ {
+ int boa=0;
+ misdn_cfg_get( bc->port, MISDN_CFG_ALARM_BLOCK, &boa, sizeof(int));
+ if (boa) {
+ cb_log(1,bc->port," --> blocking\n");
+ misdn_lib_port_block(bc->port);
+ }
+ }
+ break;
case EVENT_BCHAN_ACTIVATED:
break;
case EVENT_NEW_L3ID:
ch->l3id=bc->l3_id;
ch->addr=bc->addr;
-
- if (bc->nt && ch->state == MISDN_PRECONNECTED ) {
- /* OK we've got the very new l3id so we can answer
- now */
- start_bc_tones(ch);
-
- ch->state = MISDN_CONNECTED;
- ast_queue_control(ch->ast, AST_CONTROL_ANSWER);
-
- }
break;
case EVENT_NEW_BC:
if (bc)
- ch->bc=bc;
+ ch->bc=(struct misdn_bchannel*)user_data;
break;
case EVENT_DTMF_TONE:
break;
case EVENT_CONNECT:
{
+ /*we answer when we've got our very new L3 ID from the NT stack */
misdn_lib_send_event(bc,EVENT_CONNECT_ACKNOWLEDGE);
struct ast_channel *bridged=AST_BRIDGED_P(ch->ast);
}
}
- /*we answer when we've got our very new L3 ID from the NT stack */
- if (bc->nt) {
- ch->state=MISDN_PRECONNECTED;
- break;
- }
/* notice that we don't break here!*/
if (ch) {
struct chan_list *holded_ch=find_holded(cl_te, bc);
- if (ch->ast)
- send_cause2ast(ch->ast,bc,ch);
-
chan_misdn_log(3,bc->port," --> org:%d nt:%d, inbandavail:%d state:%d\n", ch->orginator, bc->nt, misdn_inband_avail(bc), ch->state);
if ( ch->orginator==ORG_AST && !bc->nt && misdn_inband_avail(bc) && ch->state != MISDN_CONNECTED) {
/* If there's inband information available (e.g. a
/*Check for holded channel, to implement transfer*/
if (holded_ch && ch->ast ) {
+ cb_log(1,bc->port," --> found holded ch\n");
if (ch->state == MISDN_CONNECTED ) {
misdn_transfer_bc(ch, holded_ch) ;
- misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
- break;
}
+ misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+ break;
}
stop_bc_tones(ch);
hangup_chan(ch);
release_chan(bc);
- if (bc->cause >= 0 && bc->need_release_complete)
+ if (bc->need_release_complete)
misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
}
break;
case EVENT_CLEANUP:
{
stop_bc_tones(ch);
+
+ switch(ch->state) {
+ case MISDN_CALLING:
+ bc->cause=27; /* Destination out of order */
+ break;
+ default:
+ break;
+ }
+
hangup_chan(ch);
release_chan(bc);
}
ast_cli_unregister(&cli_show_port);
ast_cli_unregister(&cli_show_ports_stats);
ast_cli_unregister(&cli_show_stacks);
+ ast_cli_unregister(&cli_port_block);
+ ast_cli_unregister(&cli_port_unblock);
ast_cli_unregister(&cli_restart_port);
ast_cli_unregister(&cli_port_up);
ast_cli_unregister(&cli_port_down);
ast_cli_register(&cli_show_stacks);
ast_cli_register(&cli_show_ports_stats);
+ ast_cli_register(&cli_port_block);
+ ast_cli_register(&cli_port_unblock);
ast_cli_register(&cli_restart_port);
ast_cli_register(&cli_port_up);
ast_cli_register(&cli_port_down);
if (neglect) {
chan_misdn_log(1, ch->bc->port, " --> disabled\n");
ch->bc->ec_enable=0;
+
+#ifdef WITH_BEROEC
+ ch->bc->bnec_tail=0;
+#endif
} else {
ch->bc->ec_enable=1;
ch->bc->orig=ch->orginator;
if (level == -1)
ast_log(LOG_WARNING, buf);
+
else if (misdn_debug_only[port] ?
(level==1 && misdn_debug[port]) || (level==misdn_debug[port])
: level <= misdn_debug[port]) {
#include "isdn_lib_intern.h"
#include <mISDNuser/isdn_debug.h>
-
void misdn_join_conf(struct misdn_bchannel *bc, int conf_id);
void misdn_split_conf(struct misdn_bchannel *bc, int conf_id);
struct misdn_stack* get_misdn_stack( void );
+#ifdef WITH_BEROEC
+static int bec_initialized=0;
+#endif
+
+
+int misdn_lib_port_block(int port)
+{
+ struct misdn_stack *stack=get_misdn_stack();
+ for ( ; stack; stack=stack->next) {
+ if (stack->port == port) {
+ stack->blocked=1;
+ return 0;
+ }
+ }
+ return -1;
+
+}
+
+int misdn_lib_port_unblock(int port)
+{
+ struct misdn_stack *stack=get_misdn_stack();
+ for ( ; stack; stack=stack->next) {
+ if (stack->port == port) {
+ stack->blocked=0;
+ return 0;
+ }
+ }
+ return -1;
+
+}
int misdn_lib_is_ptp(int port)
{
}
if (stack) {
- sprintf(buf, "* Stack Addr:%x Port %d Type %s Prot. %s L2Link %s L1Link:%s", stack->upper_id, stack->port, stack->nt?"NT":"TE", stack->ptp?"PTP":"PMP", stack->l2link?"UP":"DOWN", stack->l1link?"UP":"DOWN");
+ sprintf(buf, "* Port %d Type %s Prot. %s L2Link %s L1Link:%s Blocked:%d", stack->port, stack->nt?"NT":"TE", stack->ptp?"PTP":"PMP", stack->l2link?"UP":"DOWN", stack->l1link?"UP":"DOWN",stack->blocked);
} else {
buf[0]=0;
int empty_chan_in_stack(struct misdn_stack *stack, int channel)
{
if (channel<=0) {
- cb_log(-1,stack?stack->port:0, "empty_chan_inst_stack: cannot empty channel %d\n",channel);
+ cb_log(0,stack?stack->port:0, "empty_chan_inst_stack: cannot empty channel %d\n",channel);
return -1;
}
- cb_log (1, stack?stack->port:0, "empty_chan_in_stack: %d\n",channel);
+ cb_log (4, stack?stack->port:0, "empty_chan_in_stack: %d\n",channel);
stack->channels[channel-1] = 0;
dump_chan_list(stack);
return 0;
void bc_state_change(struct misdn_bchannel *bc, enum bchannel_state state)
{
- cb_log(3,bc->port,"BC_STATE_CHANGE: from:%s to:%s\n",
+ cb_log(5,bc->port,"BC_STATE_CHANGE: from:%s to:%s\n",
bc_state2str(bc->bc_state),
bc_state2str(state) );
void bc_next_state_change(struct misdn_bchannel *bc, enum bchannel_state state)
{
- cb_log(3,bc->port,"BC_NEXT_STATE_CHANGE: from:%s to:%s\n",
+ cb_log(5,bc->port,"BC_NEXT_STATE_CHANGE: from:%s to:%s\n",
bc_state2str(bc->next_bc_state),
bc_state2str(state) );
manager_bchannel_deactivate(bc);
+#ifdef WITH_BEROEC
+ if (bc->ec)
+ beroec_destroy(bc->ec);
+ bc->ec=NULL;
+#endif
+
if ( misdn_cap_is_speech(bc->capability) && bc->ec_enable) {
manager_ec_disable(bc);
}
void clear_l3(struct misdn_stack *stack)
{
int i;
+
for (i=0; i<stack->b_num; i++) {
if (global_state == MISDN_INITIALIZED) {
- cb_event(EVENT_CLEANUP, &stack->bc[i], glob_mgr->user_data);
+ cb_event(EVENT_CLEANUP, &stack->bc[i], NULL);
empty_chan_in_stack(stack,i+1);
empty_bc(&stack->bc[i]);
clean_up_bc(&stack->bc[i]);
int set_chan_in_stack(struct misdn_stack *stack, int channel)
{
- cb_log(1,stack->port,"set_chan_in_stack: %d\n",channel);
+ cb_log(4,stack->port,"set_chan_in_stack: %d\n",channel);
if (channel >=1 ) {
stack->channels[channel-1] = 1;
} else {
- cb_log(-1,stack->port,"couldn't set channel %d in\n", channel );
+ cb_log(0,stack->port,"couldn't set channel %d in\n", channel );
}
return 0;
if (stack->procids[i]==0) break;
if (i== MAXPROCS) {
- cb_log(-1, stack->port, "Couldnt Create New ProcId.\n");
+ cb_log(0, stack->port, "Couldnt Create New ProcId.\n");
return -1;
}
stack->procids[i]=1;
struct misdn_stack *stack=get_stack_by_bc(bc);
if (!stack) {
- cb_log(-1, bc->port, "setup_bc: NO STACK FOUND!!\n");
+ cb_log(0, bc->port, "setup_bc: NO STACK FOUND!!\n");
return -1;
}
cb_log(5, stack->port, "$$$ Setting up bc with stid :%x\n", b_stid);
if (b_stid <= 0) {
- cb_log(-1, stack->port," -- Stid <=0 at the moment in channel:%d\n",channel);
+ cb_log(0, stack->port," -- Stid <=0 at the moment in channel:%d\n",channel);
bc_state_change(bc,BCHAN_ERROR);
return 1;
ret = mISDN_new_layer(midev, &li);
if (ret ) {
- cb_log(-1, stack->port,"New Layer Err: %d %s\n",ret,strerror(errno));
+ cb_log(0, stack->port,"New Layer Err: %d %s\n",ret,strerror(errno));
bc_state_change(bc,BCHAN_ERROR);
return(-EINVAL);
ret = mISDN_set_stack(midev, bc->b_stid, &pid);
if (ret){
- cb_log(-1, stack->port,"$$$ Set Stack Err: %d %s\n",ret,strerror(errno));
+ cb_log(0, stack->port,"$$$ Set Stack Err: %d %s\n",ret,strerror(errno));
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
ret = mISDN_get_setstack_ind(midev, bc->layer_id);
if (ret) {
- cb_log(-1, stack->port,"$$$ Set StackIND Err: %d %s\n",ret,strerror(errno));
+ cb_log(0, stack->port,"$$$ Set StackIND Err: %d %s\n",ret,strerror(errno));
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
bc_state_change(bc,BCHAN_ERROR);
bc->addr = ret>0? ret : 0;
if (!bc->addr) {
- cb_log(-1, stack->port,"$$$ Get Layerid Err: %d %s\n",ret,strerror(errno));
+ cb_log(0, stack->port,"$$$ Get Layerid Err: %d %s\n",ret,strerror(errno));
mISDN_write_frame(midev, buff, bc->layer_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
bc_state_change(bc,BCHAN_ERROR);
if (!bc) return -1;
- cb_log(4, port, "Init.BC %d.\n",bidx);
+ cb_log(8, port, "Init.BC %d.\n",bidx);
memset(bc, 0,sizeof(struct misdn_bchannel));
stack_info_t *stinf;
ret = mISDN_get_stack_info(midev, stack->port, buff, sizeof(buff));
if (ret < 0) {
- cb_log(-1, port, "%s: Cannot get stack info for this port. (ret=%d)\n", __FUNCTION__, ret);
+ cb_log(0, port, "%s: Cannot get stack info for this port. (ret=%d)\n", __FUNCTION__, ret);
return -1;
}
stinf = (stack_info_t *)&frm->data.p;
- cb_log(4, port, " --> Child %x\n",stinf->child[bidx]);
+ cb_log(8, port, " --> Child %x\n",stinf->child[bidx]);
}
return 0;
if (!stack ) return NULL;
- cb_log(4, port, "Init. Stack.\n");
+ cb_log(8, port, "Init. Stack.\n");
memset(stack,0,sizeof(struct misdn_stack));
/* query port's requirements */
ret = mISDN_get_stack_info(midev, port, buff, sizeof(buff));
if (ret < 0) {
- cb_log(-1, port, "%s: Cannot get stack info for this port. (ret=%d)\n", __FUNCTION__, ret);
+ cb_log(0, port, "%s: Cannot get stack info for this port. (ret=%d)\n", __FUNCTION__, ret);
return(NULL);
}
stack->nt=0;
break;
case ISDN_PID_L0_NT_S0:
- cb_log(4, port, "NT Stack\n");
+ cb_log(8, port, "NT Stack\n");
stack->nt=1;
break;
case ISDN_PID_L0_NT_UP2:
break;
case ISDN_PID_L0_TE_E1:
- cb_log(4, port, "TE S2M Stack\n");
+ cb_log(8, port, "TE S2M Stack\n");
stack->nt=0;
stack->pri=1;
break;
case ISDN_PID_L0_NT_E1:
- cb_log(4, port, "TE S2M Stack\n");
+ cb_log(8, port, "TE S2M Stack\n");
stack->nt=1;
stack->pri=1;
break;
default:
- cb_log(-1, port, "this is a unknown port type 0x%08x\n", stinf->pid.protocol[0]);
+ cb_log(0, port, "this is a unknown port type 0x%08x\n", stinf->pid.protocol[0]);
}
int ret;
int nt=stack->nt;
- cb_log(4, port, "Init. Stack.\n");
+ cb_log(8, port, "Init. Stack.\n");
memset(&li, 0, sizeof(li));
{
ret = mISDN_new_layer(midev, &li);
if (ret) {
- cb_log(-1, port, "%s: Cannot add layer %d to this port.\n", __FUNCTION__, nt?2:4);
+ cb_log(0, port, "%s: Cannot add layer %d to this port.\n", __FUNCTION__, nt?2:4);
return(NULL);
}
ret = mISDN_register_layer(midev, stack->d_stid, stack->upper_id);
if (ret)
{
- cb_log(-1,port,"Cannot register layer %d of this port.\n", nt?2:4);
+ cb_log(0,port,"Cannot register layer %d of this port.\n", nt?2:4);
return(NULL);
}
stack->lower_id = mISDN_get_layerid(midev, stack->d_stid, nt?1:3);
if (stack->lower_id < 0) {
- cb_log(-1, port, "%s: Cannot get layer(%d) id of this port.\n", __FUNCTION__, nt?1:3);
+ cb_log(0, port, "%s: Cannot get layer(%d) id of this port.\n", __FUNCTION__, nt?1:3);
return(NULL);
}
stack->upper_id = mISDN_get_layerid(midev, stack->d_stid, nt?2:4);
if (stack->upper_id < 0) {
- cb_log(-1, port, "%s: Cannot get layer(%d) id of this port.\n", __FUNCTION__, 2);
+ cb_log(0, port, "%s: Cannot get layer(%d) id of this port.\n", __FUNCTION__, 2);
return(NULL);
}
- cb_log(4, port, "NT Stacks upper_id %x\n",stack->upper_id);
+ cb_log(8, port, "NT Stacks upper_id %x\n",stack->upper_id);
/* create nst (nt-mode only) */
}
- cb_log(1,0,"stack_init: port:%d lowerId:%x upperId:%x\n",stack->port,stack->lower_id, stack->upper_id);
+ cb_log(8,0,"stack_init: port:%d lowerId:%x upperId:%x\n",stack->port,stack->lower_id, stack->upper_id);
return stack;
}
if ( !misdn_cap_is_speech(bc->capability)) {
int ret=setup_bc(bc);
if (ret == -EINVAL){
- cb_log(-1,bc->port,"send_event: setup_bc failed\n");
+ cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
}
#endif
if (bc->channel == 0xff) {
bc->channel=find_free_chan_in_stack(stack, bc, 0);
if (!bc->channel) {
- cb_log(-1, stack->port, "Any Channel Requested, but we have no more!!\n");
+ cb_log(0, stack->port, "Any Channel Requested, but we have no more!!\n");
break;
}
}
#if 0
int ret=setup_bc(bc);
if (ret == -EINVAL){
- cb_log(-1,bc->port,"handle_event: setup_bc failed\n");
+ cb_log(0,bc->port,"handle_event: setup_bc failed\n");
misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
}
#endif
case EVENT_RELEASE:
if (bc->channel>0)
empty_chan_in_stack(stack,bc->channel);
+ int tmpcause=bc->cause;
empty_bc(bc);
+ bc->cause=tmpcause;
clean_up_bc(bc);
break;
default:
if (!bc) {
- cb_log(-1, stack->port, " --> !! lib: No free channel!\n");
+ cb_log(0, stack->port, " --> !! lib: No free channel!\n");
return -1;
}
dump_chan_list(stack);
/*bc->pid = 0;*/
+ bc->need_disconnect=0;
+ bc->need_release=0;
+ bc->need_release_complete=0;
+
cb_event(EVENT_CLEANUP, bc, glob_mgr->user_data);
if (bc->stack_holder) {
cb_log(4,stack->port, "REMOVEING Holder\n");
if ( !stack->ptp && !check) return 1;
if (stack->port == port) {
+
+ if (stack->blocked) {
+ cb_log(0,port, "Port Blocked:%d L2:%d L1:%d\n", stack->blocked, stack->l2link, stack->l1link);
+ return -1;
+ }
+
if (stack->ptp ) {
- if (stack->l1link) {
- if (check==2 && !stack->l2link) {
- cb_log(-1,port, "Port Down L2 (checked):%d L1:%d\n", stack->l2link, stack->l1link);
- return 0;
- }
+
+ if (stack->l1link && stack->l2link) {
return 1;
} else {
- cb_log(-1,port, "Port Down L2:%d L1:%d\n",
+ cb_log(0,port, "Port Down L2:%d L1:%d\n",
stack->l2link, stack->l1link);
return 0;
}
if ( stack->l1link)
return 1;
else {
- cb_log(-1,port, "Port down PMP\n");
+ cb_log(0,port, "Port down PMP\n");
return 0;
}
}
hh=(mISDNuser_head_t*)msg->data;
port=stack->port;
- cb_log(4, stack->port, " --> lib: prim %x dinfo %x\n",hh->prim, hh->dinfo);
+ cb_log(5, stack->port, " --> lib: prim %x dinfo %x\n",hh->prim, hh->dinfo);
{
switch(hh->prim){
case CC_RETRIEVE|INDICATION:
}
struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
- cb_event(EVENT_NEW_BC, bc, glob_mgr->user_data);
struct misdn_bchannel *hold_bc=stack_holder_find(stack,bc->l3_id);
+
if (hold_bc) {
+ cb_event(EVENT_NEW_BC, hold_bc, bc);
cb_log(4, stack->port, "REMOVEING Holder\n");
stack_holder_remove(stack, hold_bc);
free(hold_bc);
if ( !misdn_cap_is_speech(bc->capability)) {
int ret=setup_bc(bc);
if (ret == -EINVAL){
- cb_log(-1,bc->port,"send_event: setup_bc failed\n");
+ cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
}
if (!bc) {
msg_t *dmsg;
- cb_log(-1, stack->port,"!!!! We didn't found our bc, dinfo:%x on this port.\n",hh->dinfo);
+ cb_log(0, stack->port,"!!!! We didn't found our bc, dinfo:%x on this port.\n",hh->dinfo);
- cb_log(-1, stack->port, "Releaseing call %x (No free Chan for you..)\n", hh->dinfo);
+ 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);
}
int ret=setup_bc(bc);
if (ret == -EINVAL){
- cb_log(-1,bc->port,"handle_event_nt: setup_bc failed\n");
+ cb_log(0,bc->port,"handle_event_nt: setup_bc failed\n");
misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
}
#endif
stack->procids[bc->l3_id&0xff] = 0 ;
}
}
- else cb_log(-1, stack->port, "Couldnt find BC so I couldnt remove the Process!!!! this is a bad port.\n");
+ else cb_log(0, stack->port, "Couldnt find BC so I couldnt remove the Process!!!! this is a bad port.\n");
if (handle_cr(stack, &frm)<0) {
}
{
struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
int l3id = *((int *)(((u_char *)msg->data)+ mISDNUSER_HEAD_SIZE));
- if (!bc) { cb_log(-1, stack->port, " --> In NEW_CR: didn't found bc ??\n"); return -1;};
+ if (!bc) { cb_log(0, stack->port, " --> In NEW_CR: didn't found bc ??\n"); return -1;};
if (((l3id&0xff00)!=0xff00) && ((bc->l3_id&0xff00)==0xff00)) {
cb_log(4, stack->port, " --> Removing Process Id:%x on this port.\n", 0xff&bc->l3_id);
stack->procids[bc->l3_id&0xff] = 0 ;
case DL_ESTABLISH | INDICATION:
case DL_ESTABLISH | CONFIRM:
{
- cb_log(4, stack->port, "%% GOT L2 Activate Info.\n");
+ cb_log(3, stack->port, "%% GOT L2 Activate Info.\n");
+
+ if (stack->ptp && stack->l2link) {
+ cb_log(0, stack->port, "%% GOT L2 Activate Info. but we're activated already.. this l2 is faulty, blocking port\n");
+ cb_event(EVENT_PORT_ALARM, &stack->bc[0], glob_mgr->user_data);
+ }
+
stack->l2link = 1;
stack->l2upcnt=0;
case DL_RELEASE | CONFIRM:
{
if (stack->ptp) {
- cb_log(-1 , stack->port, "%% GOT L2 DeActivate Info.\n");
+ cb_log(3 , stack->port, "%% GOT L2 DeActivate Info.\n");
if (stack->l2upcnt>3) {
- cb_log(-1 , stack->port, "!!! Could not Get the L2 up after 3 Attemps!!!\n");
+ cb_log(0 , stack->port, "!!! Could not Get the L2 up after 3 Attemps!!!\n");
} else {
#if 0
if (stack->nt) misdn_lib_reinit_nt_stack(stack->port);
#endif
- misdn_lib_get_l2_up(stack);
- stack->l2upcnt++;
+ if (stack->l1link) {
+ misdn_lib_get_l2_up(stack);
+ stack->l2upcnt++;
+ }
}
} else
- cb_log(4, stack->port, "%% GOT L2 DeActivate Info.\n");
+ cb_log(3, stack->port, "%% GOT L2 DeActivate Info.\n");
stack->l2link = 0;
free_msg(msg);
if (stack->ptp)
set_chan_in_stack(stack, bc->channel);
else
- cb_log(-1,stack->port," --> PTMP but channel requested\n");
+ cb_log(0,stack->port," --> PTMP but channel requested\n");
} else {
bc->channel = find_free_chan_in_stack(stack, bc, 0);
if (!bc->channel) {
- cb_log(-1, stack->port, " No free channel at the moment\n");
+ cb_log(0, stack->port, " No free channel at the moment\n");
msg_t *dmsg;
- cb_log(-1, stack->port, "Releaseing call %x (No free Chan for you..)\n", hh->dinfo);
+ 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);
case EVENT_RELEASE_COMPLETE:
if (bc->channel>0)
empty_chan_in_stack(stack, bc->channel);
+ int tmpcause=bc->cause;
empty_bc(bc);
+ bc->cause=tmpcause;
clean_up_bc(bc);
break;
break;
default:
- return 0;
+ break;
}
}
cb_event(event, bc, glob_mgr->user_data);
}
}
- cb_log(-1, 0, "Timer Msg without Timer ??\n");
+ cb_log(0, 0, "Timer Msg without Timer ??\n");
free_msg(msg);
return 1;
}
if (jlen < len) {
cb_log(7,bc->port,"Jitterbuffer Underrun.\n");
+ } else {
+#ifdef WITH_BEROEC
+ if (bc->ec) {
+ flip_buf_bits(data,len);
+ beroec_cancel_alaw_chunk(bc->ec, data, bc->bframe, len);
+ flip_buf_bits(data,len);
+ }
+#endif
}
txfrm->prim = DL_DATA|REQUEST;
switch (frm->prim) {
case MGR_SETSTACK| CONFIRM:
- cb_log(2, stack->port, "BCHAN: MGR_SETSTACK|CONFIRM pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: MGR_SETSTACK|CONFIRM pid:%d\n",bc->pid);
break;
case MGR_SETSTACK| INDICATION:
- cb_log(2, stack->port, "BCHAN: MGR_SETSTACK|IND pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: MGR_SETSTACK|IND pid:%d\n",bc->pid);
break;
#if 0
AGAIN:
data. */
bc->addr= frm->addr;
} else if ( bc->addr < 0) {
- cb_log(-1, stack->port,"$$$ bc->addr <0 Error:%s\n",strerror(errno));
+ cb_log(0, stack->port,"$$$ bc->addr <0 Error:%s\n",strerror(errno));
bc->addr=0;
}
case BCHAN_CLEAN_REQUEST:
default:
- cb_log(-1, stack->port," --> STATE WASN'T SETUP (but %s) in SETSTACK|IND pid:%d\n",bc_state2str(bc->bc_state), bc->pid);
+ cb_log(0, stack->port," --> STATE WASN'T SETUP (but %s) in SETSTACK|IND pid:%d\n",bc_state2str(bc->bc_state), bc->pid);
clean_up_bc(bc);
}
return 1;
#endif
case MGR_DELLAYER| INDICATION:
- cb_log(2, stack->port, "BCHAN: MGR_DELLAYER|IND pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: MGR_DELLAYER|IND pid:%d\n",bc->pid);
break;
case MGR_DELLAYER| CONFIRM:
- cb_log(2, stack->port, "BCHAN: MGR_DELLAYER|CNF pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: MGR_DELLAYER|CNF pid:%d\n",bc->pid);
bc->pid=0;
bc->addr=0;
case PH_ACTIVATE | INDICATION:
case DL_ESTABLISH | INDICATION:
- cb_log(2, stack->port, "BCHAN: ACT Ind pid:%d\n", bc->pid);
+ cb_log(3, stack->port, "BCHAN: ACT Ind pid:%d\n", bc->pid);
free_msg(msg);
return 1;
case PH_ACTIVATE | CONFIRM:
case DL_ESTABLISH | CONFIRM:
- cb_log(2, stack->port, "BCHAN: bchan ACT Confirm pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: bchan ACT Confirm pid:%d\n",bc->pid);
free_msg(msg);
return 1;
case PH_DEACTIVATE | INDICATION:
case DL_RELEASE | INDICATION:
- cb_log (2, stack->port, "BCHAN: DeACT Ind pid:%d\n",bc->pid);
+ cb_log (3, stack->port, "BCHAN: DeACT Ind pid:%d\n",bc->pid);
free_msg(msg);
return 1;
case PH_DEACTIVATE | CONFIRM:
case DL_RELEASE | CONFIRM:
- cb_log(4, stack->port, "BCHAN: DeACT Conf pid:%d\n",bc->pid);
+ cb_log(3, stack->port, "BCHAN: DeACT Conf pid:%d\n",bc->pid);
free_msg(msg);
return 1;
}
#if MISDN_DEBUG
- cb_log(-1, stack->port, "DL_DATA INDICATION Len %d\n", frm->len);
+ cb_log(0, stack->port, "DL_DATA INDICATION Len %d\n", frm->len);
#endif
case PH_CONTROL | CONFIRM:
- cb_log(2, stack->port, "PH_CONTROL|CNF bc->addr:%x\n", frm->addr);
+ cb_log(4, stack->port, "PH_CONTROL|CNF bc->addr:%x\n", frm->addr);
free_msg(msg);
return 1;
case DL_DATA|CONFIRM:
#if MISDN_DEBUG
- cb_log(-1, stack->port, "Data confirmed\n");
+ cb_log(0, stack->port, "Data confirmed\n");
#endif
free_msg(msg);
return 1;
case DL_DATA|RESPONSE:
#if MISDN_DEBUG
- cb_log(-1, stack->port, "Data response\n");
+ cb_log(0, stack->port, "Data response\n");
#endif
break;
if (nt_err_cnt > 0 ) {
if (nt_err_cnt < 100) {
nt_err_cnt++;
- cb_log(-1, stack->port, "NT Stack sends us error: %d \n", err);
+ cb_log(0, stack->port, "NT Stack sends us error: %d \n", err);
} else if (nt_err_cnt < 105){
- cb_log(-1, stack->port, "NT Stack sends us error: %d over 100 times, so I'll stop this message\n", err);
+ cb_log(0, stack->port, "NT Stack sends us error: %d over 100 times, so I'll stop this message\n", err);
nt_err_cnt = - 1;
}
}
cb_log(5, stack->port, "lib Got Prim: Addr %x prim %x dinfo %x\n",frm->addr, frm->prim, frm->dinfo);
if(!isdn_get_info(msgs_g,event,0))
- cb_log(-1, stack->port, "Unknown Event Ind: Addr:%x prim %x dinfo %x\n",frm->addr, frm->prim, frm->dinfo);
+ cb_log(0, stack->port, "Unknown Event Ind: Addr:%x prim %x dinfo %x\n",frm->addr, frm->prim, frm->dinfo);
else
response=cb_event(event, bc, glob_mgr->user_data);
#if 1
switch (response) {
case RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE:
- cb_log(-1, stack->port, "TOTALY IGNORING SETUP \n");
+ cb_log(0, stack->port, "TOTALY IGNORING SETUP \n");
break;
case RESPONSE_IGNORE_SETUP:
empty_bc(bc);
bc_state_change(bc,BCHAN_CLEANED);
- cb_log(-1, stack->port, "GOT IGNORE SETUP\n");
+ cb_log(0, stack->port, "GOT IGNORE SETUP\n");
break;
#endif
} else {
- cb_log(-1, stack->port, "NO BC FOR STACK\n");
+ cb_log(0, stack->port, "NO BC FOR STACK\n");
}
}
switch (frm->prim) {
case PH_ACTIVATE | CONFIRM:
case PH_ACTIVATE | INDICATION:
- cb_log (1, stack->port, "L1: PH L1Link Up!\n");
+ cb_log (3, stack->port, "L1: PH L1Link Up!\n");
stack->l1link=1;
if (stack->nt) {
if (stack->nst.l1_l2(&stack->nst, msg))
free_msg(msg);
+
+ if (stack->ptp)
+ misdn_lib_get_l2_up(stack);
} else {
free_msg(msg);
}
case PH_ACTIVATE | REQUEST:
free_msg(msg);
- cb_log(1,stack->port,"L1: PH_ACTIVATE|REQUEST \n");
+ cb_log(3,stack->port,"L1: PH_ACTIVATE|REQUEST \n");
return 1;
case PH_DEACTIVATE | REQUEST:
free_msg(msg);
- cb_log(1,stack->port,"L1: PH_DEACTIVATE|REQUEST \n");
+ cb_log(3,stack->port,"L1: PH_DEACTIVATE|REQUEST \n");
return 1;
case PH_DEACTIVATE | CONFIRM:
case PH_DEACTIVATE | INDICATION:
- cb_log (1, stack->port, "L1: PH L1Link Down! \n");
+ cb_log (3, stack->port, "L1: PH L1Link Down! \n");
for (i=0; i<stack->b_num; i++) {
if (global_state == MISDN_INITIALIZED) {
stack->l1link=0;
stack->l2link=0;
-
return 1;
}
case DL_ESTABLISH | CONFIRM:
{
cb_log (3, stack->port, "L2: L2Link Up! \n");
+ if (stack->ptp && stack->l2link) {
+ cb_log (-1, stack->port, "L2: L2Link Up! but it's already UP.. must be faulty, blocking port\n");
+ cb_event(EVENT_PORT_ALARM, &stack->bc[0], glob_mgr->user_data);
+ }
stack->l2link=1;
free_msg(msg);
return 1;
switch(frm->prim) {
case MGR_SHORTSTATUS | INDICATION:
case MGR_SHORTSTATUS | CONFIRM:
- cb_log(2, 0, "MGMT: Short status dinfo %x\n",frm->dinfo);
+ cb_log(5, 0, "MGMT: Short status dinfo %x\n",frm->dinfo);
switch (frm->dinfo) {
case SSTATUS_L1_ACTIVATED:
- cb_log(1, 0, "MGMT: SSTATUS: L1_ACTIVATED \n");
+ cb_log(3, 0, "MGMT: SSTATUS: L1_ACTIVATED \n");
stack->l1link=1;
break;
case SSTATUS_L1_DEACTIVATED:
- cb_log(1, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n");
+ cb_log(3, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n");
stack->l1link=0;
clear_l3(stack);
break;
case SSTATUS_L2_ESTABLISHED:
- cb_log(1, stack->port, "MGMT: SSTATUS: L2_ESTABLISH \n");
+ cb_log(3, stack->port, "MGMT: SSTATUS: L2_ESTABLISH \n");
stack->l2link=1;
break;
case SSTATUS_L2_RELEASED:
- cb_log(1, stack->port, "MGMT: SSTATUS: L2_RELEASED \n");
+ cb_log(3, stack->port, "MGMT: SSTATUS: L2_RELEASED \n");
stack->l2link=0;
break;
}
return 1;
case MGR_SETSTACK | INDICATION:
- cb_log(2, stack->port, "MGMT: SETSTACK|IND dinfo %x\n",frm->dinfo);
+ cb_log(4, stack->port, "MGMT: SETSTACK|IND dinfo %x\n",frm->dinfo);
free_msg(msg);
return 1;
case MGR_DELLAYER | CONFIRM:
- cb_log(2, stack->port, "MGMT: DELLAYER|CNF dinfo %x\n",frm->dinfo) ;
+ cb_log(4, stack->port, "MGMT: DELLAYER|CNF dinfo %x\n",frm->dinfo) ;
free_msg(msg);
return 1;
/* fd_set rdfs; */
if (!msg) {
- cb_log(-1, 0, "fetch_msg: alloc msg failed !!");
+ cb_log(0, 0, "fetch_msg: alloc msg failed !!");
return NULL;
}
goto AGAIN;
}
- cb_log(-1,0,"mISDN_read returned :%d error:%s (%d)\n",r,strerror(errno),errno);
+ cb_log(0,0,"mISDN_read returned :%d error:%s (%d)\n",r,strerror(errno),errno);
}
return msg;
continue;
} else {
if (zero_frm) {
- cb_log(-1, port, "*** Alert: %d zero_frms caught\n", zero_frm);
+ cb_log(0, port, "*** Alert: %d zero_frms caught\n", zero_frm);
zero_frm = 0 ;
}
}
continue;
} else {
if (fff_frm) {
- cb_log(-1, port, "*** Alert: %d fff_frms caught\n", fff_frm);
+ cb_log(0, port, "*** Alert: %d fff_frms caught\n", fff_frm);
fff_frm = 0 ;
}
}
bc->need_disconnect=1;
bc->need_release=1;
bc->need_release_complete=1;
+ bc->cause=16;
if (++mypid>5000) mypid=1;
bc->pid=mypid;
+#ifdef WITH_BEROEC
+ bc->ec=NULL;
+#endif
+
#if 0
bc->addr=0;
bc->b_stid=0;
int i;
if (channel < 0 || channel > MAX_BCHANS) {
- cb_log(-1,port,"Requested channel out of bounds (%d)\n",channel);
+ cb_log(0,port,"Requested channel out of bounds (%d)\n",channel);
return NULL;
}
for (stack=glob_mgr->stack_list; stack; stack=stack->next) {
if (stack->port == port) {
+ if (stack->blocked) {
+ cb_log(0,port,"Port is blocked\n");
+ return NULL;
+ }
+
if (channel > 0) {
if (channel <= stack->b_num) {
for (i = 0; i < stack->b_num; i++) {
if (stack->bc[i].in_use && stack->bc[i].channel == channel) {
- cb_log(-1,port,"Requested channel:%d on port:%d is already in use\n",channel, port);
+ cb_log(0,port,"Requested channel:%d on port:%d is already in use\n",channel, port);
return NULL;
}
}
} else {
- cb_log(-1,port,"Requested channel:%d is out of bounds on port:%d\n",channel, port);
+ cb_log(0,port,"Requested channel:%d is out of bounds on port:%d\n",channel, port);
return NULL;
}
}
}
}
- cb_log(-1,port,"There is no free channel on port (%d)\n",port);
+ cb_log(1,port,"There is no free channel on port (%d)\n",port);
return NULL;
}
}
- cb_log(-1,port,"Port is not configured (%d)\n",port);
+ cb_log(0,port,"Port is not configured (%d)\n",port);
return NULL;
}
if (!stack) return;
- cb_log(2, stack->port, " --> mode:%s cause:%d ocause:%d rad:%s cad:%s\n", stack->nt?"NT":"TE", bc->cause, bc->out_cause, bc->rad, bc->cad);
-
- cb_log(3, stack->port, " --> facility:%s out_facility:%s\n",fac2str(bc->fac_type),fac2str(bc->out_fac_type));
+ cb_log(2, stack->port, " --> channel:%d mode:%s cause:%d ocause:%d rad:%s cad:%s\n", bc->channel, stack->nt?"NT":"TE", bc->cause, bc->out_cause, bc->rad, bc->cad);
cb_log(2, stack->port,
" --> info_dad:%s onumplan:%c dnumplan:%c rnumplan:%c cpnnumplan:%c\n",
bc->rnumplan>=0?'0'+bc->rnumplan:' ',
bc->cpnnumplan>=0?'0'+bc->cpnnumplan:' '
);
- cb_log(3, stack->port, " --> screen:%d --> pres:%d\n",
+
+ cb_log(3, stack->port, " --> caps:%s pi:%x keypad:%s sending_complete:%d\n", bearer2str(bc->capability),bc->progress_indicator, bc->keypad, bc->sending_complete);
+ cb_log(4, stack->port, " --> screen:%d --> pres:%d\n",
bc->screen, bc->pres);
- cb_log(2, stack->port, " --> channel:%d caps:%s pi:%x keypad:%s sending_complete:%d\n", bc->channel, bearer2str(bc->capability),bc->progress_indicator, bc->keypad, bc->sending_complete);
-
- cb_log(3, stack->port, " --> urate:%d rate:%d mode:%d user1:%d\n", bc->urate, bc->rate, bc->mode,bc->user1);
+ cb_log(4, stack->port, " --> addr:%x l3id:%x b_stid:%x layer_id:%x\n", bc->pid, bc->addr, bc->l3_id, bc->b_stid, bc->layer_id);
- cb_log(3, stack->port, " --> pid:%d addr:%x l3id:%x\n", bc->pid, bc->addr, bc->l3_id);
- cb_log(3, stack->port, " --> b_stid:%x layer_id:%x\n", bc->b_stid, bc->layer_id);
+ cb_log(4, stack->port, " --> facility:%s out_facility:%s\n",fac2str(bc->fac_type),fac2str(bc->out_fac_type));
+
+ cb_log(5, stack->port, " --> urate:%d rate:%d mode:%d user1:%d\n", bc->urate, bc->rate, bc->mode,bc->user1);
- cb_log(4, stack->port, " --> bc:%x h:%d sh:%d\n", bc, bc->holded, bc->stack_holder);
+ cb_log(5, stack->port, " --> bc:%x h:%d sh:%d\n", bc, bc->holded, bc->stack_holder);
}
int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
struct misdn_stack *stack=get_stack_by_bc(bc);
if (!stack) {
- cb_log(-1,bc->port,"SENDEVENT: no Stack for event:%s oad:%s dad:%s \n", isdn_get_info(msgs_g, event, 0), bc->oad, bc->dad);
+ cb_log(0,bc->port,"SENDEVENT: no Stack for event:%s oad:%s dad:%s \n", isdn_get_info(msgs_g, event, 0), bc->oad, bc->dad);
return -1;
}
switch (event) {
case EVENT_SETUP:
if (create_process(glob_mgr->midev, bc)<0) {
- cb_log(-1, stack->port, " No free channel at the moment @ send_event\n");
+ cb_log(0, stack->port, " No free channel at the moment @ send_event\n");
err=-ENOCHAN;
goto ERR;
}
#if 0
+ if (stack->nt) {
ret=setup_bc(bc);
if (ret == -EINVAL) {
- cb_log(-1,bc->port,"send_event: setup_bc failed\n");
+ cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
+ }
#endif
break;
if (bc->channel <=0 ) { /* else we have the channel already */
bc->channel = find_free_chan_in_stack(stack, bc, 0);
if (!bc->channel) {
- cb_log(-1, stack->port, " No free channel at the moment\n");
+ cb_log(0, stack->port, " No free channel at the moment\n");
err=-ENOCHAN;
goto ERR;
ret=setup_bc(bc);
if (ret == -EINVAL) {
- cb_log(-1,bc->port,"send_event: setup_bc failed\n");
+ cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
if ( (event == EVENT_CONNECT ) && misdn_cap_is_speech(bc->capability) ) {
if (!bc->nodsp) manager_ph_control(bc, DTMF_TONE_START, 0);
if (bc->ec_enable) manager_ec_enable(bc);
+
+#ifdef WITH_BEROEC
+ if (!bec_initialized) bc->bnec_tail=0;
+
+ if (bc->bnec_tail) {
+ bc->ec=beroec_new(bc->bnec_tail, BEROEC_SUBBAND, bc->bnec_ah,
+ bc->bnec_td, bc->bnec_zero, bc->bnec_adapt, bc->bnec_nlp);
+ }
+#endif
+
+
if (bc->txgain != 0) {
cb_log(4, stack->port, "--> Changing txgain to %d\n", bc->txgain);
holded_bc->active=0;*/
bc_state_change(holded_bc,BCHAN_CLEANED);
- cb_event( EVENT_NEW_BC, holded_bc, glob_mgr->user_data);
+ cb_event( EVENT_NEW_BC, bc, holded_bc);
}
break;
/* finishing the channel eh ? */
case EVENT_DISCONNECT:
if (!bc->need_disconnect) {
- cb_log(-1,1," --> we have already send Disconnect\n");
+ cb_log(0,bc->port," --> we have already send Disconnect\n");
return -1;
}
break;
case EVENT_RELEASE:
if (!bc->need_release) {
- cb_log(-1,bc->port," --> we have already send Release\n");
+ cb_log(0,bc->port," --> we have already send Release\n");
return -1;
}
bc->need_disconnect=0;
break;
case EVENT_RELEASE_COMPLETE:
if (!bc->need_release_complete) {
- cb_log(-1,bc->port," --> we have already send Release_complete\n");
+ cb_log(0,bc->port," --> we have already send Release_complete\n");
return -1;
}
bc->need_disconnect=0;
if ( bc->nt || misdn_cap_is_speech(bc->capability)) {
int ret=setup_bc(bc);
if (ret == -EINVAL){
- cb_log(-1,bc->port,"send_event: setup_bc failed\n");
+ cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
}
if (misdn_cap_is_speech(bc->capability)) {
if ( !bc->nodsp) manager_ph_control(bc, DTMF_TONE_START, 0);
if (bc->ec_enable) manager_ec_enable(bc);
+#ifdef WITH_BEROEC
+ if (!bec_initialized) bc->bnec_tail=0;
+
+ if (bc->bnec_tail) {
+ bc->ec=beroec_new(bc->bnec_tail, BEROEC_SUBBAND, bc->bnec_ah,
+ bc->bnec_td, bc->bnec_zero, bc->bnec_adapt, bc->bnec_nlp);
+ }
+#endif
+
+
if ( bc->txgain != 0 ) {
cb_log(4, stack->port, "--> Changing txgain to %d\n", bc->txgain);
manager_ph_control(bc, VOL_CHANGE_TX, bc->txgain);
struct misdn_stack *stack=find_stack_by_port( port );
if (!stack) {
- cb_log(-1,0," --> stack not found\n");
+ cb_log(0,0," --> stack not found\n");
free_msg(msg);
return 1;
}
- cb_log(-1,0," --> bc not found by channel\n");
+ cb_log(0,0," --> bc not found by channel\n");
if (stack->l2link)
misdn_lib_get_l2_down(stack);
#endif
- cb_log(-1, 0, "Unhandled Message: prim %x len %d from addr %x, dinfo %x on this port.\n",frm->prim, frm->len, frm->addr, frm->dinfo);
+ cb_log(0, 0, "Unhandled Message: prim %x len %d from addr %x, dinfo %x on this port.\n",frm->prim, frm->len, frm->addr, frm->dinfo);
free_msg(msg);
iframe_t *frm;
struct misdn_stack *stack=find_stack_by_port(port);
if (!msg) {
- cb_log(-1, port, "misgn_lib_get_port: alloc_msg failed!\n");
+ cb_log(0, port, "misgn_lib_get_port: alloc_msg failed!\n");
return -1;
}
frm=(iframe_t*)msg->data;
if (!stack ) {
- cb_log(-1, port, "There is no Stack for this port.\n");
+ cb_log(0, port, "There is no Stack for this port.\n");
return -1;
}
/* activate bchannel */
msg_t *msg=alloc_msg(MAX_MSG_SIZE);
iframe_t *frm;
if (!msg) {
- cb_log(-1, bc->port, "misgn_lib_get_port: alloc_msg failed!\n");
+ cb_log(0, bc->port, "misgn_lib_get_port: alloc_msg failed!\n");
return -1;
}
frm=(iframe_t*)msg->data;
iframe_t *frm;
if (!msg) {
- cb_log(-1, port, "port_restart: alloc_msg failed\n");
+ cb_log(0, port, "port_restart: alloc_msg failed\n");
return -1;
}
{
struct misdn_stack *stack=find_stack_by_port(frm->dinfo);
if (!stack) {
- cb_log(-1,0,"no stack found with port [%d]!! so we cannot cleanup the bc\n",frm->dinfo);
+ cb_log(0,0,"no stack found with port [%d]!! so we cannot cleanup the bc\n",frm->dinfo);
free_msg(msg);
break;
}
cb_log(1,bc->port,"CLEARSTACK queued, cleaning up\n");
clean_up_bc(bc);
} else {
- cb_log(-1,stack->port,"bc could not be cleaned correctly !! addr [%x]\n",frm->addr);
+ cb_log(0,stack->port,"bc could not be cleaned correctly !! addr [%x]\n",frm->addr);
}
}
free_msg(msg);
/* Maybe it's TE */
if (!handle_frm(msg)) {
/* wow none! */
- cb_log(-1,stack->port,"Wow we've got a strange issue while dequeueing a Frame\n");
+ cb_log(0,stack->port,"Wow we've got a strange issue while dequeueing a Frame\n");
}
}
}
while ( (msg=msg_dequeue(&stack->downqueue)) ) {
if (stack->nt ) {
if (stack->nst.manager_l3(&stack->nst, msg))
- cb_log(-1, stack->port, "Error@ Sending Message in NT-Stack.\n");
+ cb_log(0, stack->port, "Error@ Sending Message in NT-Stack.\n");
} else {
iframe_t *frm = (iframe_t *)msg->data;
midev=te_lib_init();
mgr->midev=midev;
+#ifdef WITH_BEROEC
+ int bec_ver=beroec_version();
+ if (bec_ver>=BEROEC_VERSION) {
+ beroec_init();
+ bec_initialized=1;
+ } else {
+ cb_log(0,0,"!! Please update the BEROEC binary\n");
+ bec_initialized=0;
+ }
+#endif
+
port_count=mISDN_get_stack_count(midev);
msg_queue_init(&mgr->activatequeue);
ptp=1;
if (port > port_count) {
- cb_log(-1, port, "Couldn't Initialize this port since we have only %d ports\n", port_count);
+ cb_log(0, port, "Couldn't Initialize this port since we have only %d ports\n", port_count);
exit(1);
}
stack=stack_init(midev, port, ptp);
for(i=0;i<stack->b_num; i++) {
int r;
if ((r=init_bc(stack, &stack->bc[i], stack->midev,port,i, "", 1))<0) {
- cb_log(-1, port, "Got Err @ init_bc :%d\n",r);
+ cb_log(0, port, "Got Err @ init_bc :%d\n",r);
exit(1);
}
}
if (sem_init(&handler_started, 1, 0)<0)
sem_init(&handler_started, 0, 0);
- cb_log(4, 0, "Starting Event Handler\n");
+ cb_log(8, 0, "Starting Event Handler\n");
pthread_create( &mgr->event_handler_thread, NULL,(void*)manager_event_handler, mgr);
sem_wait(&handler_started) ;
- cb_log(4, 0, "Starting Event Catcher\n");
+ cb_log(8, 0, "Starting Event Catcher\n");
pthread_create( &mgr->event_thread, NULL, (void*)misdn_lib_isdn_event_catcher, mgr);
- cb_log(4, 0, "Event Catcher started\n");
+ cb_log(8, 0, "Event Catcher started\n");
global_state= MISDN_INITIALIZED;
struct misdn_stack *stack=get_stack_by_bc(bc);
if (!stack) {
- cb_log(-1, bc->port, "bchannel_activate: Stack not found !");
+ cb_log(0, bc->port, "bchannel_activate: Stack not found !");
return ;
}
unsigned char buffer[mISDN_HEADER_LEN+2*sizeof(int)];
iframe_t *ctrl = (iframe_t *)buffer; /* preload data */
unsigned int *d = (unsigned int*)&ctrl->data.p;
- struct misdn_stack *stack=get_stack_by_bc(bc);
+ /*struct misdn_stack *stack=get_stack_by_bc(bc);*/
cb_log(4,bc->port,"ph_control: c1:%x c2:%x\n",c1,c2);
ctrl->len = sizeof(unsigned int)*2;
*d++ = c1;
*d++ = c2;
- mISDN_write(stack->midev, ctrl, mISDN_HEADER_LEN+ctrl->len, TIMEOUT_1SEC);
+ mISDN_write(glob_mgr->midev, ctrl, mISDN_HEADER_LEN+ctrl->len, TIMEOUT_1SEC);
}
/*
unsigned char buffer[mISDN_HEADER_LEN+sizeof(int)+c2_len];
iframe_t *ctrl = (iframe_t *)buffer;
unsigned int *d = (unsigned int *)&ctrl->data.p;
- struct misdn_stack *stack=get_stack_by_bc(bc);
+ /*struct misdn_stack *stack=get_stack_by_bc(bc);*/
ctrl->prim = PH_CONTROL | REQUEST;
ctrl->addr = bc->addr | FLG_MSG_DOWN;
ctrl->len = sizeof(unsigned int) + c2_len;
*d++ = c1;
memcpy(d, c2, c2_len);
- mISDN_write(stack->midev, ctrl, mISDN_HEADER_LEN+ctrl->len, TIMEOUT_1SEC);
+ mISDN_write(glob_mgr->midev, ctrl, mISDN_HEADER_LEN+ctrl->len, TIMEOUT_1SEC);
}
cb_log(4, stack->port, "Taps is %d\n",bc->ec_deftaps);
break;
default:
- cb_log(-1, stack->port, "Taps should be power of 2\n");
+ cb_log(0, stack->port, "Taps should be power of 2\n");
bc->ec_deftaps=128;
}
struct misdn_stack *stack=find_stack_by_port(port);
if (stack) {
+ stack->l2link=0;
+ stack->blocked=0;
+
cleanup_Isdnl3(&stack->nst);
cleanup_Isdnl2(&stack->nst);