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

📄 dmatrixm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 4 页
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <dnpap.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <memory.h>#include <mibsup.h>#include <mac.h>#include "dmatrixd.h"#include "dmatrixe.h"#include "dmatrixc.h"#include "dmatrix.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE   1#define SRCDSTINDEXSIZE	  13			/* not the real size, only used as switch value */#define RANKINDEXSIZE	   8static MIB_LOCAL *MatrixControlInstance = NULL;static MIB_LOCAL *DnpapMatrixMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static MIB_LOCAL *DnpapMatrixRankMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen);static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, ConnInfo ** elem, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);static ConnInfo *SrcDstGetFirstNext(DNPAP_MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);static ConnInfo *GetTopFirstNext(DNPAP_MATRIX_CONTROL * matrixcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank);BOOLEAN DnpapMatrixMInit(VOID){	MessageConfig(DNPAP_MATRIX_ERROR, "DnpapMatrix");	return DnpapMatrixConfigInit();}MIB_LOCAL *DnpapMatrixMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen){	WORD addrlen;	if (local == NULL)		return NULL;	if (obj->Request != SNMP_PDU_NEXT)	{		if (obj->IdLen == idlen)			return NULL;		/* first search the right table */		while (local != NULL && local->Index < obj->Id[idlen])			local = local->Next;		if (local == NULL)			return NULL;		addrlen = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen;		if (local->Index != obj->Id[idlen] || addrlen == 0)			return NULL;		if (obj->IdLen != idlen + 1 + 2 + 2 * addrlen ||			obj->Id[idlen + 1] != addrlen || obj->Id[idlen + 1 + addrlen + 1] != addrlen)			return NULL;		return local;	}	if (obj->IdLen == idlen)			/* first instance */		return local;	while (local != NULL && local->Index < obj->Id[idlen])		local = local->Next;	if (local == NULL || local->Index < obj->Id[idlen])		return NULL;	return local;}MIB_LOCAL *DnpapMatrixRankMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen){	WORD addrlen;	if (local == NULL)		return NULL;	if (obj->Request != SNMP_PDU_NEXT)	{		/* first search the right table */		while (local != NULL && local->Index < obj->Id[idlen])			local = local->Next;		if (local == NULL)			return NULL;		addrlen = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen;		if (local->Index != obj->Id[idlen] || addrlen == 0)			return NULL;		if (obj->IdLen != idlen + 1 + 1 + addrlen + 1 ||			obj->Id[idlen + 1] != addrlen)			return NULL;		return local;	}	if (obj->IdLen == idlen)			/* first instance */		return local;	while (local != NULL && local->Index < obj->Id[idlen])		local = local->Next;	if (local == NULL || local->Index < obj->Id[idlen])		return NULL;	return local;}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, ConnInfo ** elem, BOOLEAN SDorder, Host ** source, Host ** dest, INT * rank){	BOOLEAN first = FALSE;	if (*local == NULL || indexsize < 1)		return FALSE;	switch (indexsize)	{	case SRCDSTINDEXSIZE:		while (*local != NULL && (*elem = SrcDstGetFirstNext((DNPAP_MATRIX_CONTROL *) (*local)->Data, obj, idlen, first, SDorder, source, dest, rank)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case RANKINDEXSIZE:		while (*local != NULL && (*elem = GetTopFirstNext((DNPAP_MATRIX_CONTROL *) (*local)->Data, obj, idlen, first, SDorder, source, dest, rank)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		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 DnpapMatrixControlIndex(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	Host *source = NULL;	Host *dest = NULL;	if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, 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 DnpapMatrixControlDataSource(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	DNPAP_MATRIX_CONTROL *data;	MAC_IFACE *iface;	LONG IfaceOid[] =	{1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 1};	WORD IfaceOidLen = sizeof(IfaceOid) / sizeof(LONG);	LONG ChannelOid[] =	{1, 3, 6, 1, 4, 1, 464, 2, 7, 2, 1, 1, 1};	WORD ChannelOidLen = sizeof(ChannelOid) / sizeof(LONG);	Host *source = NULL;	Host *dest = NULL;	if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_MATRIX_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, MATRIX_BOOLEAN_DATASOURCE))			return SNMP_NOSUCHNAME;		memcpy(obj->Syntax.BufInt, data->Source, data->SourceLen * sizeof(data->Source[0]));		obj->SyntaxLen = data->SourceLen;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_MATRIX_CONTROL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (IfaceOidLen == obj->SyntaxLen &&			memcmp(IfaceOid, obj->Syntax.BufInt, (IfaceOidLen - 1) * sizeof(IfaceOid[0])) == 0)		{			data->Channel = FALSE;			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, MATRIX_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		else if (ChannelOidLen == obj->SyntaxLen &&				 memcmp(ChannelOid, obj->Syntax.BufInt, (ChannelOidLen - 1) * sizeof(ChannelOid[0])) == 0)		{			data->Channel = TRUE;			memcpy(data->Source, obj->Syntax.BufInt, obj->SyntaxLen * sizeof(data->Source[0]));			data->SourceLen = obj->SyntaxLen;			BooleanSetTrue(data->ObjectSet, MATRIX_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		return SNMP_BADVALUE;	}	return SNMP_GENERROR;}WORD DnpapMatrixControlTableSize(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	DNPAP_MATRIX_CONTROL *data;	Host *source = NULL;	Host *dest = NULL;	if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_MATRIX_CONTROL *) local->Data;		obj->Syntax.LngInt = data->TableSize;		return SNMP_NOERROR;	case SNMP_PDU_SET:		return SNMP_READONLY;	}	return SNMP_GENERROR;}WORD DnpapMatrixControlLastDelTime(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	DNPAP_MATRIX_CONTROL *data;	Host *source = NULL;	Host *dest = NULL;	if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_MATRIX_CONTROL *) local->Data;		obj->Syntax.LngUns = data->LastDeleteTime;		return SNMP_NOERROR;	case SNMP_PDU_SET:		return SNMP_READONLY;	}	return SNMP_GENERROR;}WORD DnpapMatrixControlOwner(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	DNPAP_MATRIX_CONTROL *data;	Host *source = NULL;	Host *dest = NULL;	if ((local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DNPAP_MATRIX_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, MATRIX_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_MATRIX_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, MATRIX_BOOLEAN_OWNER);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapMatrixControlStatus(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	DNPAP_MATRIX_CONTROL *data;	Host *source = NULL;	Host *dest = NULL;	local = MibRmon(obj, MatrixControlInstance, idlen, CONTROLINDEXSIZE);	switch (obj->Request)	{	case SNMP_PDU_GET:		if (local == NULL)		{			obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DNPAP_MATRIX_CONTROL *) local->Data;		obj->Syntax.LngInt = data->Status;		return SNMP_NOERROR;	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, CONTROLINDEXSIZE, NULL, FALSE, &source, &dest, NULL) == FALSE)		{			obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DNPAP_MATRIX_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, &MatrixControlInstance, idlen, CONTROLINDEXSIZE)) == NULL)					return SNMP_GENERROR;				if ((local->Data = DnpapMalloc(sizeof(DNPAP_MATRIX_CONTROL))) == NULL)					return SNMP_GENERROR;				data = (DNPAP_MATRIX_CONTROL *) local->Data;				memset(data, 0, sizeof(DNPAP_MATRIX_CONTROL));				if (DnpapMatrixCInit(data) == TRUE)				{					data->Status = SNMP_UNDERCREATION;					DnpapMessage(DMC_MESSAGE, DMATRIX_CREATE, "dmatrix: collector %ld created", local->Index);					return SNMP_NOERROR;				}				DnpapFree(local->Data);				MibRemove(obj, &MatrixControlInstance, idlen, CONTROLINDEXSIZE);				return SNMP_GENERROR;			default:				return SNMP_NOSUCHNAME;			}		}		data = (DNPAP_MATRIX_CONTROL *) local->Data;		switch (data->Status)		{		case SNMP_UNDERCREATION:			switch (obj->Syntax.LngInt)			{			case SNMP_VALID:				if (DnpapMatrixCStart(data) == TRUE)				{					data->Status = SNMP_VALID;					DnpapMessage(DMC_MESSAGE, DMATRIX_START, "dmatrix: collector %ld active", local->Index);					return SNMP_NOERROR;				}				return SNMP_BADVALUE;			case SNMP_INVALID:				if (DnpapMatrixCStop(data) == TRUE)				{					DnpapFree(local->Data);					DnpapMessage(DMC_MESSAGE, DMATRIX_DESTROY, "dmatrix: collector %ld destroyed", local->Index);					if (MibRemove(obj, &MatrixControlInstance, idlen, CONTROLINDEXSIZE) == TRUE)						return SNMP_NOERROR;				}				return SNMP_GENERROR;			default:				return SNMP_BADVALUE;			}		case SNMP_VALID:			switch (obj->Syntax.LngInt)			{			case SNMP_VALID:				return SNMP_NOERROR;			case SNMP_INVALID:				if (DnpapMatrixCStop(data) == TRUE)				{					DnpapFree(local->Data);					DnpapMessage(DMC_MESSAGE, DMATRIX_DESTROY, "dmatrix: collector %ld destroyed", local->Index);					if (MibRemove(obj, &MatrixControlInstance, idlen, CONTROLINDEXSIZE) == TRUE)						return SNMP_NOERROR;				}				return SNMP_GENERROR;			default:				return SNMP_BADVALUE;			}		}	}	return SNMP_GENERROR;}WORD DnpapMatrixSDSourceAddress(SNMP_OBJECT * obj, WORD idlen){	MIB_LOCAL *local = NULL;	ConnInfo *data = NULL;	INT rank = 0;	Host *source = NULL;	Host *dest = NULL;	if ((local = DnpapMatrixMibRmon(obj, MatrixControlInstance, idlen)) == NULL)		return SNMP_NOSUCHNAME;	switch (obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(obj, &local, idlen, SRCDSTINDEXSIZE, &data, TRUE, &source, &dest, &rank) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		if (data == NULL && (data = DnpapMatrixSearchHostObj(local->Data, obj, idlen, TRUE, &source, &rank)) == NULL)			return SNMP_NOSUCHNAME;		memcpy(obj->Syntax.BufChr, source->Addr, obj->SyntaxLen = ((DNPAP_MATRIX_CONTROL *) local->Data)->AddressLen);		return SNMP_NOERROR;	case SNMP_PDU_SET:		return SNMP_READONLY;	}

⌨️ 快捷键说明

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