[PATCH nft] src: fix rule flushing atomically

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



nft is currently retrieving the list of rule from the kernel, then
deleting each rule one by one. This is slow and not safe. Fix it
by sending a deletion command in a batch without specifying the
chain.

This change requires the kernel fix entitled:
netfilter: nf_tables: fix missing rules flushing per table

Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>
---
 src/netlink.c |   35 +----------------------------------
 1 file changed, 1 insertion(+), 34 deletions(-)

diff --git a/src/netlink.c b/src/netlink.c
index 533634a..cab8cf4 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -422,43 +422,10 @@ static int netlink_list_rules(struct netlink_ctx *ctx, const struct handle *h,
 	return 0;
 }
 
-static int flush_rule_cb(struct nft_rule *nlr, void *arg)
-{
-	struct netlink_ctx *ctx = arg;
-	const struct handle *h = ctx->data;
-	int err;
-
-	if ((h->table &&
-	    strcmp(nft_rule_attr_get_str(nlr, NFT_RULE_ATTR_TABLE), h->table) != 0) ||
-	    (h->chain &&
-	     strcmp(nft_rule_attr_get_str(nlr, NFT_RULE_ATTR_CHAIN), h->chain) != 0))
-		return 0;
-
-	netlink_dump_rule(nlr);
-	err = mnl_nft_rule_batch_del(nlr, 0, ctx->seqnum);
-	if (err < 0) {
-		netlink_io_error(ctx, NULL, "Could not delete rule: %s",
-				 strerror(errno));
-		return err;
-	}
-	return 0;
-}
-
 static int netlink_flush_rules(struct netlink_ctx *ctx, const struct handle *h,
 			       const struct location *loc)
 {
-	struct nft_rule_list *rule_cache;
-
-	rule_cache = mnl_nft_rule_dump(nf_sock, h->family);
-	if (rule_cache == NULL)
-		return netlink_io_error(ctx, loc,
-					"Could not receive rules from kernel: %s",
-					strerror(errno));
-
-	ctx->data = h;
-	nft_rule_list_foreach(rule_cache, flush_rule_cb, ctx);
-	nft_rule_list_free(rule_cache);
-	return 0;
+	return netlink_del_rule_batch(ctx, h, loc);
 }
 
 void netlink_dump_chain(struct nft_chain *nlc)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux