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

📄 dhostc.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 <stdlib.h>#include <memory.h>#include <dnpap.h>#include <config.h>#include <message.h>#include <mac.h>#include <hash.h>#include <sysmib.h>#include <protocol.h>#include <dtopn.h>#include <dfilter.h>#include <dchan.h>#include "dhoste.h"#include "dhostx.h"#include "dhostc.h"IMPORT BOOLEAN BeholderStrictRMON;static LONG HostMaxNrHosts = 2000;static BOOLEAN HostCallback(MAC_COLL * collector, PROT_PKT * pkt);static BOOLEAN HostAddLexList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostRemoveLexList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostAddTimeList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostRemoveTimeList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static DNPAP_HOST *HostAddLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostUpdateLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostRemoveLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host);static BOOLEAN HostUpdateTimeTable(DNPAP_HOST_CONTROL * hostcontrol);static VOID DelHosts(DNPAP_HOST_CONTROL * hostcontrol);static int addrcmp(DNPAP_HOST * host1, DNPAP_HOST * host2, WORD addrlen, WORD len);BOOLEAN DnpapHostConfigInit(VOID){	ConfigGetLong("beholder.dhost.maxnrhosts", &HostMaxNrHosts);	if (HostMaxNrHosts < 2)	{		DnpapMessage(DMC_WARNING, DHOST_MAX, "dhostcontrol: beholder.host.maxnrhosts < 2, setting it to 2");		HostMaxNrHosts = 2;	}	return TRUE;}BOOLEAN DnpapHostCInit(DNPAP_HOST_CONTROL * hostcontrol){	LONG source[] =	{1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 1};	hostcontrol->Index = 0;	memcpy(hostcontrol->Source, source, sizeof(source));	hostcontrol->SourceLen = sizeof(source) / sizeof(source[0]);	hostcontrol->Channel = FALSE;    hostcontrol->ChannelType = 0;    hostcontrol->ChannelAccept = TRUE;    hostcontrol->AddressLen = 0;	hostcontrol->TableSize = 0;	hostcontrol->LastDeleteTime = 0;	hostcontrol->Owner[0] = '\0';	hostcontrol->OwnerLen = 0;	hostcontrol->Status = SNMP_INVALID;	hostcontrol->NrBuckets = 10;	hostcontrol->Interval = 1000;	if ((hostcontrol->Iface =		 MacIfaceGet((WORD) hostcontrol->Source[hostcontrol->SourceLen - 1])) == NULL)	{		DnpapMessage(DMC_ERROR, DHOST_NETINIT, "dhostcontrol: network initialisation failed");		return (FALSE);	}	hostcontrol->Table = NULL;	hostcontrol->LexList = NULL;	hostcontrol->TimeList = NULL;	hostcontrol->TimeLast = NULL;	hostcontrol->TimeTable = NULL;	hostcontrol->TimeListUpdated = FALSE;	hostcontrol->LRUList = NULL;	hostcontrol->LRULast = NULL;	BooleanSetAllTrue(hostcontrol->ObjectSet);	BooleanSetFalse(hostcontrol->ObjectSet, HOST_BOOLEAN_DATASOURCE);	BooleanSetFalse(hostcontrol->ObjectSet, HOST_BOOLEAN_OWNER);	return TRUE;}BOOLEAN DnpapHostCStart(DNPAP_HOST_CONTROL * hostcontrol){	if (BeholderStrictRMON && !BooleanCheckAllTrue(hostcontrol->ObjectSet))		return FALSE;	if (hostcontrol->Channel == FALSE)	{		hostcontrol->Coll.Rcve = HostCallback;		hostcontrol->Coll.specific = hostcontrol;		if (!MacCollRegister(&(hostcontrol->Coll)))		{			DnpapMessage(DMC_ERROR, DHOST_NETERR, "dhostcontrol: network initialisation failed");			return FALSE;		}	}	if ((hostcontrol->Table = NewHash(HostMaxNrHosts/2+11, NULL)) == NULL)	{		DnpapMessage(DMC_ERROR, DHOST_HASHERR, "dhostcontrol: can not create hashtable");		return FALSE;	}	if ((hostcontrol->TimeTable = (DNPAP_HOST **) DnpapMalloc(HostMaxNrHosts * sizeof(DNPAP_HOST *))) == NULL)	{		DnpapMessage(DMC_ERROR, DHOST_TIMER, "dhostcontrol: can not create time ordered table");		return FALSE;	}	return TRUE;}BOOLEAN DnpapHostCStop(DNPAP_HOST_CONTROL * hostcontrol){	DnpapTopNHostStop(hostcontrol->Index);	MacCollRemove(&(hostcontrol->Coll));	DelHash(hostcontrol->Table);	DelHosts(hostcontrol);	DnpapFree(hostcontrol->TimeTable);	return TRUE;}BOOLEAN HostCallback(MAC_COLL * collector, PROT_PKT * pkt){	DNPAP_HOST_CONTROL *hostcontrol = collector->specific;	PROT_OBJ Interface =	{0,	 {1, 2}};	if (ProtGetField(pkt, &Interface) == TRUE &&		Interface.Syntax.LngInt == hostcontrol->Source[hostcontrol->SourceLen - 1])		DnpapHostHandlePkt(hostcontrol, pkt);	return TRUE;}VOID DnpapHostHandlePkt(DNPAP_HOST_CONTROL * hostcontrol, PROT_PKT * pkt){DNPAP_HOST *host = NULL, *oldhost = NULL;BYTE EthBroadcast[ETH_SIZE_ADDR] =	{0xff,0xff,0xff,0xff,0xff,0xff};PROT_OBJ EthTime = {0, {1, 6}};PROT_OBJ EthSize = {0, {1, 4}};PROT_OBJ EthDst = {1, {2, 1}};PROT_OBJ EthSrc = {1, {2, 2}};#ifdef NOT_HOST_GENERICPROT_OBJ DstTCP = {3, {4, 2}};PROT_OBJ SrcTCP = {3, {4, 1}};#endifBYTE *src, *dst;WORD addrlen;LWORD size;INT type;ULONG time;LONG iat, iatindex, ist, istindex;BOOLEAN hostcreated;	src = NULL;	dst = NULL;	if (hostcontrol->Channel == FALSE)		type = hostcontrol->Iface->type;	else	  	{				type = hostcontrol->ChannelType;		if (type == 0)		{			type = DnpapChannelType(hostcontrol->Source[hostcontrol->SourceLen-1]);			if (type == 0)				return;			hostcontrol->ChannelType = type;		}			   	}			switch (type)	{	case MAC_TYPE_ETHERNET_CSMACD:	case MAC_TYPE_88023_CSMACD:		if (ProtGetField(pkt, &EthTime) == TRUE)			time = EthTime.Syntax.LngUns;		else			return;		if (ProtGetField(pkt, &EthSize) == TRUE)			size = EthSize.Syntax.LngUns + 4L;		else			return;		if (ProtGetField(pkt, &EthSrc) == TRUE)			src = EthSrc.Syntax.BufChr;		if (ProtGetField(pkt, &EthDst) == TRUE)			dst = EthDst.Syntax.BufChr;		if (EthSrc.SyntaxLen != ETH_SIZE_ADDR)			src = NULL;		if (EthDst.SyntaxLen != ETH_SIZE_ADDR)			dst = NULL;		addrlen = ETH_SIZE_ADDR;		if (hostcontrol->AddressLen == 0)			hostcontrol->AddressLen = addrlen;		else		if (hostcontrol->AddressLen != addrlen)		{			DnpapMessage(DMC_FATAL, DHOST_INCONSISTENT, "dhost: inconsistent address length encountered");			DnpapExit(1);		}		break;	default:		return;	}	hostcreated = FALSE;	if ((host = HashSearch(hostcontrol->Table, src, addrlen)) == NULL)	{		/* first try to add the new host  */		if ((host = DnpapMalloc(sizeof(DNPAP_HOST))) != NULL)		{			memset(host, 0, sizeof(DNPAP_HOST));			memcpy(host->Address, src, addrlen);			if (hostcontrol->NrBuckets > 0 &&				((host->IATBucketsPkts = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->IATBucketsPkts[0]))) == NULL ||				 (host->ISTBucketsPkts = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->ISTBucketsPkts[0]))) == NULL ||				 (host->IATBucketsOctets = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->ISTBucketsOctets[0]))) == NULL ||				 (host->ISTBucketsOctets = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->ISTBucketsOctets[0]))) == NULL))			{				DnpapMessage(DMC_WARNING, DHOST_NOBUCKETS, "dhostcontrol: buckets could not be added to a host");				DnpapFree(host->IATBucketsPkts);				DnpapFree(host->ISTBucketsPkts);				DnpapFree(host->IATBucketsOctets);				DnpapFree(host->ISTBucketsOctets);				DnpapFree(host);				host = NULL;			}			else			{				memset(host->IATBucketsPkts, 0, (size_t) hostcontrol->NrBuckets * sizeof(host->IATBucketsPkts[0]));			 	memset(host->ISTBucketsPkts, 0, (size_t) hostcontrol->NrBuckets * sizeof(host->ISTBucketsPkts[0]));				memset(host->IATBucketsOctets, 0, (size_t) hostcontrol->NrBuckets * sizeof(host->IATBucketsOctets[0]));			 	memset(host->ISTBucketsOctets, 0, (size_t) hostcontrol->NrBuckets * sizeof(host->ISTBucketsOctets[0]));				if (HashAdd(hostcontrol->Table, host->Address, addrlen, host) == NULL)				{					DnpapMessage(DMC_WARNING, DHOST_NADD, "dhostcontrol: host could not be added to the hash table");					DnpapFree(host->IATBucketsPkts);					DnpapFree(host->ISTBucketsPkts);					DnpapFree(host->IATBucketsOctets);					DnpapFree(host->ISTBucketsOctets);					DnpapFree(host);					host = NULL;				}				else				{					hostcreated = TRUE;					HostAddLexList(hostcontrol, host);					HostAddTimeList(hostcontrol, host);					oldhost = HostAddLRUList(hostcontrol, host);					hostcontrol->TableSize++;					if (hostcontrol->TableSize > (LONG) HostMaxNrHosts)					{						HostRemoveLRUList(hostcontrol, oldhost);						HostRemoveTimeList(hostcontrol, oldhost);						HostRemoveLexList(hostcontrol, oldhost);						if (HashRemove(hostcontrol->Table, oldhost->Address, addrlen) != oldhost)							DnpapMessage(DMC_WARNING, DHOST_NREM, "dhostcontrol: host could not be removed from the hash table");						DnpapTopNEntryReset(hostcontrol->Index, oldhost, hostcontrol->AddressLen);						DnpapFree(oldhost->IATBucketsPkts);						DnpapFree(oldhost->ISTBucketsPkts);						DnpapFree(oldhost->IATBucketsOctets);						DnpapFree(oldhost->ISTBucketsOctets);						DnpapFree(oldhost);						hostcontrol->LastDeleteTime = SysTime();						hostcontrol->TableSize--;					}				}			}		}	}	if (host != NULL)	{		if (hostcontrol->NrBuckets > 0)		{			if (hostcreated == TRUE)			{				host->ISTTime = time;			}			else			{				ist = time - host->ISTTime;				host->ISTTime = time;				istindex = ist / hostcontrol->Interval;				if (istindex >= hostcontrol->NrBuckets)					istindex = hostcontrol->NrBuckets - 1;				host->ISTBucketsPkts[istindex]++;				host->ISTBucketsOctets[istindex] += size;			}		}		host->OutPkts++;		host->OutOctets += size;		switch (type)		{		case MAC_TYPE_ETHERNET_CSMACD:		case MAC_TYPE_88023_CSMACD:			if (!memcmp(dst, &EthBroadcast, addrlen))				host->OutBroadcastPkts++;			else if (dst[0] & 0x01)				host->OutMulticastPkts++;			break;		default:			break;		}		if (size == 64)			host->OutBucket1Pkts++;		if (size >= 65)		{			if (size <= 127)				host->OutBucket2Pkts++;			else if (size <= 255)				host->OutBucket3Pkts++;			else if (size <= 511)				host->OutBucket4Pkts++;			else if (size <= 1023)				host->OutBucket5Pkts++;			else if (size <= 1518)				host->OutBucket6Pkts++;		}#ifdef NOT_HOST_GENERIC		if (ProtGetField(pkt, &SrcTCP) == TRUE)			host->OutTCPPkts++;		else			host->OutOtherPkts++;#endif		HostUpdateLRUList(hostcontrol, host);		DnpapTopNEntryUpdate(hostcontrol->Index, host, hostcontrol->AddressLen);	}	hostcreated = FALSE;	if ((host = HashSearch(hostcontrol->Table, dst, addrlen)) == NULL)	{		if ((host = DnpapMalloc(sizeof(DNPAP_HOST))) != NULL)		{			memset(host, 0, sizeof(DNPAP_HOST));			memcpy(host->Address, dst, addrlen);			if (hostcontrol->NrBuckets > 0 &&				((host->IATBucketsPkts = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->IATBucketsPkts[0]))) == NULL ||				 (host->ISTBucketsPkts = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->ISTBucketsPkts[0]))) == NULL || 				 (host->IATBucketsOctets = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->IATBucketsOctets[0]))) == NULL ||				 (host->ISTBucketsOctets = DnpapMalloc(hostcontrol->NrBuckets * sizeof(host->ISTBucketsOctets[0]))) == NULL))			{				DnpapMessage(DMC_WARNING, DHOST_NOBUCKETS, "dhostcontrol: buckets could not be added to a host");				DnpapFree(host->IATBucketsPkts);				DnpapFree(host->ISTBucketsPkts);				DnpapFree(host->IATBucketsOctets);

⌨️ 快捷键说明

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