#define MAX_LIST 8
#define MAX_DATA 4
#define MAX_WAIT 300
-#define MAX_PRUNE 5
static THREAD_LOCAL std::vector<ExpectFlow*>* packet_expect_flows = nullptr;
// private ExpectCache methods
//-------------------------------------------------------------------------
-// Clean the hash table of at most MAX_PRUNE expired nodes
-void ExpectCache::prune()
+void ExpectCache::prune_lru()
{
- time_t now = packet_time();
-
- for (unsigned i = 0; i < MAX_PRUNE; ++i )
- {
- ExpectNode* node = (ExpectNode*)hash_table->lru_first();
-
- if ( !node || now <= node->expires )
- break;
-
- node->clear(free_list);
- hash_table->release();
- ++prunes;
- }
+ ExpectNode* node = static_cast<ExpectNode*>( hash_table->lru_first() );
+ assert(node);
+ node->clear(free_list);
+ hash_table->release();
+ ++prunes;
}
ExpectNode* ExpectCache::find_node_by_packet(Packet* p, FlowKey &key)
*/
// FIXIT-P X This should be optimized to only do full matches when full keys
// are present, likewise for partial keys.
- ExpectNode* node = (ExpectNode*) hash_table->get_user_data(&key);
+ ExpectNode* node = static_cast<ExpectNode*>( hash_table->get_user_data(&key) );
if (!node)
{
// FIXIT-M X This logic could fail if IPs were equal because the original key
port2 = key.port_h;
key.port_h = 0;
}
- node = (ExpectNode*) hash_table->get_user_data(&key);
+ node = static_cast<ExpectNode*> ( hash_table->get_user_data(&key) );
if (!node)
{
key.port_l = port1;
key.port_h = port2;
- node = (ExpectNode*) hash_table->get_user_data(&key);
+ node = static_cast<ExpectNode*> ( hash_table->get_user_data(&key) );
if (!node)
return nullptr;
}
free_list = p;
}
- expects = realized = 0;
- prunes = overflows = 0;
if (packet_expect_flows == nullptr)
packet_expect_flows = new std::vector<ExpectFlow*>;
}
vlanId, mplsId, addressSpaceId);
bool new_node = false;
- ExpectNode* node = (ExpectNode*) hash_table->get_user_data(&key);
+ ExpectNode* node = static_cast<ExpectNode*> ( hash_table->get_user_data(&key) );
if ( !node )
{
- prune();
- node = (ExpectNode*) hash_table->get(&key);
+ if ( hash_table->full() )
+ prune_lru();
+ node = static_cast<ExpectNode*> ( hash_table->get(&key) );
assert(node);
new_node = true;
}
unsigned long get_overflows() { return overflows; }
private:
- void prune();
+ void prune_lru();
ExpectNode* get_node(snort::FlowKey&, bool&);
snort::ExpectFlow* get_flow(ExpectNode*, uint32_t, int16_t);
snort::ExpectFlow* pool;
snort::ExpectFlow* free_list;
- unsigned long expects, realized;
- unsigned long prunes, overflows;
+ unsigned long expects = 0;
+ unsigned long realized = 0;
+ unsigned long prunes = 0;
+ unsigned long overflows = 0;
};
#endif