Squashed commit of the following:
commit
1cdd68e4ecc5e72b50472b258af6a31e4137497f
Author: Michael Altizer <mialtize@cisco.com>
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).
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;
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
return true;
}
-bool SFDAQ::init(const SFDAQConfig* cfg)
+bool SFDAQ::init(const SFDAQConfig* cfg, unsigned total_instances)
{
if (!loaded)
load(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())
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);
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];
}
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);
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);
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;