]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #1709 in SNORT/snort3 from ~DDAHIPHA/snort3:reload_adjust_memcaps...
authorDavis McPherson (davmcphe) <davmcphe@cisco.com>
Sat, 17 Aug 2019 13:11:24 +0000 (09:11 -0400)
committerDavis McPherson (davmcphe) <davmcphe@cisco.com>
Sat, 17 Aug 2019 13:11:24 +0000 (09:11 -0400)
Squashed commit of the following:

commit 5dd84ba87aebf1d021a4b1d16fdc866dc932fc69
Author: Devendra Dahiphale <ddahipha@cisco.com>
Date:   Tue Aug 13 15:13:36 2019 -0400

    main: Implement reload memcap framework

src/framework/module.h
src/main/analyzer.cc
src/main/analyzer.h
src/main/analyzer_command.h
src/main/snort_config.cc
src/main/snort_config.h
src/stream/CMakeLists.txt

index 61e883e1d3d8c981da30ebdf0b8f88d6122ccb3e..5b0838b11dcbfa9bdcab712eadff5279205bb427 100644 (file)
@@ -75,6 +75,17 @@ struct RuleMap
     const char* msg;
 };
 
+class ReloadMemcapManager
+{
+public:
+    virtual ~ReloadMemcapManager() = default;
+
+    virtual bool tune_memcap() = 0;
+    virtual bool tune_memcap_idle() = 0;
+protected:
+    ReloadMemcapManager() = default;
+};
+
 class SO_PUBLIC Module
 {
 public:
@@ -185,6 +196,9 @@ public:
 
     void enable_trace();
 
+    const ReloadMemcapManager* get_reload_mcm() const
+    { return reload_mcm; }
+
 protected:
     Module(const char* name, const char* help);
     Module(const char* name, const char* help, const Parameter*,
@@ -206,6 +220,7 @@ private:
     int table_level = 0;
 
     Trace* trace;
+    ReloadMemcapManager* reload_mcm = nullptr;
 
     void set_peg_count(int index, PegCount value)
     {
index 2891df1946a0e8d279be22a4380569164233e0a2..fe58a0ff797effe7dcb78b6675baf32325925c7f 100644 (file)
@@ -75,6 +75,7 @@ using namespace std;
 static MainHook_f main_hook = snort_ignore;
 
 THREAD_LOCAL ProfileStats daqPerfStats;
+THREAD_LOCAL std::list<snort::ReloadMemcapManager *> *rel_managers;
 
 static THREAD_LOCAL Analyzer* local_analyzer = nullptr;
 
@@ -526,6 +527,7 @@ void Analyzer::reinit(SnortConfig* sc)
 {
     InspectorManager::thread_reinit(sc);
     ActionManager::thread_reinit(sc);
+    rel_managers = new std::list<snort::ReloadMemcapManager *>(sc->get_reload_memcap_managers());
 }
 
 void Analyzer::term()
@@ -579,6 +581,8 @@ void Analyzer::term()
     Active::thread_term();
     delete switcher;
 
+    delete rel_managers;
+
     sfthreshold_free();
     RateFilter_Cleanup();
 }
@@ -665,13 +669,22 @@ bool Analyzer::handle_command()
 
     ac->execute(*this);
 
-    completed_work_queue_mutex.lock();
-    completed_work_queue.push(ac);
-    completed_work_queue_mutex.unlock();
+    add_command_to_completed_queue(ac);
 
     return true;
 }
 
+void Analyzer::add_command_to_completed_queue(AnalyzerCommand *ac)
+{
+    if (ac->is_complete())
+    {
+        completed_work_queue_mutex.lock();
+        completed_work_queue.push(ac);
+        completed_work_queue_mutex.unlock();
+    } else
+        cache_analyzer_command(ac);
+}
+
 void Analyzer::handle_commands()
 {
     while (handle_command())
@@ -713,6 +726,21 @@ DAQ_RecvStatus Analyzer::process_messages()
         process_daq_msg(msg, false);
         DetectionEngine::onload();
         process_retry_queue();
+
+        if (rel_managers and rel_managers->size())
+        {
+            auto manager = rel_managers->front();
+            if (manager->tune_memcap())
+            {
+                rel_managers->pop_front();
+            }
+        }
+        else
+        {
+            if(ac)
+                add_command_to_completed_queue(ac);
+        }
+
     }
 
     if (exit_after_cnt && (exit_after_cnt -= num_recv) == 0)
index 0d4bfc826c43b44c0df4e733b99d076f36374776..55ebb66dbba4069a149665177d859d4c02120290 100644 (file)
@@ -30,6 +30,7 @@
 #include <mutex>
 #include <queue>
 #include <string>
+#include <list>
 
 #include "thread.h"
 
@@ -45,6 +46,7 @@ class SFDAQInstance;
 struct Packet;
 struct SnortConfig;
 struct ProfileStats;
+class ReloadMemcapManager;
 }
 
 typedef bool (* MainHook_f)(snort::Packet*);
