int server_stats_add_ipv4(SERVER_STATS *ssp, u_int8_t ip_proto, u_int32_t address, u_int16_t port, u_int32_t *retcount) { SERVER_KEY *kp = &s_key; u_int32_t one = 1; u_int32_t *hitcountp = NULL; int ret; #ifdef DEBUG u_int32_t hostaddress = ntohl(address); #endif /* DEBUG */ if(ssp == NULL || retcount == NULL) return FLOW_ENULL; /* calls to this subsystem should only be made if we are really watching this. */ FLOWASSERT(ipset_contains(ssp->ipv4_watch, &hostaddress, IPV4_FAMILY)); /* make the key */ kp->address = address; kp->port = port; kp->protocol = ip_proto; /* find the key, add 1 to it or add a new node to the table */ ret = sfxhash_add(ssp->ipv4_table, kp, &one); switch(ret) { case SFXHASH_NOMEM: /* NOMEM means that we would add it if we could but we're * hard-core out of space. So, just assume we added it. */ case SFXHASH_OK: *retcount = 1; break; case SFXHASH_INTABLE: hitcountp = (u_int32_t *) sfxhash_mru(ssp->ipv4_table); /* never let us wrap around to less hits */ if(!hitcountp) { /* this is an odd error! */ return FLOW_BADJUJU; } else { if((*hitcountp) < SERVER_STATS_MAX_HITCOUNT) { (*hitcountp)++; } } break; } return FLOW_SUCCESS; }
/** * Get the most recently used flow from the cache * * @param flowcachep flow cache to operate on * @param flowp where to put the flow * * @return FLOW_SUCCESS on success */ static INLINE int flowcache_mru(FLOWCACHE *flowcachep, FLOW **flowpp) { if(!flowcachep || !flowpp) return FLOW_EINVALID; *flowpp = sfxhash_mru(flowcachep->ipv4_table); if(*flowpp == NULL) return FLOW_NOTFOUND; return FLOW_SUCCESS; }
/** * Get the most recently used flow from the cache * * @param sbp scoreboard to find * @param sepp score entry pointer to fill in * * @return FLOW_SUCCESS on sucess */ static INLINE int scoreboard_mru(SCOREBOARD *sbp, SCORE_ENTRY **sepp) { if(!sbp || !sepp) return FLOW_EINVALID; *sepp = sfxhash_mru(sbp->ipv4_table); if(*sepp == NULL) return FLOW_NOTFOUND; return FLOW_SUCCESS; }
/** ** Get a tracker node by either finding one or starting a new one. We may ** return NULL, in which case we wait till the next packet. */ static int ps_tracker_get(PS_TRACKER **ht, PS_HASH_KEY *key) { int iRet; *ht = (PS_TRACKER *)sfxhash_find(portscan_hash, (void *)key); if(!(*ht)) { iRet = sfxhash_add(portscan_hash, (void *)key, NULL); if(iRet == SFXHASH_OK) { *ht = (PS_TRACKER *)sfxhash_mru(portscan_hash); if(!(*ht)) return -1; ps_tracker_init(*ht); } else { return -1; } } return 0; }