aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@sw.ru>2008-01-31 07:49:35 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-31 22:28:06 -0500
commit3cb609d57c20027a8b39fc60b79b930a89da82d4 (patch)
treef88a4d355b6612665a0ea89ac91a746c06e2c3cc
parent715cf35ac9291f31a4fea7d022695a64cac0af80 (diff)
[NETFILTER]: x_tables: create per-netns /proc/net/*_tables_*
Signed-off-by: Alexey Dobriyan <adobriyan@sw.ru> Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/linux/netfilter/x_tables.h4
-rw-r--r--net/ipv4/netfilter/arp_tables.c21
-rw-r--r--net/ipv4/netfilter/ip_tables.c21
-rw-r--r--net/ipv6/netfilter/ip6_tables.c22
-rw-r--r--net/netfilter/x_tables.c20
5 files changed, 67 insertions, 21 deletions
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
index 11eea39bbf7d..b2c62cc618f5 100644
--- a/include/linux/netfilter/x_tables.h
+++ b/include/linux/netfilter/x_tables.h
@@ -357,8 +357,8 @@ extern struct xt_table *xt_find_table_lock(struct net *net, int af,
357 const char *name); 357 const char *name);
358extern void xt_table_unlock(struct xt_table *t); 358extern void xt_table_unlock(struct xt_table *t);
359 359
360extern int xt_proto_init(int af); 360extern int xt_proto_init(struct net *net, int af);
361extern void xt_proto_fini(int af); 361extern void xt_proto_fini(struct net *net, int af);
362 362
363extern struct xt_table_info *xt_alloc_table_info(unsigned int size); 363extern struct xt_table_info *xt_alloc_table_info(unsigned int size);
364extern void xt_free_table_info(struct xt_table_info *info); 364extern void xt_free_table_info(struct xt_table_info *info);
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index 3608675ab08c..a7591ce344d2 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -1822,11 +1822,26 @@ static struct nf_sockopt_ops arpt_sockopts = {
1822 .owner = THIS_MODULE, 1822 .owner = THIS_MODULE,
1823}; 1823};
1824 1824
1825static int __net_init arp_tables_net_init(struct net *net)
1826{
1827 return xt_proto_init(net, NF_ARP);
1828}
1829
1830static void __net_exit arp_tables_net_exit(struct net *net)
1831{
1832 xt_proto_fini(net, NF_ARP);
1833}
1834
1835static struct pernet_operations arp_tables_net_ops = {
1836 .init = arp_tables_net_init,
1837 .exit = arp_tables_net_exit,
1838};
1839
1825static int __init arp_tables_init(void) 1840static int __init arp_tables_init(void)
1826{ 1841{
1827 int ret; 1842 int ret;
1828 1843
1829 ret = xt_proto_init(NF_ARP); 1844 ret = register_pernet_subsys(&arp_tables_net_ops);
1830 if (ret < 0) 1845 if (ret < 0)
1831 goto err1; 1846 goto err1;
1832 1847
@@ -1851,7 +1866,7 @@ err4:
1851err3: 1866err3:
1852 xt_unregister_target(&arpt_standard_target); 1867 xt_unregister_target(&arpt_standard_target);
1853err2: 1868err2:
1854 xt_proto_fini(NF_ARP); 1869 unregister_pernet_subsys(&arp_tables_net_ops);
1855err1: 1870err1:
1856 return ret; 1871 return ret;
1857} 1872}
@@ -1861,7 +1876,7 @@ static void __exit arp_tables_fini(void)
1861 nf_unregister_sockopt(&arpt_sockopts); 1876 nf_unregister_sockopt(&arpt_sockopts);
1862 xt_unregister_target(&arpt_error_target); 1877 xt_unregister_target(&arpt_error_target);
1863 xt_unregister_target(&arpt_standard_target); 1878 xt_unregister_target(&arpt_standard_target);
1864 xt_proto_fini(NF_ARP); 1879 unregister_pernet_subsys(&arp_tables_net_ops);
1865} 1880}
1866 1881
1867EXPORT_SYMBOL(arpt_register_table); 1882EXPORT_SYMBOL(arpt_register_table);
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index a73afa1ba8b8..600737f122d2 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -2213,11 +2213,26 @@ static struct xt_match icmp_matchstruct __read_mostly = {
2213 .family = AF_INET, 2213 .family = AF_INET,
2214}; 2214};
2215 2215
2216static int __net_init ip_tables_net_init(struct net *net)
2217{
2218 return xt_proto_init(net, AF_INET);
2219}
2220
2221static void __net_exit ip_tables_net_exit(struct net *net)
2222{
2223 xt_proto_fini(net, AF_INET);
2224}
2225
2226static struct pernet_operations ip_tables_net_ops = {
2227 .init = ip_tables_net_init,
2228 .exit = ip_tables_net_exit,
2229};
2230
2216static int __init ip_tables_init(void) 2231static int __init ip_tables_init(void)
2217{ 2232{
2218 int ret; 2233 int ret;
2219 2234
2220 ret = xt_proto_init(AF_INET); 2235 ret = register_pernet_subsys(&ip_tables_net_ops);
2221 if (ret < 0) 2236 if (ret < 0)
2222 goto err1; 2237 goto err1;
2223 2238
@@ -2247,7 +2262,7 @@ err4:
2247err3: 2262err3:
2248 xt_unregister_target(&ipt_standard_target); 2263 xt_unregister_target(&ipt_standard_target);
2249err2: 2264err2:
2250 xt_proto_fini(AF_INET); 2265 unregister_pernet_subsys(&ip_tables_net_ops);
2251err1: 2266err1:
2252 return ret; 2267 return ret;
2253} 2268}
@@ -2260,7 +2275,7 @@ static void __exit ip_tables_fini(void)
2260 xt_unregister_target(&ipt_error_target); 2275 xt_unregister_target(&ipt_error_target);
2261 xt_unregister_target(&ipt_standard_target); 2276 xt_unregister_target(&ipt_standard_target);
2262 2277
2263 xt_proto_fini(AF_INET); 2278 unregister_pernet_subsys(&ip_tables_net_ops);
2264} 2279}
2265 2280
2266EXPORT_SYMBOL(ipt_register_table); 2281EXPORT_SYMBOL(ipt_register_table);
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index b91738ab9f4e..bf9bb6e55bb5 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -2238,11 +2238,26 @@ static struct xt_match icmp6_matchstruct __read_mostly = {
2238 .family = AF_INET6, 2238 .family = AF_INET6,
2239}; 2239};
2240 2240
2241static int __net_init ip6_tables_net_init(struct net *net)
2242{
2243 return xt_proto_init(net, AF_INET6);
2244}
2245
2246static void __net_exit ip6_tables_net_exit(struct net *net)
2247{
2248 xt_proto_fini(net, AF_INET6);
2249}
2250
2251static struct pernet_operations ip6_tables_net_ops = {
2252 .init = ip6_tables_net_init,
2253 .exit = ip6_tables_net_exit,
2254};
2255
2241static int __init ip6_tables_init(void) 2256static int __init ip6_tables_init(void)
2242{ 2257{
2243 int ret; 2258 int ret;
2244 2259
2245 ret = xt_proto_init(AF_INET6); 2260 ret = register_pernet_subsys(&ip6_tables_net_ops);
2246 if (ret < 0) 2261 if (ret < 0)
2247 goto err1; 2262 goto err1;
2248 2263
@@ -2272,7 +2287,7 @@ err4:
2272err3: 2287err3:
2273 xt_unregister_target(&ip6t_standard_target); 2288 xt_unregister_target(&ip6t_standard_target);
2274err2: 2289err2:
2275 xt_proto_fini(AF_INET6); 2290 unregister_pernet_subsys(&ip6_tables_net_ops);
2276err1: 2291err1:
2277 return ret; 2292 return ret;
2278} 2293}
@@ -2284,7 +2299,8 @@ static void __exit ip6_tables_fini(void)
2284 xt_unregister_match(&icmp6_matchstruct); 2299 xt_unregister_match(&icmp6_matchstruct);
2285 xt_unregister_target(&ip6t_error_target); 2300 xt_unregister_target(&ip6t_error_target);
2286 xt_unregister_target(&ip6t_standard_target); 2301 xt_unregister_target(&ip6t_standard_target);
2287 xt_proto_fini(AF_INET6); 2302
2303 unregister_pernet_subsys(&ip6_tables_net_ops);
2288} 2304}
2289 2305
2290/* 2306/*
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 12ed64c0bc9a..a6792089fcf9 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -922,7 +922,7 @@ static const struct file_operations xt_target_ops = {
922 922
923#endif /* CONFIG_PROC_FS */ 923#endif /* CONFIG_PROC_FS */
924 924
925int xt_proto_init(int af) 925int xt_proto_init(struct net *net, int af)
926{ 926{
927#ifdef CONFIG_PROC_FS 927#ifdef CONFIG_PROC_FS
928 char buf[XT_FUNCTION_MAXNAMELEN]; 928 char buf[XT_FUNCTION_MAXNAMELEN];
@@ -936,7 +936,7 @@ int xt_proto_init(int af)
936#ifdef CONFIG_PROC_FS 936#ifdef CONFIG_PROC_FS
937 strlcpy(buf, xt_prefix[af], sizeof(buf)); 937 strlcpy(buf, xt_prefix[af], sizeof(buf));
938 strlcat(buf, FORMAT_TABLES, sizeof(buf)); 938 strlcat(buf, FORMAT_TABLES, sizeof(buf));
939 proc = proc_net_fops_create(&init_net, buf, 0440, &xt_table_ops); 939 proc = proc_net_fops_create(net, buf, 0440, &xt_table_ops);
940 if (!proc) 940 if (!proc)
941 goto out; 941 goto out;
942 proc->data = (void *)(unsigned long)af; 942 proc->data = (void *)(unsigned long)af;
@@ -944,14 +944,14 @@ int xt_proto_init(int af)
944 944
945 strlcpy(buf, xt_prefix[af], sizeof(buf)); 945 strlcpy(buf, xt_prefix[af], sizeof(buf));
946 strlcat(buf, FORMAT_MATCHES, sizeof(buf)); 946 strlcat(buf, FORMAT_MATCHES, sizeof(buf));
947 proc = proc_net_fops_create(&init_net, buf, 0440, &xt_match_ops); 947 proc = proc_net_fops_create(net, buf, 0440, &xt_match_ops);
948 if (!proc) 948 if (!proc)
949 goto out_remove_tables; 949 goto out_remove_tables;
950 proc->data = (void *)(unsigned long)af; 950 proc->data = (void *)(unsigned long)af;
951 951
952 strlcpy(buf, xt_prefix[af], sizeof(buf)); 952 strlcpy(buf, xt_prefix[af], sizeof(buf));
953 strlcat(buf, FORMAT_TARGETS, sizeof(buf)); 953 strlcat(buf, FORMAT_TARGETS, sizeof(buf));
954 proc = proc_net_fops_create(&init_net, buf, 0440, &xt_target_ops); 954 proc = proc_net_fops_create(net, buf, 0440, &xt_target_ops);
955 if (!proc) 955 if (!proc)
956 goto out_remove_matches; 956 goto out_remove_matches;
957 proc->data = (void *)(unsigned long)af; 957 proc->data = (void *)(unsigned long)af;
@@ -963,34 +963,34 @@ int xt_proto_init(int af)
963out_remove_matches: 963out_remove_matches:
964 strlcpy(buf, xt_prefix[af], sizeof(buf)); 964 strlcpy(buf, xt_prefix[af], sizeof(buf));
965 strlcat(buf, FORMAT_MATCHES, sizeof(buf)); 965 strlcat(buf, FORMAT_MATCHES, sizeof(buf));
966 proc_net_remove(&init_net, buf); 966 proc_net_remove(net, buf);
967 967
968out_remove_tables: 968out_remove_tables:
969 strlcpy(buf, xt_prefix[af], sizeof(buf)); 969 strlcpy(buf, xt_prefix[af], sizeof(buf));
970 strlcat(buf, FORMAT_TABLES, sizeof(buf)); 970 strlcat(buf, FORMAT_TABLES, sizeof(buf));
971 proc_net_remove(&init_net, buf); 971 proc_net_remove(net, buf);
972out: 972out:
973 return -1; 973 return -1;
974#endif 974#endif
975} 975}
976EXPORT_SYMBOL_GPL(xt_proto_init); 976EXPORT_SYMBOL_GPL(xt_proto_init);
977 977
978void xt_proto_fini(int af) 978void xt_proto_fini(struct net *net, int af)
979{ 979{
980#ifdef CONFIG_PROC_FS 980#ifdef CONFIG_PROC_FS
981 char buf[XT_FUNCTION_MAXNAMELEN]; 981 char buf[XT_FUNCTION_MAXNAMELEN];
982 982
983 strlcpy(buf, xt_prefix[af], sizeof(buf)); 983 strlcpy(buf, xt_prefix[af], sizeof(buf));
984 strlcat(buf, FORMAT_TABLES, sizeof(buf)); 984 strlcat(buf, FORMAT_TABLES, sizeof(buf));
985 proc_net_remove(&init_net, buf); 985 proc_net_remove(net, buf);
986 986
987 strlcpy(buf, xt_prefix[af], sizeof(buf)); 987 strlcpy(buf, xt_prefix[af], sizeof(buf));
988 strlcat(buf, FORMAT_TARGETS, sizeof(buf)); 988 strlcat(buf, FORMAT_TARGETS, sizeof(buf));
989 proc_net_remove(&init_net, buf); 989 proc_net_remove(net, buf);
990 990
991 strlcpy(buf, xt_prefix[af], sizeof(buf)); 991 strlcpy(buf, xt_prefix[af], sizeof(buf));
992 strlcat(buf, FORMAT_MATCHES, sizeof(buf)); 992 strlcat(buf, FORMAT_MATCHES, sizeof(buf));
993 proc_net_remove(&init_net, buf); 993 proc_net_remove(net, buf);
994#endif /*CONFIG_PROC_FS*/ 994#endif /*CONFIG_PROC_FS*/
995} 995}
996EXPORT_SYMBOL_GPL(xt_proto_fini); 996EXPORT_SYMBOL_GPL(xt_proto_fini);