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
*/
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);
}
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);
}
/**