]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: unifiy meta and ct postprocessing
authorFlorian Westphal <fw@strlen.de>
Fri, 29 Sep 2017 11:54:21 +0000 (13:54 +0200)
committerFlorian Westphal <fw@strlen.de>
Fri, 29 Sep 2017 11:54:21 +0000 (13:54 +0200)
From postprocess point of view meta and ct are logically the same,
except that their storage area overlaps (union type), so if we
extract the relevant fields we can move all of it into a single
helper and support dependency store/kill for both expressions.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/netlink_delinearize.c

index 7c61cd0c5bbc97bb97e6eb5d09b461f2c83fe69e..44328879ebb8c88f8e4443da0095425f3a23dc9f 100644 (file)
@@ -1385,12 +1385,29 @@ static void payload_match_postprocess(struct rule_pp_ctx *ctx,
        }
 }
 
-static void ct_meta_common_postprocess(const struct expr *expr)
+static void ct_meta_common_postprocess(struct rule_pp_ctx *ctx,
+                                      const struct expr *expr,
+                                      enum proto_bases base)
 {
        const struct expr *left = expr->left;
        struct expr *right = expr->right;
 
        switch (expr->op) {
+       case OP_EQ:
+               if (expr->right->ops->type == EXPR_RANGE)
+                       break;
+
+               expr->left->ops->pctx_update(&ctx->pctx, expr);
+
+               if (ctx->pdctx.pbase == PROTO_BASE_INVALID &&
+                   left->flags & EXPR_F_PROTOCOL) {
+                       payload_dependency_store(&ctx->pdctx, ctx->stmt, base);
+               } else if (ctx->pdctx.pbase < PROTO_BASE_TRANSPORT_HDR) {
+                       __payload_dependency_kill(&ctx->pdctx, base);
+                       if (left->flags & EXPR_F_PROTOCOL)
+                               payload_dependency_store(&ctx->pdctx, ctx->stmt, base);
+               }
+               break;
        case OP_NEQ:
                if (right->ops->type != EXPR_SET && right->ops->type != EXPR_SET_REF)
                        break;
@@ -1406,40 +1423,17 @@ static void ct_meta_common_postprocess(const struct expr *expr)
 static void meta_match_postprocess(struct rule_pp_ctx *ctx,
                                   const struct expr *expr)
 {
-       struct expr *left = expr->left;
-
-       switch (expr->op) {
-       case OP_EQ:
-               if (expr->right->ops->type == EXPR_RANGE)
-                       break;
-
-               expr->left->ops->pctx_update(&ctx->pctx, expr);
+       const struct expr *left = expr->left;
 
-               if (ctx->pdctx.pbase == PROTO_BASE_INVALID &&
-                   left->flags & EXPR_F_PROTOCOL)
-                       payload_dependency_store(&ctx->pdctx, ctx->stmt,
-                                                left->meta.base);
-               break;
-       default:
-               ct_meta_common_postprocess(expr);
-               break;
-       }
+       ct_meta_common_postprocess(ctx, expr, left->meta.base);
 }
 
 static void ct_match_postprocess(struct rule_pp_ctx *ctx,
                                 const struct expr *expr)
 {
-       switch (expr->op) {
-       case OP_EQ:
-               if (expr->right->ops->type == EXPR_RANGE)
-                       break;
+       const struct expr *left = expr->left;
 
-               expr->left->ops->pctx_update(&ctx->pctx, expr);
-               break;
-       default:
-               ct_meta_common_postprocess(expr);
-               break;
-       }
+       ct_meta_common_postprocess(ctx, expr, left->ct.base);
 }
 
 /* Convert a bitmask to a prefix length */