aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/addrconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r--net/ipv6/addrconf.c91
1 files changed, 9 insertions, 82 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index b1ce8fc62049..de7a194a64ab 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -4037,41 +4037,6 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write,
4037 return ret; 4037 return ret;
4038} 4038}
4039 4039
4040static int addrconf_sysctl_forward_strategy(ctl_table *table,
4041 void __user *oldval,
4042 size_t __user *oldlenp,
4043 void __user *newval, size_t newlen)
4044{
4045 int *valp = table->data;
4046 int val = *valp;
4047 int new;
4048
4049 if (!newval || !newlen)
4050 return 0;
4051 if (newlen != sizeof(int))
4052 return -EINVAL;
4053 if (get_user(new, (int __user *)newval))
4054 return -EFAULT;
4055 if (new == *valp)
4056 return 0;
4057 if (oldval && oldlenp) {
4058 size_t len;
4059 if (get_user(len, oldlenp))
4060 return -EFAULT;
4061 if (len) {
4062 if (len > table->maxlen)
4063 len = table->maxlen;
4064 if (copy_to_user(oldval, valp, len))
4065 return -EFAULT;
4066 if (put_user(len, oldlenp))
4067 return -EFAULT;
4068 }
4069 }
4070
4071 *valp = new;
4072 return addrconf_fixup_forwarding(table, valp, val);
4073}
4074
4075static void dev_disable_change(struct inet6_dev *idev) 4040static void dev_disable_change(struct inet6_dev *idev)
4076{ 4041{
4077 if (!idev || !idev->dev) 4042 if (!idev || !idev->dev)
@@ -4148,16 +4113,13 @@ static struct addrconf_sysctl_table
4148 .sysctl_header = NULL, 4113 .sysctl_header = NULL,
4149 .addrconf_vars = { 4114 .addrconf_vars = {
4150 { 4115 {
4151 .ctl_name = NET_IPV6_FORWARDING,
4152 .procname = "forwarding", 4116 .procname = "forwarding",
4153 .data = &ipv6_devconf.forwarding, 4117 .data = &ipv6_devconf.forwarding,
4154 .maxlen = sizeof(int), 4118 .maxlen = sizeof(int),
4155 .mode = 0644, 4119 .mode = 0644,
4156 .proc_handler = addrconf_sysctl_forward, 4120 .proc_handler = addrconf_sysctl_forward,
4157 .strategy = addrconf_sysctl_forward_strategy,
4158 }, 4121 },
4159 { 4122 {
4160 .ctl_name = NET_IPV6_HOP_LIMIT,
4161 .procname = "hop_limit", 4123 .procname = "hop_limit",
4162 .data = &ipv6_devconf.hop_limit, 4124 .data = &ipv6_devconf.hop_limit,
4163 .maxlen = sizeof(int), 4125 .maxlen = sizeof(int),
@@ -4165,7 +4127,6 @@ static struct addrconf_sysctl_table
4165 .proc_handler = proc_dointvec, 4127 .proc_handler = proc_dointvec,
4166 }, 4128 },
4167 { 4129 {
4168 .ctl_name = NET_IPV6_MTU,
4169 .procname = "mtu", 4130 .procname = "mtu",
4170 .data = &ipv6_devconf.mtu6, 4131 .data = &ipv6_devconf.mtu6,
4171 .maxlen = sizeof(int), 4132 .maxlen = sizeof(int),
@@ -4173,7 +4134,6 @@ static struct addrconf_sysctl_table
4173 .proc_handler = proc_dointvec, 4134 .proc_handler = proc_dointvec,
4174 }, 4135 },
4175 { 4136 {
4176 .ctl_name = NET_IPV6_ACCEPT_RA,
4177 .procname = "accept_ra", 4137 .procname = "accept_ra",
4178 .data = &ipv6_devconf.accept_ra, 4138 .data = &ipv6_devconf.accept_ra,
4179 .maxlen = sizeof(int), 4139 .maxlen = sizeof(int),
@@ -4181,7 +4141,6 @@ static struct addrconf_sysctl_table
4181 .proc_handler = proc_dointvec, 4141 .proc_handler = proc_dointvec,
4182 }, 4142 },
4183 { 4143 {
4184 .ctl_name = NET_IPV6_ACCEPT_REDIRECTS,
4185 .procname = "accept_redirects", 4144 .procname = "accept_redirects",
4186 .data = &ipv6_devconf.accept_redirects, 4145 .data = &ipv6_devconf.accept_redirects,
4187 .maxlen = sizeof(int), 4146 .maxlen = sizeof(int),
@@ -4189,7 +4148,6 @@ static struct addrconf_sysctl_table
4189 .proc_handler = proc_dointvec, 4148 .proc_handler = proc_dointvec,
4190 }, 4149 },
4191 { 4150 {
4192 .ctl_name = NET_IPV6_AUTOCONF,
4193 .procname = "autoconf", 4151 .procname = "autoconf",
4194 .data = &ipv6_devconf.autoconf, 4152 .data = &ipv6_devconf.autoconf,
4195 .maxlen = sizeof(int), 4153 .maxlen = sizeof(int),
@@ -4197,7 +4155,6 @@ static struct addrconf_sysctl_table
4197 .proc_handler = proc_dointvec, 4155 .proc_handler = proc_dointvec,
4198 }, 4156 },
4199 { 4157 {
4200 .ctl_name = NET_IPV6_DAD_TRANSMITS,
4201 .procname = "dad_transmits", 4158 .procname = "dad_transmits",
4202 .data = &ipv6_devconf.dad_transmits, 4159 .data = &ipv6_devconf.dad_transmits,
4203 .maxlen = sizeof(int), 4160 .maxlen = sizeof(int),
@@ -4205,7 +4162,6 @@ static struct addrconf_sysctl_table
4205 .proc_handler = proc_dointvec, 4162 .proc_handler = proc_dointvec,
4206 }, 4163 },
4207 { 4164 {
4208 .ctl_name = NET_IPV6_RTR_SOLICITS,
4209 .procname = "router_solicitations", 4165 .procname = "router_solicitations",
4210 .data = &ipv6_devconf.rtr_solicits, 4166 .data = &ipv6_devconf.rtr_solicits,
4211 .maxlen = sizeof(int), 4167 .maxlen = sizeof(int),
@@ -4213,25 +4169,20 @@ static struct addrconf_sysctl_table
4213 .proc_handler = proc_dointvec, 4169 .proc_handler = proc_dointvec,
4214 }, 4170 },
4215 { 4171 {
4216 .ctl_name = NET_IPV6_RTR_SOLICIT_INTERVAL,
4217 .procname = "router_solicitation_interval", 4172 .procname = "router_solicitation_interval",
4218 .data = &ipv6_devconf.rtr_solicit_interval, 4173 .data = &ipv6_devconf.rtr_solicit_interval,
4219 .maxlen = sizeof(int), 4174 .maxlen = sizeof(int),
4220 .mode = 0644, 4175 .mode = 0644,
4221 .proc_handler = proc_dointvec_jiffies, 4176 .proc_handler = proc_dointvec_jiffies,
4222 .strategy = sysctl_jiffies,
4223 }, 4177 },
4224 { 4178 {
4225 .ctl_name = NET_IPV6_RTR_SOLICIT_DELAY,
4226 .procname = "router_solicitation_delay", 4179 .procname = "router_solicitation_delay",
4227 .data = &ipv6_devconf.rtr_solicit_delay, 4180 .data = &ipv6_devconf.rtr_solicit_delay,
4228 .maxlen = sizeof(int), 4181 .maxlen = sizeof(int),
4229 .mode = 0644, 4182 .mode = 0644,
4230 .proc_handler = proc_dointvec_jiffies, 4183 .proc_handler = proc_dointvec_jiffies,
4231 .strategy = sysctl_jiffies,
4232 }, 4184 },
4233 { 4185 {
4234 .ctl_name = NET_IPV6_FORCE_MLD_VERSION,
4235 .procname = "force_mld_version", 4186 .procname = "force_mld_version",
4236 .data = &ipv6_devconf.force_mld_version, 4187 .data = &ipv6_devconf.force_mld_version,
4237 .maxlen = sizeof(int), 4188 .maxlen = sizeof(int),
@@ -4240,7 +4191,6 @@ static struct addrconf_sysctl_table
4240 }, 4191 },
4241#ifdef CONFIG_IPV6_PRIVACY 4192#ifdef CONFIG_IPV6_PRIVACY
4242 { 4193 {
4243 .ctl_name = NET_IPV6_USE_TEMPADDR,
4244 .procname = "use_tempaddr", 4194 .procname = "use_tempaddr",
4245 .data = &ipv6_devconf.use_tempaddr, 4195 .data = &ipv6_devconf.use_tempaddr,
4246 .maxlen = sizeof(int), 4196 .maxlen = sizeof(int),
@@ -4248,7 +4198,6 @@ static struct addrconf_sysctl_table
4248 .proc_handler = proc_dointvec, 4198 .proc_handler = proc_dointvec,
4249 }, 4199 },
4250 { 4200 {
4251 .ctl_name = NET_IPV6_TEMP_VALID_LFT,
4252 .procname = "temp_valid_lft", 4201 .procname = "temp_valid_lft",
4253 .data = &ipv6_devconf.temp_valid_lft, 4202 .data = &ipv6_devconf.temp_valid_lft,
4254 .maxlen = sizeof(int), 4203 .maxlen = sizeof(int),
@@ -4256,7 +4205,6 @@ static struct addrconf_sysctl_table
4256 .proc_handler = proc_dointvec, 4205 .proc_handler = proc_dointvec,
4257 }, 4206 },
4258 { 4207 {
4259 .ctl_name = NET_IPV6_TEMP_PREFERED_LFT,
4260 .procname = "temp_prefered_lft", 4208 .procname = "temp_prefered_lft",
4261 .data = &ipv6_devconf.temp_prefered_lft, 4209 .data = &ipv6_devconf.temp_prefered_lft,
4262 .maxlen = sizeof(int), 4210 .maxlen = sizeof(int),
@@ -4264,7 +4212,6 @@ static struct addrconf_sysctl_table
4264 .proc_handler = proc_dointvec, 4212 .proc_handler = proc_dointvec,
4265 }, 4213 },
4266 { 4214 {
4267 .ctl_name = NET_IPV6_REGEN_MAX_RETRY,
4268 .procname = "regen_max_retry", 4215 .procname = "regen_max_retry",
4269 .data = &ipv6_devconf.regen_max_retry, 4216 .data = &ipv6_devconf.regen_max_retry,
4270 .maxlen = sizeof(int), 4217 .maxlen = sizeof(int),
@@ -4272,7 +4219,6 @@ static struct addrconf_sysctl_table
4272 .proc_handler = proc_dointvec, 4219 .proc_handler = proc_dointvec,
4273 }, 4220 },
4274 { 4221 {
4275 .ctl_name = NET_IPV6_MAX_DESYNC_FACTOR,
4276 .procname = "max_desync_factor", 4222 .procname = "max_desync_factor",
4277 .data = &ipv6_devconf.max_desync_factor, 4223 .data = &ipv6_devconf.max_desync_factor,
4278 .maxlen = sizeof(int), 4224 .maxlen = sizeof(int),
@@ -4281,7 +4227,6 @@ static struct addrconf_sysctl_table
4281 }, 4227 },
4282#endif 4228#endif
4283 { 4229 {
4284 .ctl_name = NET_IPV6_MAX_ADDRESSES,
4285 .procname = "max_addresses", 4230 .procname = "max_addresses",
4286 .data = &ipv6_devconf.max_addresses, 4231 .data = &ipv6_devconf.max_addresses,
4287 .maxlen = sizeof(int), 4232 .maxlen = sizeof(int),
@@ -4289,7 +4234,6 @@ static struct addrconf_sysctl_table
4289 .proc_handler = proc_dointvec, 4234 .proc_handler = proc_dointvec,
4290 }, 4235 },
4291 { 4236 {
4292 .ctl_name = NET_IPV6_ACCEPT_RA_DEFRTR,
4293 .procname = "accept_ra_defrtr", 4237 .procname = "accept_ra_defrtr",
4294 .data = &ipv6_devconf.accept_ra_defrtr, 4238 .data = &ipv6_devconf.accept_ra_defrtr,
4295 .maxlen = sizeof(int), 4239 .maxlen = sizeof(int),
@@ -4297,7 +4241,6 @@ static struct addrconf_sysctl_table
4297 .proc_handler = proc_dointvec, 4241 .proc_handler = proc_dointvec,
4298 }, 4242 },
4299 { 4243 {
4300 .ctl_name = NET_IPV6_ACCEPT_RA_PINFO,
4301 .procname = "accept_ra_pinfo", 4244 .procname = "accept_ra_pinfo",
4302 .data = &ipv6_devconf.accept_ra_pinfo, 4245 .data = &ipv6_devconf.accept_ra_pinfo,
4303 .maxlen = sizeof(int), 4246 .maxlen = sizeof(int),
@@ -4306,7 +4249,6 @@ static struct addrconf_sysctl_table
4306 }, 4249 },
4307#ifdef CONFIG_IPV6_ROUTER_PREF 4250#ifdef CONFIG_IPV6_ROUTER_PREF
4308 { 4251 {
4309 .ctl_name = NET_IPV6_ACCEPT_RA_RTR_PREF,
4310 .procname = "accept_ra_rtr_pref", 4252 .procname = "accept_ra_rtr_pref",
4311 .data = &ipv6_devconf.accept_ra_rtr_pref, 4253 .data = &ipv6_devconf.accept_ra_rtr_pref,
4312 .maxlen = sizeof(int), 4254 .maxlen = sizeof(int),
@@ -4314,17 +4256,14 @@ static struct addrconf_sysctl_table
4314 .proc_handler = proc_dointvec, 4256 .proc_handler = proc_dointvec,
4315 }, 4257 },
4316 { 4258 {
4317 .ctl_name = NET_IPV6_RTR_PROBE_INTERVAL,
4318 .procname = "router_probe_interval", 4259 .procname = "router_probe_interval",
4319 .data = &ipv6_devconf.rtr_probe_interval, 4260 .data = &ipv6_devconf.rtr_probe_interval,
4320 .maxlen = sizeof(int), 4261 .maxlen = sizeof(int),
4321 .mode = 0644, 4262 .mode = 0644,
4322 .proc_handler = proc_dointvec_jiffies, 4263 .proc_handler = proc_dointvec_jiffies,
4323 .strategy = sysctl_jiffies,
4324 }, 4264 },
4325#ifdef CONFIG_IPV6_ROUTE_INFO 4265#ifdef CONFIG_IPV6_ROUTE_INFO
4326 { 4266 {
4327 .ctl_name = NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN,
4328 .procname = "accept_ra_rt_info_max_plen", 4267 .procname = "accept_ra_rt_info_max_plen",
4329 .data = &ipv6_devconf.accept_ra_rt_info_max_plen, 4268 .data = &ipv6_devconf.accept_ra_rt_info_max_plen,
4330 .maxlen = sizeof(int), 4269 .maxlen = sizeof(int),
@@ -4334,7 +4273,6 @@ static struct addrconf_sysctl_table
4334#endif 4273#endif
4335#endif 4274#endif
4336 { 4275 {
4337 .ctl_name = NET_IPV6_PROXY_NDP,
4338 .procname = "proxy_ndp", 4276 .procname = "proxy_ndp",
4339 .data = &ipv6_devconf.proxy_ndp, 4277 .data = &ipv6_devconf.proxy_ndp,
4340 .maxlen = sizeof(int), 4278 .maxlen = sizeof(int),
@@ -4342,7 +4280,6 @@ static struct addrconf_sysctl_table
4342 .proc_handler = proc_dointvec, 4280 .proc_handler = proc_dointvec,
4343 }, 4281 },
4344 { 4282 {
4345 .ctl_name = NET_IPV6_ACCEPT_SOURCE_ROUTE,
4346 .procname = "accept_source_route", 4283 .procname = "accept_source_route",
4347 .data = &ipv6_devconf.accept_source_route, 4284 .data = &ipv6_devconf.accept_source_route,
4348 .maxlen = sizeof(int), 4285 .maxlen = sizeof(int),
@@ -4351,7 +4288,6 @@ static struct addrconf_sysctl_table
4351 }, 4288 },
4352#ifdef CONFIG_IPV6_OPTIMISTIC_DAD 4289#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
4353 { 4290 {
4354 .ctl_name = CTL_UNNUMBERED,
4355 .procname = "optimistic_dad", 4291 .procname = "optimistic_dad",
4356 .data = &ipv6_devconf.optimistic_dad, 4292 .data = &ipv6_devconf.optimistic_dad,
4357 .maxlen = sizeof(int), 4293 .maxlen = sizeof(int),
@@ -4362,7 +4298,6 @@ static struct addrconf_sysctl_table
4362#endif 4298#endif
4363#ifdef CONFIG_IPV6_MROUTE 4299#ifdef CONFIG_IPV6_MROUTE
4364 { 4300 {
4365 .ctl_name = CTL_UNNUMBERED,
4366 .procname = "mc_forwarding", 4301 .procname = "mc_forwarding",
4367 .data = &ipv6_devconf.mc_forwarding, 4302 .data = &ipv6_devconf.mc_forwarding,
4368 .maxlen = sizeof(int), 4303 .maxlen = sizeof(int),
@@ -4371,16 +4306,13 @@ static struct addrconf_sysctl_table
4371 }, 4306 },
4372#endif 4307#endif
4373 { 4308 {
4374 .ctl_name = CTL_UNNUMBERED,
4375 .procname = "disable_ipv6", 4309 .procname = "disable_ipv6",
4376 .data = &ipv6_devconf.disable_ipv6, 4310 .data = &ipv6_devconf.disable_ipv6,
4377 .maxlen = sizeof(int), 4311 .maxlen = sizeof(int),
4378 .mode = 0644, 4312 .mode = 0644,
4379 .proc_handler = addrconf_sysctl_disable, 4313 .proc_handler = addrconf_sysctl_disable,
4380 .strategy = sysctl_intvec,
4381 }, 4314 },
4382 { 4315 {
4383 .ctl_name = CTL_UNNUMBERED,
4384 .procname = "accept_dad", 4316 .procname = "accept_dad",
4385 .data = &ipv6_devconf.accept_dad, 4317 .data = &ipv6_devconf.accept_dad,
4386 .maxlen = sizeof(int), 4318 .maxlen = sizeof(int),
@@ -4388,7 +4320,6 @@ static struct addrconf_sysctl_table
4388 .proc_handler = proc_dointvec, 4320 .proc_handler = proc_dointvec,
4389 }, 4321 },
4390 { 4322 {
4391 .ctl_name = CTL_UNNUMBERED,
4392 .procname = "force_tllao", 4323 .procname = "force_tllao",
4393 .data = &ipv6_devconf.force_tllao, 4324 .data = &ipv6_devconf.force_tllao,
4394 .maxlen = sizeof(int), 4325 .maxlen = sizeof(int),
@@ -4396,13 +4327,13 @@ static struct addrconf_sysctl_table
4396 .proc_handler = proc_dointvec 4327 .proc_handler = proc_dointvec
4397 }, 4328 },
4398 { 4329 {
4399 .ctl_name = 0, /* sentinel */ 4330 /* sentinel */
4400 } 4331 }
4401 }, 4332 },
4402}; 4333};
4403 4334
4404static int __addrconf_sysctl_register(struct net *net, char *dev_name, 4335static int __addrconf_sysctl_register(struct net *net, char *dev_name,
4405 int ctl_name, struct inet6_dev *idev, struct ipv6_devconf *p) 4336 struct inet6_dev *idev, struct ipv6_devconf *p)
4406{ 4337{
4407 int i; 4338 int i;
4408 struct addrconf_sysctl_table *t; 4339 struct addrconf_sysctl_table *t;
@@ -4410,9 +4341,9 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name,
4410#define ADDRCONF_CTL_PATH_DEV 3 4341#define ADDRCONF_CTL_PATH_DEV 3
4411 4342
4412 struct ctl_path addrconf_ctl_path[] = { 4343 struct ctl_path addrconf_ctl_path[] = {
4413 { .procname = "net", .ctl_name = CTL_NET, }, 4344 { .procname = "net", },
4414 { .procname = "ipv6", .ctl_name = NET_IPV6, }, 4345 { .procname = "ipv6", },
4415 { .procname = "conf", .ctl_name = NET_IPV6_CONF, }, 4346 { .procname = "conf", },
4416 { /* to be set */ }, 4347 { /* to be set */ },
4417 { }, 4348 { },
4418 }; 4349 };
@@ -4438,7 +4369,6 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name,
4438 goto free; 4369 goto free;
4439 4370
4440 addrconf_ctl_path[ADDRCONF_CTL_PATH_DEV].procname = t->dev_name; 4371 addrconf_ctl_path[ADDRCONF_CTL_PATH_DEV].procname = t->dev_name;
4441 addrconf_ctl_path[ADDRCONF_CTL_PATH_DEV].ctl_name = ctl_name;
4442 4372
4443 t->sysctl_header = register_net_sysctl_table(net, addrconf_ctl_path, 4373 t->sysctl_header = register_net_sysctl_table(net, addrconf_ctl_path,
4444 t->addrconf_vars); 4374 t->addrconf_vars);
@@ -4474,10 +4404,9 @@ static void addrconf_sysctl_register(struct inet6_dev *idev)
4474{ 4404{
4475 neigh_sysctl_register(idev->dev, idev->nd_parms, NET_IPV6, 4405 neigh_sysctl_register(idev->dev, idev->nd_parms, NET_IPV6,
4476 NET_IPV6_NEIGH, "ipv6", 4406 NET_IPV6_NEIGH, "ipv6",
4477 &ndisc_ifinfo_sysctl_change, 4407 &ndisc_ifinfo_sysctl_change);
4478 ndisc_ifinfo_sysctl_strategy);
4479 __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, 4408 __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
4480 idev->dev->ifindex, idev, &idev->cnf); 4409 idev, &idev->cnf);
4481} 4410}
4482 4411
4483static void addrconf_sysctl_unregister(struct inet6_dev *idev) 4412static void addrconf_sysctl_unregister(struct inet6_dev *idev)
@@ -4516,13 +4445,11 @@ static int addrconf_init_net(struct net *net)
4516 net->ipv6.devconf_dflt = dflt; 4445 net->ipv6.devconf_dflt = dflt;
4517 4446
4518#ifdef CONFIG_SYSCTL 4447#ifdef CONFIG_SYSCTL
4519 err = __addrconf_sysctl_register(net, "all", NET_PROTO_CONF_ALL, 4448 err = __addrconf_sysctl_register(net, "all", NULL, all);
4520 NULL, all);
4521 if (err < 0) 4449 if (err < 0)
4522 goto err_reg_all; 4450 goto err_reg_all;
4523 4451
4524 err = __addrconf_sysctl_register(net, "default", NET_PROTO_CONF_DEFAULT, 4452 err = __addrconf_sysctl_register(net, "default", NULL, dflt);
4525 NULL, dflt);
4526 if (err < 0) 4453 if (err < 0)
4527 goto err_reg_dflt; 4454 goto err_reg_dflt;
4528#endif 4455#endif