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

📄 dhostc.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 2 页
字号:
				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->IATTime = time;			}			else			{				iat = time - host->IATTime;				host->IATTime = time;				iatindex = iat / hostcontrol->Interval;				if (iatindex >= hostcontrol->NrBuckets)					iatindex = hostcontrol->NrBuckets - 1;				host->IATBucketsPkts[iatindex]++;				host->IATBucketsOctets[iatindex] += size;			}		}		host->InPkts++;		host->InOctets += size;		if (size == 64)			host->InBucket1Pkts++;		if (size >= 65)		{			if (size <= 127)				host->InBucket2Pkts++;			else if (size <= 255)				host->InBucket3Pkts++;			else if (size <= 511)				host->InBucket4Pkts++;			else if (size <= 1023)				host->InBucket5Pkts++;			else if (size <= 1518)				host->InBucket6Pkts++;		}#ifdef NOT_HOST_GENERIC		if (ProtGetField(pkt, &DstTCP) == TRUE)			host->InTCPPkts++;		else			host->InOtherPkts++;#endif		HostUpdateLRUList(hostcontrol, host);		DnpapTopNEntryUpdate(hostcontrol->Index, host, hostcontrol->AddressLen);	}	return;}BOOLEAN HostAddLexList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){DNPAP_HOST *p, *q;WORD addrlen = hostcontrol->AddressLen;	if (hostcontrol->LexList == NULL)	{		hostcontrol->LexList = host;		host->LexPrev = NULL;		host->LexNext = NULL;		return TRUE;	}	for (p = hostcontrol->LexList, q = NULL; p != NULL; q = p, p = p->LexNext)	{		if (addrcmp(p, host, addrlen, addrlen) >= 0)			break;	}	if (q != NULL)		q->LexNext = host;	else		hostcontrol->LexList = host;	if (p != NULL)		p->LexPrev = host;	host->LexPrev = q;	host->LexNext = p;	return TRUE;}BOOLEAN HostAddTimeList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (hostcontrol->TimeList == NULL)	{		hostcontrol->TimeList = host;		hostcontrol->TimeLast = host;		host->TimePrev = NULL;		host->TimeNext = NULL;		hostcontrol->TimeListUpdated = TRUE;		return TRUE;	}	host->TimePrev = hostcontrol->TimeLast;	host->TimeNext = NULL;	hostcontrol->TimeLast->TimeNext = host;	hostcontrol->TimeLast = host;	hostcontrol->TimeListUpdated = TRUE;	return TRUE;}DNPAP_HOST *HostAddLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (hostcontrol->LRUList == NULL)	{		hostcontrol->LRUList = host;		hostcontrol->LRULast = host;		host->LRUPrev = NULL;		host->LRUNext = NULL;		return NULL;	}	host->LRUNext = hostcontrol->LRUList;	host->LRUPrev = NULL;	hostcontrol->LRUList->LRUPrev = host;	hostcontrol->LRUList = host;	return hostcontrol->LRULast;}BOOLEAN HostUpdateLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (hostcontrol->TableSize > 1 && hostcontrol->LRUList != host)	{		HostRemoveLRUList(hostcontrol, host);		HostAddLRUList(hostcontrol, host);	}	return TRUE;}BOOLEAN HostRemoveLexList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (host->LexPrev != NULL)		host->LexPrev->LexNext = host->LexNext;	else		hostcontrol->LexList = host->LexNext;	if (host->LexNext != NULL)		host->LexNext->LexPrev = host->LexPrev;	host->LexPrev = NULL;	host->LexNext = NULL;	return TRUE;}BOOLEAN HostRemoveTimeList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (host->TimePrev != NULL)		host->TimePrev->TimeNext = host->TimeNext;	else		hostcontrol->TimeList = host->TimeNext;	if (host->TimeNext != NULL)		host->TimeNext->TimePrev = host->TimePrev;	else		hostcontrol->TimeLast = host->TimePrev;	hostcontrol->TimeListUpdated = TRUE;	host->TimePrev = NULL;	host->TimeNext = NULL;	return TRUE;}BOOLEAN HostRemoveLRUList(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (host->LRUPrev != NULL)		host->LRUPrev->LRUNext = host->LRUNext;	else		hostcontrol->LRUList = host->LRUNext;	if (host->LRUNext != NULL)		host->LRUNext->LRUPrev = host->LRUPrev;	else		hostcontrol->LRULast = host->LRUPrev;	host->LRUPrev = NULL;	host->LRUNext = NULL;	return TRUE;}VOID DelHosts(DNPAP_HOST_CONTROL * hostcontrol){	DNPAP_HOST *host1, *host2;	for (host2 = hostcontrol->LexList; host2 != NULL; host2 = host1)	{		host1 = host2->LexNext;		DnpapFree(host2->IATBucketsPkts);		DnpapFree(host2->ISTBucketsPkts);		DnpapFree(host2->IATBucketsOctets);		DnpapFree(host2->ISTBucketsOctets);		DnpapFree(host2);		hostcontrol->TableSize--;	}	hostcontrol->LexList = NULL;}DNPAP_HOST *DnpapHostSearchNext(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host, WORD len){DNPAP_HOST *p;WORD addrlen = hostcontrol->AddressLen;    if (len == addrlen &&		(p = HashSearch(hostcontrol->Table, host->Address, addrlen)) != NULL)		return p->LexNext;	else	{		for (p = hostcontrol->LexList; p != NULL; p = p->LexNext)		{			if (addrcmp(p, host, addrlen, len) >= 0)				break;		}		return p;	}	return NULL;}DNPAP_HOST *DnpapHostBucketSearchNext(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host, WORD len, LONG *bucket){DNPAP_HOST *p;WORD addrlen = hostcontrol->AddressLen;    if (len >= addrlen &&		(p = HashSearch(hostcontrol->Table, host->Address, addrlen)) != NULL)	{		if (len == addrlen)		{			*bucket = 1;			return p;		}		if (*bucket < hostcontrol->NrBuckets)		{			(*bucket)++;			return p;		}		*bucket = 1;			return p->LexNext;	}	else	{		for (p = hostcontrol->LexList; p != NULL; p = p->LexNext)		{			if (addrcmp(p, host, addrlen, len) >= 0)				break;		}		*bucket = 1;		return p;	}	return NULL;}DNPAP_HOST *DnpapHostSearchHash(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen){WORD i, addrlen = hostcontrol->AddressLen;BYTE address[HOST_SIZE_ADDR];	if (obj->Id[idlen+1] != addrlen)		return NULL;	for (i = 0; i < addrlen; i++)		address[i] = (BYTE) obj->Id[idlen+2+i];	return HashSearch(hostcontrol->Table, address, addrlen);}DNPAP_HOST *DnpapHostTimeSearch(DNPAP_HOST_CONTROL * hostcontrol, SNMP_OBJECT * obj, WORD idlen){	if (obj->Id[idlen+1] < 1 || obj->Id[idlen+1] > hostcontrol->TableSize)		return NULL;	if (hostcontrol->TimeListUpdated == TRUE)		HostUpdateTimeTable(hostcontrol);	return hostcontrol->TimeTable[obj->Id[idlen+1]-1];}LONG DnpapHostSearchCreationOrder(DNPAP_HOST_CONTROL * hostcontrol, DNPAP_HOST * host){	if (hostcontrol->TimeListUpdated == TRUE)		HostUpdateTimeTable(hostcontrol);	return host->TimeListPtr - hostcontrol->TimeTable + 1;}BOOLEAN HostUpdateTimeTable(DNPAP_HOST_CONTROL * hostcontrol){	LONG i;	DNPAP_HOST *p;	for (p = hostcontrol->TimeList, i = 0; p != NULL; p = p->TimeNext, i++)	{		hostcontrol->TimeTable[i] = p;		p->TimeListPtr = hostcontrol->TimeTable + i;	}	if (i != hostcontrol->TableSize)	{		DnpapMessage(DMC_FATAL, DHOST_UPDTIME, "dhostcontrol: internal error in time list and table");		DnpapExit(DHOST_UPDTIME);	}	hostcontrol->TimeListUpdated = FALSE;	return TRUE;}int addrcmp(DNPAP_HOST * host1, DNPAP_HOST * host2, WORD addrlen, WORD len){INT i1, i2;	BYTE *a1 = host1->Address, *a2 = host2->Address;	if (len > addrlen)		len = addrlen;	for (i1 = 0, i2 = 0; len > 0; i1++, i2++, len--)	{		if (a1[i1] < a2[i2])			return -1;		else		if (a1[i1] > a2[i2])			return 1;	}	return 0;}

⌨️ 快捷键说明

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