]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #1298 in SNORT/snort3 from reload_perfmon to master
authorRuss Combs (rucombs) <rucombs@cisco.com>
Mon, 2 Jul 2018 21:21:35 +0000 (17:21 -0400)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Mon, 2 Jul 2018 21:21:35 +0000 (17:21 -0400)
Squashed commit of the following:

commit 19d5460377fa2275f61ae2b9fd1b0cf18c740ada
Author: mdagon <mdagon@cisco.com>
Date:   Thu Jun 28 09:29:14 2018 -0400

    perf_monitor: fix for reload

src/network_inspectors/perf_monitor/perf_module.cc
src/network_inspectors/perf_monitor/perf_module.h
src/network_inspectors/perf_monitor/perf_monitor.cc

index 6a3eb6dcc230cc126e268e13c4ea272a20e5e130..710c6afb91be99aadd6dcac98cf556cfb923b0da 100644 (file)
@@ -102,6 +102,12 @@ PerfMonModule::PerfMonModule() :
     Module(PERF_NAME, PERF_HELP, s_params)
 { }
 
+PerfMonModule::~PerfMonModule()
+{
+    if (config)
+        delete config;
+}
+
 ProfileStats* PerfMonModule::get_profile() const
 { return &perfmonStats; }
 
@@ -111,66 +117,66 @@ bool PerfMonModule::set(const char*, Value& v, SnortConfig*)
     if ( v.is("base") )
     {
         if ( v.get_bool() )
-            config.perf_flags |= PERF_BASE;
+            config->perf_flags |= PERF_BASE;
         else
-            config.perf_flags &= ~PERF_BASE; //Clear since true by default
+            config->perf_flags &= ~PERF_BASE; //Clear since true by default
     }
     else if ( v.is("cpu") )
     {
         if ( v.get_bool() )
-            config.perf_flags |= PERF_CPU;
+            config->perf_flags |= PERF_CPU;
     }
     else if ( v.is("flow") )
     {
         if ( v.get_bool() )
-            config.perf_flags |= PERF_FLOW;
+            config->perf_flags |= PERF_FLOW;
     }
     else if ( v.is("flow_ip") )
     {
         if ( v.get_bool() )
-            config.perf_flags |= PERF_FLOWIP;
+            config->perf_flags |= PERF_FLOWIP;
     }
     else if ( v.is("packets") )
     {
-        config.pkt_cnt = v.get_long();
+        config->pkt_cnt = v.get_long();
     }
     else if ( v.is("seconds") )
     {
-        config.sample_interval = v.get_long();
-        if ( config.sample_interval == 0 )
-            config.perf_flags |= PERF_SUMMARY;
+        config->sample_interval = v.get_long();
+        if ( config->sample_interval == 0 )
+            config->perf_flags |= PERF_SUMMARY;
     }
     else if ( v.is("flow_ip_memcap") )
     {
-        config.flowip_memcap = v.get_long();
+        config->flowip_memcap = v.get_long();
     }
     else if ( v.is("max_file_size") )
-        config.max_file_size = v.get_long() - ROLLOVER_THRESH;
+        config->max_file_size = v.get_long() - ROLLOVER_THRESH;
 
     else if ( v.is("flow_ports") )
     {
-        config.flow_max_port_to_track = v.get_long();
+        config->flow_max_port_to_track = v.get_long();
     }
     else if ( v.is("output") )
     {
-        config.output = (PerfOutput)v.get_long();
+        config->output = (PerfOutput)v.get_long();
     }
     else if ( v.is("format") )
     {
-        config.format = (PerfFormat)v.get_long();
+        config->format = (PerfFormat)v.get_long();
     }
     else if ( v.is("name") )
     {
-        config.modules.back().set_name(v.get_string());
+        config->modules.back().set_name(v.get_string());
     }
     else if ( v.is("pegs") )
     {
-        config.modules.back().set_peg_names(v);
+        config->modules.back().set_peg_names(v);
     }
     else if ( v.is("summary") )
     {
         if ( v.get_bool() )
-            config.perf_flags |= PERF_SUMMARY;
+            config->perf_flags |= PERF_SUMMARY;
     }
     else if ( v.is("modules") )
     {
@@ -184,8 +190,13 @@ bool PerfMonModule::set(const char*, Value& v, SnortConfig*)
 
 bool PerfMonModule::begin(const char* fqn, int idx, SnortConfig*)
 {
+    if (strcmp(fqn, "perf_monitor") == 0)
+    {
+        assert(config == nullptr);
+        config = new PerfConfig;
+    }
     if ( idx != 0 && strcmp(fqn, "perf_monitor.modules") == 0 )
-        config.modules.push_back(ModuleConfig());
+        config->modules.push_back(ModuleConfig());
 
     return true;
 }
@@ -193,13 +204,17 @@ bool PerfMonModule::begin(const char* fqn, int idx, SnortConfig*)
 bool PerfMonModule::end(const char* fqn, int idx, SnortConfig*)
 {
     if ( idx != 0 && strcmp(fqn, "perf_monitor.modules") == 0 )
-        return config.modules.back().confirm_parse();
+        return config->modules.back().confirm_parse();
 
     return true;
 }
 
-PerfConfig& PerfMonModule::get_config()
-{ return config; }
+PerfConfig* PerfMonModule::get_config()
+{ 
+    PerfConfig* tmp = config;
+    config = nullptr;
+    return tmp; 
+}
 
 const PegInfo* PerfMonModule::get_pegs() const
 { return snort::simple_pegs; }
index 7b134368c3d602bea20ced401ec9de0ba1082a6c..5442b788e6de45807f5c5faf4f51483800bf4fe6 100644 (file)
@@ -94,6 +94,7 @@ class PerfMonModule : public snort::Module
 {
 public:
     PerfMonModule();
+    ~PerfMonModule() override;
 
     bool set(const char*, snort::Value&, snort::SnortConfig*) override;
     bool begin(const char*, int, snort::SnortConfig*) override;
@@ -103,13 +104,16 @@ public:
     PegCount* get_counts() const override;
     snort::ProfileStats* get_profile() const override;
 
-    PerfConfig& get_config();
+    PerfConfig* get_config();
+#ifdef UNIT_TEST
+    void set_config(PerfConfig* ptr) { config = ptr; }
+#endif
 
     Usage get_usage() const override
     { return GLOBAL; }
 
 private:
-    PerfConfig config;
+    PerfConfig* config = nullptr;
 };
 
 extern THREAD_LOCAL SimpleStats pmstats;
index 212c65a5912fa5a599616cb52157aab19a578e3c..89dde481e299eeb7ac4a8a6f6e0e0ab66d6a31cc 100644 (file)
@@ -59,7 +59,8 @@ class FlowIPDataHandler;
 class PerfMonitor : public Inspector
 {
 public:
-    PerfMonitor(PerfMonModule*);
+    PerfMonitor(PerfConfig*);
+    ~PerfMonitor() override { delete config;}
 
     bool configure(SnortConfig*) override;
     void show(SnortConfig*) override;
@@ -75,7 +76,7 @@ public:
     FlowIPTracker* get_flow_ip();
 
 private:
-    PerfConfig& config;
+    PerfConfig* const config;
     FlowIPTracker* flow_ip_tracker = nullptr;
     FlowIPDataHandler* flow_ip_handler = nullptr;
 
@@ -141,36 +142,36 @@ private:
     PerfMonitor& perf_monitor;
 };
 
-PerfMonitor::PerfMonitor(PerfMonModule* mod) : config(mod->get_config())
-{ }
+PerfMonitor::PerfMonitor(PerfConfig* pcfg) : config(pcfg)
+{ assert (config != nullptr); }
 
 void PerfMonitor::show(SnortConfig*)
 {
     LogMessage("PerfMonitor config:\n");
-    LogMessage("  Sample Time:      %d seconds\n", config.sample_interval);
-    LogMessage("  Packet Count:     %d\n", config.pkt_cnt);
-    LogMessage("  Max File Size:    " STDu64 "\n", config.max_file_size);
+    LogMessage("  Sample Time:      %d seconds\n", config->sample_interval);
+    LogMessage("  Packet Count:     %d\n", config->pkt_cnt);
+    LogMessage("  Max File Size:    " STDu64 "\n", config->max_file_size);
     LogMessage("  Summary Mode:     %s\n",
-        (config.perf_flags & PERF_SUMMARY) ? "ACTIVE" : "INACTIVE");
+        (config->perf_flags & PERF_SUMMARY) ? "ACTIVE" : "INACTIVE");
     LogMessage("  Base Stats:       %s\n",
-        (config.perf_flags & PERF_BASE) ? "ACTIVE" : "INACTIVE");
+        (config->perf_flags & PERF_BASE) ? "ACTIVE" : "INACTIVE");
     LogMessage("  Flow Stats:       %s\n",
-        (config.perf_flags & PERF_FLOW) ? "ACTIVE" : "INACTIVE");
-    if (config.perf_flags & PERF_FLOW)
+        (config->perf_flags & PERF_FLOW) ? "ACTIVE" : "INACTIVE");
+    if (config->perf_flags & PERF_FLOW)
     {
-        LogMessage("    Max Flow Port:    %u\n", config.flow_max_port_to_track);
+        LogMessage("    Max Flow Port:    %u\n", config->flow_max_port_to_track);
     }
     LogMessage("  Event Stats:      %s\n",
-        (config.perf_flags & PERF_EVENT) ? "ACTIVE" : "INACTIVE");
+        (config->perf_flags & PERF_EVENT) ? "ACTIVE" : "INACTIVE");
     LogMessage("  Flow IP Stats:    %s\n",
-        (config.perf_flags & PERF_FLOWIP) ? "ACTIVE" : "INACTIVE");
-    if (config.perf_flags & PERF_FLOWIP)
+        (config->perf_flags & PERF_FLOWIP) ? "ACTIVE" : "INACTIVE");
+    if (config->perf_flags & PERF_FLOWIP)
     {
-        LogMessage("    Flow IP Memcap:   %u\n", config.flowip_memcap);
+        LogMessage("    Flow IP Memcap:   %u\n", config->flowip_memcap);
     }
     LogMessage("  CPU Stats:    %s\n",
-        (config.perf_flags & PERF_CPU) ? "ACTIVE" : "INACTIVE");
-    switch ( config.output )
+        (config->perf_flags & PERF_CPU) ? "ACTIVE" : "INACTIVE");
+    switch ( config->output )
     {
         case PerfOutput::TO_CONSOLE:
             LogMessage("    Output Location:  console\n");
@@ -179,7 +180,7 @@ void PerfMonitor::show(SnortConfig*)
             LogMessage("    Output Location:  file\n");
             break;
     }