@@ -110,7 +112,9 @@ private:
     void init_unprivileged();
     void term();
     void show_source();
-
+    void cache_analyzer_command(AnalyzerCommand* aci) { ac = aci; }
+    void add_command_to_completed_queue(AnalyzerCommand *ac);
+    AnalyzerCommand* get_analyzer_command() { return ac; }
 public:
     std::queue<AnalyzerCommand*> completed_work_queue;
     std::mutex completed_work_queue_mutex;
@@ -131,6 +135,7 @@ private:
     RetryQueue* retry_queue = nullptr;
     OopsHandler* oops_handler = nullptr;
     ContextSwitcher* switcher = nullptr;
+    AnalyzerCommand* ac = nullptr;
 
     std::mutex pending_work_queue_mutex;
 };
index ea91dd08b27e3be7d979879337dbb941d517217d..d2ce19d8ad40d52392a99f3708aed8b1c2c3d381 100644 (file)
@@ -34,8 +34,11 @@ public:
     virtual const char* stringify() = 0;
     unsigned get() { return ++ref_count; }
     unsigned put() { return --ref_count; }
+    bool is_complete() { return completion_status; }
+    void set_completion_status(bool status) { completion_status = status; }
 private:
     unsigned ref_count = 0;
+    bool completion_status = true;
 };
 
 class ACGetStats : public AnalyzerCommand
index d4ba8f0b2c68633a2823428094a09b5c8696b881..170b48e6b52229ccb8ca03d732e436f846caadd6 100644 (file)
@@ -310,6 +310,8 @@ SnortConfig::~SnortConfig()
     delete daq_config;
     delete proto_ref;
 
+    reload_managers.clear();
+
     trim_heap();
 }
 
@@ -1084,3 +1086,13 @@ void SnortConfig::set_conf(SnortConfig* sc)
     }
 }
 
+SO_PUBLIC bool SnortConfig::register_reload_memcap_manager(ReloadMemcapManager *memcap_manager)
+{
+    reload_managers.push_back(memcap_manager);
+    return true;
+}
+
+std::list<ReloadMemcapManager *> SnortConfig::get_reload_memcap_managers()
+{
+    return reload_managers;
+}
index f66584968a60f563b4750bc525f9cd283b64e578..580c7ce9e6e00fb77cb293ecdec9362e83a06c31 100644 (file)
@@ -31,6 +31,8 @@
 #include "main/thread.h"
 #include "sfip/sf_cidr.h"
 
+#include <list>
+
 #define DEFAULT_LOG_DIR "."
 
 enum RunFlag
@@ -148,12 +150,16 @@ class ProtocolReference;
 struct GHash;
 struct XHash;
 
+class ReloadMemcapManager;
+
 struct SnortConfig;
 typedef void (* ScScratchFunc)(SnortConfig* sc);
 
 struct SnortConfig
 {
 private:
+    std::list<ReloadMemcapManager *> reload_managers;
+
     void init(const SnortConfig* const, ProtocolReference*);
     bool verify_stream_inspectors();
 
@@ -164,6 +170,9 @@ public:
 
     SnortConfig(const SnortConfig&) = delete;
 
+    SO_PUBLIC bool register_reload_memcap_manager(ReloadMemcapManager *);
+    std::list<ReloadMemcapManager *> get_reload_memcap_managers();
+
     void setup();
     void post_setup();
     bool verify();
index 19eb7f09e54ab9f5f4b082c481834bec280caa75..62c2dbb0f9e24209527415b5c7918a0343fe1a69 100644 (file)
@@ -10,6 +10,7 @@ add_subdirectory(file)
 add_subdirectory(test)
 
 set (STREAM_INCLUDES
+    flush_bucket.h
     paf.h
     stream.h
     stream_splitter.h