diff options
Diffstat (limited to 'src/payload.c')
-rw-r--r-- | src/payload.c | 70 |
1 files changed, 30 insertions, 40 deletions
diff --git a/src/payload.c b/src/payload.c index af533b2a..74f8254a 100644 --- a/src/payload.c +++ b/src/payload.c @@ -223,6 +223,34 @@ static int payload_add_dependency(struct eval_ctx *ctx, return 0; } +static const struct proto_desc * +payload_gen_special_dependency(struct eval_ctx *ctx, const struct expr *expr) +{ + switch (expr->payload.base) { + case PROTO_BASE_LL_HDR: + switch (ctx->pctx.family) { + case NFPROTO_INET: + return &proto_inet; + case NFPROTO_BRIDGE: + return &proto_eth; + case NFPROTO_NETDEV: + return &proto_netdev; + default: + break; + } + break; + case PROTO_BASE_TRANSPORT_HDR: + if (expr->payload.desc == &proto_icmp) + return &proto_ip; + if (expr->payload.desc == &proto_icmp6) + return &proto_ip6; + return &proto_inet_service; + default: + break; + } + return NULL; +} + /** * payload_gen_dependency - generate match expression on payload dependency * @@ -276,46 +304,8 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, desc = ctx->pctx.protocol[expr->payload.base - 1].desc; /* Special case for mixed IPv4/IPv6 and bridge tables */ - if (desc == NULL) { - switch (ctx->pctx.family) { - case NFPROTO_INET: - switch (expr->payload.base) { - case PROTO_BASE_LL_HDR: - desc = &proto_inet; - break; - case PROTO_BASE_TRANSPORT_HDR: - desc = &proto_inet_service; - break; - default: - break; - } - break; - case NFPROTO_BRIDGE: - switch (expr->payload.base) { - case PROTO_BASE_LL_HDR: - desc = &proto_eth; - break; - case PROTO_BASE_TRANSPORT_HDR: - desc = &proto_inet_service; - break; - default: - break; - } - break; - case NFPROTO_NETDEV: - switch (expr->payload.base) { - case PROTO_BASE_LL_HDR: - desc = &proto_netdev; - break; - case PROTO_BASE_TRANSPORT_HDR: - desc = &proto_inet_service; - break; - default: - break; - } - break; - } - } + if (desc == NULL) + desc = payload_gen_special_dependency(ctx, expr); if (desc == NULL) return expr_error(ctx->msgs, expr, |