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

📄 discnodm.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 <dnpap.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <mac.h>#include "discd.h"#include "disce.h"#include "discnodc.h"#include "discnod.h"IMPORT BOOLEAN BeholderStrictRMON;static MIB_LOCAL *DiscNodeControlInstance = NULL;static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, INT type, WORD indexsize, DISCNODE ** elem);static DISCNODE *DiscNodeGetFirstNext(DISCNODE_CONTROL * discnodecontrol, INT type, WORD indexsize, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);static LONG TableSize(DISCNODE_CONTROL * discnodecontrol, INT type);static INT DiscTableType(SNMP_OBJECT * obj, WORD idlen);static WORD DiscTableLen(INT type, INT addrtype, WORD * offset, WORD * sublen);BOOLEAN DiscNodeMInit(VOID){	MessageConfig(DISCNODE_ERROR, "DiscNode");	return DiscNodeConfigInit();}BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, INT type, WORD indexsize, DISCNODE ** elem){	BOOLEAN first = FALSE;	if (*local == NULL || indexsize < 1)		return FALSE;	switch (indexsize)	{	case DISC_ETHNODEINDEXSIZE:	case DISC_IPNODEINDEXSIZE:	case DISC_UDPNODEINDEXSIZE:		/* case DISC_TCPNODEINDEXSIZE:  */		while (*local != NULL && (*elem = DiscNodeGetFirstNext((DISCNODE_CONTROL *) (*local)->Data, type, indexsize, obj, idlen, first)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case DISC_ETHTIMEINDEXSIZE:		/* case DISC_IPTIMEINDEXSIZE:  */		/* case DISC_UDPTIMEINDEXSIZE:  */		/* case DISC_TCPTIMEINDEXSIZE:  */		if (obj->IdLen >= idlen + indexsize)		{			if (obj->Id[idlen + 1] < TableSize((DISCNODE_CONTROL *) (*local)->Data, type))			{				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1]++;				obj->IdLen = idlen + DISC_ETHTIMEINDEXSIZE;				*elem = DiscNodeTimeSearch((DISCNODE_CONTROL *) (*local)->Data, type, obj, idlen);				break;			}			*local = (*local)->Next;		}		while (*local != NULL && TableSize(((DISCNODE_CONTROL *) (*local)->Data), type) == 0)			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = 1;		obj->IdLen = idlen + DISC_ETHTIMEINDEXSIZE;		*elem = DiscNodeTimeSearch((DISCNODE_CONTROL *) (*local)->Data, type, 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;}DISCNODE *DiscNodeGetFirstNext(DISCNODE_CONTROL * discnodecontrol, INT type, WORD indexsize, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){	DISCNODE disc, *p, *lexlist = NULL;	INT len, addrlen = 0;	if (discnodecontrol->TableSize == 0)		return NULL;	switch (type)	{	case DISC_TYPE_ETH:		lexlist = discnodecontrol->EthLexList;		addrlen = DISC_SIZE_ETHADDR;		break;	case DISC_TYPE_IP:		lexlist = discnodecontrol->IPLexList;		addrlen = DISC_SIZE_TOIPADDR;		break;	case DISC_TYPE_UDP:		lexlist = discnodecontrol->UDPLexList;		addrlen = DISC_SIZE_TOUDPADDR;		break;	case DISC_TYPE_TCP:		lexlist = discnodecontrol->TCPLexList;		addrlen = DISC_SIZE_TOTCPADDR;		break;	default:		DnpapMessage(DMC_FATAL, DISC_TYPE, "discnodecontrol: unknown type");		DnpapExit(DISC_TYPE);	}	if (first == TRUE)	{		p = lexlist;		obj->IdLen = Node2Id(type, p->Address, addrlen, obj->Id, idlen + 1);		return p;	}	len = Id2Node(type, obj->Id, idlen + 1, obj->IdLen, disc.Address);	p = DiscNodeSearchNext(discnodecontrol, type, &disc, len);	if (p != NULL)		obj->IdLen = Node2Id(type, p->Address, addrlen, obj->Id, idlen + 1);	return p;}WORD DiscNodeControlIndex(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		Obj->Syntax.LngInt = local->Index;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlDataSource(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_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, 2, 1, 16, 7, 2, 1, 1, 1};	WORD ChannelOidLen = sizeof(ChannelOid) / sizeof(LONG);	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, DISC_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 = (DISCNODE_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, DISC_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, DISC_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		return SNMP_BADVALUE;	}	return SNMP_GENERROR;}WORD DiscNodeControlEthTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->EthTableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlIPTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->IPTableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlUDPTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->UDPTableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlTCPTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->TCPTableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlTableSize(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->TableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlLastDeleteTime(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngUns = data->LastDeleteTime;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlOwner(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	if ((local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)		return SNMP_NOSUCHNAME;	switch (Obj->Request)	{	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)			return SNMP_NOSUCHNAME;	case SNMP_PDU_GET:		data = (DISCNODE_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, DISC_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 = (DISCNODE_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, DISC_BOOLEAN_OWNER);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DiscNodeControlStatus(SNMP_OBJECT * Obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DISCNODE_CONTROL *data;	local = MibRmon(Obj, DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE);	switch (Obj->Request)	{	case SNMP_PDU_GET:		if (local == NULL)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DISCNODE_CONTROL *) local->Data;		Obj->Syntax.LngInt = data->Status;		return SNMP_NOERROR;	case SNMP_PDU_NEXT:		if (RmonNext(Obj, &local, IdLen, 0, CONTROLINDEXSIZE, NULL) == FALSE)		{			Obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DISCNODE_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, &DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE)) == NULL)					return SNMP_GENERROR;				if ((local->Data = DnpapMalloc(sizeof(DISCNODE_CONTROL))) == NULL)					return SNMP_GENERROR;				data = (DISCNODE_CONTROL *) local->Data;				if (DiscNodeCInit(data) == TRUE)				{					data->Status = SNMP_UNDERCREATION;					DnpapMessage(DMC_MESSAGE, DISC_CREATE, "discnode: collector %ld created", local->Index);					return SNMP_NOERROR;				}				DnpapFree(local->Data);				MibRemove(Obj, &DiscNodeControlInstance, IdLen, CONTROLINDEXSIZE);				return SNMP_GENERROR;			default:

⌨️ 快捷键说明

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