📄 dtopn_m.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <limits.h>#include <dnpap.h>#include <dmath.h>#include <dhostx.h>#include <stdlib.h>#include <memory.h>#include <message.h>#include <mibsup.h>#include "dtopn_d.h"#include "dtopn_e.h"#include "dtopn_c.h"#include "dtopn.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE 1#define TOPNINDEXSIZE 2#define DTOPN_UPDATE_ENTRY(value) \ if (entry->PrevValue > host->value) \ entry->Rate += host->value + (ULONG_MAX - entry->PrevValue); \ else \ entry->Rate += host->value - entry->PrevValue; \ entry->PrevValue = host->valuestatic MIB_LOCAL *TopNControlInstance = NULL;static BOOLEAN RmonNext (SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, DNPAP_TOPN_ENTRY **elem);BOOLEAN DnpapTopNMInit(VOID){ MessageConfig(DNPAP_TOPN_ERROR, "DnpapTopN"); return TRUE;}BOOLEAN RmonNext (SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, DNPAP_TOPN_ENTRY **elem){ if (*local == NULL || indexsize < 1) return FALSE; switch (indexsize) { case TOPNINDEXSIZE: if (obj->IdLen >= idlen + indexsize) { if (((DNPAP_TOPN_CONTROL*)(*local)->Data)->Status == SNMP_VALID && ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TimeRemaining == 0 && ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TableSize > 0 && ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TopNArray != NULL && obj->Id[idlen+1] < min(((DNPAP_TOPN_CONTROL*)(*local)->Data)->RequestedSize, ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TableSize)) { obj->Id[idlen] = (*local)->Index; obj->Id[idlen+1]++; obj->IdLen = idlen + TOPNINDEXSIZE; *elem = ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TopNArray[obj->Id[idlen+1]-1]; break; } *local = (*local)->Next; } while (*local != NULL && (((DNPAP_TOPN_CONTROL*)(*local)->Data)->Status != SNMP_VALID || ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TimeRemaining > 0 || ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TableSize == 0 || ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TopNArray == NULL)) *local = (*local)->Next; if (*local == NULL) return FALSE; obj->Id[idlen] = (*local)->Index; obj->Id[idlen+1] = 1; obj->IdLen = idlen + TOPNINDEXSIZE; *elem = ((DNPAP_TOPN_CONTROL*)(*local)->Data)->TopNArray[0]; break; case CONTROLINDEXSIZE: if (obj->IdLen >= idlen + indexsize) { /* only go to next collector if requested index was higher or equal */ if (obj->Id[idlen] >= (*local)->Index) *local = (*local)->Next; if (*local == NULL) return FALSE; } obj->Id[idlen] = (*local)->Index; obj->IdLen = idlen + CONTROLINDEXSIZE; break; } return TRUE;}WORD DnpapHostTopNControlIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: obj->Syntax.LngInt = local->Index; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapHostTopNHostIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->HostIndex; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; data->HostIndex = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapHostTopNRateBase(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->RateBase; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt < DTOPN_RATEBASEMIN || obj->Syntax.LngInt > DTOPN_RATEBASEMAX) return SNMP_BADVALUE; data->RateBase = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapHostTopNTimeRemaining(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->TimeRemaining; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (obj->Syntax.LngInt < 1) return SNMP_BADVALUE; data->TimeRemaining = obj->Syntax.LngInt; data->Duration = data->TimeRemaining; if (data->Status == SNMP_VALID) { if (DnpapTopNCStop(data) == FALSE) { DnpapMessage(DMC_ERROR, DTOPN_STOP, "dtopN: collector %ld could not be stopped", local->Index); return SNMP_GENERROR; } if (DnpapTopNCStart(data) == FALSE) { DnpapMessage(DMC_ERROR, DTOPN_START, "dtopN: collector %ld could not be started", local->Index); return SNMP_BADVALUE; } } return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapHostTopNDuration(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->Duration; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapHostTopNRequestedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->RequestedSize; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (obj->Syntax.LngInt < 0) return SNMP_BADVALUE; if (DnpapFillEntryTable(data, obj->Syntax.LngInt) != TRUE) return SNMP_GENERROR; data->RequestedSize = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapHostTopNGrantedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = min(data->RequestedSize, data->TableSize); return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapHostTopNStartTime(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngUns = data->StartTime; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD DnpapHostTopNOwner(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; if ((local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, TOPN_BOOLEAN_OWNER)) return SNMP_NOSUCHNAME; memcpy (obj->Syntax.BufChr, data->Owner, data->OwnerLen); obj->SyntaxLen = data->OwnerLen; return SNMP_NOERROR; case SNMP_PDU_SET: data = (DNPAP_TOPN_CONTROL*) local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; memcpy (data->Owner, obj->Syntax.BufChr, obj->SyntaxLen); data->OwnerLen = obj->SyntaxLen; BooleanSetTrue(data->ObjectSet, TOPN_BOOLEAN_OWNER); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD DnpapHostTopNStatus(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL;DNPAP_TOPN_CONTROL *data; local = MibRmon(obj, TopNControlInstance, idlen, CONTROLINDEXSIZE); switch (obj->Request) { case SNMP_PDU_GET: if (local == NULL) { obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->Status; return SNMP_NOERROR; case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE, NULL) == FALSE) { obj->Syntax.LngInt = SNMP_INVALID; return SNMP_NOSUCHNAME; } data = (DNPAP_TOPN_CONTROL*) local->Data; obj->Syntax.LngInt = data->Status; return SNMP_NOERROR; case SNMP_PDU_SET: if (local == NULL) { switch (obj->Syntax.LngInt) { case SNMP_CREATEREQUEST: if ((local = MibInsert(obj, &TopNControlInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_GENERROR; if ((local->Data = DnpapMalloc(sizeof(DNPAP_TOPN_CONTROL))) == NULL) return SNMP_GENERROR; data = (DNPAP_TOPN_CONTROL*) local->Data; if (DnpapTopNCInit(data) == TRUE) { data->Status = SNMP_UNDERCREATION; DnpapMessage(DMC_MESSAGE, DTOPN_CREATE, "dtopN: collector %ld created", local->Index); return SNMP_NOERROR; } DnpapFree(local->Data); MibRemove (obj, &TopNControlInstance, idlen, CONTROLINDEXSIZE); return SNMP_GENERROR; default: return SNMP_NOSUCHNAME;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -