Files
svc.ems/plat/isdn/src/isdn_debug.c
2024-09-27 15:39:34 +08:00

1374 lines
33 KiB
C

/***********************************************************
Copyright (C), LGC Wireless.
File Name: isdn_debug.c
Description: ISDN Debug
Version: v9.1.0
Author: Gengxin Chen
Create Date: 2008-5-27
History:
<author> <date> <version> <desc>
************************************************************/
#include "./include/isdn_debug.h"
#define DEBUG_ID 24
#define VER_DEBUG "R9V1_01"
#define IS_PATCH 2
//#define PROTO_ISDN 3
#define PAGE_NUM 5
#define ISDN_MONITOR_NONE 0x0000
#define ISDN_MONITOR_ERROR 0x0002
#define ISDN_MONITOR_MSG 0x0004
#define ISDN_MONITOR_FUNC 0x0008
#define ISDN_MONITOR_STATE 0x8000
#define ISDN_MONITOR_ALL 0x7fff
static ISDN_Msg_Csta isdn_csta;
static u8 AsciInBuf[4096];
static u8 AsciOutBuf[4096];
static u8 AsciTempBuf[4096];
static u16 MonitorIsdnFg;
static u8 info[4096];
static int debug_link_id;
static u8 log_help[] = {
"ISDN Debug Monitor Help:\n\r\
\n\r\
1.[help] display help menu\n\r\
2.[log all/none] display all/none logs\n\r\
3.[log error on/off] display error logs \n\r\
3.[log state on/off] display state logs \n\r\
4.[list cg] display all cg (N/A)\n\r\
5.[list cg-x] display cg (N/A)\n\r\
6.[list circuit-x] display circuit->port (N/A)\n\r\n\r"
};
static u16 disp_page[10];
static u8 *disp_ptr = (u8 *) disp_page;
static u32 debug_status_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1
};
static u8 debug_status = 1;
static u32 debug_name_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,2
};
static u32 debug_ascin_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,3
};
static u32 debug_ascout_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,4
};
static u32 debug_page_title[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1,1
};
static u32 debug_page_line[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1,2,1
};
const static u8 BASE_ID_LEN = 15;
const static u8 PAGE_POINT = 14;
const static u8 LINE_POINT = 15;
static u8 title1_p[] =
{
" ISDN Page 01 SAP Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Enable\n\r\
SystemID\n\r\
Run mode\n\r\
Remote IP\n\r"
};
static u8 title2_p[] =
{
" ISDN Page 02 CG Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Enable\n\r\
SAP_ID\n\r\
Circuit_num\n\r\
Variant\n\r\
Priority\n\r\
TG_ID\n\r\
NFAS\n\r\
PRI\n\r\
BACKUP\n\r"
};
static u8 title3_p[] =
{
" ISDN Page 03 Circuit Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Enable\n\r\
CG_ID\n\r\
PLAT_ID\n\r\
HEAD CIC\n\r\
CIC RANGE\n\r\
D-CHANNEL\n\r\
LINK_ID\n\r\
LK2_STATUS\n\r\
LK3_STATUS\n\r\
DC_STATUS\n\r"
};
static u8 title4_p[] =
{
" ISDN Page 04 Port Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Enable\n\r\
Fsm_state\n\r\
CIC_state\n\r\
SU_port\n\r\
Timer_F\n\r\
Time_W\n\r"
};
static u8 title5_p[] =
{
" ISDN Page 05 Csta Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
RV-SD-SETUP\n\r\
RV-SD-SETUPACK\n\r\
RV-SD-CALLPROC\n\r\
RV-SD-ALERT\n\r\
RV-SD-CONN\n\r\
RV-SD-CONNACK\n\r\
RV-SD-DISC\n\r\
RV-SD-REL\n\r\
RV-SD-RELCOMP\n\r\
RD-SETUP\n\r\
RD-SETUPACK\n\r\
RD-CALLPROC\n\r\
RD-ALERT\n\r\
RD-CONN\n\r\
RD-CONNACK\n\r\
RD-DISC\n\r\
RD-REL\n\r\
RD-RELCOMP\n\r"
};
static void debug_setcol(int color);
static void debug_cancelcol();
static void isdn_asciout_proc(const char *fmt, ...)
{
va_list ap;
char buf[4096];
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
if((strlen(AsciOutBuf) + strlen(buf)) < 4096)
strcat(AsciOutBuf, buf);
else
strcpy(AsciOutBuf, buf);
va_end(ap);
}
static void list_sap(u8 sap_id)
{
const pal_sap_struct *sap_ptr = pal_sap_ptr(sap_id);
if(sap_ptr == NULL)
{
printf("list sap err!sap_id = %d, can't find sap_ptr!\n", sap_id);
return;
}
if(sap_id >= ISDN_MAX_SAP)
return;
sprintf(info,"\r\n\
#ISDN SAP Info\r\n\
Enable=%d\r\n\
SystemID(%d)\r\n\
Run mode(%d)\r\n\
Remote IP(%lx)\r\n\
------------------\r\n",
sap_ptr->enable,
isdn_rs.attrib.systemID,
isdn_rs.attrib.isdn_run_mode,
isdn_rs.attrib.isdn_remote_ip);
isdn_asciout_proc(info);
}
static void list_cg(u16 cg_id)
{
const pal_cg_struct *cg_ptr = pal_cg_ptr(cg_id);
if(cg_ptr == NULL)
{
printf("list cg err!cg_id = %d, can't find cg_ptr!\n", cg_id);
return;
}
if(cg_ptr->attrib.protocol != PROTO_ISDN)
return;
if(cg_id >= ISDN_MAX_CG)
return;
sprintf(info,"\r\n\
#ISDN CG- %d Info\r\n\
enable:%d\r\n\
sap_id:%d\r\n\
circuit_num:%d\r\n\
Attrib-->\r\n\
variant_type(%d)\r\n\
priority(%d)\r\n\
tg_id(%ld)\r\n\
NFAS(%d)\r\n\
pri_link(%ld)\r\n\
backup_link(%ld)\r\n\
---------------------\r\n",
cg_id,
cg_ptr->enable,
cg_ptr->sap_id,
cg_ptr->circuit_num,
cg_ptr->attrib.variant,
cg_ptr->attrib.priority,
cg_ptr->attrib.tg_id,
cg_ptr->attrib.nfas.flag,
cg_ptr->attrib.nfas.prim_link,
cg_ptr->attrib.nfas.backup_link
);
isdn_asciout_proc(info);
}
static void list_all_cg(void)
{
int i;
const pal_cg_struct *cg_ptr = NULL;
isdn_asciout_proc("CgId\tSapId\tCircirtNum\tVariant\tPrior\tTgId\tNFAS\tPRI\tBackUp\r\n");
for(i = 0; i < ISDN_MAX_CG; i++)
{
cg_ptr = pal_cg_ptr(i);
if(cg_ptr == NULL)
continue;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
continue;
if(cg_ptr->enable == 0)
continue;
sprintf(info,"%d\t%d\t%d\t\t%d\t%d\t%ld\t%d\t%ld\t%ld\r\n",
i,
cg_ptr->sap_id,
cg_ptr->circuit_num,
cg_ptr->attrib.variant,
cg_ptr->attrib.priority,
cg_ptr->attrib.tg_id,
cg_ptr->attrib.nfas.flag,
cg_ptr->attrib.nfas.prim_link,
cg_ptr->attrib.nfas.backup_link);
isdn_asciout_proc(info);
}
}
static void list_circuit(u16 circuit_id)
{
const pal_cg_struct *cg_ptr = NULL;
const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id);
if(circuit_ptr == NULL)
{
printf("list circuit err!circuit_id = %d, can't find circuit_ptr!\n", circuit_id);
return;
}
if(circuit_id >= ISDN_MAX_CIRCUIT)
return;
cg_ptr = pal_cg_ptr(circuit_ptr->cg_id);
if(cg_ptr == NULL)
return;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
return;
sprintf(info,"\r\n\
#ISDN Circuit-%d Info\r\n\
enable:%d\r\n\
cg_id:%d\r\n\
Attrib->\r\n\
plat_id(%d)\r\n\
head_cic(%ld)\r\n\
cic_range(%d)\r\n\
d_channel(%d)\r\n\
link_id(%ld)\r\n\
lk2_status(%d)\r\n\
lk3_status(%d)\r\n\
dc_status(%d)\r\n\
-------------------\r\n",
circuit_id,
circuit_ptr->enable,
circuit_ptr->cg_id,
circuit_ptr->attrib.plat_id,
circuit_ptr->attrib.head_cic,
circuit_ptr->attrib.cic_range,
circuit_ptr->attrib.d_chnl,
circuit_ptr->attrib.link_id,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status);
isdn_asciout_proc(info);
}
static void list_all_circuit()
{
int i;
const pal_cg_struct *cg_ptr = NULL;
const pal_circuit_struct *circuit_ptr = NULL;
isdn_asciout_proc("CircuitId\tCgId\tPlatId\tHeatCic\tRange\tD_Chnl\tLinkId\tLk2Status\tLk3Status\tDcStatus\r\n");
for(i = 0; i < ISDN_MAX_CIRCUIT; i++)
{
circuit_ptr = pal_circuit_ptr(i);
if(circuit_ptr == NULL)
continue;
if(circuit_ptr->enable == 0)
continue;
cg_ptr = pal_cg_ptr(circuit_ptr->cg_id);
if(cg_ptr == NULL)
continue;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
continue;
sprintf(info,"%d\t\t%d\t%d\t%ld\t%d\t%d\t%ld\t%d\t\t%d\t\t%d\r\n",
i,
circuit_ptr->cg_id,
circuit_ptr->attrib.plat_id,
circuit_ptr->attrib.head_cic,
circuit_ptr->attrib.cic_range,
circuit_ptr->attrib.d_chnl,
circuit_ptr->attrib.link_id,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status);
isdn_asciout_proc(info);
}
}
static void list_all_circuit_by(u16 cg_id)
{
int i;
const pal_cg_struct *cg_ptr = NULL;
const pal_circuit_struct *circuit_ptr = NULL;
isdn_asciout_proc("--->circuit:\r\n");
isdn_asciout_proc("CircuitId\tCgId\tPlatId\tHeatCic\tRange\tD_Chnl\tLinkId\tLk2Status\tLk3Status\tDcStatus\r\n");
for(i = 0; i < ISDN_MAX_CIRCUIT; i++)
{
circuit_ptr = pal_circuit_ptr(i);
if(circuit_ptr == NULL)
continue;
if(circuit_ptr->enable == 0 &&
circuit_ptr->cg_id != cg_id)
continue;
cg_ptr = pal_cg_ptr(circuit_ptr->cg_id);
if(cg_ptr == NULL)
continue;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
continue;
sprintf(info,"%d\t\t%d\t%d\t%ld\t%d\t%d\t%ld\t%d\t\t%d\t\t%d\r\n",
i,
circuit_ptr->cg_id,
circuit_ptr->attrib.plat_id,
circuit_ptr->attrib.head_cic,
circuit_ptr->attrib.cic_range,
circuit_ptr->attrib.d_chnl,
circuit_ptr->attrib.link_id,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status,
isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status);
isdn_asciout_proc(info);
}
}
static void list_port(u32 pid)
{
if(pid >= ISDN_MAX_PORT)
return;
sprintf(info,"\r\n\
#ISDN Port-%ld Info\r\n\
enable:%d\r\n\
su_proc_id:%ld\r\n\
msg_cmd:%d\r\n\
primitive_cmd:%d\r\n\
------------------------\r\n\
call_state:%d\r\n\
maintenance_state:%d\r\n\
------------------------\r\n\
cpc_state:%d\r\n\
m_state:%d\r\n\
------------------------\r\n",
pid,
isdn_rs.port_pond[pid].enable,
isdn_rs.port_pond[pid].su_proc_id,
isdn_rs.port_pond[pid].msg_cmd,
isdn_rs.port_pond[pid].primitive_cmd,
isdn_rs.port_pond[pid].cic_state.call_state,
isdn_rs.port_pond[pid].cic_state.maintenance_state,
isdn_rs.port_pond[pid].fsm_state.cpc_state,
isdn_rs.port_pond[pid].fsm_state.m_state);
isdn_asciout_proc(info);
}
static void list_all_port()
{
int i, j = 0;
isdn_asciout_proc("index\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n");
for(i = 0; i < ISDN_MAX_PORT; i++)
{
if(isdn_rs.port_pond[i].enable == 0)
continue;
sprintf(info,"%d\t%d\t%ld\t%d\t\t%d\t\t%d\t\t%d\r\n",
j++,
i,
isdn_rs.port_pond[i].su_proc_id,
isdn_rs.port_pond[i].cic_state.call_state,
isdn_rs.port_pond[i].cic_state.maintenance_state,
isdn_rs.port_pond[i].fsm_state.cpc_state,
isdn_rs.port_pond[i].fsm_state.m_state);
isdn_asciout_proc(info);
}
}
static void list_all_port_by(u16 circuit_id)
{
int i,cic,pid;
const pal_cg_struct *cg_ptr = NULL;
const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id);
if(circuit_ptr == NULL)
{
printf("list all port by circuit_id err!circuit_id = %d, can't find circuit_ptr!\n", circuit_id);
return;
}
cg_ptr = pal_cg_ptr(circuit_ptr->cg_id);
if(cg_ptr == NULL)
return;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
return;
pid = ISDN_CIRCUIT_CIC * circuit_id;
cic = circuit_ptr->attrib.head_cic;
isdn_asciout_proc("-->port:\r\n");
isdn_asciout_proc("CIC\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n");
for(i = 0; i < circuit_ptr->attrib.cic_range; i++)
{
isdn_asciout_proc("%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\r\n",
cic,
pid,
isdn_rs.port_pond[pid].su_proc_id,
isdn_rs.port_pond[pid].cic_state.call_state,
isdn_rs.port_pond[pid].cic_state.maintenance_state,
isdn_rs.port_pond[pid].fsm_state.cpc_state,
isdn_rs.port_pond[pid].fsm_state.m_state);
cic++;
pid++;
}
}
static int list_cic(u8 link_id, u32 cic_val)
{
int i,pid;
u32 head_cic;
const pal_circuit_struct *circuit_ptr = NULL;
const pal_cg_struct *cg_ptr = NULL;
for(i = 0; i < ISDN_MAX_CIRCUIT; i++)
{
circuit_ptr = pal_circuit_ptr(i);
if(circuit_ptr == NULL)
continue;
if(circuit_ptr->enable == 0)
continue;
if((cic_val < circuit_ptr->attrib.head_cic) ||
((cic_val - circuit_ptr->attrib.head_cic ) >=
circuit_ptr->attrib.cic_range))
continue;
cg_ptr = pal_cg_ptr(circuit_ptr->cg_id);
if(cg_ptr == NULL)
continue;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
continue;
if(cg_ptr->attrib.nfas.flag)
{
if(cg_ptr->attrib.nfas.prim_link != link_id &&
cg_ptr->attrib.nfas.backup_link != link_id)
continue;
}
else
{
if(circuit_ptr->attrib.link_id != link_id)
continue;
}
head_cic = circuit_ptr->attrib.head_cic;
if(circuit_ptr->attrib.cic_range == 24)
head_cic--;
pid = ISDN_CIRCUIT_CIC * i + (cic_val - head_cic);
list_sap(cg_ptr->sap_id);
list_cg(circuit_ptr->cg_id);
list_circuit(i);
list_port(pid);
return 1;
}
sprintf(info, "illegal cic value! link_id=%d,cic=%ld\r\n", link_id, cic_val);
isdn_asciout_proc(info);
return -1;
}
static void debug_setcol(int color)
{
isdn_asciout_proc("%c[%dm",COL_ESC , color);
}
static void debug_cancelcol()
{
isdn_asciout_proc("%c[m",COL_ESC);
}
static u16 debug_disp_line(u8 page, u8 line)
{
u16 disp_length;
disp_length = 0;
disp_ptr = (u8 *)disp_page;
const pal_sap_struct *sap_ptr = pal_sap_ptr(disp_page[page]);
if(sap_ptr == NULL)
return ISDN_CM_FAILED;
const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(disp_page[page]);
if(circuit_ptr == NULL)
return ISDN_CM_FAILED;
const pal_cg_struct *cg_ptr = pal_cg_ptr(disp_page[page]);
if(cg_ptr == NULL)
return ISDN_CM_FAILED;
if(cg_ptr->attrib.protocol != PROTO_ISDN)
return ISDN_CM_FAILED;
switch(page)
{
case 1: // Page 1: sap Info
switch(line)
{
case 0:
disp_ptr = (u8 *)&disp_page[page]; //Subpage
disp_length = 2;
break;
case 1: //enable
disp_ptr = (u8 *)&(sap_ptr->enable);
disp_length = 1;
break;
case 2: //systemID
disp_ptr = (u8 *)&(isdn_rs.attrib.systemID);
disp_length = 1;
break;
case 3: //run_mode
disp_ptr = (u8 *)&(isdn_rs.attrib.isdn_run_mode);
disp_length = 1;
break;
case 4: //isdn_remote_ip
disp_ptr = (u8 *)&(isdn_rs.attrib.isdn_remote_ip);
disp_length = 4;
break;
default:
break;
}
break;
case 2: // Page 2: cg Info
switch(line)
{
case 0:
disp_ptr = (u8 *)&disp_page[page]; //Subpage
disp_length = 2;
break;
case 1: //enable
disp_ptr = (u8 *)&(cg_ptr->enable);
disp_length = 1;
break;
case 2: //sap_id
disp_ptr = (u8 *)&(cg_ptr->sap_id);
disp_length = 1;
break;
case 3: //circuit_num
disp_ptr = (u8 *)&(cg_ptr->circuit_num);
disp_length = 1;
break;
case 4: //variant_type
disp_ptr = (u8 *)&(cg_ptr->attrib.variant);
disp_length = 1;
break;
case 5: //priority
disp_ptr = (u8 *)&(cg_ptr->attrib.priority);
disp_length = 1;
break;
case 6: //tg_id
disp_ptr = (u8 *)&(cg_ptr->attrib.tg_id);
disp_length = 4;
break;
case 7: //nfas
disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.flag);
disp_length = 1;
break;
case 8: //pri
disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.prim_link);
disp_length = 1;
break;
case 9: //backup
disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.backup_link);
disp_length = 1;
break;
default:
break;
}
break;
case 3: // Page 3: circuit Info
switch(line)
{
case 0:
disp_ptr = (u8 *)&disp_page[page]; //Subpage
disp_length = 2;
break;
case 1: //enable
disp_ptr = (u8 *)&(circuit_ptr->enable);
disp_length = 1;
break;
case 2: //cg_id
disp_ptr = (u8 *)&(circuit_ptr->cg_id);
disp_length = 2;
break;
case 3: //plat_id
disp_ptr = (u8 *)&(circuit_ptr->attrib.plat_id);
disp_length = 1;
break;
case 4: //head_cic
disp_ptr = (u8 *)&(circuit_ptr->attrib.head_cic);
disp_length = 4;
break;
case 5: //cic_range
disp_ptr = (u8 *)&(circuit_ptr->attrib.cic_range);
disp_length = 1;
break;
case 6: //d-channel
disp_ptr = (u8 *)&(circuit_ptr->attrib.d_chnl);
disp_length = 4;
break;
case 7: //link_id
disp_ptr = (u8 *)&(circuit_ptr->attrib.link_id);
disp_length = 1;
break;
case 8: //lk2_status
disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status);
disp_length = 1;
break;
case 9: //lk3_status
disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status);
disp_length = 1;
break;
case 10: //dc_status
disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status);
disp_length = 1;
break;
default:
break;
}
break;
case 4: // Page 4: port Info
switch(line)
{
case 0:
disp_ptr = (u8 *)&disp_page[page]; //Subpage
disp_length = 2;
break;
case 1: //enable
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].enable);
disp_length = 1;
break;
case 2: //fsm_state
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].fsm_state);
disp_length = 2;
break;
case 3: //cic_state
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].cic_state);
disp_length = 2;
break;
case 4: //su_proc_id
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].su_proc_id);
disp_length = 4;
break;
case 5: //timer_flag
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].timer_flag);
disp_length = 2;
break;
case 6: //w_time
disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].w_time);
disp_length = 4;
break;
default:
break;
}
break;
case 5: // Page 5: call statistics Info
switch(line)
{
//receive and send
case 0:
disp_ptr = (u8 *)&isdn_csta.rv_setup;
disp_length = 8;
break;
case 1:
disp_ptr = (u8 *)&isdn_csta.rv_setupAck;
disp_length = 8;
break;
case 2:
disp_ptr = (u8 *)&isdn_csta.rv_callProc;
disp_length = 8;
break;
case 3:
disp_ptr = (u8 *)&isdn_csta.rv_alert;
disp_length = 8;
break;
case 4:
disp_ptr = (u8 *)&isdn_csta.rv_conn;
disp_length = 8;
break;
case 5:
disp_ptr = (u8 *)&isdn_csta.rv_connAck;
disp_length = 8;
break;
case 6:
disp_ptr = (u8 *)&isdn_csta.rv_disc;
disp_length = 8;
break;
case 7:
disp_ptr = (u8 *)&isdn_csta.rv_rel;
disp_length = 8;
break;
case 8:
disp_ptr = (u8 *)&isdn_csta.rv_relComp;
disp_length = 8;
break;
//redirect
case 9:
disp_ptr = (u8 *)&isdn_csta.rd_setup;
disp_length = 4;
break;
case 10:
disp_ptr = (u8 *)&isdn_csta.rd_setupAck;
disp_length = 4;
break;
case 11:
disp_ptr = (u8 *)&isdn_csta.rd_callProc;
disp_length = 4;
break;
case 12:
disp_ptr = (u8 *)&isdn_csta.rd_alert;
disp_length = 4;
break;
case 13:
disp_ptr = (u8 *)&isdn_csta.rd_conn;
disp_length = 4;
break;
case 14:
disp_ptr = (u8 *)&isdn_csta.rd_connAck;
disp_length = 4;
break;
case 15:
disp_ptr = (u8 *)&isdn_csta.rd_disc;
disp_length = 4;
break;
case 16:
disp_ptr = (u8 *)&isdn_csta.rd_rel;
disp_length = 4;
break;
case 17:
disp_ptr = (u8 *)&isdn_csta.rd_relComp;
disp_length = 4;
break;
default:
break;
}
break;
default:
disp_length = 0;
break;
}
return disp_length;
}
static void debug_disp_page(u8 page)
{
u8 disp_line;
u16 disp_length;
debug_page_line[PAGE_POINT] = page + 5;
for (disp_line = 0; disp_line < 22; disp_line++)
{
disp_length = debug_disp_line(page, disp_line);
debug_page_line[LINE_POINT] = disp_line + 2;
debug_page_line[LINE_POINT + 1] = 2; // Data Pointer
debug_set_response(BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length);
}
}
int isdn_debug_init(void)
{
u8 page;
u8 data[10];
u8 *ptr;
strcpy(AsciInBuf, "\0");
strcpy(AsciOutBuf, "\0");
MonitorIsdnFg = ISDN_MONITOR_NONE;
bzero(disp_page, 20);
memset(&isdn_csta, 0, sizeof(ISDN_Msg_Csta));
ptr = data;
debug_set_response(BASE_ID_LEN, debug_status_id, &debug_status, 1);
debug_set_response(BASE_ID_LEN, debug_name_id, VER_DEBUG, 10);
debug_set_response(BASE_ID_LEN, debug_ascin_id, AsciInBuf, 4096);
debug_set_response(BASE_ID_LEN, debug_ascout_id, AsciOutBuf, 4096);
for (page = 1; page <= PAGE_NUM; page++)
{
switch (page)
{
case 1: //page 1
ptr = title1_p;
break;
case 2: //page 2
ptr = title2_p;
break;
case 3: //page 3
ptr = title3_p;
break;
case 4: //page 4
ptr = title4_p;
break;
case 5: //page 5
ptr = title5_p;
break;
default:
break;
}
debug_page_title[PAGE_POINT] = 5 + page;
debug_set_response(BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr));
debug_disp_page(page);
}
return ISDN_CM_OK;
}
void isdn_debug_timer(void)
{
u8 in_page, err_fg = 0;
u8 *ascii_in_ptr = NULL;
u8 *str_start = NULL;
u16 str_len, num;
if((str_len = strlen(AsciInBuf)) > 0)
{
in_page = AsciInBuf[0] - 1;
ascii_in_ptr = AsciInBuf + 1;
if (in_page > PAGE_NUM)
err_fg = 1;
else if (strcmp(ascii_in_ptr,"log error on") == 0)
{
MonitorIsdnFg = MonitorIsdnFg | ISDN_MONITOR_ERROR;
}
else if (strcmp(ascii_in_ptr,"log error off") == 0)
{
MonitorIsdnFg = MonitorIsdnFg & (~ISDN_MONITOR_ERROR);
}
else if (strcmp(ascii_in_ptr,"log all") == 0)
{
MonitorIsdnFg = ISDN_MONITOR_ALL;
}
else if (strcmp(ascii_in_ptr,"log none") == 0)
{
MonitorIsdnFg = ISDN_MONITOR_NONE;
}
else if (strcmp(ascii_in_ptr,"log state on") == 0)
{
MonitorIsdnFg = MonitorIsdnFg | ISDN_MONITOR_STATE;
}
else if (strcmp(ascii_in_ptr,"log state off") == 0)
{
MonitorIsdnFg = MonitorIsdnFg & (~ISDN_MONITOR_STATE);
}
else if (strcmp(ascii_in_ptr,"help") == 0)
{
isdn_asciout_proc(log_help);
isdn_asciout_proc("Ver.%sp%02d\r\n",VER_DEBUG,IS_PATCH);
}
else if (isdigit(ascii_in_ptr[0]))
{
num = strtoul(ascii_in_ptr, NULL, 10);
disp_page[in_page] = num;
debug_disp_page(in_page);
}
else if ((str_start = strstr(ascii_in_ptr, ">")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
disp_page[in_page] += num;
debug_disp_page(in_page);
}
else if ((str_start = strstr(ascii_in_ptr, "<"))!= NULL)
{
num = strtoul(str_start + 1, NULL, 10);
disp_page[in_page] -= num;
debug_disp_page(in_page);
}
else if (strcmp(ascii_in_ptr,"reset csta") == 0)
{
memset(&isdn_csta,0,sizeof(ISDN_Msg_Csta));
}
else if (strcmp(ascii_in_ptr,"test color") == 0)
{
debug_setcol(COL_WHITE);
isdn_asciout_proc("COL_WHITE\n\r");
debug_setcol(COL_RED);
isdn_asciout_proc("COL_RED\n\r");
debug_setcol(COL_YELLOW);
isdn_asciout_proc("COL_YELLOW\n\r");
debug_setcol(COL_GREEN);
isdn_asciout_proc("COL_GREEN\n\r");
debug_setcol(COL_BLUE);
isdn_asciout_proc("COL_BLUE\n\r");
debug_setcol(COL_BROWN);
isdn_asciout_proc("COL_BROWN\n\r");
debug_setcol(COL_MEGEN);
isdn_asciout_proc("COL_MEGEN\n\r");
debug_setcol(COL_GRAY);
isdn_asciout_proc("COL_GRAY\n\r");
debug_setcol(COL_HI_WHI);
isdn_asciout_proc("COL_HI_WHI\n\r");
debug_setcol(COL_HI_RED);
isdn_asciout_proc("COL_HI_RED\n\r");
debug_setcol(COL_HI_YEL);
isdn_asciout_proc("COL_HI_YEL\n\r");
debug_setcol(COL_HI_GRE);
isdn_asciout_proc("COL_HI_GRE\n\r");
debug_setcol(COL_HI_BLU);
isdn_asciout_proc("COL_HI_BLU\n\r");
debug_setcol(COL_HI_BRO);
isdn_asciout_proc("COL_HI_BRO\n\r");
debug_setcol(COL_HI_MEG);
isdn_asciout_proc("COL_HI_MEG\n\r");
debug_setcol(COL_BLACK);
isdn_asciout_proc("COL_BLACK\n\r");
debug_cancelcol();
}
else if (strstr(ascii_in_ptr, "reset port") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
if (num >= ISDN_MAX_PORT)
err_fg = 1;
else
{
memset(&(isdn_rs.port_pond[num]),0,sizeof(ISDN_Port_struct));
}
}
}
else if (strstr(ascii_in_ptr, "set link_id") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "=")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
debug_link_id = num;
}
}
else if (strstr(ascii_in_ptr, "list sap") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
list_sap(num);
}
}
else if (strstr(ascii_in_ptr, "list cg") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
list_cg(num);
list_all_circuit_by(num);
}
else
list_all_cg();
}
else if (strstr(ascii_in_ptr, "list circuit") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
list_circuit(num);
list_all_port_by(num);
}
else
list_all_circuit();
}
else if (strstr(ascii_in_ptr, "list debug link") != NULL)
{
isdn_asciout_proc("debug_link_id = %d\n\r",debug_link_id);
}
else if (strstr(ascii_in_ptr, "list cic") != NULL)
{
if((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
list_cic(debug_link_id, num);
}
}
else if (strstr(ascii_in_ptr, "trace on") != NULL)
{
if((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
isdn_rs.port_pond[num].trace_flag = 1;
}
}
else if (strstr(ascii_in_ptr, "trace off") != NULL)
{
if((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
isdn_rs.port_pond[num].trace_flag = 0;
}
else
{
int i;
for(i = 0; i < ISDN_MAX_PORT; i++)
isdn_rs.port_pond[i].trace_flag = 0;
}
}
else
err_fg = 1;
if (err_fg == 0)
isdn_asciout_proc("Command OK!\n\r");
else
isdn_asciout_proc("Command Error!\n\r");
strcpy(AsciInBuf, "\0");
}
}
static void display_isdn_msgtype(u8 msgtype, u8 proto_discr)
{
if(proto_discr == PROTOCOL_DISCR)
{
switch(msgtype)
{
case MSG_ALERT:
isdn_asciout_proc("Alerting");
break;
case MSG_CALL_PROC:
isdn_asciout_proc("Call proceeding");
break;
case MSG_CONN:
isdn_asciout_proc("Connect");
break;
case MSG_CONNACK:
isdn_asciout_proc("Connect acknowledge");
break;
case MSG_PROG:
isdn_asciout_proc("Progress");
break;
case MSG_SETUP:
isdn_asciout_proc("Setup");
break;
case MSG_SETUP_ACK:
isdn_asciout_proc("Setup acknowledge");
break;
case MSG_DISC:
isdn_asciout_proc("Disconnect");
break;
case MSG_REL:
isdn_asciout_proc("Release");
break;
case MSG_REL_COMP:
isdn_asciout_proc("Release complete");
break;
case MSG_RESTART:
isdn_asciout_proc("Restart");
break;
case MSG_REST_ACK:
isdn_asciout_proc("Restart acknowledge");
break;
case MSG_INFORMATION:
isdn_asciout_proc("Information");
break;
case MSG_NOTI:
isdn_asciout_proc("Notify");
break;
case MSG_STATUS:
isdn_asciout_proc("Status");
break;
case MSG_STAT_ENQ:
isdn_asciout_proc("Status enquiry");
break;
case MSG_FAC:
isdn_asciout_proc("Facility (connectionless)");
break;
default:
isdn_asciout_proc("Unknown message");
break;
}
}
else if(proto_discr == M_PROTOCOL_DISCR)
{
switch(msgtype)
{
case MSG_SERVICE:
isdn_asciout_proc("Service");
break;
case MSG_SERVICE_ACK:
isdn_asciout_proc("Service acknowledge");
break;
default:
isdn_asciout_proc("Unknown message");
break;
}
}
isdn_asciout_proc("(message type=0x%x)\r\n",msgtype);
}
void isdn_log_err(u32 pid,const char *fmt, ...)
{
va_list ap;
struct timeval tv;
struct timezone tz;
struct tm *t;
char timestr[1024];
if((MonitorIsdnFg & ISDN_MONITOR_ERROR) != ISDN_MONITOR_ERROR)
return;
gettimeofday(&tv, &tz);
t = localtime(&tv.tv_sec);
sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec);
va_start(ap, fmt);
vsprintf(AsciTempBuf, fmt, ap);
debug_setcol(COL_RED);
isdn_asciout_proc("%s%s (pid=%d)", timestr, AsciTempBuf, pid);
debug_cancelcol();
isdn_asciout_proc("\r\n");
va_end(ap);
}
void isdn_trace_func(u32 pid,const char *fmt, ...)
{
va_list ap;
struct timeval tv;
struct timezone tz;
struct tm *t;
char timestr[1024];
if (((MonitorIsdnFg & ISDN_MONITOR_FUNC) != ISDN_MONITOR_FUNC) ||
(isdn_rs.port_pond[pid%ISDN_MAX_PORT].trace_flag != 1))
return;
gettimeofday(&tv, &tz);
t = localtime(&tv.tv_sec);
sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec );
va_start(ap, fmt);
vsprintf(AsciTempBuf, fmt, ap);
debug_setcol(COL_YELLOW);
isdn_asciout_proc("%s%s (pid=%d)",timestr,AsciTempBuf,pid);
debug_cancelcol();
isdn_asciout_proc("\r\n");
va_end(ap);
}
void monitor_isdn_msg(u32 pid,u8 *head,IuaMsgStr *msg,u8 col)
{
int i, len;
u32 cic;
struct timeval tv;
struct timezone tz;
struct tm *t;
char timestr[1024];
int circuit_id = pid / ISDN_CIRCUIT_CIC;
const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id);
if(circuit_ptr == NULL)
{
printf("monitor isdn msg err!pid=%ld, circuit_id = %d, can't find circuit_ptr!\n", pid, circuit_id);
return;
}
if((MonitorIsdnFg & ISDN_MONITOR_MSG) != ISDN_MONITOR_MSG)
return;
if(circuit_ptr->attrib.cic_range == 32)
cic = circuit_ptr->attrib.head_cic + (pid % ISDN_CIRCUIT_CIC);
else
cic = circuit_ptr->attrib.head_cic + (pid % ISDN_CIRCUIT_CIC) - 1;
gettimeofday(&tv, &tz);
t = localtime(&tv.tv_sec);
sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec);
debug_setcol(col);
isdn_asciout_proc("%s%s ",timestr,head);
if(msg->msgcontent.isdn_msg.msg_m.call_ref[0] & 0x80)
isdn_asciout_proc("msg send to originating side\n\r");
else
isdn_asciout_proc("msg send from originating side\n\r");
display_isdn_msgtype(msg->msgcontent.isdn_msg.msg_m.msg_type, msg->msgcontent.isdn_msg.msg_m.proto_Discr);
isdn_asciout_proc("--cic=0x%04x,cref=0x%02x%02x,link=%d,proto=%d,pid=%d->\n\r",
cic,
msg->msgcontent.isdn_msg.msg_m.call_ref[0]&0x7F,
msg->msgcontent.isdn_msg.msg_m.call_ref[1],
msg->e1_no,
msg->msgcontent.isdn_msg.msg_m.proto_Discr,
pid);
len = msg->msg_length - 5;
debug_cancelcol();
for (i = 0; i < len; i ++)
{
sprintf(&AsciTempBuf[3*i]," %02x", msg->msgcontent.isdn_msg.ie_content[i]);
}
sprintf(&AsciTempBuf[3*i],"\n\r");
isdn_asciout_proc(AsciTempBuf);
return;
}
void monitor_isdn_port(u32 call_ref,u32 port)
{
if ((MonitorIsdnFg & ISDN_MONITOR_STATE) != ISDN_MONITOR_STATE)
return;
isdn_asciout_proc("-->port:\r\n");
isdn_asciout_proc("CallRef\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n");
sprintf(info,"%lx\t%ld\t%ld\t%d\t\t%d\t\t%d\t\t%d\r\n",
call_ref,
port,
isdn_rs.port_pond[port].su_proc_id,
isdn_rs.port_pond[port].cic_state.call_state,
isdn_rs.port_pond[port].cic_state.maintenance_state,
isdn_rs.port_pond[port].fsm_state.cpc_state,
isdn_rs.port_pond[port].fsm_state.m_state);
isdn_asciout_proc(info);
}
void isdn_msg_csta(u8 msgtype,u8 flag)
{
switch(msgtype)
{
case MSG_ALERT:
if(flag==0) //receive
isdn_csta.rv_alert++;
else if(flag == 1) //send
isdn_csta.sd_alert++;
else //redirect
isdn_csta.rd_alert++;
break;
case MSG_CALL_PROC:
if(flag==0) //receive
isdn_csta.rv_callProc++;
else if(flag == 1) //send
isdn_csta.sd_callProc++;
else //redirect
isdn_csta.rd_callProc++;
break;
case MSG_CONN:
if(flag==0) //receive
isdn_csta.rv_conn++;
else if(flag == 1) //send
isdn_csta.sd_conn++;
else //redirect
isdn_csta.rd_conn++;
break;
case MSG_CONNACK:
if(flag==0) //receive
isdn_csta.rv_connAck++;
else if(flag == 1) //send
isdn_csta.sd_connAck++;
else //redirect
isdn_csta.rd_connAck++;
break;
case MSG_PROG:
break;
case MSG_SETUP:
if(flag==0) //receive
isdn_csta.rv_setup++;
else if(flag == 1) //send
isdn_csta.sd_setup++;
else //redirect
isdn_csta.rd_setup++;
break;
case MSG_SETUP_ACK:
if(flag==0) //receive
isdn_csta.rv_setupAck++;
else if(flag == 1) //send
isdn_csta.sd_setupAck++;
else //redirect
isdn_csta.rd_setupAck++;
break;
case MSG_DISC:
if(flag==0) //receive
isdn_csta.rv_disc++;
else if(flag == 1) //send
isdn_csta.sd_disc++;
else //redirect
isdn_csta.rd_disc++;
break;
case MSG_REL:
if(flag==0) //receive
isdn_csta.rv_rel++;
else if(flag == 1) //send
isdn_csta.sd_rel++;
else //redirect
isdn_csta.rd_rel++;
break;
case MSG_REL_COMP:
if(flag==0) //receive
isdn_csta.rv_relComp++;
else if(flag == 1) //send
isdn_csta.sd_relComp++;
else //redirect
isdn_csta.rd_relComp++;
break;
case MSG_RESTART:
break;
case MSG_REST_ACK:
break;
case MSG_INFORMATION:
break;
case MSG_NOTI:
break;
case MSG_STATUS:
break;
case MSG_STAT_ENQ:
break;
case MSG_FAC:
break;
default:
break;
}
}