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

270 lines
6.4 KiB
C

/**************************************************/
/*Title: snmpdebug.c */
/*Descr: Debug Module of SNMP Agent */
/*Author: Liang Hanxi */
/*Create: 2002-4-1 */
/*Modify: */
/**************************************************/
#include "./include/heartbeat.h"
static unsigned long l_starttime;
extern snmp_csta SnmpCsta[96];
extern int snmp_ins;
extern heartbeat_shm *HbShm;
int snmp_setmib(BYTE oidlen, DWORD *oid, BYTE *pdata,WORD datalen);
int snmp_getmib(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
int snmp_getsys(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
void time_sync(BYTE oidlen,DWORD *oid,BYTE *pdata,WORD len,snmp_addr *addr);
static void submit_snmpcsta(BYTE *pdword,BYTE *pbyte,int len);
/* by simon at 23/9/25 */
extern char SnmpVer[16];
void snmpmib_init()
{
DWORD oid[OID_MAXLEN]=SNMP_OID;
DWORD sysoid[8]={1,3,6,1,2,1,1};
l_starttime=time(NULL);
inquire_getmsg(SNMP_OIDLEN,oid,snmp_getmib);
inquire_setmsg(SNMP_OIDLEN,oid,snmp_setmib);
inquire_getmsg(7,sysoid,snmp_getsys);
inquire_trapmsg(time_sync);
}
int snmp_setmib(BYTE oidlen, DWORD *oid, BYTE *pdata,WORD datalen)
{
return -1;
switch(oid[SNMP_OIDLEN])
{
case 1: //Measure
return -1; //read only
case 2: //Configuration
switch(oid[SNMP_OIDLEN+1])
{
case 1: //SNMP Parameter
switch(oid[SNMP_OIDLEN+2])
{
case 1: //Port
return -1; //not allow
case 2: //password
return -1; //not provide now
}
break;
case 2:
break;
case 3:
break;
}
break;
case 3:
break;
}
}
int snmp_getmib(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype)
{
int instance;
snmp_csta *pcsta;
switch(oid[SNMP_OIDLEN])
{
case 1: //csta
if(oidlen!=SNMP_OIDLEN+2)
return -1;
instance=oid[SNMP_OIDLEN+1];
if(instance==snmp_ins || instance>95)
{
*vartype=NosuchInstance;
snmp_debug(SNMPDB_MIB,"csta message not ready.instance=%d",instance);
return -1;
}
pcsta=&SnmpCsta[instance];
if(pcsta->timestamp ==0)
{
snmp_debug(SNMPDB_MIB,"csta message is expired");
*vartype=5;
return 0;
}
*vartype=4;
snmp_debug(SNMPDB_MIB, "Respond csta message");
submit_snmpcsta((BYTE *)&pcsta->timestamp,pdata,sizeof(snmp_csta));
//memcpy(pdata,(BYTE *)&pcsta->timestamp,sizeof(snmp_csta));
return sizeof(snmp_csta);
default:
return -1;
}
return -1;
}
int snmp_getsys(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype)
{
unsigned long l_time;
char contact[50]="InterWAVE";
char sysname[50];
switch(oid[oidlen - 1])
{
case 1:
*vartype = 4;
memcpy(pdata, SnmpVer, strlen(SnmpVer));
return strlen(SnmpVer);
case 3:
l_time=time(NULL);
*vartype=0x43;
return encode_integer(pdata,(l_time-l_starttime)*100);
case 4:
*vartype=4;
memcpy(pdata,contact,strlen(contact));
return strlen(contact);
case 5:
*vartype=4;
sprintf(sysname,"SNMP Agent %d.%d",HbShm->sys_id,HbShm->subsys_id);
memcpy(pdata,sysname,strlen(sysname));
return strlen(sysname);
}
return -1;
}
#define SNMP_OMC_HB_OID {1,3,6,1,4,1,1373,2,4,1}
#define SNMP_OMC_HB_OIDLEN 10
#define SNMP_SERNUM_LEN 4
unsigned long long Bcd2Ull(BYTE *pBcd, int BcdLen);
extern unsigned long long SNMPSerialNumber;
extern BYTE snmp_synctime_flag;
void time_sync(BYTE oidlen,DWORD *oid,BYTE *pdata,WORD len,snmp_addr *addr)
{
//DWORD ObjID[20]=FLATFORM_HB_OID;
DWORD OMCHBObjID[20] = SNMP_OMC_HB_OID;
heartbeat_msg *pmsg=(heartbeat_msg *)pdata;
struct timeval tv;
struct timezone tz;
int l_time,l_temp;
static int master_host=0,master_timeout;
char oidstring[256];
char tmpstr[64];
oidstring[0]=0;
int i;
if (!snmp_synctime_flag)
return;
if(memcmp(&oid[7], &OMCHBObjID[7], (SNMP_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 ((SNMPSerialNumber==0) ||//support old version, do not have serial number
(Bcd2Ull(&pdata[39],SNMP_SERNUM_LEN)==SNMPSerialNumber) )
{}
else
return;
}
else// if it is not omc heartbeat then return
return;
if(pmsg->subsys_id ==HbShm->subsys_id && pmsg->sys_id ==HbShm->sys_id)
return;
/*
if(memcmp(&oid[9],&ObjID[9],(FLATFORM_HB_OIDLEN-9)*4)!=0)
{
return;
}
*/
/*
if(pmsg->sys_id!=MasterSysID || pmsg->subsys_id!=MasterSubSysID)
return;
*/
if(SNMPSerialNumber!=0){//New version
if(pdata[26]!=5&&pdata[26]!=7)//not the master omc
return;
}else{//Old version
if(pdata[21]!=5&&pdata[21]!=7)//not the master omc
return;
}
memcpy((BYTE *)&l_temp,pmsg->timestamp,4);
l_time=htonl(l_temp); //timestamp in heartbeat
gettimeofday(&tv,&tz); //local time
if(master_host==0 || master_timeout<=0)
{
snmp_debug(SNMPDB_SYS, "change master host to %lX",htonl(addr->remote_ip));
master_host=addr->remote_ip;
master_timeout=8;
}
if(addr->remote_ip != master_host)
{
master_timeout--;
snmp_debug(SNMPDB_SYS, "Found another master,ip=%lX.current master=%lX,timeout=%ld\n",htonl(addr->remote_ip),htonl(master_host),master_timeout);
return;
}
else
master_timeout=8;
if(abs(l_time-tv.tv_sec)<2) //compare
{
return;
}
timeSync_log("system's time's second is :%ld",tv.tv_sec);
tv.tv_sec =l_time;
settimeofday(&tv,&tz);
for(i=0;i<oidlen;i++)
{
sprintf(tmpstr,"%ld.",oid[i]);
strcat(oidstring,tmpstr);
}
timeSync_log("oid is:%s",oidstring);
timeSync_log("system's time's second is changed to %ld by %lX\n",tv.tv_sec,htonl(addr->remote_ip));
snmp_debug(SNMPDB_SYS, "system's time is changed by %lX\n",htonl(addr->remote_ip));
}
void submit_snmpcsta(BYTE *pdword,BYTE *pbyte,int len)
{
int i;
DWORD *p1,*p2;
for(i=0;i<len/4;i++)
{
p1=(DWORD *)(pdword+4*i);
p2=(DWORD *)(pbyte+4*i);
*p2=htonl(*p1);
}
}
void timeSync_log(const char *fmt,...)
{
//#if DUALSRV_DEBUG == 1
char logFile[64];
FILE *fp;
time_t l_time;
va_list ap;
char buf[8192];
struct tm *t;
char timestr[64];
l_time=time(NULL);
t=localtime(&l_time);
sprintf(logFile,"../log/SnmpTimeSync_%04d%02d%02d.log",t->tm_year+1900,t->tm_mon+1,t->tm_mday);
fp=fopen(logFile,"a");
if(fp!=NULL)
{
va_start(ap,fmt);
vsprintf(buf,fmt,ap);
sprintf(timestr,"%02d:%02d:%02d: ",t->tm_hour,t->tm_min,t->tm_sec);
fputs(timestr,fp);
fputs(buf,fp);
fputs("\n",fp);
fflush(fp);
va_end(ap);
fclose(fp);
}
//#endif
}