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