diff options
-rw-r--r-- | include/net/ipv6.h | 2 | ||||
-rw-r--r-- | include/net/route.h | 2 | ||||
-rw-r--r-- | net/ipv4/route.c | 11 | ||||
-rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 14 | ||||
-rw-r--r-- | net/ipv6/af_inet6.c | 12 | ||||
-rw-r--r-- | net/ipv6/sysctl_net_ipv6.c | 16 | ||||
-rw-r--r-- | net/sysctl_net.c | 4 |
7 files changed, 43 insertions, 18 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 2d5c18514a2d..113028fb8f66 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -608,6 +608,8 @@ extern struct ctl_table *ipv6_icmp_sysctl_init(struct net *net); | |||
608 | extern struct ctl_table *ipv6_route_sysctl_init(struct net *net); | 608 | extern struct ctl_table *ipv6_route_sysctl_init(struct net *net); |
609 | extern int ipv6_sysctl_register(void); | 609 | extern int ipv6_sysctl_register(void); |
610 | extern void ipv6_sysctl_unregister(void); | 610 | extern void ipv6_sysctl_unregister(void); |
611 | extern int ipv6_static_sysctl_register(void); | ||
612 | extern void ipv6_static_sysctl_unregister(void); | ||
611 | #endif | 613 | #endif |
612 | 614 | ||
613 | #endif /* __KERNEL__ */ | 615 | #endif /* __KERNEL__ */ |
diff --git a/include/net/route.h b/include/net/route.h index 3140cc500854..4f0d8c14736c 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -204,6 +204,4 @@ static inline struct inet_peer *rt_get_peer(struct rtable *rt) | |||
204 | return rt->peer; | 204 | return rt->peer; |
205 | } | 205 | } |
206 | 206 | ||
207 | extern ctl_table ipv4_route_table[]; | ||
208 | |||
209 | #endif /* _ROUTE_H */ | 207 | #endif /* _ROUTE_H */ |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a507c5e27d0e..380d6474cf66 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2914,7 +2914,7 @@ static int ipv4_sysctl_rtcache_flush_strategy(ctl_table *table, | |||
2914 | return 0; | 2914 | return 0; |
2915 | } | 2915 | } |
2916 | 2916 | ||
2917 | ctl_table ipv4_route_table[] = { | 2917 | static ctl_table ipv4_route_table[] = { |
2918 | { | 2918 | { |
2919 | .ctl_name = NET_IPV4_ROUTE_GC_THRESH, | 2919 | .ctl_name = NET_IPV4_ROUTE_GC_THRESH, |
2920 | .procname = "gc_thresh", | 2920 | .procname = "gc_thresh", |
@@ -3216,6 +3216,15 @@ int __init ip_rt_init(void) | |||
3216 | return rc; | 3216 | return rc; |
3217 | } | 3217 | } |
3218 | 3218 | ||
3219 | /* | ||
3220 | * We really need to sanitize the damn ipv4 init order, then all | ||
3221 | * this nonsense will go away. | ||
3222 | */ | ||
3223 | void __init ip_static_sysctl_init(void) | ||
3224 | { | ||
3225 | register_sysctl_paths(ipv4_route_path, ipv4_route_table); | ||
3226 | } | ||
3227 | |||
3219 | EXPORT_SYMBOL(__ip_select_ident); | 3228 | EXPORT_SYMBOL(__ip_select_ident); |
3220 | EXPORT_SYMBOL(ip_route_input); | 3229 | EXPORT_SYMBOL(ip_route_input); |
3221 | EXPORT_SYMBOL(ip_route_output_key); | 3230 | EXPORT_SYMBOL(ip_route_output_key); |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index d63e9388d92d..770d827f5ab8 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -401,13 +401,6 @@ static struct ctl_table ipv4_table[] = { | |||
401 | .proc_handler = &ipv4_local_port_range, | 401 | .proc_handler = &ipv4_local_port_range, |
402 | .strategy = &ipv4_sysctl_local_port_range, | 402 | .strategy = &ipv4_sysctl_local_port_range, |
403 | }, | 403 | }, |
404 | { | ||
405 | .ctl_name = NET_IPV4_ROUTE, | ||
406 | .procname = "route", | ||
407 | .maxlen = 0, | ||
408 | .mode = 0555, | ||
409 | .child = ipv4_route_table | ||
410 | }, | ||
411 | #ifdef CONFIG_IP_MULTICAST | 404 | #ifdef CONFIG_IP_MULTICAST |
412 | { | 405 | { |
413 | .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS, | 406 | .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS, |
@@ -882,11 +875,4 @@ static __init int sysctl_ipv4_init(void) | |||
882 | return 0; | 875 | return 0; |
883 | } | 876 | } |
884 | 877 | ||
885 | /* set enough of tree skeleton to get rid of ordering problems */ | ||
886 | void __init ip_static_sysctl_init(void) | ||
887 | { | ||
888 | static ctl_table table[1]; | ||
889 | register_sysctl_paths(net_ipv4_ctl_path, table); | ||
890 | } | ||
891 | |||
892 | __initcall(sysctl_ipv4_init); | 878 | __initcall(sysctl_ipv4_init); |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index c708ca842298..95055f8c3f35 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -934,6 +934,11 @@ static int __init inet6_init(void) | |||
934 | if (err) | 934 | if (err) |
935 | goto out_unregister_sock; | 935 | goto out_unregister_sock; |
936 | 936 | ||
937 | #ifdef CONFIG_SYSCTL | ||
938 | err = ipv6_static_sysctl_register(); | ||
939 | if (err) | ||
940 | goto static_sysctl_fail; | ||
941 | #endif | ||
937 | /* | 942 | /* |
938 | * ipngwg API draft makes clear that the correct semantics | 943 | * ipngwg API draft makes clear that the correct semantics |
939 | * for TCP and UDP is to consider one TCP and UDP instance | 944 | * for TCP and UDP is to consider one TCP and UDP instance |
@@ -1058,6 +1063,10 @@ ipmr_fail: | |||
1058 | icmp_fail: | 1063 | icmp_fail: |
1059 | unregister_pernet_subsys(&inet6_net_ops); | 1064 | unregister_pernet_subsys(&inet6_net_ops); |
1060 | register_pernet_fail: | 1065 | register_pernet_fail: |
1066 | #ifdef CONFIG_SYSCTL | ||
1067 | ipv6_static_sysctl_unregister(); | ||
1068 | static_sysctl_fail: | ||
1069 | #endif | ||
1061 | cleanup_ipv6_mibs(); | 1070 | cleanup_ipv6_mibs(); |
1062 | out_unregister_sock: | 1071 | out_unregister_sock: |
1063 | sock_unregister(PF_INET6); | 1072 | sock_unregister(PF_INET6); |
@@ -1113,6 +1122,9 @@ static void __exit inet6_exit(void) | |||
1113 | rawv6_exit(); | 1122 | rawv6_exit(); |
1114 | 1123 | ||
1115 | unregister_pernet_subsys(&inet6_net_ops); | 1124 | unregister_pernet_subsys(&inet6_net_ops); |
1125 | #ifdef CONFIG_SYSCTL | ||
1126 | ipv6_static_sysctl_unregister(); | ||
1127 | #endif | ||
1116 | cleanup_ipv6_mibs(); | 1128 | cleanup_ipv6_mibs(); |
1117 | proto_unregister(&rawv6_prot); | 1129 | proto_unregister(&rawv6_prot); |
1118 | proto_unregister(&udplitev6_prot); | 1130 | proto_unregister(&udplitev6_prot); |
diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c index 5c99274558bf..e6dfaeac6be3 100644 --- a/net/ipv6/sysctl_net_ipv6.c +++ b/net/ipv6/sysctl_net_ipv6.c | |||
@@ -150,3 +150,19 @@ void ipv6_sysctl_unregister(void) | |||
150 | unregister_net_sysctl_table(ip6_header); | 150 | unregister_net_sysctl_table(ip6_header); |
151 | unregister_pernet_subsys(&ipv6_sysctl_net_ops); | 151 | unregister_pernet_subsys(&ipv6_sysctl_net_ops); |
152 | } | 152 | } |
153 | |||
154 | static struct ctl_table_header *ip6_base; | ||
155 | |||
156 | int ipv6_static_sysctl_register(void) | ||
157 | { | ||
158 | static struct ctl_table empty[1]; | ||
159 | ip6_base = register_net_sysctl_rotable(net_ipv6_ctl_path, empty); | ||
160 | if (ip6_base == NULL) | ||
161 | return -ENOMEM; | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | void ipv6_static_sysctl_unregister(void) | ||
166 | { | ||
167 | unregister_net_sysctl_table(ip6_base); | ||
168 | } | ||
diff --git a/net/sysctl_net.c b/net/sysctl_net.c index cefbc367d8be..972201cd5fa7 100644 --- a/net/sysctl_net.c +++ b/net/sysctl_net.c | |||
@@ -73,7 +73,9 @@ static struct ctl_table_root net_sysctl_ro_root = { | |||
73 | 73 | ||
74 | static int sysctl_net_init(struct net *net) | 74 | static int sysctl_net_init(struct net *net) |
75 | { | 75 | { |
76 | setup_sysctl_set(&net->sysctls, NULL, is_seen); | 76 | setup_sysctl_set(&net->sysctls, |
77 | &net_sysctl_ro_root.default_set, | ||
78 | is_seen); | ||
77 | return 0; | 79 | return 0; |
78 | } | 80 | } |
79 | 81 | ||