summaryrefslogtreecommitdiffstats
path: root/src/payload.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2016-04-24 22:15:08 +0100
committerPatrick McHardy <kaber@trash.net>2016-04-24 22:15:08 +0100
commit1f229e4f83a651029e7cdc13e24a2827a6af25d2 (patch)
tree3a4500be3d9dd1ac9442c964339eec985da890c6 /src/payload.c
parent3b219e5dd3a558228d67d97e0e2ac3e94c88df92 (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.c20
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