]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/blobdiff - net/netfilter/nf_conntrack_proto_gre.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[mirror_ubuntu-disco-kernel.git] / net / netfilter / nf_conntrack_proto_gre.c
index 9b48dc8b4b885a00d8806038fc5fd0948e60cbca..8899b51aad4433accbe3bc58ba7688f1560facb4 100644 (file)
 #include <linux/netfilter/nf_conntrack_proto_gre.h>
 #include <linux/netfilter/nf_conntrack_pptp.h>
 
-enum grep_conntrack {
-       GRE_CT_UNREPLIED,
-       GRE_CT_REPLIED,
-       GRE_CT_MAX
-};
-
 static const unsigned int gre_timeouts[GRE_CT_MAX] = {
        [GRE_CT_UNREPLIED]      = 30*HZ,
        [GRE_CT_REPLIED]        = 180*HZ,
 };
 
 static unsigned int proto_gre_net_id __read_mostly;
-struct netns_proto_gre {
-       struct nf_proto_net     nf;
-       rwlock_t                keymap_lock;
-       struct list_head        keymap_list;
-       unsigned int            gre_timeouts[GRE_CT_MAX];
-};
 
 static inline struct netns_proto_gre *gre_pernet(struct net *net)
 {
@@ -332,9 +320,49 @@ gre_timeout_nla_policy[CTA_TIMEOUT_GRE_MAX+1] = {
 };
 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
 
+#ifdef CONFIG_SYSCTL
+static struct ctl_table gre_sysctl_table[] = {
+       {
+               .procname       = "nf_conntrack_gre_timeout",
+               .maxlen         = sizeof(unsigned int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_jiffies,
+       },
+       {
+               .procname       = "nf_conntrack_gre_timeout_stream",
+               .maxlen         = sizeof(unsigned int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_jiffies,
+       },
+       {}
+};
+#endif
+
+static int gre_kmemdup_sysctl_table(struct net *net, struct nf_proto_net *nf,
+                                   struct netns_proto_gre *net_gre)
+{
+#ifdef CONFIG_SYSCTL
+       int i;
+
+       if (nf->ctl_table)
+               return 0;
+
+       nf->ctl_table = kmemdup(gre_sysctl_table,
+                               sizeof(gre_sysctl_table),
+                               GFP_KERNEL);
+       if (!nf->ctl_table)
+               return -ENOMEM;
+
+       for (i = 0; i < GRE_CT_MAX; i++)
+               nf->ctl_table[i].data = &net_gre->gre_timeouts[i];
+#endif
+       return 0;
+}
+
 static int gre_init_net(struct net *net)
 {
        struct netns_proto_gre *net_gre = gre_pernet(net);
+       struct nf_proto_net *nf = &net_gre->nf;
        int i;
 
        rwlock_init(&net_gre->keymap_lock);
@@ -342,7 +370,7 @@ static int gre_init_net(struct net *net)
        for (i = 0; i < GRE_CT_MAX; i++)
                net_gre->gre_timeouts[i] = gre_timeouts[i];
 
-       return 0;
+       return gre_kmemdup_sysctl_table(net, nf, net_gre);
 }
 
 /* protocol helper struct */
@@ -402,6 +430,8 @@ static int __init nf_ct_proto_gre_init(void)
 {
        int ret;
 
+       BUILD_BUG_ON(offsetof(struct netns_proto_gre, nf) != 0);
+
        ret = register_pernet_subsys(&proto_gre_net_ops);
        if (ret < 0)
                goto out_pernet;