diff options
author | Patrick McHardy <kaber@trash.net> | 2016-04-24 22:15:08 +0100 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2016-04-24 22:15:08 +0100 |
commit | 1f229e4f83a651029e7cdc13e24a2827a6af25d2 (patch) | |
tree | 3a4500be3d9dd1ac9442c964339eec985da890c6 /src/payload.c | |
parent | 3b219e5dd3a558228d67d97e0e2ac3e94c88df92 (diff) |
payload: add payload_is_stacked()
Add payload_is_stacked() to determine whether a protocol expression match defines
a stacked protocol on the same layer.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/payload.c')
-rw-r--r-- | src/payload.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/payload.c b/src/payload.c index 9dca56be..0bbfb542 100644 --- a/src/payload.c +++ b/src/payload.c @@ -322,6 +322,26 @@ int exthdr_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, } /** + * payload_is_stacked - return whether a payload protocol match defines a stacked + * protocol on the same layer + * + * @desc: current protocol description on this layer + * @expr: payload match + */ +bool payload_is_stacked(const struct proto_desc *desc, const struct expr *expr) +{ + const struct proto_desc *next; + + if (expr->left->ops->type != EXPR_PAYLOAD || + !(expr->left->flags & EXPR_F_PROTOCOL) || + expr->op != OP_EQ) + return false; + + next = proto_find_upper(desc, mpz_get_be16(expr->right->value)); + return next && next->base == desc->base; +} + +/** * payload_dependency_store - store a possibly redundant protocol match * * @ctx: payload dependency context |