From: Victor Julien Date: Fri, 30 Jan 2015 14:04:38 +0000 (+0100) Subject: detect: select detect engine at Detect entry X-Git-Tag: suricata-3.0RC1~218 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ff6d3dcfd9c61e320fd83d3cdbec371de286722;p=thirdparty%2Fsuricata.git detect: select detect engine at Detect entry Limited to Pcap only currently. --- diff --git a/src/detect-engine.c b/src/detect-engine.c index 4e167f0613..3d5adde9fe 100644 --- a/src/detect-engine.c +++ b/src/detect-engine.c @@ -1683,6 +1683,11 @@ void DetectEngineMultiTenantSetup(void) master->multi_tenant_enabled ? "enabled" : "disabled"); } +uint32_t DetectEngineTentantGetIdFromPcap(DetectEngineThreadCtx *det_ctx, const Packet *p) +{ + return p->pcap_v.tenant_id; +} + DetectEngineCtx *DetectEngineGetByTenantId(int tenant_id) { DetectEngineMasterCtx *master = &g_master_de_ctx; diff --git a/src/detect-engine.h b/src/detect-engine.h index 70f5f1f758..42c4bef589 100644 --- a/src/detect-engine.h +++ b/src/detect-engine.h @@ -86,6 +86,8 @@ int DetectEngineReloadIsStart(void); void DetectEngineReloadSetDone(void); int DetectEngineReloadIsDone(void); +/* TODO move elsewhere? */ +uint32_t DetectEngineTentantGetIdFromPcap(DetectEngineThreadCtx *, const Packet *p); /** * \brief Registers an app inspection engine. diff --git a/src/detect.c b/src/detect.c index 66de27ac6c..906f79bc87 100644 --- a/src/detect.c +++ b/src/detect.c @@ -1983,13 +1983,18 @@ TmEcode Detect(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq, PacketQue goto error; } - det_ctx = det_ctx->mt_det_ctxs[1]; - BUG_ON(det_ctx == NULL); - de_ctx = det_ctx->de_ctx; - BUG_ON(de_ctx == NULL); - if (SC_ATOMIC_GET(det_ctx->so_far_used_by_detect) == 0) { - (void)SC_ATOMIC_SET(det_ctx->so_far_used_by_detect, 1); - SCLogDebug("MT de_ctx %p det_ctx %p", de_ctx, det_ctx); + uint32_t tenant_id = DetectEngineTentantGetIdFromPcap(det_ctx, p); + if (tenant_id > 0 && tenant_id < det_ctx->mt_det_ctxs_cnt) { + det_ctx = det_ctx->mt_det_ctxs[tenant_id]; + BUG_ON(det_ctx == NULL); + de_ctx = det_ctx->de_ctx; + BUG_ON(de_ctx == NULL); + if (SC_ATOMIC_GET(det_ctx->so_far_used_by_detect) == 0) { + (void)SC_ATOMIC_SET(det_ctx->so_far_used_by_detect, 1); + SCLogDebug("MT de_ctx %p det_ctx %p (tenant %u)", de_ctx, det_ctx, tenant_id); + } + } else { + return TM_ECODE_OK; } }