netfilter: nf_tables: Carry reset boolean in nft_obj_dump_ctx
authorPhil Sutter <phil@nwl.cc>
Fri, 20 Oct 2023 17:34:33 +0000 (19:34 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 24 Oct 2023 11:16:30 +0000 (13:16 +0200)
Relieve the dump callback from having to inspect nlmsg_type upon each
call, just do it once at start of the dump.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_tables_api.c

index c84e2cc..ecb251f 100644 (file)
@@ -7685,6 +7685,7 @@ struct nft_obj_dump_ctx {
        unsigned int    s_idx;
        char            *table;
        u32             type;
+       bool            reset;
 };
 
 static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
@@ -7698,12 +7699,8 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
        unsigned int entries = 0;
        struct nft_object *obj;
        unsigned int idx = 0;
-       bool reset = false;
        int rc = 0;
 
-       if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
-               reset = true;
-
        rcu_read_lock();
        nft_net = nft_pernet(net);
        cb->seq = READ_ONCE(nft_net->base_seq);
@@ -7730,7 +7727,7 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
                                                     NFT_MSG_NEWOBJ,
                                                     NLM_F_MULTI | NLM_F_APPEND,
                                                     table->family, table,
-                                                    obj, reset);
+                                                    obj, ctx->reset);
                        if (rc < 0)
                                break;
 
@@ -7739,7 +7736,7 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
 cont:
                        idx++;
                }
-               if (reset && entries)
+               if (ctx->reset && entries)
                        audit_log_obj_reset(table, nft_net->base_seq, entries);
                if (rc < 0)
                        break;
@@ -7766,6 +7763,9 @@ static int nf_tables_dump_obj_start(struct netlink_callback *cb)
        if (nla[NFTA_OBJ_TYPE])
                ctx->type = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
 
+       if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
+               ctx->reset = true;
+
        return 0;
 }