]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #267 in SNORT/snort3 from perfmon to master
authorRuss Combs (rucombs) <rucombs@cisco.com>
Tue, 16 Feb 2016 19:48:22 +0000 (14:48 -0500)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Tue, 16 Feb 2016 19:48:22 +0000 (14:48 -0500)
Squashed commit of the following:

commit f1eade234d514397a8d784232eb99d589a84585c
Author: Carter Waxman <cwaxman@cisco.com>
Date:   Tue Feb 16 14:06:43 2016 -0500

    fixed minimum time on perfmon to disallow 0 seconds

commit d3099e71110bf8e4571b45a09d1d9e555d731200
Author: Carter Waxman <cwaxman@cisco.com>
Date:   Mon Feb 15 15:56:42 2016 -0500

    fixed threadlocal init. fixed include. fixed ranged based for looping.

commit 1d7a5bcd8331399d48aa1ad44a57bcbc5d798add
Author: Carter Waxman <cwaxman@cisco.com>
Date:   Mon Feb 15 13:09:50 2016 -0500

    allow perfmon to dump when no traffic is present

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

index 28c4a7f43f040b8e2adc6147a0d1fe4ccef00ec3..d4f54e9b3bac8429e9b36d9ba66e516eb84b4be6 100644 (file)
@@ -607,6 +607,7 @@ void Snort::thread_idle()
 {
     if ( flow_con )
         flow_con->timeout_flows(16384, time(NULL));
+    perf_monitor_idle_process();
     aux_counts.idle++;
 }
 
index 4274d135f2f929685ba9ca7d5c38dec4debf75c3..a9e02e3aeb48f925400aeed33808cfa890fe9de6 100644 (file)
@@ -49,8 +49,8 @@ static const Parameter s_params[] =
     { "packets", Parameter::PT_INT, "0:", "10000",
       "minimum packets to report" },
 
-    { "seconds", Parameter::PT_INT, "0:", "60",
-      "report interval; 0 means report at exit only" },
+    { "seconds", Parameter::PT_INT, "1:", "60",
+      "report interval" },
 
     { "flow_ip_memcap", Parameter::PT_INT, "8200:", "52428800",
       "maximum memory for flow tracking" },
index 993698f5ee588e54c28edc8a0b69f48dfaa1b1cb..762e5e866df1d353ef2b2d4182a7228c447a5b24 100644 (file)
@@ -87,6 +87,8 @@ public:
     void tterm() override;
 };
 
+static THREAD_LOCAL PerfMonitor* this_perf_monitor;
+
 PerfMonitor::PerfMonitor(PerfMonModule* mod)
 {
     mod->get_config(config);
@@ -165,16 +167,18 @@ void PerfMonitor::tinit()
     if (config.perf_flags & SFPERF_EVENT)
         trackers->push_back(perf_event = new EventTracker(&config));
 
-    for (unsigned int i = 0; i < trackers->size(); i++)
-        trackers->at(i)->open(true);
+    for (auto& tracker : *trackers)
+        tracker->open(true);
 
     //FIXIT-M: move this
 #ifdef LINUX_SMP
     sfInitProcPidStats(&(sfBase.sfProcPidStats));
 #endif
 
-    for (unsigned int i = 0; i < trackers->size(); i++)
-        trackers->at(i)->reset();
+    for (auto& tracker : *trackers)
+        tracker->reset();
+
+    this_perf_monitor = this;
 }
 
 void PerfMonitor::tterm()
@@ -221,42 +225,62 @@ void PerfMonitor::eval(Packet* p)
 
     if (IsSetRotatePerfFileFlag())
     {
-        for (unsigned int i = 0; i < trackers->size(); i++)
-            trackers->at(i)->rotate();
+        for (auto& tracker : *trackers)
+            tracker->rotate();
         ClearRotatePerfFileFlag();
     }
 
-    for (unsigned int i = 0; i < trackers->size(); i++)
-        trackers->at(i)->update(p);
+    if (p)
+    {
+        for (auto& tracker : *trackers)
+            tracker->update(p);
+    }
 
-    if ((config.perf_flags & SFPERF_TIME_COUNT) && !p->is_rebuilt())
+    if (!p || ((config.perf_flags & SFPERF_TIME_COUNT) && !p->is_rebuilt()))
     {
         if (ready_to_process(p))
         {
-            for (unsigned int i = 0; i < trackers->size(); i++)
+            for (auto& tracker : *trackers)
             {
-                trackers->at(i)->process(false);
-                trackers->at(i)->auto_rotate();
+                tracker->process(false);
+                tracker->auto_rotate();
             }
         }
     }
-    ++pmstats.total_packets;
+
+    if (p)
+        ++pmstats.total_packets;
+}
+
+//FIXIT-M uncouple from Snort class when framework permits
+void perf_monitor_idle_process()
+{
+    this_perf_monitor->eval(nullptr);
 }
 
 static bool ready_to_process(Packet* p)
 {
     static THREAD_LOCAL time_t sample_time = 0;
+    static THREAD_LOCAL time_t cur_time;
     static THREAD_LOCAL uint64_t cnt = 0;
 
-    if (sample_time == 0)
-        sample_time = p->pkth->ts.tv_sec;
+    if (p)
+    {
+        cnt++;
+        cur_time = p->pkth->ts.tv_sec;
+    }
+    else
+        cur_time = time(nullptr);
+
+    if (!sample_time)
+        sample_time = cur_time;
 
-    if ( ++cnt >= config.pkt_cnt )
+    if ( cnt >= config.pkt_cnt )
     {
-        if ((p->pkth->ts.tv_sec - sample_time) >= config.sample_interval)
+        if ((cur_time - sample_time) >= config.sample_interval)
         {
             cnt = 0;
-            sample_time = p->pkth->ts.tv_sec;
+            sample_time = cur_time;
             return true;
         }
     }
index 43af28bba0451aa2464981a4a1e031a7ddd30d80..b908d62547c77aeb35223a3bbe6a9ad00802a022 100644 (file)
@@ -70,6 +70,8 @@ typedef struct _SFPERF
 extern SFPERF* perfmon_config;
 extern THREAD_LOCAL bool perfmon_rotate_perf_file;
 
+void perf_monitor_idle_process();
+
 /* functions to set & get the RotatePerfFileFlag */
 inline void SetRotatePerfFileFlag(void)
 {