]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft-cache: Introduce __fetch_chain_cache()
authorPhil Sutter <phil@nwl.cc>
Fri, 20 Mar 2020 09:06:16 +0000 (10:06 +0100)
committerPhil Sutter <phil@nwl.cc>
Mon, 11 May 2020 12:28:28 +0000 (14:28 +0200)
Extract the inner part of fetch_chain_cache() into a dedicated function,
preparing for individual chain caching.

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

index 611846534a0984b810b5cd4cb8fdb9b603b41ccd..a0c4dfc6722862bfcfab553b5f5486bb347d6d61 100644 (file)
@@ -322,9 +322,9 @@ static int fetch_set_cache(struct nft_handle *h,
        return ret;
 }
 
-static int fetch_chain_cache(struct nft_handle *h,
-                            const struct builtin_table *t,
-                            const char *chain)
+static int __fetch_chain_cache(struct nft_handle *h,
+                              const struct builtin_table *t,
+                              const struct nftnl_chain *c)
 {
        struct nftnl_chain_list_cb_data d = {
                .h = h,
@@ -334,24 +334,10 @@ static int fetch_chain_cache(struct nft_handle *h,
        struct nlmsghdr *nlh;
        int ret;
 
-       if (t && chain) {
-               struct nftnl_chain *c = nftnl_chain_alloc();
-
-               if (!c)
-                       return -1;
-
-               nlh = nftnl_chain_nlmsg_build_hdr(buf, NFT_MSG_GETCHAIN,
-                                                 h->family, NLM_F_ACK,
-                                                 h->seq);
-               nftnl_chain_set_str(c, NFTNL_CHAIN_TABLE, t->name);
-               nftnl_chain_set_str(c, NFTNL_CHAIN_NAME, chain);
+       nlh = nftnl_chain_nlmsg_build_hdr(buf, NFT_MSG_GETCHAIN, h->family,
+                                         c ? NLM_F_ACK : NLM_F_DUMP, h->seq);
+       if (c)
                nftnl_chain_nlmsg_build_payload(nlh, c);
-               nftnl_chain_free(c);
-       } else {
-               nlh = nftnl_chain_nlmsg_build_hdr(buf, NFT_MSG_GETCHAIN,
-                                                 h->family, NLM_F_DUMP,
-                                                 h->seq);
-       }
 
        ret = mnl_talk(h, nlh, nftnl_chain_list_cb, &d);
        if (ret < 0 && errno == EINTR)
@@ -360,6 +346,30 @@ static int fetch_chain_cache(struct nft_handle *h,
        return ret;
 }
 
+static int fetch_chain_cache(struct nft_handle *h,
+                            const struct builtin_table *t,
+                            const char *chain)
+{
+       struct nftnl_chain *c;
+       int ret;
+
+       if (!chain)
+               return __fetch_chain_cache(h, t, NULL);
+
+       assert(t);
+
+       c = nftnl_chain_alloc();
+       if (!c)
+               return -1;
+
+       nftnl_chain_set_str(c, NFTNL_CHAIN_TABLE, t->name);
+       nftnl_chain_set_str(c, NFTNL_CHAIN_NAME, chain);
+       ret = __fetch_chain_cache(h, t, c);
+
+       nftnl_chain_free(c);
+       return ret;
+}
+
 static int nftnl_rule_list_cb(const struct nlmsghdr *nlh, void *data)
 {
        struct nftnl_chain *c = data;