]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #4982: main: Retry queue timeout option added
authorVivitha Thiraviam -X (vithirav - HCL TECHNOLOGIES LIMITED at Cisco) <vithirav@cisco.com>
Wed, 19 Nov 2025 20:22:33 +0000 (20:22 +0000)
committerSteve Chew (stechew) <stechew@cisco.com>
Wed, 19 Nov 2025 20:22:33 +0000 (20:22 +0000)
Merge in SNORT/snort3 from ~VITHIRAV/snort3:retry_queue_timeout to master

Squashed commit of the following:

commit 61f65bb7adef7ce6e4b836ee07c8a62030c66fb7
Author: vithirav <vithirav@cisco.com>
Date:   Tue Nov 18 20:45:04 2025 -0800

    main: Retry queue timeout option added

src/main.cc
src/main/analyzer.cc
src/main/analyzer.h
src/main/snort_config.h
src/main/snort_module.cc
src/main/test/distill_verdict_stubs.h
src/main/test/distill_verdict_test.cc
src/parser/parser.cc

index f050f5a9c2f67618b3e596c63c2f4f67f7d6f36c..5b8b8193a2a2bde1415bdfc1bb77f1769926ea31 100644 (file)
@@ -180,7 +180,7 @@ bool Pig::prep(const char* source)
         return false;
     }
     requires_privileged_start = instance->can_start_unprivileged();
-    analyzer = new Analyzer(instance, idx, source, sc->pkt_cnt);
+    analyzer = new Analyzer(instance, idx, source, sc->pkt_cnt, sc->retry_timeout);
     analyzer->set_skip_cnt(sc->pkt_skip);
 #ifdef REG_TEST
     analyzer->set_pause_after_cnt(sc->pkt_pause_cnt);
index 39e7e1af65b390f0560c69d4cba9a1b7a1870db7..b2d9ef07f3fba82d223a266d74fff3ece7106db9 100644 (file)
@@ -104,6 +104,7 @@ class RetryQueue
 public:
     RetryQueue(unsigned interval_ms)
     {
+        LogMessage("Retry queue interval is: %u ms\n", interval_ms);
         assert(interval_ms > 0);
         interval = { static_cast<time_t>(interval_ms / 1000), static_cast<suseconds_t>((interval_ms % 1000) * 1000) };
     }
@@ -746,12 +747,12 @@ void Analyzer::term()
     TraceApi::thread_term();
 }
 
-Analyzer::Analyzer(SFDAQInstance* instance, unsigned i, const char* s, uint64_t msg_cnt) :
+Analyzer::Analyzer(SFDAQInstance* instance, unsigned i, const char* s, uint64_t msg_cnt, const uint32_t retry_timeout) :
     id(i),
     exit_after_cnt(msg_cnt),
     source(s ? s : ""),
     daq_instance(instance),
-    retry_queue(new RetryQueue(200)),
+    retry_queue(new RetryQueue(retry_timeout)),
     oops_handler(new OopsHandler())
 {
     set_state(State::NEW);
index 124ab257515e4b5dece6f3d35524b37d99e95f62..be16eb0f5581f5f0f9fcf6cd8954f288b74ba3f9 100644 (file)
@@ -81,7 +81,7 @@ public:
     static void set_main_hook(MainHook_f);
 
     Analyzer() = delete;
-    Analyzer(snort::SFDAQInstance*, unsigned id, const char* source, uint64_t msg_cnt = 0);
+    Analyzer(snort::SFDAQInstance*, unsigned id, const char* source, uint64_t msg_cnt = 0, const uint32_t retry_timeout = 200);
     ~Analyzer();
 
     void operator()(Swapper*, uint16_t run_num);
index a49e4a63cc1414b642e24371385c9dc5f2ab7c51..ab69519fb6820e1ce7dedd6c0fc8be811a4bf6c6 100644 (file)
@@ -423,7 +423,7 @@ public:
     SoRules* so_rules = nullptr;
 
     DumpConfigType dump_config_type = DUMP_CONFIG_NONE;
-
+    uint32_t retry_timeout = 200;   // Milliseconds to hold packet on retry queue.
     std::string dump_config_file;
     std::thread* config_dumper = nullptr;
 private:
index b63ac71582afee6ee37dd98f25bc7f67375d47df..24fd58b35683f46f6fe1d25e587636c601e114ab 100644 (file)
@@ -573,6 +573,9 @@ static const Parameter s_params[] =
     { "--process-all-events", Parameter::PT_IMPLIED, nullptr, nullptr,
       "process all action groups" },
 
+    { "--retry-timeout", Parameter::PT_INT, "0:max32", "200",
+      "Number of milliseconds a packet stays in the retry queue before being reexamined" },
+
     { "--rule", Parameter::PT_STRING, nullptr, nullptr,
       "<rules> to be added to configuration; may be repeated" },
 
@@ -1150,6 +1153,9 @@ bool SnortModule::set(const char*, Value& v, SnortConfig* sc)
     else if ( is(v, "--process-all-events") )
         sc->set_process_all_events(true);
 
+    else if ( is(v, "--retry-timeout") )
+        sc->retry_timeout = v.get_uint32();
+
     else if ( is(v, "--rule") )
         parser_append_rules(v.get_string());
 
index 8b177bbf48e0b42857c358cdd4e22ac6bec5603d..49278101803cb3cb8e733c3ba1e17ce0c37c5421 100644 (file)
@@ -212,7 +212,6 @@ const uint8_t* PacketManager::encode_reject(UnreachResponse, EncodeFlags, const
 void FileService::thread_init() { }
 void FileService::thread_term() { }
 void ErrorMessage(const char*,...) { }
-void LogMessage(const char*,...) { }
 [[noreturn]] void FatalError(const char*,...) { exit(-1); }
 void ParseWarning(WarningGroup, const char*, ...) { }
 void HighAvailabilityManager::thread_init() { }
index aec78f220c2259e5d8c06cabc0b3f7354d853884..3e823ddb39f53bff21345ce1d75aea604dcd7b8b 100644 (file)
@@ -59,6 +59,20 @@ unsigned DataBus::get_id(const PubKey&)
 { return 0; }
 void ThreadConfig::update_thread_status(bool) {}
 void ThreadConfig::kick_watchdog() {}
+
+// Mock the log function to copy the log message
+char captured_log[64];
+void LogMessage(const char* format, va_list& args)
+{
+    vsnprintf(captured_log, sizeof(captured_log),format, args);
+}
+void LogMessage(const char* format,...)
+{
+    va_list args;
+    va_start(args, format);
+    LogMessage(format, args);
+    va_end(args);
+}
 }
 
 const FlowCacheConfig& FlowControl::get_flow_cache_config() const
@@ -89,7 +103,7 @@ TEST_GROUP(distill_verdict_tests)
         pkt.action = &active_action;
         di = new SFDAQInstance(nullptr, 0, nullptr);
         pkt.daq_instance = di;
-        analyzer = new Analyzer(di, 0, nullptr);
+        analyzer = new Analyzer(di, 0, nullptr, 0, 40);
     }
 
     void teardown() override
@@ -185,6 +199,10 @@ TEST(distill_verdict_tests, deferred_trust_prevent_whitelist)
     mock().checkExpectations();
 }
 
+TEST(distill_verdict_tests, logmessage_verify)
+{
+   STRCMP_EQUAL(captured_log, "Retry queue interval is: 40 ms\n");
+}
 //-------------------------------------------------------------------------
 // main
 //-------------------------------------------------------------------------
index be85ca16f9b761dc1ca5bd9a8d581a1a11f409ad..910bc1f58f5836b613dd8fdadb59d1774f503244 100644 (file)
@@ -331,6 +331,7 @@ SnortConfig* ParseSnortConf(const SnortConfig* cmd_line_conf, const char* fname)
     sc->output_flags = cmd_line_conf->output_flags;
     sc->tweaks = cmd_line_conf->tweaks;
     sc->dump_config_type = cmd_line_conf->dump_config_type;
+    sc->retry_timeout = cmd_line_conf->retry_timeout;
     sc->dump_config_file = cmd_line_conf->dump_config_file;
     sc->pid_filename = cmd_line_conf->pid_filename;
     sc->max_procs = cmd_line_conf->max_procs;