netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Subject: [PATCH nft 05/18] optimize: fix reject statement
Date: Mon, 20 Jun 2022 10:32:02 +0200	[thread overview]
Message-ID: <20220620083215.1021238-6-pablo@netfilter.org> (raw)
In-Reply-To: <20220620083215.1021238-1-pablo@netfilter.org>

Add missing code to the statement collection routine. Compare reject
expressions when available. Add tests/shell.

Fixes: fb298877ece2 ("src: add ruleset optimization infrastructure")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 src/optimize.c                                | 19 ++++++++++++++++---
 .../optimizations/dumps/merge_reject.nft      |  7 +++++++
 .../testcases/optimizations/merge_reject      | 15 +++++++++++++++
 3 files changed, 38 insertions(+), 3 deletions(-)
 create mode 100644 tests/shell/testcases/optimizations/dumps/merge_reject.nft
 create mode 100755 tests/shell/testcases/optimizations/merge_reject

diff --git a/src/optimize.c b/src/optimize.c
index 94242ee5f490..427625846484 100644
--- a/src/optimize.c
+++ b/src/optimize.c
@@ -178,13 +178,19 @@ static bool __stmt_type_eq(const struct stmt *stmt_a, const struct stmt *stmt_b,
 			return false;
 		break;
 	case STMT_REJECT:
-		if (stmt_a->reject.expr || stmt_b->reject.expr)
-			return false;
-
 		if (stmt_a->reject.family != stmt_b->reject.family ||
 		    stmt_a->reject.type != stmt_b->reject.type ||
 		    stmt_a->reject.icmp_code != stmt_b->reject.icmp_code)
 			return false;
+
+		if (!!stmt_a->reject.expr ^ !!stmt_b->reject.expr)
+			return false;
+
+		if (!stmt_a->reject.expr)
+			return true;
+
+		if (__expr_cmp(stmt_a->reject.expr, stmt_b->reject.expr))
+			return false;
 		break;
 	case STMT_NAT:
 		if (stmt_a->nat.type != stmt_b->nat.type ||
@@ -304,6 +310,13 @@ static int rule_collect_stmts(struct optimize_ctx *ctx, struct rule *rule)
 			clone->nat.flags = stmt->nat.flags;
 			clone->nat.type_flags = stmt->nat.type_flags;
 			break;
+		case STMT_REJECT:
+			if (stmt->reject.expr)
+				clone->reject.expr = expr_get(stmt->reject.expr);
+			clone->reject.type = stmt->reject.type;
+			clone->reject.icmp_code = stmt->reject.icmp_code;
+			clone->reject.family = stmt->reject.family;
+			break;
 		default:
 			xfree(clone);
 			continue;
diff --git a/tests/shell/testcases/optimizations/dumps/merge_reject.nft b/tests/shell/testcases/optimizations/dumps/merge_reject.nft
new file mode 100644
index 000000000000..9a13e2b96faa
--- /dev/null
+++ b/tests/shell/testcases/optimizations/dumps/merge_reject.nft
@@ -0,0 +1,7 @@
+table ip x {
+	chain y {
+		ip daddr 172.30.33.70 tcp dport 3306 counter packets 0 bytes 0 drop
+		meta l4proto . ip daddr . tcp dport { tcp . 172.30.238.117 . 8080, tcp . 172.30.33.71 . 3306, tcp . 172.30.254.251 . 3306 } counter packets 0 bytes 0 reject
+		ip daddr 172.30.254.252 tcp dport 3306 counter packets 0 bytes 0 reject with tcp reset
+	}
+}
diff --git a/tests/shell/testcases/optimizations/merge_reject b/tests/shell/testcases/optimizations/merge_reject
new file mode 100755
index 000000000000..497e8f64dc5d
--- /dev/null
+++ b/tests/shell/testcases/optimizations/merge_reject
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+RULESET="table ip x {
+	chain y {
+		meta l4proto tcp ip daddr 172.30.33.70 tcp dport 3306 counter packets 0 bytes 0 drop
+		meta l4proto tcp ip daddr 172.30.33.71 tcp dport 3306 counter packets 0 bytes 0 reject
+		meta l4proto tcp ip daddr 172.30.238.117 tcp dport 8080 counter packets 0 bytes 0 reject
+		meta l4proto tcp ip daddr 172.30.254.251 tcp dport 3306 counter packets 0 bytes 0 reject
+		meta l4proto tcp ip daddr 172.30.254.252 tcp dport 3306 counter packets 0 bytes 0 reject with tcp reset
+	}
+}"
+
+$NFT -o -f - <<< $RULESET
-- 
2.30.2


  parent reply	other threads:[~2022-06-20  8:32 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-20  8:31 [PATCH nft 00/18] fixes and improvements for -o/--optimize Pablo Neira Ayuso
2022-06-20  8:31 ` [PATCH nft 01/18] optimize: do not compare relational expression rhs when collecting statements Pablo Neira Ayuso
2022-06-20  8:31 ` [PATCH nft 02/18] optimize: do not merge rules with set reference in rhs Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 03/18] optimize: do not print stateful information Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 04/18] optimize: remove comment after merging Pablo Neira Ayuso
2022-06-20  8:32 ` Pablo Neira Ayuso [this message]
2022-06-20  8:32 ` [PATCH nft 06/18] optimize: fix verdict map merging Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 07/18] optimize: add osf expression support Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 08/18] optimize: add xfrm " Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 09/18] optimize: add fib " Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 10/18] optimize: add binop " Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 11/18] optimize: add numgen " Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 12/18] optimize: add hash " Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 13/18] optimize: add unsupported statement Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 14/18] tests: shell: run -c -o on ruleset Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 15/18] optimize: only merge OP_IMPLICIT and OP_EQ relational Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 16/18] optimize: assume verdict is same when rules have no verdict Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 17/18] optimize: limit statement is not supported yet Pablo Neira Ayuso
2022-06-20  8:32 ` [PATCH nft 18/18] libnftables: release top level scope Pablo Neira Ayuso
2022-06-23 17:17 ` [PATCH nft 00/18] fixes and improvements for -o/--optimize Pablo Neira Ayuso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220620083215.1021238-6-pablo@netfilter.org \
    --to=pablo@netfilter.org \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).