]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft: cache: Fetch sets per table
authorPhil Sutter <phil@nwl.cc>
Mon, 6 Apr 2020 14:49:05 +0000 (16:49 +0200)
committerPhil Sutter <phil@nwl.cc>
Mon, 11 May 2020 12:28:28 +0000 (14:28 +0200)
Kernel accepts a table name when dumping sets, so make use of that in
case a table was passed to fetch_set_cache() but no set name.

Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/nft-cache.c

index e042bd83bebf5eb17599066fa4ad7f119e0e1866..51b371c51c3f48f1f35d6e8fb585987bd0d619e1 100644 (file)
@@ -254,25 +254,31 @@ static int fetch_set_cache(struct nft_handle *h,
                .h = h,
                .t = t,
        };
+       uint16_t flags = NLM_F_DUMP;
+       struct nftnl_set *s = NULL;
        struct nlmsghdr *nlh;
        char buf[16536];
        int i, ret;
 
-       if (t && set) {
-               struct nftnl_set *s = nftnl_set_alloc();
-
+       if (t) {
+               s = nftnl_set_alloc();
                if (!s)
                        return -1;
 
-               nlh = nftnl_set_nlmsg_build_hdr(buf, NFT_MSG_GETSET, h->family,
-                                               NLM_F_ACK, h->seq);
                nftnl_set_set_str(s, NFTNL_SET_TABLE, t->name);
-               nftnl_set_set_str(s, NFTNL_SET_NAME, set);
+
+               if (set) {
+                       nftnl_set_set_str(s, NFTNL_SET_NAME, set);
+                       flags = NLM_F_ACK;
+               }
+       }
+
+       nlh = nftnl_set_nlmsg_build_hdr(buf, NFT_MSG_GETSET,
+                                       h->family, flags, h->seq);
+
+       if (s) {
                nftnl_set_nlmsg_build_payload(nlh, s);
                nftnl_set_free(s);
-       } else {
-               nlh = nftnl_set_nlmsg_build_hdr(buf, NFT_MSG_GETSET, h->family,
-                                               NLM_F_DUMP, h->seq);
        }
 
        ret = mnl_talk(h, nlh, nftnl_set_list_cb, &d);
@@ -282,8 +288,6 @@ static int fetch_set_cache(struct nft_handle *h,
        }
 
        if (t && set) {
-               struct nftnl_set *s;
-
                s = nftnl_set_list_lookup_byname(h->cache->table[t->type].sets,
                                                 set);
                set_fetch_elem_cb(s, h);