From: Michael Altizer (mialtize) Date: Thu, 14 May 2020 15:31:28 +0000 (+0000) Subject: Merge pull request #2205 in SNORT/snort3 from ~MIALTIZE/snort3:instance_id to master X-Git-Tag: 3.0.1-4~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e94814ac86352993d2c50426fff1ba6ee25f5b1a;p=thirdparty%2Fsnort3.git Merge pull request #2205 in SNORT/snort3 from ~MIALTIZE/snort3:instance_id to master Squashed commit of the following: commit 1cdd68e4ecc5e72b50472b258af6a31e4137497f Author: Michael Altizer Date: Mon May 11 16:56:07 2020 -0400 daq: Configure DAQ instances with total instances and instance IDs The DAQ instances will only be explicitly configured with this information when Snort is running in multi-instance mode (-z >1). --- diff --git a/src/main.cc b/src/main.cc index 4b81d2f44..f64bd5ed9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -149,7 +149,7 @@ private: bool Pig::prep(const char* source) { SnortConfig* sc = SnortConfig::get_conf(); - SFDAQInstance *instance = new SFDAQInstance(source, sc->daq_config); + SFDAQInstance *instance = new SFDAQInstance(source, idx, sc->daq_config); if (!SFDAQ::init_instance(instance, sc->bpf_filter)) { delete instance; diff --git a/src/main/snort.cc b/src/main/snort.cc index 02e6da721..acdbb9808 100644 --- a/src/main/snort.cc +++ b/src/main/snort.cc @@ -235,7 +235,7 @@ void Snort::init(int argc, char** argv) LogMessage("%s\n", LOG_DIV); - SFDAQ::init(sc->daq_config); + SFDAQ::init(sc->daq_config, ThreadConfig::get_instance_max()); } // this function should only include initialization that must be done as a diff --git a/src/packet_io/sfdaq.cc b/src/packet_io/sfdaq.cc index 079bb12a1..a8389e749 100644 --- a/src/packet_io/sfdaq.cc +++ b/src/packet_io/sfdaq.cc @@ -212,7 +212,7 @@ static bool AddDaqModuleConfig(const SFDAQModuleConfig *dmc) return true; } -bool SFDAQ::init(const SFDAQConfig* cfg) +bool SFDAQ::init(const SFDAQConfig* cfg, unsigned total_instances) { if (!loaded) load(cfg); @@ -235,6 +235,8 @@ bool SFDAQ::init(const SFDAQConfig* cfg) daq_config_set_msg_pool_size(daqcfg, cfg->get_batch_size() * 4); daq_config_set_snaplen(daqcfg, cfg->get_mru_size()); daq_config_set_timeout(daqcfg, cfg->timeout); + if (total_instances > 1) + daq_config_set_total_instances(daqcfg, total_instances); /* If no modules were specified, try to automatically configure with the default. */ if (cfg->module_configs.empty()) diff --git a/src/packet_io/sfdaq.h b/src/packet_io/sfdaq.h index acf511ec8..d76bd0996 100644 --- a/src/packet_io/sfdaq.h +++ b/src/packet_io/sfdaq.h @@ -42,7 +42,7 @@ public: static void print_types(std::ostream&); static const char* verdict_to_string(DAQ_Verdict verdict); - static bool init(const SFDAQConfig*); + static bool init(const SFDAQConfig*, unsigned total_instances); static void term(); static bool init_instance(SFDAQInstance*, const std::string& bpf_string); diff --git a/src/packet_io/sfdaq_instance.cc b/src/packet_io/sfdaq_instance.cc index 5fcfa901e..860ed0886 100644 --- a/src/packet_io/sfdaq_instance.cc +++ b/src/packet_io/sfdaq_instance.cc @@ -36,10 +36,12 @@ using namespace snort; -SFDAQInstance::SFDAQInstance(const char* input, const SFDAQConfig* cfg) +SFDAQInstance::SFDAQInstance(const char* input, unsigned id, const SFDAQConfig* cfg) { if (input) input_spec = input; + // The Snort instance ID is 0-based while the DAQ ID is 1-based, so adjust accordingly. + instance_id = id + 1; batch_size = cfg->get_batch_size(); daq_msgs = new DAQ_Msg_h[batch_size]; } @@ -69,8 +71,11 @@ bool SFDAQInstance::init(DAQ_Config_h daqcfg, const std::string& bpf_string) char buf[256] = ""; int rval; - /* Reuse the main DAQ instance configuration with the input specification specific to this instance. */ + // Reuse the main DAQ instance configuration with the input specification specific to this + // instance. Also, configure the DAQ instance ID in the multi-instance case. daq_config_set_input(daqcfg, input_spec.c_str()); + if (daq_config_get_total_instances(daqcfg) > 0) + daq_config_set_instance_id(daqcfg, instance_id); if ((rval = daq_instance_instantiate(daqcfg, &instance, buf, sizeof(buf))) != DAQ_SUCCESS) { ErrorMessage("Couldn't construct a DAQ instance: %s (%d)\n", buf, rval); diff --git a/src/packet_io/sfdaq_instance.h b/src/packet_io/sfdaq_instance.h index e329c72f9..19027cbbe 100644 --- a/src/packet_io/sfdaq_instance.h +++ b/src/packet_io/sfdaq_instance.h @@ -39,7 +39,7 @@ struct SfIp; class SFDAQInstance { public: - SFDAQInstance(const char* intf, const SFDAQConfig*); + SFDAQInstance(const char* intf, unsigned id, const SFDAQConfig*); ~SFDAQInstance(); bool init(DAQ_Config_h, const std::string& bpf_string); @@ -87,6 +87,7 @@ private: void get_tunnel_capabilities(); std::string input_spec; + uint32_t instance_id; DAQ_Instance_h instance = nullptr; DAQ_Msg_h* daq_msgs; unsigned curr_batch_size = 0;