From: Shravan Rangarajuvenkata (shrarang) Date: Fri, 28 Feb 2020 21:18:07 +0000 (+0000) Subject: Merge pull request #2010 in SNORT/snort3 from ~SATHIRKA/snort3:navl_reload_multithrea... X-Git-Tag: 3.0.0-269~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0d9ed0813510dd073375a0aec248b2ff1e2d0d7;p=thirdparty%2Fsnort3.git Merge pull request #2010 in SNORT/snort3 from ~SATHIRKA/snort3:navl_reload_multithread to master Squashed commit of the following: commit 481482201b9e05af0fed08f8cec583c001e52f5b Author: Sreeja Athirkandathil Narayanan Date: Thu Feb 13 14:14:58 2020 -0500 appid: Support third-party reload when snort is running with multiple packet threads --- diff --git a/src/network_inspectors/appid/appid_inspector.cc b/src/network_inspectors/appid/appid_inspector.cc index 59252e68e..d77593751 100644 --- a/src/network_inspectors/appid/appid_inspector.cc +++ b/src/network_inspectors/appid/appid_inspector.cc @@ -152,6 +152,10 @@ void AppIdInspector::tinit() LuaDetectorManager::initialize(*ctxt); AppIdServiceState::initialize(config->memcap); appidDebug = new AppIdDebug(); + assert(!tp_appid_thread_ctxt); + tp_appid_thread_ctxt = ctxt->get_tp_appid_ctxt(); + if (tp_appid_thread_ctxt) + tp_appid_thread_ctxt->tinit(); if (ctxt->config.log_all_sessions) appidDebug->set_enabled(true); } @@ -175,20 +179,6 @@ void AppIdInspector::eval(Packet* p) Profile profile(appid_perf_stats); appid_stats.packets++; - ThirdPartyAppIdContext* tp_appid_ctxt = ctxt->get_tp_appid_ctxt(); - if (tp_appid_thread_ctxt != tp_appid_ctxt) - { - if (tp_appid_thread_ctxt) - { - tp_appid_thread_ctxt->tfini(); - - // FIXIT-H: Assuming one packet thread - delete tp_appid_thread_ctxt; - } - tp_appid_ctxt->tinit(); - tp_appid_thread_ctxt = tp_appid_ctxt; - } - if (p->flow) { AppIdDiscovery::do_application_discovery(p, *this, tp_appid_thread_ctxt); diff --git a/src/network_inspectors/appid/appid_module.cc b/src/network_inspectors/appid/appid_module.cc index b3a304c70..070a5275e 100644 --- a/src/network_inspectors/appid/appid_module.cc +++ b/src/network_inspectors/appid/appid_module.cc @@ -128,6 +128,38 @@ bool AcAppIdDebug::execute(Analyzer&, void**) return true; } +class ACThirdPartyAppIdContextSwap : public AnalyzerCommand +{ +public: + bool execute(Analyzer&, void**) override; + ACThirdPartyAppIdContextSwap(ThirdPartyAppIdContext* tp_ctxt): tp_ctxt(tp_ctxt) { } + ~ACThirdPartyAppIdContextSwap() override; + const char* stringify() override { return "THIRD-PARTY_CONTEXT_SWAP"; } +private: + ThirdPartyAppIdContext* tp_ctxt = nullptr; +}; + +bool ACThirdPartyAppIdContextSwap::execute(Analyzer&, void**) +{ + assert(tp_appid_thread_ctxt); + AppIdInspector* inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME, true); + ThirdPartyAppIdContext* tp_appid_ctxt = inspector->get_ctxt().get_tp_appid_ctxt(); + assert(tp_appid_thread_ctxt != tp_appid_ctxt); + LogMessage("== swapping third-party configuration\n"); + tp_appid_thread_ctxt->tfini(); + tp_appid_ctxt->tinit(); + tp_appid_thread_ctxt = tp_appid_ctxt; + + return true; +} + +ACThirdPartyAppIdContextSwap::~ACThirdPartyAppIdContextSwap() +{ + delete tp_ctxt; + Swapper::set_reload_in_progress(false); + LogMessage("== reload third-party complete\n"); +} + static int enable_debug(lua_State* L) { int proto = luaL_optint(L, 1, 0); @@ -177,20 +209,18 @@ static int reload_third_party(lua_State*) LogMessage("== reload pending; retry\n"); return 0; } - - if (ThreadConfig::get_instance_max() != 1) - LogMessage("Third-party reload not supported with more than one packet thread."); - else + Swapper::set_reload_in_progress(true); + LogMessage(".. reloading third-party\n"); + AppIdInspector* inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME, true); + AppIdContext& ctxt = inspector->get_ctxt(); + ThirdPartyAppIdContext* old_ctxt = ctxt.get_tp_appid_ctxt(); + if (!old_ctxt) { - Swapper::set_reload_in_progress(true); - LogMessage(".. reloading third-party\n"); - AppIdInspector* inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME, true); - AppIdContext& ctxt = inspector->get_ctxt(); - ctxt.create_tp_appid_ctxt(); - Swapper::set_reload_in_progress(false); - LogMessage("== reload third-party complete\n"); + LogMessage("== reload third-party failed - third-party module doesn't exist\n"); + return 0; } - + ctxt.create_tp_appid_ctxt(); + main_broadcast_command(new ACThirdPartyAppIdContextSwap(old_ctxt), true); return 0; }