summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/payload.h3
-rw-r--r--src/evaluate.c9
-rw-r--r--src/payload.c9
3 files changed, 12 insertions, 9 deletions
diff --git a/include/payload.h b/include/payload.h
index bda31886..5952b24f 100644
--- a/include/payload.h
+++ b/include/payload.h
@@ -16,7 +16,8 @@ struct stmt;
extern int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
struct stmt **res);
extern int exthdr_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
- struct stmt **res);
+ const struct proto_desc *dependency,
+ enum proto_bases pb, struct stmt **res);
/**
* struct payload_dep_ctx - payload protocol dependency tracking
diff --git a/src/evaluate.c b/src/evaluate.c
index 94412f27..0e02548c 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -448,19 +448,20 @@ static int __expr_evaluate_exthdr(struct eval_ctx *ctx, struct expr **exprp)
*/
static int expr_evaluate_exthdr(struct eval_ctx *ctx, struct expr **exprp)
{
- const struct proto_desc *base;
+ const struct proto_desc *base, *dependency = &proto_ip6;
+ enum proto_bases pb = PROTO_BASE_NETWORK_HDR;
struct expr *expr = *exprp;
struct stmt *nstmt;
- base = ctx->pctx.protocol[PROTO_BASE_NETWORK_HDR].desc;
- if (base == &proto_ip6)
+ base = ctx->pctx.protocol[pb].desc;
+ if (base == dependency)
return __expr_evaluate_exthdr(ctx, exprp);
if (base)
return expr_error(ctx->msgs, expr,
"cannot use exthdr with %s", base->name);
- if (exthdr_gen_dependency(ctx, expr, &nstmt) < 0)
+ if (exthdr_gen_dependency(ctx, expr, dependency, pb - 1, &nstmt) < 0)
return -1;
list_add(&nstmt->list, &ctx->rule->stmts);
diff --git a/src/payload.c b/src/payload.c
index 74f8254a..efd19602 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -317,18 +317,19 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
}
int exthdr_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
- struct stmt **res)
+ const struct proto_desc *dependency,
+ enum proto_bases pb, struct stmt **res)
{
const struct proto_desc *desc;
- desc = ctx->pctx.protocol[PROTO_BASE_LL_HDR].desc;
+ desc = ctx->pctx.protocol[pb].desc;
if (desc == NULL)
return expr_error(ctx->msgs, expr,
"Cannot generate dependency: "
"no %s protocol specified",
- proto_base_names[PROTO_BASE_LL_HDR]);
+ proto_base_names[pb]);
- return payload_add_dependency(ctx, desc, &proto_ip6, expr, res);
+ return payload_add_dependency(ctx, desc, dependency, expr, res);
}
/**