📄 reachm.c
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details */#include <dnpap.h>#include <dmath.h>#include <dmemory.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <mibsup.h>#include <message.h>#include "reache.h"#include "reachc.h"#include "reach.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE 1#define FLOAT_SCALE 1000#define DOUBLE_SCALE 1000000000Lstatic MIB_LOCAL *ReachInstance = NULL;static BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize);BOOLEAN ReachMInit(VOID){ MessageConfig(REACH_ERROR, "Reachability"); return ReachConfigInit();}BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize){ if (*local == NULL || indexsize < 1) return FALSE; if (obj->IdLen == idlen || (*local)->Index > obj->Id[idlen] || (*local = (*local)->Next) != NULL) { obj->Id[idlen] = (*local)->Index; obj->IdLen = idlen + indexsize; return TRUE; } return FALSE;}WORD ReachIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL *local = NULL; if ((local = MibRmon (obj, ReachInstance, idlen, CONTROLINDEXSIZE)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext (obj, &local, idlen, CONTROLINDEXSIZE) == 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 ReachIPAddress(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, REACH_BOOLEAN_ADDRESS)) return SNMP_NOSUCHNAME; obj->Syntax.LngUns = mem2ulong(data->IPAddress); return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; ulong2mem(data->IPAddress, obj->Syntax.LngUns); BooleanSetTrue(data->ObjectSet, REACH_BOOLEAN_ADDRESS); return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachDelay(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = data->Delay; return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt <= 0 || obj->Syntax.LngInt > 2000000L) return SNMP_BADVALUE; data->Delay = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachTimeout(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = data->Timeout; return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt <= 10 || obj->Syntax.LngInt > 2000000L) return SNMP_BADVALUE; data->Timeout = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachValueSteps(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = data->ValueSteps; return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; if (obj->Syntax.LngInt < 1 || obj->Syntax.LngInt > 100) return SNMP_BADVALUE; data->ValueSteps = obj->Syntax.LngInt; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachICMPWeight(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = (LONG)(data->ICMPWeight*DOUBLE_SCALE); return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; data->ICMPWeight = ((DOUBLE)obj->Syntax.LngInt)/DOUBLE_SCALE; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachUDPWeight(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = (LONG)(data->UDPWeight*DOUBLE_SCALE); return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (data->Status != SNMP_UNDERCREATION) return SNMP_READONLY; data->UDPWeight = ((DOUBLE)obj->Syntax.LngInt)/DOUBLE_SCALE; return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachRemaining(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngInt = data->Remaining; return SNMP_NOERROR; case SNMP_PDU_SET: data = (Reach*)local->Data; if (obj->Syntax.LngInt < 1) return SNMP_BADVALUE; data->Remaining = obj->Syntax.LngInt; if (data->Status == SNMP_VALID) { if (ReachCStop(data) == FALSE) { DnpapMessage(DMC_ERROR, REACH_STOP, "reach: collector %ld could not be stopped", local->Index); return SNMP_GENERROR; } if (ReachCStart(data) == FALSE) { DnpapMessage(DMC_ERROR, REACH_START, "reach: collector %ld could not be started", local->Index); return SNMP_BADVALUE; } } return SNMP_NOERROR; } return SNMP_GENERROR;}WORD ReachICMPReceived(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngUns = data->ICMPReceived; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD ReachUDPReceived(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngUns = data->UDPReceived; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD ReachICMPDropped(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE) return SNMP_NOSUCHNAME; case SNMP_PDU_GET: data = (Reach*)local->Data; obj->Syntax.LngUns = data->ICMPDropped; return SNMP_NOERROR; case SNMP_PDU_SET: return SNMP_READONLY; } return SNMP_GENERROR;}WORD ReachUDPDropped(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;Reach* data = NULL; if ((local = MibRmon(obj, ReachInstance, idlen, 1)) == NULL) return SNMP_NOSUCHNAME; switch (obj->Request) { case SNMP_PDU_NEXT: if (RmonNext(obj, &local, idlen, 1) == FALSE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -