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

📄 dstatm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <math.h>#include <memory.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <snmp.h>#include <mibsup.h>#include <message.h>#include <mac.h>#include "dstate.h"#include "dstatc.h"#include "dstat.h"IMPORT BOOLEAN BeholderStrictRMON;#define INDEXSIZE      		1#define IFTINDEXSIZE     	2#define LENGTHINDEXSIZE     3	/* not the real size, only needed for switch */#define TYPEINDEXSIZE     	4	/* not the real size, only needed for switch */static MIB_LOCAL *etherStats = NULL;static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, TypeEntry **entry);BOOLEAN DnpapEtherStatsMInit(VOID){	MessageConfig(DNPAP_STATISTICS_ERROR, "DnpapEtherStat");	return TRUE;}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, TypeEntry **entry){	DNPAP_ETHER_STATS *data;	if (*local == NULL || indexsize < 1)		return FALSE;	switch (indexsize)	{	case TYPEINDEXSIZE:		if (obj->IdLen >= idlen + 2)		{			data = (DNPAP_ETHER_STATS *) (*local)->Data;			if (data->Status == SNMP_VALID && 				data->TypeBuckets > 0 && obj->Id[idlen + 1] < data->TypeLast->Type)			{				if ((*entry = DnpapNextTypeEntry(data, obj->Id[idlen + 1])) == NULL)					return FALSE;				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1] = (*entry)->Type;				obj->IdLen = idlen + 2;				break;			}			*local = (*local)->Next;		}		while (*local != NULL &&			   (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID ||				((DNPAP_ETHER_STATS *) (*local)->Data)->TypeBuckets == 0))			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = ((DNPAP_ETHER_STATS *)(*local)->Data)->TypeList->Type;		obj->IdLen = idlen + 2;		break;	case LENGTHINDEXSIZE:		if (obj->IdLen >= idlen + 2)		{			data = (DNPAP_ETHER_STATS *) (*local)->Data;			if (data->Status == SNMP_VALID && obj->Id[idlen + 1] < data->LengthBuckets)			{				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1]++;				obj->IdLen = idlen + 2;				break;			}			*local = (*local)->Next;		}		while (*local != NULL &&			   (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID ||				((DNPAP_ETHER_STATS *) (*local)->Data)->LengthBuckets == 0))			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = 1;		obj->IdLen = idlen + 2;		break;	case IFTINDEXSIZE:		if (obj->IdLen >= idlen + indexsize)		{			data = (DNPAP_ETHER_STATS *) (*local)->Data;			if (data->Status == SNMP_VALID && obj->Id[idlen + 1] < data->IFTBuckets)			{				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1]++;				obj->IdLen = idlen + IFTINDEXSIZE;				break;			}			*local = (*local)->Next;		}		while (*local != NULL &&			   (((DNPAP_ETHER_STATS *) (*local)->Data)->Status != SNMP_VALID ||				((DNPAP_ETHER_STATS *) (*local)->Data)->IFTBuckets == 0))			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = 1;		obj->IdLen = idlen + IFTINDEXSIZE;		break;	case INDEXSIZE:		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 + INDEXSIZE;		break;	}	return TRUE;}WORD DnpapEtherStatsIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		Obj->Syntax.LngInt = local->Index;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsDataSource(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_IFACE *iface;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, STAT_BOOLEAN_DATASOURCE))			return SNMP_NOSUCHNAME;		memcpy(Obj->Syntax.BufInt, data->Source, data->SourceLen * sizeof(LONG));		Obj->SyntaxLen = data->SourceLen;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (data->SourceLen != Obj->SyntaxLen ||			memcmp(data->Source, Obj->Syntax.BufInt, (data->SourceLen - 1) * sizeof(data->Source[0])))			return SNMP_BADVALUE;		if ((iface = MacIfaceGet((WORD) Obj->Syntax.BufInt[Obj->SyntaxLen - 1])) == NULL)			return SNMP_BADVALUE;		if (iface->type != MAC_TYPE_ETHERNET_CSMACD && iface->type != MAC_TYPE_88023_CSMACD)			return SNMP_BADVALUE;		memcpy(data->Source, Obj->Syntax.BufInt, Obj->SyntaxLen * sizeof(data->Source[0]));		data->SourceLen = Obj->SyntaxLen;		data->Iface = iface;		BooleanSetTrue(data->ObjectSet, STAT_BOOLEAN_DATASOURCE);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsDropEvents(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.LostPkts + stat.DiscardedPkts - (data->BaseStat.LostPkts + data->BaseStat.DiscardedPkts);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsOctets(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		Obj->Syntax.LngUns = data->Octets;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsPkts(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		Obj->Syntax.LngUns = data->Pkts;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsBroadcastPkts(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.BroadcastPkts - data->BaseStat.BroadcastPkts;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsMulticastPkts(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.MulticastPkts - data->BaseStat.MulticastPkts;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsCRCAlignErrors(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.CRCAlignErrors - data->BaseStat.CRCAlignErrors;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsUndersizePkts(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.UndersizePkts - data->BaseStat.UndersizePkts;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsOversizePkts(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.OversizePkts - data->BaseStat.OversizePkts;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsFragments(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)		{			Obj->Syntax.LngUns = 0UL;			return SNMP_NOERROR;		}		MacStatistics(data->Iface, &stat);		Obj->Syntax.LngUns = stat.Fragments - data->BaseStat.Fragments;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapEtherStatsJabbers(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_ETHER_STATS *data;	MAC_STAT stat;	if ((local = MibRmon(Obj, etherStats, IdLen, INDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, INDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_ETHER_STATS *) local->Data;		if (data->Status != SNMP_VALID)

⌨️ 快捷键说明

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