netfilter: cttimeout: use option structure
authorFlorian Westphal <fw@strlen.de>
Tue, 8 Feb 2022 11:29:47 +0000 (12:29 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 9 Feb 2022 10:56:06 +0000 (11:56 +0100)
Instead of two exported functions, export a single option structure.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_conntrack_timeout.h
net/netfilter/nf_conntrack_timeout.c
net/netfilter/nfnetlink_cttimeout.c

index db507e4a65bb47ddbf1d4ed1ce4d85585479a9a2..3ea94f6f3844c5316694a31592ab48992aee353c 100644 (file)
@@ -108,8 +108,12 @@ static inline void nf_ct_destroy_timeout(struct nf_conn *ct)
 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
 
 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
-extern struct nf_ct_timeout *(*nf_ct_timeout_find_get_hook)(struct net *net, const char *name);
-extern void (*nf_ct_timeout_put_hook)(struct nf_ct_timeout *timeout);
+struct nf_ct_timeout_hooks {
+       struct nf_ct_timeout *(*timeout_find_get)(struct net *net, const char *name);
+       void (*timeout_put)(struct nf_ct_timeout *timeout);
+};
+
+extern const struct nf_ct_timeout_hooks *nf_ct_timeout_hook;
 #endif
 
 #endif /* _NF_CONNTRACK_TIMEOUT_H */
index cd76ccca25e8f6f244facb35cc9e276f1205548c..cec166ecba77362041e04e862258242978cacbf7 100644 (file)
 #include <net/netfilter/nf_conntrack_l4proto.h>
 #include <net/netfilter/nf_conntrack_timeout.h>
 
-struct nf_ct_timeout *
-(*nf_ct_timeout_find_get_hook)(struct net *net, const char *name) __read_mostly;
-EXPORT_SYMBOL_GPL(nf_ct_timeout_find_get_hook);
-
-void (*nf_ct_timeout_put_hook)(struct nf_ct_timeout *timeout) __read_mostly;
-EXPORT_SYMBOL_GPL(nf_ct_timeout_put_hook);
+const struct nf_ct_timeout_hooks *nf_ct_timeout_hook __read_mostly;
+EXPORT_SYMBOL_GPL(nf_ct_timeout_hook);
 
 static int untimeout(struct nf_conn *ct, void *timeout)
 {
@@ -48,31 +44,30 @@ EXPORT_SYMBOL_GPL(nf_ct_untimeout);
 
 static void __nf_ct_timeout_put(struct nf_ct_timeout *timeout)
 {
-       typeof(nf_ct_timeout_put_hook) timeout_put;
+       const struct nf_ct_timeout_hooks *h = rcu_dereference(nf_ct_timeout_hook);
 
-       timeout_put = rcu_dereference(nf_ct_timeout_put_hook);
-       if (timeout_put)
-               timeout_put(timeout);
+       if (h)
+               h->timeout_put(timeout);
 }
 
 int nf_ct_set_timeout(struct net *net, struct nf_conn *ct,
                      u8 l3num, u8 l4num, const char *timeout_name)
 {
-       typeof(nf_ct_timeout_find_get_hook) timeout_find_get;
+       const struct nf_ct_timeout_hooks *h;
        struct nf_ct_timeout *timeout;
        struct nf_conn_timeout *timeout_ext;
        const char *errmsg = NULL;
        int ret = 0;
 
        rcu_read_lock();
-       timeout_find_get = rcu_dereference(nf_ct_timeout_find_get_hook);
-       if (!timeout_find_get) {
+       h = rcu_dereference(nf_ct_timeout_hook);
+       if (!h) {
                ret = -ENOENT;
                errmsg = "Timeout policy base is empty";
                goto out;
        }
 
-       timeout = timeout_find_get(net, timeout_name);
+       timeout = h->timeout_find_get(net, timeout_name);
        if (!timeout) {
                ret = -ENOENT;
                pr_info_ratelimited("No such timeout policy \"%s\"\n",
@@ -119,15 +114,15 @@ EXPORT_SYMBOL_GPL(nf_ct_set_timeout);
 void nf_ct_destroy_timeout(struct nf_conn *ct)
 {
        struct nf_conn_timeout *timeout_ext;
-       typeof(nf_ct_timeout_put_hook) timeout_put;
+       const struct nf_ct_timeout_hooks *h;
 
        rcu_read_lock();
-       timeout_put = rcu_dereference(nf_ct_timeout_put_hook);
+       h = rcu_dereference(nf_ct_timeout_hook);
 
-       if (timeout_put) {
+       if (h) {
                timeout_ext = nf_ct_timeout_find(ct);
                if (timeout_ext) {
-                       timeout_put(timeout_ext->timeout);
+                       h->timeout_put(timeout_ext->timeout);
                        RCU_INIT_POINTER(timeout_ext->timeout, NULL);
                }
        }
index c57673d499be72cbb266d160ffa78be9c9c3ed2c..b0d8888a539bd4a7f700835a62cc218215e5732f 100644 (file)
@@ -605,6 +605,11 @@ static struct pernet_operations cttimeout_ops = {
        .size   = sizeof(struct nfct_timeout_pernet),
 };
 
+static const struct nf_ct_timeout_hooks hooks = {
+       .timeout_find_get = ctnl_timeout_find_get,
+       .timeout_put = ctnl_timeout_put,
+};
+
 static int __init cttimeout_init(void)
 {
        int ret;
@@ -619,8 +624,7 @@ static int __init cttimeout_init(void)
                        "nfnetlink.\n");
                goto err_out;
        }
-       RCU_INIT_POINTER(nf_ct_timeout_find_get_hook, ctnl_timeout_find_get);
-       RCU_INIT_POINTER(nf_ct_timeout_put_hook, ctnl_timeout_put);
+       RCU_INIT_POINTER(nf_ct_timeout_hook, &hooks);
        return 0;
 
 err_out:
@@ -633,8 +637,7 @@ static void __exit cttimeout_exit(void)
        nfnetlink_subsys_unregister(&cttimeout_subsys);
 
        unregister_pernet_subsys(&cttimeout_ops);
-       RCU_INIT_POINTER(nf_ct_timeout_find_get_hook, NULL);
-       RCU_INIT_POINTER(nf_ct_timeout_put_hook, NULL);
+       RCU_INIT_POINTER(nf_ct_timeout_hook, NULL);
        synchronize_rcu();
 }