416 lines
12 KiB
C
416 lines
12 KiB
C
//////////////////////////////////////////////////
|
|
//Title : spLog.c
|
|
//Auhtor : Liu Wei
|
|
//Desc : sccp log implementation
|
|
//Created : 2007-05-19
|
|
//Revision :
|
|
//
|
|
//Revision :
|
|
//
|
|
//////////////////////////////////////////////////
|
|
|
|
#include "./include/sccp.h"
|
|
#include "./include/sccp_pub.h"
|
|
#include "./include/sccp_func.h"
|
|
|
|
BYTE sccpDebugFull = 0;
|
|
/* by simon at 23/9/26 */
|
|
extern SCCP_SegMsgBuf sccp_segmsgbuf[MAX_SEGMSG_BUF];
|
|
|
|
extern void spWatchDogStatic ( u8 uDebugStaticMask );
|
|
extern char sccp_debug_buf[5120];
|
|
extern int spLog_fd;
|
|
extern unsigned long spLogDebug_mask;
|
|
|
|
void spLog ( char *info )
|
|
{
|
|
#ifdef DEBUG_TEST
|
|
if( strlen ( info ) < 2048 )
|
|
{
|
|
printf ( "[SCCP]: %s\n", info );
|
|
}
|
|
#else
|
|
if( strlen ( sccp_debug_buf ) + strlen ( info ) > 2048 )
|
|
{
|
|
sccpDebugFull = 1;
|
|
return;
|
|
}
|
|
strncat ( sccp_debug_buf, info, 2048 );
|
|
strcat ( sccp_debug_buf, "\r\n" );
|
|
|
|
if( spLog_fd != -1 )
|
|
{
|
|
write ( spLog_fd, info, strlen ( info ) );
|
|
write ( spLog_fd, "\r\n", 2 );
|
|
}
|
|
|
|
if( strlen ( sccp_debug_buf ) > 2050 )
|
|
{
|
|
printf ( "sccp debug buffer overflow, len=%d\n", strlen ( sccp_debug_buf ) );
|
|
}
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spShowAddr ( SCCP_ADDR * pAddr, const char *sAddrName )
|
|
{
|
|
char srcAddr[128], digits[24];
|
|
|
|
Digits2Str ( digits, pAddr->GTAI, ( ( pAddr->len + 1 ) / 2 ) % MAX_DIGITS );
|
|
digits[pAddr->len] = 0;
|
|
sprintf ( srcAddr, "%s: SPC=%06X SSN=%d RI=%d GTI=%d NP=%d TT=%d GT=%s", sAddrName, pAddr->DPC, pAddr->SSN, pAddr->RI, pAddr->GTI, pAddr->NP, pAddr->TT, digits );
|
|
spLog ( srcAddr );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
void spLogDebug ( DWORD mask, const char *fmt, ... )
|
|
{
|
|
va_list ap;
|
|
char buf[1024];
|
|
|
|
if( ( mask & spLogDebug_mask ) == 0 || sccpDebugFull )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( spLogDebug_mask & SCCPDB_TIME )
|
|
{
|
|
struct timeval tv;
|
|
struct timezone tz;
|
|
struct tm *t;
|
|
char timestr[32];
|
|
|
|
gettimeofday ( &tv, &tz );
|
|
t = localtime ( &tv.tv_sec );
|
|
if( t == NULL )
|
|
{
|
|
assert( 0 && "syscall : localtime fail");
|
|
exit(0);
|
|
}
|
|
sprintf ( timestr, "(%d:%d:%d.%ld):", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec );
|
|
spLog ( timestr );
|
|
}
|
|
|
|
if( ( mask & SCCPDB_ERR ) && ( strlen ( sccp_debug_buf ) + 5 < 2048 ) )
|
|
{
|
|
strcat ( sccp_debug_buf, "\33[31m" );
|
|
}
|
|
|
|
va_start ( ap, fmt );
|
|
vsnprintf ( buf, 1024, fmt, ap );
|
|
va_end ( ap );
|
|
strcat ( buf, "\33[37m" );
|
|
spLog ( buf );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spShowBCD ( DWORD mask, BYTE * buf, int len )
|
|
{
|
|
// int i = 0, j = 0, linemax = 24;
|
|
char info[1024];
|
|
|
|
if( ( spLogDebug_mask & SCCPDB_MSG ) == 0 || ( spLogDebug_mask & mask ) == 0 || sccpDebugFull )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( len >= 256 )
|
|
{
|
|
len = 256;
|
|
}
|
|
|
|
MsgToFmtLog ( buf, len, info, 1024 );
|
|
spLog ( info );
|
|
}
|
|
|
|
void spLogSeg ( SCCP_SegMsgBuf * pSegMsgbuf )
|
|
{
|
|
char digits[24], info[256];
|
|
|
|
spShowAddr ( &pSegMsgbuf->SegID.CGA, "spShowAddr" );
|
|
|
|
BcdToAscii ( digits, pSegMsgbuf->SegID.SegLR, 6 );
|
|
digits[6] = 0;
|
|
sprintf ( info, "Seginfo: Total=%d RSE=%d DPC=%06X SLS=%d Class=%d SegLR=0x%s", pSegMsgbuf->MsgTotal, pSegMsgbuf->RSE, pSegMsgbuf->SegID.DPC, pSegMsgbuf->SegID.SLS, pSegMsgbuf->MsgClass, digits );
|
|
spLog ( info );
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spShowMsg ( DWORD mask, const char *pDesc, Intra_Msg * pIntraMsg )
|
|
{
|
|
// int i = 0, j = 0, linemax = 24;
|
|
int len;
|
|
// char srcAddr[128], dstAddr[128];
|
|
char digits[24], info[1024];
|
|
char *pStr;
|
|
|
|
if( ( mask & spLogDebug_mask ) == 0 && ( sccp_filter_msg ( &pIntraMsg->CGA, &pIntraMsg->CDA ) == 0 || mask >= SCCPDB_STP ) )
|
|
{
|
|
return;
|
|
}
|
|
if( sccpDebugFull )
|
|
{
|
|
return;
|
|
}
|
|
if( strlen ( sccp_debug_buf ) + 2 < 2048 )
|
|
{
|
|
strcat ( sccp_debug_buf, "\r\n" );
|
|
}
|
|
if( spLogDebug_mask & SCCPDB_TIME )
|
|
{
|
|
struct timeval tv;
|
|
struct timezone tz;
|
|
struct tm *t;
|
|
char timestr[32];
|
|
|
|
gettimeofday ( &tv, &tz );
|
|
t = localtime ( &tv.tv_sec );
|
|
if( t == NULL )
|
|
{
|
|
assert( 0 && "syscall : localtime fail");
|
|
exit(0);
|
|
}
|
|
sprintf ( timestr, "(%d:%d:%d.%ld):", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec );
|
|
spLog ( timestr );
|
|
}
|
|
|
|
if( mask & SCCPDB_ERR && ( strlen ( sccp_debug_buf ) + 5 < 2048 ) )
|
|
{
|
|
strcat ( sccp_debug_buf, "\33[31m" );
|
|
}
|
|
|
|
spGetMsgStr ( pIntraMsg->msgtype, pStr );
|
|
sprintf ( info, "%s %s[%d->%d], SLS=%02x, NetID=%d, msglen=%d\33[37m", pDesc, pStr, pIntraMsg->CGA.SSN, pIntraMsg->CDA.SSN, pIntraMsg->SLS, pIntraMsg->NetID, pIntraMsg->msglen );
|
|
|
|
spLog ( info );
|
|
|
|
if( ( spLogDebug_mask & SCCPDB_ADDR ) || ( mask & SCCPDB_ERR ) )
|
|
{
|
|
spShowAddr ( &pIntraMsg->CGA, "SrcAddr" );
|
|
spShowAddr ( &pIntraMsg->CDA, "DstAddr" );
|
|
}
|
|
|
|
if( mask & SCCPDB_AIF )
|
|
{
|
|
char digits1[24], digits2[24];
|
|
|
|
BcdToAscii ( digits1, pIntraMsg->aSLR, 6 );
|
|
digits1[6] = 0;
|
|
BcdToAscii ( digits2, pIntraMsg->aDLR, 6 );
|
|
digits2[6] = 0;
|
|
sprintf ( info, "SLR = %s DLR = %s ", digits1, digits2 );
|
|
spLog ( info );
|
|
}
|
|
|
|
if( mask & SCCPDB_XUDT )
|
|
{
|
|
BcdToAscii ( digits, pIntraMsg->Segmnt.SegLR, 6 );
|
|
digits[6] = 0;
|
|
sprintf ( info, "Seginfo: RS=%d SegLR=0x%s", pIntraMsg->Segmnt.RSBits, digits );
|
|
spLog ( info );
|
|
}
|
|
|
|
if( ( spLogDebug_mask & SCCPDB_MSG ) == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
len = pIntraMsg->msglen % 256;
|
|
MsgToFmtLog ( pIntraMsg->data, len, info, 1024 );
|
|
spLog ( info );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spShowPrimitive ( SP_UiPriPara * pUiPriParam, u8 uDirection )
|
|
{
|
|
u8 *pStr;
|
|
|
|
spGetUlPrimitiveStr ( pUiPriParam->uUiPri, pStr );
|
|
if( uDirection )
|
|
{
|
|
spLogDebug ( SCCPDB_TIME, "AIF ==> SCCP : %s", pStr );
|
|
}
|
|
else
|
|
{
|
|
spLogDebug ( SCCPDB_TIME, "SCCP ==> AIF : %s", pStr );
|
|
}
|
|
|
|
spShowUserData ( pUiPriParam );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spLogStateError ( u16 wConnId, u8 uErrCode )
|
|
{
|
|
CO_ConnSection *pCS;
|
|
u8 *pStateStr;
|
|
u8 *pPriStr;
|
|
u8 *pSideStr;
|
|
|
|
WxcAssert ( wConnId < CO_CS_MPORT, "SCCP spLogStateError unexpected connection id" );
|
|
|
|
pCS = &pSp->tCo.tCSInst[wConnId];
|
|
|
|
spGetCoStateStr ( pCS->uCState, pStateStr );
|
|
spGetUlPrimitiveStr ( pCS->uPri, pPriStr );
|
|
spGetCoInstanceSide ( pCS->uSide, pSideStr );
|
|
|
|
switch ( uErrCode )
|
|
{
|
|
case ERR_NONE:
|
|
{
|
|
#ifdef _WXC_FSM_TEST
|
|
char str[512];
|
|
|
|
sprintf ( str, "]coFsm[: call back state %s , side :%s \n", pStateStr, pSideStr );
|
|
spLog ( str );
|
|
#endif
|
|
}
|
|
break;
|
|
case ERR_FSM_UNEXPECT_SIDE:
|
|
spLogDebug ( SCCPDB_ERR, "Recieve unexpected side: %s ", pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_UNEXPECT_SIDE );
|
|
break;
|
|
case ERR_FSM_UNEXPECT_PRI:
|
|
spLogDebug ( SCCPDB_ERR, "Recieve unexpected primitive in the state machine ," "Discard the primtive . \nstate: %s primtive :%s side :%s\n", pStateStr, pPriStr, pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_UNEXPECT_PRI );
|
|
break;
|
|
case ERR_FSM_DISCARD:
|
|
spLogDebug ( SCCPDB_ERR, "Unexpected state machine ,Discard the state : %s side :%s", pStateStr, pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_DISCARD );
|
|
break;
|
|
case ERR_FSM_ERROR:
|
|
spLogDebug ( SCCPDB_ERR, "Unexpected state machine ,error state : %s side :%s", pStateStr, pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_ERROR );
|
|
break;
|
|
case ERR_FSM_FATAL:
|
|
spLogDebug ( SCCPDB_ERR, "Unexpected state machine ,fatal error : %s side :%s", pStateStr, pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_FATAL );
|
|
case ERR_FSM_RESERVED:
|
|
spLogDebug ( SCCPDB_ERR, "Unexpected reserved state machine, unsupported now state : %s side :%s", pStateStr, pSideStr );
|
|
spWatchDogStatic ( ERR_FSM_RESERVED );
|
|
break;
|
|
default:
|
|
spLogDebug ( SCCPDB_ERR, "SCCP log state error , but unkonw eror code" );
|
|
spWatchDogStatic ( ERR_FSM_UNKOWN_ERROR_CODE );
|
|
break;
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spLogTimerOut ( u16 wConnId, u8 uTimerID )
|
|
{
|
|
u8 *pTimerStr;
|
|
|
|
spGetTimerOutStr ( uTimerID, pTimerStr );
|
|
spLogDebug ( SCCPDB_ERR, "SCCP Timer Out Timer ID : %s ConnID : %d ", pTimerStr, wConnId );
|
|
spWatchDogStatic ( SP_TIMER_OUT );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// ///
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
void spShowUserData ( SP_UiPriPara * pPri )
|
|
{
|
|
SP_UD *pUd;
|
|
SP_UiPriUnion *pPriUn;
|
|
|
|
pPriUn = &pPri->tPriUnion;
|
|
|
|
switch ( pPri->uUiPri )
|
|
{
|
|
case N_CONNECT_REQ:
|
|
if( !( pPriUn->tPriNConnReq.uOptFlag & 0x08 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Connect Req primitive Flag :0x%X ", pPriUn->tPriNConnReq.uOptFlag );
|
|
pUd = &pPriUn->tPriNConnReq.tUD;
|
|
break;
|
|
case N_CONNECT_IND:
|
|
if( !( pPriUn->tPriNConnInd.uOptFlag & 0x04 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Connect Ind primitive Flag :0x%X NetID : %d "
|
|
"RI : %d SSN : %d" , pPriUn->tPriNConnInd.uOptFlag
|
|
,pPriUn->tPriNConnInd.tCDA.NetID
|
|
,pPriUn->tPriNConnInd.tCDA.RI
|
|
,pPriUn->tPriNConnInd.tCDA.SSN );
|
|
pUd = &pPriUn->tPriNConnInd.tUD;
|
|
break;
|
|
case N_CONNECT_CFM:
|
|
if( !( pPriUn->tPriNConnCfm.uOptFlag & 0x04 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Connect Cfm primitive Flag :0x%X ", pPriUn->tPriNConnCfm.uOptFlag );
|
|
pUd = &pPriUn->tPriNConnCfm.tUD;
|
|
break;
|
|
case N_CONNECT_RSP:
|
|
if( !( pPriUn->tPriNConnRsp.uOptFlag & 0x04 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Connect Rsp primitive Flag :0x%X ", pPriUn->tPriNConnRsp.uOptFlag );
|
|
pUd = &pPriUn->tPriNConnRsp.tUD;
|
|
break;
|
|
case N_DISCONNECT_REQ:
|
|
if( !( pPriUn->tPriNDisconnReq.uOptFlag & 0x04 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Disconnect Req primitive Flag :0x%X ", pPriUn->tPriNDisconnReq.uOptFlag );
|
|
pUd = &pPriUn->tPriNDisconnReq.tUD;
|
|
break;
|
|
case N_DISCONNECT_IND:
|
|
if( !( pPriUn->tPriNDisconnInd.uOptFlag & 0x04 ) )
|
|
{
|
|
return;
|
|
}
|
|
spLogDebug ( SCCPDB_AIF, "Disconnect Ind primitive Flag :0x%X ", pPriUn->tPriNDisconnInd.uOptFlag );
|
|
pUd = &pPriUn->tPriNDisconnInd.tUD;
|
|
break;
|
|
case N_DATA_REQ:
|
|
pUd = &pPriUn->tPriNDataReq.tUD;
|
|
break;
|
|
case N_DATA_IND:
|
|
pUd = &pPriUn->tPriNDataInd.tUD;
|
|
break;
|
|
case N_DATAAK_REQ:
|
|
case N_EDATA_REQ:
|
|
case N_RESET_REQ:
|
|
case N_RESET_RSP:
|
|
case N_INFORM_REQ:
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
if( pUd->uDataLen > 0 )
|
|
{
|
|
spShowBCD ( SCCPDB_AIF, pUd->aUserData, ( pUd->uDataLen ) % 256 );
|
|
}
|
|
}
|