diff --git a/include/GenericHashEntry.h b/include/GenericHashEntry.h index 7c278ded82..db0a4feecd 100644 --- a/include/GenericHashEntry.h +++ b/include/GenericHashEntry.h @@ -81,15 +81,29 @@ class GenericHashEntry { private: GenericHashEntry *hash_next; /**< Pointer of next hash entry.*/ HashEntryState hash_entry_state; + /** + * @brief Set one of the states of the hash entry in its lifecycle. + * + * @param s A state of the enum HashEntryState + */ + inline void set_state(HashEntryState s) { hash_entry_state = s; }; + /** + * @brief Set the hash entry state to active. Private as it must only be + * called in the constructor + * + */ + inline void set_hash_entry_state_active() { + set_state(hash_entry_state_active); + }; protected: u_int32_t num_uses; /* Don't use 16 bits as we might run out of space on large networks with MACs, VLANs etc. */ time_t first_seen; /**< Time of first seen. */ time_t last_seen; /**< Time of last seen. */ NetworkInterface *iface; /**< Pointer of network interface. */ - virtual bool isIdle(u_int max_idleness); - public: + + public: /** * @brief A Constructor * @details Creating a new GenericHashEntry. @@ -133,7 +147,23 @@ class GenericHashEntry { * @param n Hash entry to set as next hash entry. */ inline void set_next(GenericHashEntry *n) { hash_next = n; }; - inline void set_state(HashEntryState s) { hash_entry_state = s; }; + /** + * @brief Set the hash entry state to idle. Must be called inline + * with packets/flows processing. + * + */ + virtual void set_hash_entry_state_idle() { + set_state(hash_entry_state_idle); + }; + /** + * @brief Set the hash entry state to ready to be purged. Must be called NON-inline + * with packets/flows processing. + * @details Inline method. + * + */ + inline void set_hash_entry_state_ready_to_be_purged() { + set_state(hash_entry_state_ready_to_be_purged); + }; HashEntryState get_state() const; void updateSeen(); void updateSeen(time_t _last_seen); diff --git a/src/Flow.cpp b/src/Flow.cpp index a8db879cef..6b6b538d7b 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -1096,7 +1096,7 @@ void Flow::update_hosts_stats(struct timeval *tv, bool dump_alert) { set_acknowledge_to_purge(); } else { /* Marked as ready to be purged, will be purged by NetworkInterface::purgeIdleFlows */ - set_state(hash_entry_state_ready_to_be_purged); + set_hash_entry_state_ready_to_be_purged(); } postFlowSetIdle(tv->tv_sec); diff --git a/src/GenericHash.cpp b/src/GenericHash.cpp index 86c7bade87..895325e6a3 100644 --- a/src/GenericHash.cpp +++ b/src/GenericHash.cpp @@ -219,7 +219,7 @@ u_int GenericHash::purgeIdle() { head->housekeep(now); if(head_state == hash_entry_state_active && head->idle()) - head->set_state(hash_entry_state_idle); + head->set_hash_entry_state_idle(); prev = head; head = next; diff --git a/src/GenericHashEntry.cpp b/src/GenericHashEntry.cpp index fe94e5a46f..51645c263c 100644 --- a/src/GenericHashEntry.cpp +++ b/src/GenericHashEntry.cpp @@ -26,7 +26,7 @@ GenericHashEntry::GenericHashEntry(NetworkInterface *_iface) { hash_next = NULL, iface = _iface, first_seen = last_seen = 0, num_uses = 0; - hash_entry_state = hash_entry_state_active; + set_hash_entry_state_active(); if(iface && iface->getTimeLastPktRcvd() > 0) first_seen = last_seen = iface->getTimeLastPktRcvd(); diff --git a/src/Host.cpp b/src/Host.cpp index d971e22168..fa2c824c6f 100644 --- a/src/Host.cpp +++ b/src/Host.cpp @@ -1142,7 +1142,7 @@ void Host::updateStats(update_hosts_stats_user_data_t *update_hosts_stats_user_d struct timeval *tv = update_hosts_stats_user_data->tv; if(get_state() == hash_entry_state_idle) { - set_state(hash_entry_state_ready_to_be_purged); + set_hash_entry_state_ready_to_be_purged(); if(getNumTriggeredAlerts() && (update_hosts_stats_user_data->acle diff --git a/src/Mac.cpp b/src/Mac.cpp index 4ac77a4af2..dc1e977912 100644 --- a/src/Mac.cpp +++ b/src/Mac.cpp @@ -486,7 +486,7 @@ void Mac::checkStatsReset() { void Mac::updateStats(struct timeval *tv) { if(get_state() == hash_entry_state_idle) - set_state(hash_entry_state_ready_to_be_purged); + set_hash_entry_state_ready_to_be_purged(); checkDataReset(); checkStatsReset(); diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index 0261a595dc..d33cacdb3e 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -2984,7 +2984,7 @@ static bool update_generic_element_stats(GenericHashEntry *node, void *user_data GenericTrafficElement *elem; if(node->get_state() == hash_entry_state_idle) - node->set_state(hash_entry_state_ready_to_be_purged); + node->set_hash_entry_state_ready_to_be_purged(); if((elem = dynamic_cast(node))) { struct timeval *tv = (struct timeval*)user_data; diff --git a/src/ViewInterface.cpp b/src/ViewInterface.cpp index 70501ef1f4..7c296c4200 100644 --- a/src/ViewInterface.cpp +++ b/src/ViewInterface.cpp @@ -250,7 +250,7 @@ static bool viewed_flows_walker(GenericHashEntry *flow, void *user_data, bool *m if(acked_to_purge) { /* We can set the 'ready to be purged' state on behalf of the underlying viewed interface. It is safe as this view is in sync with the viewed interfaces by bean of acked_to_purge */ - f->set_state(hash_entry_state_ready_to_be_purged); + f->set_hash_entry_state_ready_to_be_purged(); } f->dumpFlow(tv, iface);