reachm.c

来自「嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络」· C语言 代码 · 共 760 行 · 第 1/2 页

C
760
字号
/* 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 + =
减小字号Ctrl + -
显示快捷键?