struct PHGlobal
{
const InspectApi& api;
- bool init;
+ bool init; // call api.pinit()
PHGlobal(const InspectApi& p) : api(p)
{ init = true; };
struct PHClass
{
const InspectApi& api;
+ bool init; // call pin->tinit()
- PHClass(const InspectApi& p) : api(p) { };
- ~PHClass() { };
+ PHClass(const InspectApi& p) : api(p)
+ { init = true; };
static bool comp (PHClass* a, PHClass* b)
{ return ( a->api.type < b->api.type ); };
p->get_api()->dtor(p);
}
-InspectSsnFunc InspectorManager::get_session(const char* key)
+InspectSsnFunc InspectorManager::get_session(uint16_t proto)
{
- const InspectApi* api = get_plugin(key);
- return api ? api->ssn : nullptr;
+ for ( auto* p : s_handlers )
+ {
+ if ( p->api.type == IT_STREAM && p->api.proto_bits == proto && !p->init )
+ return p->api.ssn;
+ }
+ return nullptr;
}
//-------------------------------------------------------------------------
sc->framework_config = nullptr;
}
-static PHClass* GetClass(const char* keyword, FrameworkConfig* fc)
+static PHClass* get_class(const char* keyword, FrameworkConfig* fc)
{
for ( auto* p : fc->clist )
if ( !strcmp(p->api.base.name, keyword) )
if ( pi && pi->framework_policy )
{
for ( auto* p : pi->framework_policy->ilist )
- p->handler->tinit();
+ if ( p->pp_class.init )
+ {
+ p->handler->tinit();
+ p->pp_class.init = false;
+ }
}
}
if ( pi && pi->framework_policy )
{
for ( auto* p : pi->framework_policy->ilist )
- p->handler->tterm();
+ if ( !p->pp_class.init )
+ {
+ p->handler->tterm();
+ p->pp_class.init = true;
+ }
}
for ( auto* p : sc->framework_config->clist )
// since given api and mod
const char* keyword = api->base.name;
- PHClass* ppc = GetClass(keyword, fc);
+ PHClass* ppc = get_class(keyword, fc);
if ( !ppc )
ParseError("unknown inspector: '%s'.", keyword);
sort(fp->ilist.begin(), fp->ilist.end(), PHInstance::comp);
fp->vectorize();
- if ( fp->service.num && !fp->binder && InspectorManager::get_wizard() )
+ if ( fp->session.num && !fp->binder )
instantiate_binder(sc, fp);
return ok;
const InspectApi*, Module*, SnortConfig*, const char* name = nullptr);
static void free_inspector(Inspector*);
- static InspectSsnFunc get_session(const char* key);
+ static InspectSsnFunc get_session(uint16_t proto);
static InspectorType get_type(const char* key);
static Inspector* get_inspector(const char* key, bool dflt_only = false);
if ( config->tcp_cfg.max_sessions )
{
- if ( (f = InspectorManager::get_session("stream_tcp")) )
+ if ( (f = InspectorManager::get_session((uint16_t)PktType::TCP)) )
flow_con->init_tcp(config->tcp_cfg, f);
}
if ( config->udp_cfg.max_sessions )
{
- if ( (f = InspectorManager::get_session("stream_udp")) )
+ if ( (f = InspectorManager::get_session((uint16_t)PktType::UDP)) )
flow_con->init_udp(config->udp_cfg, f);
}
if ( config->ip_cfg.max_sessions )
{
- if ( (f = InspectorManager::get_session("stream_ip")) )
+ if ( (f = InspectorManager::get_session((uint16_t)PktType::IP)) )
flow_con->init_ip(config->ip_cfg, f);
}
if ( config->icmp_cfg.max_sessions )
{
- if ( (f = InspectorManager::get_session("stream_icmp")) )
+ if ( (f = InspectorManager::get_session((uint16_t)PktType::ICMP)) )
flow_con->init_icmp(config->icmp_cfg, f);
}
if ( config->tcp_cfg.max_sessions || config->udp_cfg.max_sessions )