-    switch(config.format)
+    switch(config->format)
     {
         case PerfFormat::TEXT:
             LogMessage("    Output Format:  text\n");
@@ -225,30 +226,30 @@ bool PerfMonitor::configure(SnortConfig*)
     new PerfIdleHandler(*this);
     new PerfRotateHandler(*this);
 
-    if ( config.perf_flags & PERF_FLOWIP )
+    if ( config->perf_flags & PERF_FLOWIP )
         flow_ip_handler = new FlowIPDataHandler(*this);
 
-    return config.resolve();
+    return config->resolve();
 }
 
 void PerfMonitor::tinit()
 {
     trackers = new std::vector<PerfTracker*>();
 
-    if (config.perf_flags & PERF_BASE)
-        trackers->push_back(new BaseTracker(&config));
+    if (config->perf_flags & PERF_BASE)
+        trackers->push_back(new BaseTracker(config));
 
-    if (config.perf_flags & PERF_FLOW)
-        trackers->push_back(new FlowTracker(&config));
+    if (config->perf_flags & PERF_FLOW)
+        trackers->push_back(new FlowTracker(config));
 
-    if (config.perf_flags & PERF_FLOWIP)
+    if (config->perf_flags & PERF_FLOWIP)
     {
-        flow_ip_tracker = new FlowIPTracker(&config);
+        flow_ip_tracker = new FlowIPTracker(config);
         trackers->push_back(flow_ip_tracker);
     }
 
-    if (config.perf_flags & PERF_CPU )
-        trackers->push_back(new CPUTracker(&config));
+    if (config->perf_flags & PERF_CPU )
+        trackers->push_back(new CPUTracker(config));
 
     for (unsigned i = 0; i < trackers->size(); i++)
     {
@@ -267,7 +268,7 @@ void PerfMonitor::tterm()
         while (!trackers->empty())
         {
             auto back = trackers->back();
-            if ( config.perf_flags & PERF_SUMMARY )
+            if ( config->perf_flags & PERF_SUMMARY )
                 back->process(true);
             delete back;
             trackers->pop_back();
@@ -296,7 +297,7 @@ void PerfMonitor::eval(Packet* p)
         }
     }
 
-    if ( (!p || !p->is_rebuilt()) && !(config.perf_flags & PERF_SUMMARY) )
+    if ( (!p || !p->is_rebuilt()) && !(config->perf_flags & PERF_SUMMARY) )
     {
         if (ready_to_process(p))
         {
@@ -335,9 +336,9 @@ bool PerfMonitor::ready_to_process(Packet* p)
     if (!sample_time)
         sample_time = cur_time;
 
-    if ( cnt >= config.pkt_cnt )
+    if ( cnt >= config->pkt_cnt )
     {
-        if ((cur_time - sample_time) >= config.sample_interval)
+        if ((cur_time - sample_time) >= config->sample_interval)
         {
             cnt = 0;
             sample_time = cur_time;
@@ -361,7 +362,7 @@ static void mod_dtor(Module* m)
 { delete m; }
 
 static Inspector* pm_ctor(Module* m)
-{ return new PerfMonitor((PerfMonModule*)m); }
+{ return new PerfMonitor(((PerfMonModule*)m)->get_config()); }
 
 static void pm_dtor(Inspector* p)
 { delete p; }
@@ -407,30 +408,31 @@ const BaseApi* nin_perf_monitor[] =
 #ifdef UNIT_TEST
 TEST_CASE("Process timing logic", "[perfmon]")
 {
-    PerfMonModule mod;
-    PerfConfig& config = mod.get_config();
-    PerfMonitor perfmon(&mod);
+    PerfMonModule mod; 
+    PerfConfig* config = new PerfConfig;
+    mod.set_config(config);
+    PerfMonitor perfmon(mod.get_config());
 
     Packet p(false);
     DAQ_PktHdr_t pkth;
     p.pkth = &pkth;
 
-    config.pkt_cnt = 0;
-    config.sample_interval = 0;
+    config->pkt_cnt = 0;
+    config->sample_interval = 0;
     pkth.ts.tv_sec = 0;
     REQUIRE((perfmon.ready_to_process(&p) == true));
     pkth.ts.tv_sec = 1;
     REQUIRE((perfmon.ready_to_process(&p) == true));
 
-    config.pkt_cnt = 2;
-    config.sample_interval = 0;
+    config->pkt_cnt = 2;
+    config->sample_interval = 0;
     pkth.ts.tv_sec = 2;
     REQUIRE((perfmon.ready_to_process(&p) == false));
     pkth.ts.tv_sec = 3;
     REQUIRE((perfmon.ready_to_process(&p) == true));
 
-    config.pkt_cnt = 0;
-    config.sample_interval = 2;
+    config->pkt_cnt = 0;
+    config->sample_interval = 2;
     pkth.ts.tv_sec = 4;
     REQUIRE((perfmon.ready_to_process(&p) == false));
     pkth.ts.tv_sec = 8;
@@ -438,8 +440,8 @@ TEST_CASE("Process timing logic", "[perfmon]")
     pkth.ts.tv_sec = 10;
     REQUIRE((perfmon.ready_to_process(&p) == true));
 
-    config.pkt_cnt = 5;
-    config.sample_interval = 4;
+    config->pkt_cnt = 5;
+    config->sample_interval = 4;
     pkth.ts.tv_sec = 11;
     REQUIRE((perfmon.ready_to_process(&p) == false));
     pkth.ts.tv_sec = 14;