static void free_inspector(Inspector*);
static InspectSsnFunc get_session(uint16_t proto);
- static InspectorType get_type(const char* key);
SO_PUBLIC static Inspector* get_inspector(const char* key, bool dflt_only = false,
SnortConfig* sc = nullptr);
typedef std::list<ModHook*> ModuleList;
static ModuleList s_modules;
+static std::unordered_map<std::string, Module*> s_module_map;
static unsigned s_errors = 0;
std::set<uint32_t> ModuleManager::gids;
{
ModHook* mh = new ModHook(m, b);
s_modules.emplace_back(mh);
+ s_module_map[std::string(m->get_name())] = m;
Profiler::register_module(m);
Module* ModuleManager::get_module(const char* s)
{
- for ( auto p : s_modules )
- if ( !strcmp(p->mod->get_name(), s) )
- return p->mod;
-
- return nullptr;
+ return s_module_map[std::string(s)];
}
Module* ModuleManager::get_default_module(const char* s, SnortConfig* sc)
#include "log/messages.h"
#include "main/snort_config.h"
#include "managers/inspector_manager.h"
+#include "managers/module_manager.h"
#include "profiler/profiler.h"
#include "protocols/packet.h"
#include "protocols/tcp.h"
//-------------------------------------------------------------------------
// helpers
//-------------------------------------------------------------------------
+static bool is_global(const char* key)
+{
+ Module* m = ModuleManager::get_module(key);
+ return m ? m->get_usage() == Module::GLOBAL : false;
+}
static void set_session(Flow* flow, const char* key)
{
- Inspector* pin = InspectorManager::get_inspector(key);
+ Inspector* pin = InspectorManager::get_inspector(key, is_global(key));
if ( pin )
{
const char* s = SnortConfig::get_conf()->proto_ref->get_name(flow->ssn_state.snort_protocol_id);
- return InspectorManager::get_inspector(s);
+ return InspectorManager::get_inspector(s, is_global(s));
}
//-------------------------------------------------------------------------
else
key = pb->use.svc.c_str();
- if ( (pb->use.object = InspectorManager::get_inspector(key)) )
+ if ( (pb->use.object = InspectorManager::get_inspector(key, is_global(key))) )
{
- switch ( InspectorManager::get_type(key) )
+ switch ( ((Inspector*)pb->use.object)->get_api()->type )
{
case IT_STREAM: pb->use.what = BindUse::BW_STREAM; break;
case IT_WIZARD: pb->use.what = BindUse::BW_WIZARD; break;