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

242 lines
7.9 KiB
C

/*********************************************************/
/*Title: sccpmib.c */
/*Descr: SCCP Management information Base Interface */
/*Author: Liang Hanxi */
/*Create: 2002-4-16 */
/*Modify: */
/*********************************************************/
#include "./include/sccp.h"
/*===========import================*/
extern int BuildRouteIndex ( ); //gtt.c
extern int sccp_loadparam ( ); //sccpparam.c
extern void sccp_saveparam ( );
extern int sccp_setparam ( DWORD * oid, BYTE * pdata, WORD datalen );
extern int sccp_getparam ( DWORD * oid, BYTE * pdata, BYTE * vartype );
extern void sccp_reset ( ); //sccp.c
extern void DWORD2BYTE ( BYTE * pdword, BYTE * pbyte, int len ); //sccpfun.c
extern void spLogDebug ( DWORD mask, const char *fmt, ... );
/* by simon at 23/9/26 */
extern SCCP_CSTA SccpCsta[96];
extern DWORD SccpCstaInd;
/* by simon at 23/9/26*/
extern int RelatedSSNNum;
extern RL_SSN RelatedSSN[SCCP_RLSSN_NUM];
extern SCOC_BUF ScocBuf;
extern SCCP_ROUTE RouteList[SCCP_ROUTE_NUM];
extern LOCAL_SSN LocalSSN[256];
extern SCCP_ROUTE RouteList[SCCP_ROUTE_NUM];
extern SCCP_OPT SCCP_Param;
/*===========export================*/
void sccpmib_init ( );
void sccp_sethb ( );
/*===========private===============*/
int sccp_setmib ( BYTE oidlen, DWORD * oid, BYTE * pdata, WORD datalen );
int sccp_getmib ( BYTE oidlen, DWORD * oid, BYTE * pdata, BYTE * vartype );
void sccp_trapcallback ( BYTE oidlen, DWORD * oid, BYTE * pdata, WORD len, snmp_addr * addr );
void sccpmib_init ( )
{
DWORD oid[20] = SCCP_OID;
inquire_setmsg ( SCCP_OIDLEN, oid, sccp_setmib );
inquire_getmsg ( SCCP_OIDLEN, oid, sccp_getmib );
inquire_trapmsg ( sccp_trapcallback );
}
void sccp_sethb ( )
{
set_status ( 2, 4 + SCCP_Param.RegNum, SCCP_Param.version );
set_led ( 4, 9 );
}
/************************************************/
//MIB Interface=================================>
/************************************************/
int sccp_setmib ( BYTE oidlen, DWORD * oid, BYTE * pdata, WORD datalen )
{
switch ( oid[SCCP_OIDLEN] )
{
case 1: //CSTA, read only
return -1;
case 2: //Paramter
return sccp_setparam ( &oid[SCCP_OIDLEN + 1], pdata, datalen );
case 3: //Status
switch ( oid[SCCP_OIDLEN + 1] )
{
case 1: //version, read only
return -1;
case 2: //command
switch ( pdata[0] )
{
case 0: //reset
spLogDebug ( SCCPDB_SNMP, "Reset SCCP..." );
sccp_reset ( );
break;
case 1: //load
return -1;
case 2: //save
spLogDebug ( SCCPDB_SNMP, "Save Parameter..." );
sccp_saveparam ( );
break;
}
return 1;
case 3: //status, read only
return -1;
}
break;
}
return -1;
}
int sccp_getmib ( BYTE oidlen, DWORD * oid, BYTE * pdata, BYTE * vartype )
{
DWORD instance;
SCCP_CSTA *pcsta;
spLogDebug ( SCCPDB_SNMP, "get sccp mib..." );
switch ( oid[SCCP_OIDLEN] )
{
case 1: //CSTA
instance = oid[SCCP_OIDLEN + 1];
if( instance == SccpCstaInd || instance > 95 )
{
*vartype = NosuchInstance;
spLogDebug ( SCCPDB_SNMP, "csta message not ready. instance=%d", instance );
return 0;
}
pcsta = &SccpCsta[instance];
if( pcsta->timestamp == 0 )
{
spLogDebug ( SCCPDB_SNMP, "csta message is expired" );
*vartype = 5;
return 0;
}
*vartype = 4;
spLogDebug ( SCCPDB_SNMP, "Respond csta message" );
DWORD2BYTE ( ( BYTE * ) & pcsta->timestamp, pdata, sizeof ( SCCP_CSTA ) );
return sizeof ( SCCP_CSTA );
case 2: //Config
return sccp_getparam ( &oid[SCCP_OIDLEN + 1], pdata, vartype );
case 3: //Status
switch ( oid[SCCP_OIDLEN + 1] )
{
case 1: //version
spLogDebug ( SCCPDB_SNMP, "Get SCCP Version" );
memcpy ( pdata, SCCP_Param.version, 3 );
*vartype = 4;
return 3;
case 2: //command, write only
return -1;
case 3: //status
pdata[0] = SCCP_Param.status;
*vartype = 2;
return 1;
}
break;
}
return -1;
}
//#define OMC_HB_OID {1,3,6,1,4,1,1373,1,4,1,1}
#define OMC_HB_OID {1,3,6,1,4,1,1373,2,4,1}
#define OMC_HB_OIDLEN 10
int AddToIpList ( DWORD ip, BYTE ssn );
void sccp_OMCIP_detect ( DWORD ip )
{
int i;
BYTE index = 0;
for ( i = 0; i <= 1; i++ )
{
if( SCCP_Param.OMCIP[i] == ip )
return;
else if( SCCP_Param.OMCIP[i] == 0 )
index = i;
}
SCCP_Param.OMCIP[index] = ip;
AddToIpList ( ip, 4 );
}
extern ull SCCPSerialNumber;
void sccp_trapcallback ( BYTE oidlen, DWORD * oid, BYTE * pdata, WORD len, snmp_addr * addr )
{
DWORD ObjID[20] = FLATFORM_HB_OID;
BYTE ssn;
short infolen, i, pos = 2; //component_id=0:iptrans
heartbeat_msg *phbmsg = ( heartbeat_msg * ) pdata;
BYTE *pstatus = phbmsg->info;
DWORD OMCHLObjID[20] = OMC_HB_OID;
BYTE newHeartbeat = 0;
if( memcmp ( &oid[7], &OMCHLObjID[7], ( OMC_HB_OIDLEN - 7 ) * 4 ) == 0 ) //omc heartbeat
{ //automatic add omc ip into ip list,
//if receive omc heartbeat and the omc serial number is equial to the local serial number,
//then the platform will send heartbeat if received omc heartbeat
if( ( SCCPSerialNumber == 0 ) || //support old version, do not have serial number
( Bcd2Ull ( &pdata[39], SCCP_SERNUM_LEN ) == SCCPSerialNumber ) )
sccp_OMCIP_detect ( addr->remote_ip );
}
if( memcmp ( &oid[9], &ObjID[9], ( FLATFORM_HB_OIDLEN - 9 ) * 4 ) != 0 || addr->remote_ip == SCCP_Param.ip )
return;
if( sizeof ( struct heartbeat_msg ) > ( INFO_LEN + 18 ) )
newHeartbeat = 1;
if( !newHeartbeat )
{ //old version heartbeat, length and component_id are one octet
pos = 1;
pos += pstatus[pos] + 1; //length of iptrans status
pos++; //component_id=1:mtp3
pos += pstatus[pos] + 1; //length of mtp3
pos++; //component_id=2:sccp
}
else
{ //new version heartbeat, length and component_id are 2 octets
pos++; //length is 2 octets
pos += pstatus[pos] + 1; //length of iptrans status
pos++; //component_id=1:mtp3
pos++; //component_id is 2 octets
pos++; //length is 2 octets
pos += pstatus[pos] + 1; //length of mtp3
pos++; //component_id=2:sccp
pos++; //component_id is 2 octets
pos++; //sccp length 1
}
infolen = pstatus[pos++];
if( infolen <= 4 || infolen > 32 )
return;
for ( i = pos + 4; i < pos + infolen; i++ )
{
ssn = pstatus[i];
// printf("beat recieve,ssn=%d\n",ssn);
if( ssn <= 1 )
continue;
if( addr->remote_ip == LocalSSN[ssn].ip[0] )
{
LocalSSN[ssn].status[0] = ST_Enable;
LocalSSN[ssn].timeout[0] = T_hbrecv;
}
else if( addr->remote_ip == LocalSSN[ssn].ip[1] )
{
LocalSSN[ssn].status[1] = ST_Enable;
LocalSSN[ssn].timeout[1] = T_hbrecv;
}
}
}