]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
payload: automatically kill dependencies for exthdr and tcpopt
authorManuel Messner <mm@skelett.io>
Tue, 7 Feb 2017 02:14:14 +0000 (03:14 +0100)
committerFlorian Westphal <fw@strlen.de>
Sun, 12 Feb 2017 14:34:47 +0000 (15:34 +0100)
This patch automatically removes the dependencies for exthdr and tcpopt.

 # nft add rule filter input tcp option maxseg kind 3 counter.
 # nft list table filter input

Before:
 # ip protocol 6 tcp option maxseg kind 3 counter

After:
 # tcp option maxseg kind 3 counter

Thus allowing to write tests as follows:
 # tcp option maxseg kind 3;ok

Signed-off-by: Manuel Messner <mm@skelett.io>
Signed-off-by: Florian Westphal <fw@strlen.de>
include/payload.h
src/netlink_delinearize.c
src/payload.c

index 5952b24fd1520099fb5ead0b3a06e0e5a4fc2f28..a3d23095119c770b37e2e502d10b4d0937b7c1e0 100644 (file)
@@ -42,6 +42,8 @@ extern void __payload_dependency_kill(struct payload_dep_ctx *ctx,
                                      enum proto_bases base);
 extern void payload_dependency_kill(struct payload_dep_ctx *ctx,
                                    struct expr *expr);
+extern void exthdr_dependency_kill(struct payload_dep_ctx *ctx,
+                                  struct expr *expr);
 
 extern bool payload_can_merge(const struct expr *e1, const struct expr *e2);
 extern struct expr *payload_expr_join(const struct expr *e1,
index 1e94af49013d0cffb9d1b7143ab218625c200cac..90553836be794a157755212255ccbb31dcfcb7fc 100644 (file)
@@ -1841,7 +1841,7 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
                expr_postprocess(ctx, &expr->key);
                break;
        case EXPR_EXTHDR:
-               __payload_dependency_kill(&ctx->pdctx, PROTO_BASE_NETWORK_HDR);
+               exthdr_dependency_kill(&ctx->pdctx, expr);
                break;
        case EXPR_SET_REF:
        case EXPR_META:
index 0207296e5f61538e479e63b5a368d714ef6938a2..169954bad207828f7dc47eef08d5853fae25a4d2 100644 (file)
@@ -410,6 +410,20 @@ void payload_dependency_kill(struct payload_dep_ctx *ctx, struct expr *expr)
        __payload_dependency_kill(ctx, expr->payload.base);
 }
 
+void exthdr_dependency_kill(struct payload_dep_ctx *ctx, struct expr *expr)
+{
+       switch (expr->exthdr.op) {
+       case NFT_EXTHDR_OP_TCPOPT:
+               __payload_dependency_kill(ctx, PROTO_BASE_TRANSPORT_HDR);
+               break;
+       case NFT_EXTHDR_OP_IPV6:
+               __payload_dependency_kill(ctx, PROTO_BASE_NETWORK_HDR);
+               break;
+       default:
+               break;
+       }
+}
+
 /**
  * payload_expr_complete - fill in type information of a raw payload expr
  *