⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtopn_m.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -