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

📄 dhostm.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 <dmath.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <message.h>#include <mibsup.h>#include <mac.h>#include "dhoste.h"#include "dhostc.h"#include "dhost.h"IMPORT BOOLEAN BeholderStrictRMON;#define CONTROLINDEXSIZE   		1#define HOSTINDEXSIZE			7		/* not the real size, only used as switch value */#define TIMEINDEXSIZE      		2#define HOSTBUCKETINDEXSIZE     8		/* not the real size, only used as switch value */#define TIMEBUCKETINDEXSIZE     3static MIB_LOCAL *HostControlInstance = NULL;static MIB_LOCAL *DnpapHostMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen, WORD extra);static BOOLEAN RmonNext(SNMP_OBJECT * obj, MIB_LOCAL ** local, WORD idlen, WORD indexsize, DNPAP_HOST ** elem);static DNPAP_HOST *HostGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);static DNPAP_HOST *HostBucketGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);static DNPAP_HOST *HostTimeBucketGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first);BOOLEAN DnpapHostMInit(VOID){	MessageConfig(DNPAP_HOST_ERROR, "DnpapHost");	return DnpapHostConfigInit();}MIB_LOCAL *DnpapHostMibRmon(SNMP_OBJECT * obj, MIB_LOCAL * local, WORD idlen, WORD extra){	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_HOST_CONTROL *) local->Data)->AddressLen;		if (local->Index != obj->Id[idlen] || addrlen == 0)			return NULL;		if (obj->IdLen != idlen + 1 + 1 + addrlen + extra ||			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, DNPAP_HOST ** elem){	BOOLEAN first = FALSE;	if (*local == NULL || indexsize < 1)		return FALSE;	switch (indexsize)	{	case HOSTBUCKETINDEXSIZE:		while (*local != NULL && (*elem = HostBucketGetFirstNext((DNPAP_HOST_CONTROL *) (*local)->Data, obj, idlen, first)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case HOSTINDEXSIZE:		while (*local != NULL && (*elem = HostGetFirstNext((DNPAP_HOST_CONTROL *) (*local)->Data, obj, idlen, first)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case TIMEBUCKETINDEXSIZE:		while (*local != NULL && (*elem = HostTimeBucketGetFirstNext((DNPAP_HOST_CONTROL *) (*local)->Data, obj, idlen, first)) == NULL)		{			first = TRUE;			*local = (*local)->Next;		}		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		break;	case TIMEINDEXSIZE:		if (obj->IdLen >= idlen + indexsize)		{			if (obj->Id[idlen + 1] < ((DNPAP_HOST_CONTROL *) (*local)->Data)->TableSize)			{				obj->Id[idlen] = (*local)->Index;				obj->Id[idlen + 1]++;				obj->IdLen = idlen + TIMEINDEXSIZE;				*elem = DnpapHostTimeSearch((DNPAP_HOST_CONTROL *) (*local)->Data, obj, idlen);				break;			}			*local = (*local)->Next;		}		while (*local != NULL && ((DNPAP_HOST_CONTROL *) (*local)->Data)->TableSize == 0)			*local = (*local)->Next;		if (*local == NULL)			return FALSE;		obj->Id[idlen] = (*local)->Index;		obj->Id[idlen + 1] = 1;		obj->IdLen = idlen + TIMEINDEXSIZE;		*elem = DnpapHostTimeSearch((DNPAP_HOST_CONTROL *) (*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;}DNPAP_HOST *HostGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){	DNPAP_HOST host, *p;	INT i, len;	WORD addrlen = hostcontrol->AddressLen;	if (hostcontrol->TableSize == 0)		return NULL;	if (first == FALSE)	{		if (obj->IdLen > idlen + 1)		{			if (obj->Id[idlen + 1] > addrlen)				return NULL;			if (obj->Id[idlen + 1] < addrlen)				first = TRUE;		}		else			first = TRUE;	}	if (first == TRUE)	{		p = hostcontrol->LexList;		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 1] = addrlen;		obj->IdLen = idlen + 1 + 1 + addrlen;		return p;	}	len = obj->IdLen - idlen - 2;	if (len < 0)		len = 0;	else if (len > addrlen)		len = addrlen;	for (i = 0; i < len; i++)		host.Address[i] = (BYTE) obj->Id[idlen + 2 + i];	p = DnpapHostSearchNext(hostcontrol, &host, len);	if (p != NULL)	{		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 1] = addrlen;		obj->IdLen = idlen + 1 + 1 + addrlen;	}	return p;}DNPAP_HOST *HostBucketGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){	DNPAP_HOST host, *p;	INT i, len;	LONG bucket;	WORD addrlen = hostcontrol->AddressLen;	if (hostcontrol->TableSize == 0 || hostcontrol->NrBuckets == 0)		return NULL;	if (first == FALSE)	{		if (obj->IdLen > idlen + 1)		{			if (obj->Id[idlen + 1] > addrlen)				return NULL;			if (obj->Id[idlen + 1] < addrlen)				first = TRUE;		}		else			first = TRUE;	}	if (first == TRUE)	{		p = hostcontrol->LexList;		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 2 + addrlen] = 1;		obj->Id[idlen + 1] = addrlen;		obj->IdLen = idlen + 1 + 1 + addrlen + 1;		return p;	}	len = obj->IdLen - idlen - 2;	if (len < 0)		len = 0;	else if (len > addrlen + 1)		len = addrlen + 1;	for (i = 0; i < IntMin(len, addrlen); i++)		host.Address[i] = (BYTE) obj->Id[idlen + 2 + i];	bucket = obj->Id[idlen + 2 + addrlen];	p = DnpapHostBucketSearchNext(hostcontrol, &host, len, &bucket);	if (p != NULL)	{		for (i = 0; i < addrlen; i++)			obj->Id[idlen + 2 + i] = (LONG) p->Address[i];		obj->Id[idlen + 1] = addrlen;		obj->Id[idlen + 2 + addrlen] = bucket;		obj->IdLen = idlen + 1 + 1 + addrlen + 1;	}	return p;}DNPAP_HOST *HostTimeBucketGetFirstNext(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen, BOOLEAN first){	INT len;	if (hostcontrol->TableSize == 0 || hostcontrol->NrBuckets == 0)		return NULL;	if (first == TRUE)	{		obj->Id[idlen + 1] = 1;		obj->Id[idlen + 1 + 1] = 1;		obj->IdLen = idlen + TIMEBUCKETINDEXSIZE;		return DnpapHostTimeSearch(hostcontrol, obj, idlen);	}	len = obj->IdLen - idlen - 1;	if (len < 0)		len = 0;	else if (len > 2)		len = 2;	switch (len)	{	case 0:		obj->Id[idlen + 1] = 1;	case 1:		obj->Id[idlen + 1 + 1] = 1;		break;	case 2:		if (obj->Id[idlen + 1 + 1] < hostcontrol->NrBuckets)			obj->Id[idlen + 1 + 1]++;		else		{			if (obj->Id[idlen + 1] < hostcontrol->TableSize)				obj->Id[idlen + 1]++;			else				return NULL;			obj->Id[idlen + 1 + 1] = 1;		}		break;	}	obj->IdLen = idlen + TIMEBUCKETINDEXSIZE;	return DnpapHostTimeSearch(hostcontrol, obj, idlen);}WORD DnpapHostControlIndex(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	if ((local = MibRmon(obj, HostControlInstance, 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;	}	return SNMP_GENERROR;}WORD DnpapHostControlDataSource(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_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);	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, HOST_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_HOST_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, HOST_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, HOST_BOOLEAN_DATASOURCE);			return SNMP_NOERROR;		}		return SNMP_BADVALUE;	}	return SNMP_GENERROR;}WORD DnpapHostControlTableSize(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		obj->Syntax.LngInt = data->TableSize;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapHostControlLastDeleteTime(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		obj->Syntax.LngUns = data->LastDeleteTime;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapHostControlBuckets(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		obj->Syntax.LngInt = data->NrBuckets;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_HOST_CONTROL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (obj->Syntax.LngInt < 0)			return SNMP_BADVALUE;		data->NrBuckets = obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapHostControlInterval(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		obj->Syntax.LngInt = data->Interval;		return SNMP_NOERROR;	case SNMP_PDU_SET:		data = (DNPAP_HOST_CONTROL *) local->Data;		if (data->Status != SNMP_UNDERCREATION)			return SNMP_READONLY;		if (obj->Syntax.LngInt < 1)			return SNMP_BADVALUE;		data->Interval = obj->Syntax.LngInt;		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapHostControlOwner(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	if ((local = MibRmon(obj, HostControlInstance, 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_HOST_CONTROL *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, HOST_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_HOST_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, HOST_BOOLEAN_OWNER);		return SNMP_NOERROR;	}	return SNMP_GENERROR;}WORD DnpapHostControlStatus(SNMP_OBJECT * obj, WORD IdLen){	MIB_LOCAL *local = NULL;	DNPAP_HOST_CONTROL *data;	local = MibRmon(obj, HostControlInstance, IdLen, CONTROLINDEXSIZE);	switch (obj->Request)	{	case SNMP_PDU_GET:		if (local == NULL)		{			obj->Syntax.LngInt = SNMP_INVALID;			return SNMP_NOSUCHNAME;		}		data = (DNPAP_HOST_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;

⌨️ 快捷键说明

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