From 1f229e4f83a651029e7cdc13e24a2827a6af25d2 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Sun, 24 Apr 2016 22:15:08 +0100 Subject: 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 --- src/payload.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/payload.c') diff --git a/src/payload.c b/src/payload.c index 9dca56be..0bbfb542 100644 --- a/src/payload.c +++ b/src/payload.c @@ -321,6 +321,26 @@ int exthdr_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, return payload_add_dependency(ctx, desc, &proto_ip6, expr, res); } +/** + * 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 * -- cgit v1.2.3