📄 dhostc.c
字号:
/* 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 + -