From 636fb8d387b7da46f6a67434458d410390b5a3fd Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Tue, 19 Mar 2019 11:41:41 +0100 Subject: [PATCH] mpm: track maxdepth Track max depth setting per MpmCtx. To make sure the data structure doesn't increase in size change global bool to use a flags field. --- src/detect-engine-mpm.c | 2 +- src/util-mpm.c | 23 +++++++++++++++++------ src/util-mpm.h | 16 ++++++++++------ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/detect-engine-mpm.c b/src/detect-engine-mpm.c index 41c1c00e83..282ed9d33c 100644 --- a/src/detect-engine-mpm.c +++ b/src/detect-engine-mpm.c @@ -863,7 +863,7 @@ static void MpmStoreFreeFunc(void *ptr) { MpmStore *ms = ptr; if (ms != NULL) { - if (ms->mpm_ctx != NULL && !ms->mpm_ctx->global) + if (ms->mpm_ctx != NULL && !(ms->mpm_ctx->flags & MPMCTX_FLAGS_GLOBAL)) { SCLogDebug("destroying mpm_ctx %p", ms->mpm_ctx); mpm_table[ms->mpm_ctx->mpm_type].DestroyCtx(ms->mpm_ctx); diff --git a/src/util-mpm.c b/src/util-mpm.c index bae22d571f..f1b0b57329 100644 --- a/src/util-mpm.c +++ b/src/util-mpm.c @@ -79,7 +79,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(item[0].mpm_ctx_ts, 0, sizeof(MpmCtx)); - item[0].mpm_ctx_ts->global = 1; + item[0].mpm_ctx_ts->flags |= MPMCTX_FLAGS_GLOBAL; /* toclient */ item[0].mpm_ctx_tc = SCMalloc(sizeof(MpmCtx)); @@ -88,7 +88,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(item[0].mpm_ctx_tc, 0, sizeof(MpmCtx)); - item[0].mpm_ctx_tc->global = 1; + item[0].mpm_ctx_tc->flags |= MPMCTX_FLAGS_GLOBAL; /* our id starts from 0 always. Helps us with the ctx retrieval from * the array */ @@ -113,7 +113,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(items[i].mpm_ctx_ts, 0, sizeof(MpmCtx)); - items[i].mpm_ctx_ts->global = 1; + items[i].mpm_ctx_ts->flags |= MPMCTX_FLAGS_GLOBAL; } if (items[i].mpm_ctx_tc == NULL) { items[i].mpm_ctx_tc = SCMalloc(sizeof(MpmCtx)); @@ -122,7 +122,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(items[i].mpm_ctx_tc, 0, sizeof(MpmCtx)); - items[i].mpm_ctx_tc->global = 1; + items[i].mpm_ctx_tc->flags |= MPMCTX_FLAGS_GLOBAL; } return items[i].id; } @@ -151,7 +151,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(new_item[0].mpm_ctx_ts, 0, sizeof(MpmCtx)); - new_item[0].mpm_ctx_ts->global = 1; + new_item[0].mpm_ctx_ts->flags |= MPMCTX_FLAGS_GLOBAL; /* toclient */ new_item[0].mpm_ctx_tc = SCMalloc(sizeof(MpmCtx)); @@ -160,7 +160,7 @@ int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *nam exit(EXIT_FAILURE); } memset(new_item[0].mpm_ctx_tc, 0, sizeof(MpmCtx)); - new_item[0].mpm_ctx_tc->global = 1; + new_item[0].mpm_ctx_tc->flags |= MPMCTX_FLAGS_GLOBAL; new_item[0].id = de_ctx->mpm_ctx_factory_container->no_of_items; de_ctx->mpm_ctx_factory_container->no_of_items++; @@ -556,6 +556,17 @@ int MpmAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, mpm_ctx->pattern_cnt++; + if (!(mpm_ctx->flags & MPMCTX_FLAGS_NODEPTH)) { + if (depth) { + mpm_ctx->maxdepth = MAX(mpm_ctx->maxdepth, depth); + SCLogDebug("%p: depth %u max %u", mpm_ctx, depth, mpm_ctx->maxdepth); + } else { + mpm_ctx->flags |= MPMCTX_FLAGS_NODEPTH; + mpm_ctx->maxdepth = 0; + SCLogDebug("%p: alas, no depth for us", mpm_ctx); + } + } + if (mpm_ctx->maxlen < patlen) mpm_ctx->maxlen = patlen; diff --git a/src/util-mpm.h b/src/util-mpm.h index e8a22cbf08..a47a9cf2e1 100644 --- a/src/util-mpm.h +++ b/src/util-mpm.h @@ -79,15 +79,19 @@ typedef struct MpmPattern_ { struct MpmPattern_ *next; } MpmPattern; +/* Indicates if this a global mpm_ctx. Global mpm_ctx is the one that + * is instantiated when we use "single". Non-global is "full", i.e. + * one per sgh. */ +#define MPMCTX_FLAGS_GLOBAL BIT_U8(0) +#define MPMCTX_FLAGS_NODEPTH BIT_U8(1) + typedef struct MpmCtx_ { void *ctx; - uint16_t mpm_type; + uint8_t mpm_type; + + uint8_t flags; - /* Indicates if this a global mpm_ctx. Global mpm_ctx is the one that - * is instantiated when we use "single". Non-global is "full", i.e. - * one per sgh. We are using a uint16_t here to avoiding using a pad. - * You can use a uint8_t here as well. */ - uint16_t global; + uint16_t maxdepth; /* unique patterns */ uint32_t pattern_cnt;