/**************************************************/ /*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;iremote_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;itm_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 }