Skip to content

Commit a2225e0

Browse files
Jianguo Wuummakynes
authored andcommitted
netfilter: move the sysctl nf_hooks_lwtunnel into the netfilter core
Currently, the sysctl net.netfilter.nf_hooks_lwtunnel depends on the nf_conntrack module, but the nf_conntrack module is not always loaded. Therefore, accessing net.netfilter.nf_hooks_lwtunnel may have an error. Move sysctl nf_hooks_lwtunnel into the netfilter core. Fixes: 7a3f5b0 ("netfilter: add netfilter hooks to SRv6 data plane") Suggested-by: Pablo Neira Ayuso <[email protected]> Signed-off-by: Jianguo Wu <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 9a3bc8d commit a2225e0

File tree

5 files changed

+87
-17
lines changed

5 files changed

+87
-17
lines changed

include/net/netns/netfilter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ struct netns_nf {
1515
const struct nf_logger __rcu *nf_loggers[NFPROTO_NUMPROTO];
1616
#ifdef CONFIG_SYSCTL
1717
struct ctl_table_header *nf_log_dir_header;
18+
#ifdef CONFIG_LWTUNNEL
19+
struct ctl_table_header *nf_lwtnl_dir_header;
20+
#endif
1821
#endif
1922
struct nf_hook_entries __rcu *hooks_ipv4[NF_INET_NUMHOOKS];
2023
struct nf_hook_entries __rcu *hooks_ipv6[NF_INET_NUMHOOKS];

net/netfilter/core.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,12 +815,21 @@ int __init netfilter_init(void)
815815
if (ret < 0)
816816
goto err;
817817

818+
#ifdef CONFIG_LWTUNNEL
819+
ret = netfilter_lwtunnel_init();
820+
if (ret < 0)
821+
goto err_lwtunnel_pernet;
822+
#endif
818823
ret = netfilter_log_init();
819824
if (ret < 0)
820-
goto err_pernet;
825+
goto err_log_pernet;
821826

822827
return 0;
823-
err_pernet:
828+
err_log_pernet:
829+
#ifdef CONFIG_LWTUNNEL
830+
netfilter_lwtunnel_fini();
831+
err_lwtunnel_pernet:
832+
#endif
824833
unregister_pernet_subsys(&netfilter_net_ops);
825834
err:
826835
return ret;

net/netfilter/nf_conntrack_standalone.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
#include <net/netfilter/nf_conntrack_acct.h>
2323
#include <net/netfilter/nf_conntrack_zones.h>
2424
#include <net/netfilter/nf_conntrack_timestamp.h>
25-
#ifdef CONFIG_LWTUNNEL
26-
#include <net/netfilter/nf_hooks_lwtunnel.h>
27-
#endif
2825
#include <linux/rculist_nulls.h>
2926

3027
static bool enable_hooks __read_mostly;
@@ -612,9 +609,6 @@ enum nf_ct_sysctl_index {
612609
NF_SYSCTL_CT_PROTO_TIMEOUT_GRE,
613610
NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,
614611
#endif
615-
#ifdef CONFIG_LWTUNNEL
616-
NF_SYSCTL_CT_LWTUNNEL,
617-
#endif
618612

619613
NF_SYSCTL_CT_LAST_SYSCTL,
620614
};
@@ -946,15 +940,6 @@ static struct ctl_table nf_ct_sysctl_table[] = {
946940
.proc_handler = proc_dointvec_jiffies,
947941
},
948942
#endif
949-
#ifdef CONFIG_LWTUNNEL
950-
[NF_SYSCTL_CT_LWTUNNEL] = {
951-
.procname = "nf_hooks_lwtunnel",
952-
.data = NULL,
953-
.maxlen = sizeof(int),
954-
.mode = 0644,
955-
.proc_handler = nf_hooks_lwtunnel_sysctl_handler,
956-
},
957-
#endif
958943
};
959944

960945
static struct ctl_table nf_ct_netfilter_table[] = {

net/netfilter/nf_hooks_lwtunnel.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#include <linux/sysctl.h>
44
#include <net/lwtunnel.h>
55
#include <net/netfilter/nf_hooks_lwtunnel.h>
6+
#include <linux/netfilter.h>
7+
8+
#include "nf_internals.h"
69

710
static inline int nf_hooks_lwtunnel_get(void)
811
{
@@ -50,4 +53,68 @@ int nf_hooks_lwtunnel_sysctl_handler(struct ctl_table *table, int write,
5053
return ret;
5154
}
5255
EXPORT_SYMBOL_GPL(nf_hooks_lwtunnel_sysctl_handler);
56+
57+
static struct ctl_table nf_lwtunnel_sysctl_table[] = {
58+
{
59+
.procname = "nf_hooks_lwtunnel",
60+
.data = NULL,
61+
.maxlen = sizeof(int),
62+
.mode = 0644,
63+
.proc_handler = nf_hooks_lwtunnel_sysctl_handler,
64+
},
65+
};
66+
67+
static int __net_init nf_lwtunnel_net_init(struct net *net)
68+
{
69+
struct ctl_table_header *hdr;
70+
struct ctl_table *table;
71+
72+
table = nf_lwtunnel_sysctl_table;
73+
if (!net_eq(net, &init_net)) {
74+
table = kmemdup(nf_lwtunnel_sysctl_table,
75+
sizeof(nf_lwtunnel_sysctl_table),
76+
GFP_KERNEL);
77+
if (!table)
78+
goto err_alloc;
79+
}
80+
81+
hdr = register_net_sysctl_sz(net, "net/netfilter", table,
82+
ARRAY_SIZE(nf_lwtunnel_sysctl_table));
83+
if (!hdr)
84+
goto err_reg;
85+
86+
net->nf.nf_lwtnl_dir_header = hdr;
87+
88+
return 0;
89+
err_reg:
90+
if (!net_eq(net, &init_net))
91+
kfree(table);
92+
err_alloc:
93+
return -ENOMEM;
94+
}
95+
96+
static void __net_exit nf_lwtunnel_net_exit(struct net *net)
97+
{
98+
const struct ctl_table *table;
99+
100+
table = net->nf.nf_lwtnl_dir_header->ctl_table_arg;
101+
unregister_net_sysctl_table(net->nf.nf_lwtnl_dir_header);
102+
if (!net_eq(net, &init_net))
103+
kfree(table);
104+
}
105+
106+
static struct pernet_operations nf_lwtunnel_net_ops = {
107+
.init = nf_lwtunnel_net_init,
108+
.exit = nf_lwtunnel_net_exit,
109+
};
110+
111+
int __init netfilter_lwtunnel_init(void)
112+
{
113+
return register_pernet_subsys(&nf_lwtunnel_net_ops);
114+
}
115+
116+
void netfilter_lwtunnel_fini(void)
117+
{
118+
unregister_pernet_subsys(&nf_lwtunnel_net_ops);
119+
}
53120
#endif /* CONFIG_SYSCTL */

net/netfilter/nf_internals.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ void nf_queue_nf_hook_drop(struct net *net);
2929
/* nf_log.c */
3030
int __init netfilter_log_init(void);
3131

32+
#ifdef CONFIG_LWTUNNEL
33+
/* nf_hooks_lwtunnel.c */
34+
int __init netfilter_lwtunnel_init(void);
35+
void netfilter_lwtunnel_fini(void);
36+
#endif
37+
3238
/* core.c */
3339
void nf_hook_entries_delete_raw(struct nf_hook_entries __rcu **pp,
3440
const struct nf_hook_ops *reg);

0 commit comments

Comments
 (0)