#define SFRF_NO_REVERT_LIMIT 1000
// private data ...
+
+THREAD_LOCAL RateFilterStats rate_filter_stats;
+
/* Key to find tracking nodes in trackingHash.
*/
PADDING_GUARD_BEGIN
* Check for any Permanent sid objects for this gid or add this one ...
*/
XHashNode* hnode = xhash_get_node(rf_hash, (void*)&key);
- if ( hnode && hnode->data )
+ if ( !hnode )
+ {
+ // xhash_get_node fails to insert only if rf_hash is full.
+ rate_filter_stats.xhash_nomem_peg++;
+ return dynNode;
+ }
+
+ if ( hnode->data )
{
dynNode = (tSFRFTrackingNode*)hnode->data;
#include "hash/ghash.h"
#include "hash/xhash.h"
+#include "main/thread.h"
#include "sfip/sf_ipvar.h"
#include "utils/dyn_array.h"
#include "utils/sflsq.h"
// Debug Printing
//#define THD_DEBUG
+THREAD_LOCAL EventFilterStats event_filter_stats;
+
XHash* sfthd_new_hash(unsigned nbytes, size_t key, size_t data)
{
size_t size = key + data;
/* Increment the event count */
sfthd_ip_node->count++;
}
+ else if (status == XHASH_NOMEM)
+ {
+ event_filter_stats.xhash_nomem_peg_local++;
+ return 1;
+ }
else if (status != XHASH_OK)
{
/* hash error */
/* Increment the event count */
sfthd_ip_node->count++;
}
+ else if (status == XHASH_NOMEM)
+ {
+ event_filter_stats.xhash_nomem_peg_global++;
+ return 1;
+ }
else if (status != XHASH_OK)
{
/* hash error */
#define event_filter_help \
"configure thresholding of events"
+extern THREAD_LOCAL EventFilterStats event_filter_stats; // in sfthd.cc
+const PegInfo event_filter_peg_names[] =
+{
+ { CountType::SUM, "no_memory_local", "number of times event filter ran out of local memory" },
+ { CountType::SUM, "no_memory_global", "number of times event filter ran out of global memory" },
+ { CountType::END, nullptr, nullptr }
+};
+
class EventFilterModule : public Module
{
public:
bool begin(const char*, int, SnortConfig*) override;
bool end(const char*, int, SnortConfig*) override;
+ const PegInfo* get_pegs() const override
+ {
+ return event_filter_peg_names;
+ }
+
+ PegCount* get_counts() const override
+ {
+ return (PegCount*)&event_filter_stats;
+ }
+
Usage get_usage() const override
{ return CONTEXT; }
#define rate_filter_help \
"configure rate filters (which change rule actions)"
+extern THREAD_LOCAL RateFilterStats rate_filter_stats;
+const PegInfo rate_filter_peg_names[] =
+{
+ { CountType::SUM, "no_memory", "number of times rate filter ran out of memory" },
+ { CountType::END, nullptr, nullptr }
+};
+
+
class RateFilterModule : public Module
{
public:
bool begin(const char*, int, SnortConfig*) override;
bool end(const char*, int, SnortConfig*) override;
+ const PegInfo* get_pegs() const override
+ {
+ return rate_filter_peg_names;
+ }
+
+ PegCount* get_counts() const override
+ {
+ return (PegCount*)&rate_filter_stats;
+ }
+
Usage get_usage() const override
{ return DETECT; }