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

📄 statbufm.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 <dnpap.h>#include <maxmem.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <dmath.h>#include "statbufd.h"#include "statbufe.h"#include "statbufc.h"#include "statbuf.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE    1#define ENTRYINDEXSIZE      2extern SHORT StatBufMaxNrEntries;static MIB_LOCAL    *StatBufControlInstance = NULL;static BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, StatBuf **elem);BOOLEAN StatBufMInit(VOID){    MessageConfig(STATBUF_ERROR, "StatBuffer");    return StatBufConfigInit();}BOOLEAN RmonNext(SNMP_OBJECT *obj, MIB_LOCAL **local, WORD idlen, WORD indexsize, StatBuf **elem){StatBufControl *data;    if (*local == NULL || indexsize < 1)        return FALSE;    switch (indexsize)    {                case ENTRYINDEXSIZE:        		if (obj->IdLen >= idlen + indexsize)		{        data = (StatBufControl*)(*local)->Data;        if ((data->BufferWrapped == TRUE && obj->Id[idlen+1] < data->GrantedSize) ||            (data->BufferWrapped == FALSE && obj->Id[idlen+1] < data->BufferPos))        {                   /*  BufferWrapped == FALSE and BufferPos == 0 if Status != VALID  */            obj->Id[idlen] = (*local)->Index;            obj->Id[idlen+1]++;            obj->IdLen = idlen + ENTRYINDEXSIZE;        	*elem = StatBufSearch((StatBufControl*)(*local)->Data, obj, idlen);            break;        }        *local = (*local)->Next;		}        while (*local != NULL &&                 (((StatBufControl*)(*local)->Data)->GrantedSize == 0 ||                 (((StatBufControl*)(*local)->Data)->BufferWrapped == FALSE &&                  ((StatBufControl*)(*local)->Data)->BufferPos == 0)))            *local = (*local)->Next;        if (*local == NULL)            return FALSE;        obj->Id[idlen] = (*local)->Index;        obj->Id[idlen+1] = 1;        obj->IdLen = idlen + ENTRYINDEXSIZE;        *elem = StatBufSearch((StatBufControl*)(*local)->Data, obj, idlen);        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 StatBufControlIndex(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL    *local = NULL;    if ((local = MibRmon (obj, StatBufControlInstance, 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 StatBufControlVariable(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL;			    if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL)		return SNMP_NOSUCHNAME;			switch (obj->Request)	{	case SNMP_PDU_NEXT:        if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:        data = (StatBufControl*)local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, STATBUF_BOOLEAN_VARIABLE))			return SNMP_NOSUCHNAME;        memcpy(obj->Syntax.BufInt, data->Variable, (obj->SyntaxLen = data->VariableLen)*sizeof(data->Variable[0]));		return SNMP_NOERROR;	case SNMP_PDU_SET:        data = (StatBufControl*)local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;        memcpy(data->Variable, obj->Syntax.BufInt, (data->VariableLen = obj->SyntaxLen)*sizeof(data->Variable[0]));		BooleanSetTrue(data->ObjectSet, STATBUF_BOOLEAN_VARIABLE);		return SNMP_NOERROR;	}    return SNMP_GENERROR;}WORD StatBufControlRequestedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL        *local = NULL;StatBufControl  *data;StatBuf         *buffer;LONG             i, ni, j;    if ((local = MibRmon(obj, StatBufControlInstance, 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 = (StatBufControl*) local->Data;        obj->Syntax.LngInt = data->RequestedSize;        return SNMP_NOERROR;    case SNMP_PDU_SET:        data = (StatBufControl*) local->Data;        if (obj->Syntax.LngInt < 1)            return SNMP_BADVALUE;        data->GrantedSize = LongMin(MemoryGetAvail(), MemoryGetMaxChunk())/sizeof(StatBuf);        if (data->GrantedSize > LongMin(obj->Syntax.LngInt, StatBufMaxNrEntries))            data->GrantedSize = LongMin(obj->Syntax.LngInt, StatBufMaxNrEntries);        if (data->GrantedSize == data->BufferAllocated)        {            data->RequestedSize = obj->Syntax.LngInt;            return SNMP_NOERROR;        }        if ((buffer = NewStatBuf(data->GrantedSize)) == NULL)        {               DelStatBuf(data->Buffer);            data->Buffer = NULL;            data->BufferPos = 0;            data->GrantedSize = 0;            data->BufferAllocated = 0;            data->BufferWrapped = FALSE;        }        else        {            if (data->BufferWrapped == TRUE)                ni = LongMin(data->GrantedSize, data->BufferAllocated);            else                ni = LongMin(data->GrantedSize, data->BufferPos);            for (i = 0; i < ni; i++)                                   {                            j = data->BufferPos - ni + i;                if (j < 0)                    j = j + data->BufferAllocated;                memcpy(buffer+i, data->Buffer+j, sizeof(StatBuf));            }            DelStatBuf(data->Buffer);            data->Buffer = buffer;            data->BufferPos = ni;            data->BufferAllocated = data->GrantedSize;            data->BufferWrapped = FALSE;        }        data->RequestedSize = obj->Syntax.LngInt;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD StatBufControlGrantedSize(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL        *local = NULL;StatBufControl  *data;    if ((local = MibRmon(obj, StatBufControlInstance, 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 = (StatBufControl*)local->Data;        obj->Syntax.LngInt = data->GrantedSize;        return SNMP_NOERROR;    case SNMP_PDU_SET:        return SNMP_READONLY;    }    return SNMP_GENERROR;}WORD StatBufControlInterval(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL;			    if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL)		return SNMP_NOSUCHNAME;			switch (obj->Request)	{	case SNMP_PDU_NEXT:        if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:        data = (StatBufControl*)local->Data;        obj->Syntax.LngInt = data->Interval;		return SNMP_NOERROR;	case SNMP_PDU_SET:        data = (StatBufControl*)local->Data;        if (data->Status != SNMP_UNDERCREATION)            return SNMP_READONLY;        if (obj->Syntax.LngInt <= 0 || obj->Syntax.LngInt > 2000000L)            return SNMP_BADVALUE;        data->Interval = obj->Syntax.LngInt;        return SNMP_NOERROR;	}    return SNMP_GENERROR;}WORD StatBufControlSampleType(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL* local = NULL;StatBufControl* data = NULL;			    if ((local = MibRmon(obj, StatBufControlInstance, idlen, 1)) == NULL)		return SNMP_NOSUCHNAME;			switch (obj->Request)	{	case SNMP_PDU_NEXT:        if (RmonNext(obj, &local, idlen, 1, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:        data = (StatBufControl*)local->Data;        obj->Syntax.LngInt = data->SampleType;		return SNMP_NOERROR;	case SNMP_PDU_SET:        data = (StatBufControl*)local->Data;        if (data->Status != SNMP_UNDERCREATION)            return SNMP_READONLY;        if (obj->Syntax.LngInt != STATBUF_ABSOLUTE && obj->Syntax.LngInt != STATBUF_DELTA)            return SNMP_BADVALUE;        data->SampleType = obj->Syntax.LngInt;        return SNMP_NOERROR;	}    return SNMP_GENERROR;}WORD StatBufControlFullStatus(SNMP_OBJECT *obj, WORD idlen){MIB_LOCAL        *local = NULL;StatBufControl  *data;    if ((local = MibRmon(obj, StatBufControlInstance, 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 = (StatBufControl*)local->Data;        obj->Syntax.LngInt = data->FullStatus;        return SNMP_NOERROR;    case SNMP_PDU_SET:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -