diff options
author | Patrick McHardy <kaber@trash.net> | 2016-03-26 10:04:48 +0000 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2016-04-24 21:51:31 +0100 |
commit | 3b219e5dd3a558228d67d97e0e2ac3e94c88df92 (patch) | |
tree | 26eb77c8be3c4720a9a858328fbe5931841edc94 /src/payload.c | |
parent | 3b79cab7eb64df9922922eed76a37c93cf207417 (diff) |
payload: move payload depedency tracking to payload.c
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/payload.c')
-rw-r--r-- | src/payload.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/payload.c b/src/payload.c index 45a2ba21..9dca56be 100644 --- a/src/payload.c +++ b/src/payload.c @@ -322,6 +322,50 @@ int exthdr_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, } /** + * payload_dependency_store - store a possibly redundant protocol match + * + * @ctx: payload dependency context + * @stmt: payload match + * @base: base of payload match + */ +void payload_dependency_store(struct payload_dep_ctx *ctx, + struct stmt *stmt, enum proto_bases base) +{ + ctx->pbase = base + 1; + ctx->pdep = stmt; +} + +/** + * __payload_dependency_kill - kill a redundant payload depedency + * + * @ctx: payload dependency context + * @expr: higher layer payload expression + * + * Kill a redundant payload expression if a higher layer payload expression + * implies its existance. + */ +void __payload_dependency_kill(struct payload_dep_ctx *ctx, + enum proto_bases base) +{ + if (ctx->pbase != PROTO_BASE_INVALID && + ctx->pbase == base && + ctx->pdep != NULL) { + list_del(&ctx->pdep->list); + stmt_free(ctx->pdep); + + ctx->pbase = PROTO_BASE_INVALID; + if (ctx->pdep == ctx->prev) + ctx->prev = NULL; + ctx->pdep = NULL; + } +} + +void payload_dependency_kill(struct payload_dep_ctx *ctx, struct expr *expr) +{ + __payload_dependency_kill(ctx, expr->payload.base); +} + +/** * payload_expr_complete - fill in type information of a raw payload expr * * @expr: the payload expression |