diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 346 |
1 files changed, 193 insertions, 153 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 19727d941962..01c62a0d3742 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -78,8 +78,6 @@ | |||
78 | 78 | ||
79 | #ifdef CONFIG_IPV6_PRIVACY | 79 | #ifdef CONFIG_IPV6_PRIVACY |
80 | #include <linux/random.h> | 80 | #include <linux/random.h> |
81 | #include <linux/crypto.h> | ||
82 | #include <linux/scatterlist.h> | ||
83 | #endif | 81 | #endif |
84 | 82 | ||
85 | #include <asm/uaccess.h> | 83 | #include <asm/uaccess.h> |
@@ -110,8 +108,6 @@ static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpad | |||
110 | static void ipv6_regen_rndid(unsigned long data); | 108 | static void ipv6_regen_rndid(unsigned long data); |
111 | 109 | ||
112 | static int desync_factor = MAX_DESYNC_FACTOR * HZ; | 110 | static int desync_factor = MAX_DESYNC_FACTOR * HZ; |
113 | static struct crypto_tfm *md5_tfm; | ||
114 | static DEFINE_SPINLOCK(md5_tfm_lock); | ||
115 | #endif | 111 | #endif |
116 | 112 | ||
117 | static int ipv6_count_addresses(struct inet6_dev *idev); | 113 | static int ipv6_count_addresses(struct inet6_dev *idev); |
@@ -169,6 +165,15 @@ struct ipv6_devconf ipv6_devconf = { | |||
169 | .max_desync_factor = MAX_DESYNC_FACTOR, | 165 | .max_desync_factor = MAX_DESYNC_FACTOR, |
170 | #endif | 166 | #endif |
171 | .max_addresses = IPV6_MAX_ADDRESSES, | 167 | .max_addresses = IPV6_MAX_ADDRESSES, |
168 | .accept_ra_defrtr = 1, | ||
169 | .accept_ra_pinfo = 1, | ||
170 | #ifdef CONFIG_IPV6_ROUTER_PREF | ||
171 | .accept_ra_rtr_pref = 1, | ||
172 | .rtr_probe_interval = 60 * HZ, | ||
173 | #ifdef CONFIG_IPV6_ROUTE_INFO | ||
174 | .accept_ra_rt_info_max_plen = 0, | ||
175 | #endif | ||
176 | #endif | ||
172 | }; | 177 | }; |
173 | 178 | ||
174 | static struct ipv6_devconf ipv6_devconf_dflt = { | 179 | static struct ipv6_devconf ipv6_devconf_dflt = { |
@@ -190,6 +195,15 @@ static struct ipv6_devconf ipv6_devconf_dflt = { | |||
190 | .max_desync_factor = MAX_DESYNC_FACTOR, | 195 | .max_desync_factor = MAX_DESYNC_FACTOR, |
191 | #endif | 196 | #endif |
192 | .max_addresses = IPV6_MAX_ADDRESSES, | 197 | .max_addresses = IPV6_MAX_ADDRESSES, |
198 | .accept_ra_defrtr = 1, | ||
199 | .accept_ra_pinfo = 1, | ||
200 | #ifdef CONFIG_IPV6_ROUTER_PREF | ||
201 | .accept_ra_rtr_pref = 1, | ||
202 | .rtr_probe_interval = 60 * HZ, | ||
203 | #ifdef CONFIG_IPV6_ROUTE_INFO | ||
204 | .accept_ra_rt_info_max_plen = 0, | ||
205 | #endif | ||
206 | #endif | ||
193 | }; | 207 | }; |
194 | 208 | ||
195 | /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ | 209 | /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ |
@@ -327,86 +341,83 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
327 | if (dev->mtu < IPV6_MIN_MTU) | 341 | if (dev->mtu < IPV6_MIN_MTU) |
328 | return NULL; | 342 | return NULL; |
329 | 343 | ||
330 | ndev = kmalloc(sizeof(struct inet6_dev), GFP_KERNEL); | 344 | ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL); |
331 | 345 | ||
332 | if (ndev) { | 346 | if (ndev == NULL) |
333 | memset(ndev, 0, sizeof(struct inet6_dev)); | 347 | return NULL; |
334 | 348 | ||
335 | rwlock_init(&ndev->lock); | 349 | rwlock_init(&ndev->lock); |
336 | ndev->dev = dev; | 350 | ndev->dev = dev; |
337 | memcpy(&ndev->cnf, &ipv6_devconf_dflt, sizeof(ndev->cnf)); | 351 | memcpy(&ndev->cnf, &ipv6_devconf_dflt, sizeof(ndev->cnf)); |
338 | ndev->cnf.mtu6 = dev->mtu; | 352 | ndev->cnf.mtu6 = dev->mtu; |
339 | ndev->cnf.sysctl = NULL; | 353 | ndev->cnf.sysctl = NULL; |
340 | ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl); | 354 | ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl); |
341 | if (ndev->nd_parms == NULL) { | 355 | if (ndev->nd_parms == NULL) { |
342 | kfree(ndev); | 356 | kfree(ndev); |
343 | return NULL; | 357 | return NULL; |
344 | } | 358 | } |
345 | /* We refer to the device */ | 359 | /* We refer to the device */ |
346 | dev_hold(dev); | 360 | dev_hold(dev); |
347 | |||
348 | if (snmp6_alloc_dev(ndev) < 0) { | ||
349 | ADBG((KERN_WARNING | ||
350 | "%s(): cannot allocate memory for statistics; dev=%s.\n", | ||
351 | __FUNCTION__, dev->name)); | ||
352 | neigh_parms_release(&nd_tbl, ndev->nd_parms); | ||
353 | ndev->dead = 1; | ||
354 | in6_dev_finish_destroy(ndev); | ||
355 | return NULL; | ||
356 | } | ||
357 | 361 | ||
358 | if (snmp6_register_dev(ndev) < 0) { | 362 | if (snmp6_alloc_dev(ndev) < 0) { |
359 | ADBG((KERN_WARNING | 363 | ADBG((KERN_WARNING |
360 | "%s(): cannot create /proc/net/dev_snmp6/%s\n", | 364 | "%s(): cannot allocate memory for statistics; dev=%s.\n", |
361 | __FUNCTION__, dev->name)); | 365 | __FUNCTION__, dev->name)); |
362 | neigh_parms_release(&nd_tbl, ndev->nd_parms); | 366 | neigh_parms_release(&nd_tbl, ndev->nd_parms); |
363 | ndev->dead = 1; | 367 | ndev->dead = 1; |
364 | in6_dev_finish_destroy(ndev); | 368 | in6_dev_finish_destroy(ndev); |
365 | return NULL; | 369 | return NULL; |
366 | } | 370 | } |
367 | 371 | ||
368 | /* One reference from device. We must do this before | 372 | if (snmp6_register_dev(ndev) < 0) { |
369 | * we invoke __ipv6_regen_rndid(). | 373 | ADBG((KERN_WARNING |
370 | */ | 374 | "%s(): cannot create /proc/net/dev_snmp6/%s\n", |
371 | in6_dev_hold(ndev); | 375 | __FUNCTION__, dev->name)); |
376 | neigh_parms_release(&nd_tbl, ndev->nd_parms); | ||
377 | ndev->dead = 1; | ||
378 | in6_dev_finish_destroy(ndev); | ||
379 | return NULL; | ||
380 | } | ||
381 | |||
382 | /* One reference from device. We must do this before | ||
383 | * we invoke __ipv6_regen_rndid(). | ||
384 | */ | ||
385 | in6_dev_hold(ndev); | ||
372 | 386 | ||
373 | #ifdef CONFIG_IPV6_PRIVACY | 387 | #ifdef CONFIG_IPV6_PRIVACY |
374 | get_random_bytes(ndev->rndid, sizeof(ndev->rndid)); | 388 | init_timer(&ndev->regen_timer); |
375 | get_random_bytes(ndev->entropy, sizeof(ndev->entropy)); | 389 | ndev->regen_timer.function = ipv6_regen_rndid; |
376 | init_timer(&ndev->regen_timer); | 390 | ndev->regen_timer.data = (unsigned long) ndev; |
377 | ndev->regen_timer.function = ipv6_regen_rndid; | 391 | if ((dev->flags&IFF_LOOPBACK) || |
378 | ndev->regen_timer.data = (unsigned long) ndev; | 392 | dev->type == ARPHRD_TUNNEL || |
379 | if ((dev->flags&IFF_LOOPBACK) || | 393 | dev->type == ARPHRD_NONE || |
380 | dev->type == ARPHRD_TUNNEL || | 394 | dev->type == ARPHRD_SIT) { |
381 | dev->type == ARPHRD_NONE || | 395 | printk(KERN_INFO |
382 | dev->type == ARPHRD_SIT) { | 396 | "%s: Disabled Privacy Extensions\n", |
383 | printk(KERN_INFO | 397 | dev->name); |
384 | "%s: Disabled Privacy Extensions\n", | 398 | ndev->cnf.use_tempaddr = -1; |
385 | dev->name); | 399 | } else { |
386 | ndev->cnf.use_tempaddr = -1; | 400 | in6_dev_hold(ndev); |
387 | } else { | 401 | ipv6_regen_rndid((unsigned long) ndev); |
388 | in6_dev_hold(ndev); | 402 | } |
389 | ipv6_regen_rndid((unsigned long) ndev); | ||
390 | } | ||
391 | #endif | 403 | #endif |
392 | 404 | ||
393 | if (netif_carrier_ok(dev)) | 405 | if (netif_carrier_ok(dev)) |
394 | ndev->if_flags |= IF_READY; | 406 | ndev->if_flags |= IF_READY; |
395 | 407 | ||
396 | write_lock_bh(&addrconf_lock); | 408 | write_lock_bh(&addrconf_lock); |
397 | dev->ip6_ptr = ndev; | 409 | dev->ip6_ptr = ndev; |
398 | write_unlock_bh(&addrconf_lock); | 410 | write_unlock_bh(&addrconf_lock); |
399 | 411 | ||
400 | ipv6_mc_init_dev(ndev); | 412 | ipv6_mc_init_dev(ndev); |
401 | ndev->tstamp = jiffies; | 413 | ndev->tstamp = jiffies; |
402 | #ifdef CONFIG_SYSCTL | 414 | #ifdef CONFIG_SYSCTL |
403 | neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6, | 415 | neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6, |
404 | NET_IPV6_NEIGH, "ipv6", | 416 | NET_IPV6_NEIGH, "ipv6", |
405 | &ndisc_ifinfo_sysctl_change, | 417 | &ndisc_ifinfo_sysctl_change, |
406 | NULL); | 418 | NULL); |
407 | addrconf_sysctl_register(ndev, &ndev->cnf); | 419 | addrconf_sysctl_register(ndev, &ndev->cnf); |
408 | #endif | 420 | #endif |
409 | } | ||
410 | return ndev; | 421 | return ndev; |
411 | } | 422 | } |
412 | 423 | ||
@@ -524,7 +535,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
524 | goto out; | 535 | goto out; |
525 | } | 536 | } |
526 | 537 | ||
527 | ifa = kmalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC); | 538 | ifa = kzalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC); |
528 | 539 | ||
529 | if (ifa == NULL) { | 540 | if (ifa == NULL) { |
530 | ADBG(("ipv6_add_addr: malloc failed\n")); | 541 | ADBG(("ipv6_add_addr: malloc failed\n")); |
@@ -538,7 +549,6 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
538 | goto out; | 549 | goto out; |
539 | } | 550 | } |
540 | 551 | ||
541 | memset(ifa, 0, sizeof(struct inet6_ifaddr)); | ||
542 | ipv6_addr_copy(&ifa->addr, addr); | 552 | ipv6_addr_copy(&ifa->addr, addr); |
543 | 553 | ||
544 | spin_lock_init(&ifa->lock); | 554 | spin_lock_init(&ifa->lock); |
@@ -1305,52 +1315,67 @@ static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) | |||
1305 | __ipv6_dev_ac_dec(ifp->idev, &addr); | 1315 | __ipv6_dev_ac_dec(ifp->idev, &addr); |
1306 | } | 1316 | } |
1307 | 1317 | ||
1318 | static int addrconf_ifid_eui48(u8 *eui, struct net_device *dev) | ||
1319 | { | ||
1320 | if (dev->addr_len != ETH_ALEN) | ||
1321 | return -1; | ||
1322 | memcpy(eui, dev->dev_addr, 3); | ||
1323 | memcpy(eui + 5, dev->dev_addr + 3, 3); | ||
1324 | |||
1325 | /* | ||
1326 | * The zSeries OSA network cards can be shared among various | ||
1327 | * OS instances, but the OSA cards have only one MAC address. | ||
1328 | * This leads to duplicate address conflicts in conjunction | ||
1329 | * with IPv6 if more than one instance uses the same card. | ||
1330 | * | ||
1331 | * The driver for these cards can deliver a unique 16-bit | ||
1332 | * identifier for each instance sharing the same card. It is | ||
1333 | * placed instead of 0xFFFE in the interface identifier. The | ||
1334 | * "u" bit of the interface identifier is not inverted in this | ||
1335 | * case. Hence the resulting interface identifier has local | ||
1336 | * scope according to RFC2373. | ||
1337 | */ | ||
1338 | if (dev->dev_id) { | ||
1339 | eui[3] = (dev->dev_id >> 8) & 0xFF; | ||
1340 | eui[4] = dev->dev_id & 0xFF; | ||
1341 | } else { | ||
1342 | eui[3] = 0xFF; | ||
1343 | eui[4] = 0xFE; | ||
1344 | eui[0] ^= 2; | ||
1345 | } | ||
1346 | return 0; | ||
1347 | } | ||
1348 | |||
1349 | static int addrconf_ifid_arcnet(u8 *eui, struct net_device *dev) | ||
1350 | { | ||
1351 | /* XXX: inherit EUI-64 from other interface -- yoshfuji */ | ||
1352 | if (dev->addr_len != ARCNET_ALEN) | ||
1353 | return -1; | ||
1354 | memset(eui, 0, 7); | ||
1355 | eui[7] = *(u8*)dev->dev_addr; | ||
1356 | return 0; | ||
1357 | } | ||
1358 | |||
1359 | static int addrconf_ifid_infiniband(u8 *eui, struct net_device *dev) | ||
1360 | { | ||
1361 | if (dev->addr_len != INFINIBAND_ALEN) | ||
1362 | return -1; | ||
1363 | memcpy(eui, dev->dev_addr + 12, 8); | ||
1364 | eui[0] |= 2; | ||
1365 | return 0; | ||
1366 | } | ||
1367 | |||
1308 | static int ipv6_generate_eui64(u8 *eui, struct net_device *dev) | 1368 | static int ipv6_generate_eui64(u8 *eui, struct net_device *dev) |
1309 | { | 1369 | { |
1310 | switch (dev->type) { | 1370 | switch (dev->type) { |
1311 | case ARPHRD_ETHER: | 1371 | case ARPHRD_ETHER: |
1312 | case ARPHRD_FDDI: | 1372 | case ARPHRD_FDDI: |
1313 | case ARPHRD_IEEE802_TR: | 1373 | case ARPHRD_IEEE802_TR: |
1314 | if (dev->addr_len != ETH_ALEN) | 1374 | return addrconf_ifid_eui48(eui, dev); |
1315 | return -1; | ||
1316 | memcpy(eui, dev->dev_addr, 3); | ||
1317 | memcpy(eui + 5, dev->dev_addr + 3, 3); | ||
1318 | |||
1319 | /* | ||
1320 | * The zSeries OSA network cards can be shared among various | ||
1321 | * OS instances, but the OSA cards have only one MAC address. | ||
1322 | * This leads to duplicate address conflicts in conjunction | ||
1323 | * with IPv6 if more than one instance uses the same card. | ||
1324 | * | ||
1325 | * The driver for these cards can deliver a unique 16-bit | ||
1326 | * identifier for each instance sharing the same card. It is | ||
1327 | * placed instead of 0xFFFE in the interface identifier. The | ||
1328 | * "u" bit of the interface identifier is not inverted in this | ||
1329 | * case. Hence the resulting interface identifier has local | ||
1330 | * scope according to RFC2373. | ||
1331 | */ | ||
1332 | if (dev->dev_id) { | ||
1333 | eui[3] = (dev->dev_id >> 8) & 0xFF; | ||
1334 | eui[4] = dev->dev_id & 0xFF; | ||
1335 | } else { | ||
1336 | eui[3] = 0xFF; | ||
1337 | eui[4] = 0xFE; | ||
1338 | eui[0] ^= 2; | ||
1339 | } | ||
1340 | return 0; | ||
1341 | case ARPHRD_ARCNET: | 1375 | case ARPHRD_ARCNET: |
1342 | /* XXX: inherit EUI-64 from other interface -- yoshfuji */ | 1376 | return addrconf_ifid_arcnet(eui, dev); |
1343 | if (dev->addr_len != ARCNET_ALEN) | ||
1344 | return -1; | ||
1345 | memset(eui, 0, 7); | ||
1346 | eui[7] = *(u8*)dev->dev_addr; | ||
1347 | return 0; | ||
1348 | case ARPHRD_INFINIBAND: | 1377 | case ARPHRD_INFINIBAND: |
1349 | if (dev->addr_len != INFINIBAND_ALEN) | 1378 | return addrconf_ifid_infiniband(eui, dev); |
1350 | return -1; | ||
1351 | memcpy(eui, dev->dev_addr + 12, 8); | ||
1352 | eui[0] |= 2; | ||
1353 | return 0; | ||
1354 | } | 1379 | } |
1355 | return -1; | 1380 | return -1; |
1356 | } | 1381 | } |
@@ -1376,34 +1401,9 @@ static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) | |||
1376 | /* (re)generation of randomized interface identifier (RFC 3041 3.2, 3.5) */ | 1401 | /* (re)generation of randomized interface identifier (RFC 3041 3.2, 3.5) */ |
1377 | static int __ipv6_regen_rndid(struct inet6_dev *idev) | 1402 | static int __ipv6_regen_rndid(struct inet6_dev *idev) |
1378 | { | 1403 | { |
1379 | struct net_device *dev; | ||
1380 | struct scatterlist sg[2]; | ||
1381 | |||
1382 | sg_set_buf(&sg[0], idev->entropy, 8); | ||
1383 | sg_set_buf(&sg[1], idev->work_eui64, 8); | ||
1384 | |||
1385 | dev = idev->dev; | ||
1386 | |||
1387 | if (ipv6_generate_eui64(idev->work_eui64, dev)) { | ||
1388 | printk(KERN_INFO | ||
1389 | "__ipv6_regen_rndid(idev=%p): cannot get EUI64 identifier; use random bytes.\n", | ||
1390 | idev); | ||
1391 | get_random_bytes(idev->work_eui64, sizeof(idev->work_eui64)); | ||
1392 | } | ||
1393 | regen: | 1404 | regen: |
1394 | spin_lock(&md5_tfm_lock); | 1405 | get_random_bytes(idev->rndid, sizeof(idev->rndid)); |
1395 | if (unlikely(md5_tfm == NULL)) { | ||
1396 | spin_unlock(&md5_tfm_lock); | ||
1397 | return -1; | ||
1398 | } | ||
1399 | crypto_digest_init(md5_tfm); | ||
1400 | crypto_digest_update(md5_tfm, sg, 2); | ||
1401 | crypto_digest_final(md5_tfm, idev->work_digest); | ||
1402 | spin_unlock(&md5_tfm_lock); | ||
1403 | |||
1404 | memcpy(idev->rndid, &idev->work_digest[0], 8); | ||
1405 | idev->rndid[0] &= ~0x02; | 1406 | idev->rndid[0] &= ~0x02; |
1406 | memcpy(idev->entropy, &idev->work_digest[8], 8); | ||
1407 | 1407 | ||
1408 | /* | 1408 | /* |
1409 | * <draft-ietf-ipngwg-temp-addresses-v2-00.txt>: | 1409 | * <draft-ietf-ipngwg-temp-addresses-v2-00.txt>: |
@@ -2143,7 +2143,6 @@ static void addrconf_ip6_tnl_config(struct net_device *dev) | |||
2143 | return; | 2143 | return; |
2144 | } | 2144 | } |
2145 | ip6_tnl_add_linklocal(idev); | 2145 | ip6_tnl_add_linklocal(idev); |
2146 | addrconf_add_mroute(dev); | ||
2147 | } | 2146 | } |
2148 | 2147 | ||
2149 | static int addrconf_notify(struct notifier_block *this, unsigned long event, | 2148 | static int addrconf_notify(struct notifier_block *this, unsigned long event, |
@@ -2668,11 +2667,10 @@ static int if6_seq_open(struct inode *inode, struct file *file) | |||
2668 | { | 2667 | { |
2669 | struct seq_file *seq; | 2668 | struct seq_file *seq; |
2670 | int rc = -ENOMEM; | 2669 | int rc = -ENOMEM; |
2671 | struct if6_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); | 2670 | struct if6_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); |
2672 | 2671 | ||
2673 | if (!s) | 2672 | if (!s) |
2674 | goto out; | 2673 | goto out; |
2675 | memset(s, 0, sizeof(*s)); | ||
2676 | 2674 | ||
2677 | rc = seq_open(file, &if6_seq_ops); | 2675 | rc = seq_open(file, &if6_seq_ops); |
2678 | if (rc) | 2676 | if (rc) |
@@ -3133,6 +3131,15 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, | |||
3133 | array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor; | 3131 | array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor; |
3134 | #endif | 3132 | #endif |
3135 | array[DEVCONF_MAX_ADDRESSES] = cnf->max_addresses; | 3133 | array[DEVCONF_MAX_ADDRESSES] = cnf->max_addresses; |
3134 | array[DEVCONF_ACCEPT_RA_DEFRTR] = cnf->accept_ra_defrtr; | ||
3135 | array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo; | ||
3136 | #ifdef CONFIG_IPV6_ROUTER_PREF | ||
3137 | array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref; | ||
3138 | array[DEVCONF_RTR_PROBE_INTERVAL] = cnf->rtr_probe_interval; | ||
3139 | #ifdef CONFIV_IPV6_ROUTE_INFO | ||
3140 | array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen; | ||
3141 | #endif | ||
3142 | #endif | ||
3136 | } | 3143 | } |
3137 | 3144 | ||
3138 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, | 3145 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, |
@@ -3586,6 +3593,51 @@ static struct addrconf_sysctl_table | |||
3586 | .proc_handler = &proc_dointvec, | 3593 | .proc_handler = &proc_dointvec, |
3587 | }, | 3594 | }, |
3588 | { | 3595 | { |
3596 | .ctl_name = NET_IPV6_ACCEPT_RA_DEFRTR, | ||
3597 | .procname = "accept_ra_defrtr", | ||
3598 | .data = &ipv6_devconf.accept_ra_defrtr, | ||
3599 | .maxlen = sizeof(int), | ||
3600 | .mode = 0644, | ||
3601 | .proc_handler = &proc_dointvec, | ||
3602 | }, | ||
3603 | { | ||
3604 | .ctl_name = NET_IPV6_ACCEPT_RA_PINFO, | ||
3605 | .procname = "accept_ra_pinfo", | ||
3606 | .data = &ipv6_devconf.accept_ra_pinfo, | ||
3607 | .maxlen = sizeof(int), | ||
3608 | .mode = 0644, | ||
3609 | .proc_handler = &proc_dointvec, | ||
3610 | }, | ||
3611 | #ifdef CONFIG_IPV6_ROUTER_PREF | ||
3612 | { | ||
3613 | .ctl_name = NET_IPV6_ACCEPT_RA_RTR_PREF, | ||
3614 | .procname = "accept_ra_rtr_pref", | ||
3615 | .data = &ipv6_devconf.accept_ra_rtr_pref, | ||
3616 | .maxlen = sizeof(int), | ||
3617 | .mode = 0644, | ||
3618 | .proc_handler = &proc_dointvec, | ||
3619 | }, | ||
3620 | { | ||
3621 | .ctl_name = NET_IPV6_RTR_PROBE_INTERVAL, | ||
3622 | .procname = "router_probe_interval", | ||
3623 | .data = &ipv6_devconf.rtr_probe_interval, | ||
3624 | .maxlen = sizeof(int), | ||
3625 | .mode = 0644, | ||
3626 | .proc_handler = &proc_dointvec_jiffies, | ||
3627 | .strategy = &sysctl_jiffies, | ||
3628 | }, | ||
3629 | #ifdef CONFIV_IPV6_ROUTE_INFO | ||
3630 | { | ||
3631 | .ctl_name = NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN, | ||
3632 | .procname = "accept_ra_rt_info_max_plen", | ||
3633 | .data = &ipv6_devconf.accept_ra_rt_info_max_plen, | ||
3634 | .maxlen = sizeof(int), | ||
3635 | .mode = 0644, | ||
3636 | .proc_handler = &proc_dointvec, | ||
3637 | }, | ||
3638 | #endif | ||
3639 | #endif | ||
3640 | { | ||
3589 | .ctl_name = 0, /* sentinel */ | 3641 | .ctl_name = 0, /* sentinel */ |
3590 | } | 3642 | } |
3591 | }, | 3643 | }, |
@@ -3760,13 +3812,6 @@ int __init addrconf_init(void) | |||
3760 | 3812 | ||
3761 | register_netdevice_notifier(&ipv6_dev_notf); | 3813 | register_netdevice_notifier(&ipv6_dev_notf); |
3762 | 3814 | ||
3763 | #ifdef CONFIG_IPV6_PRIVACY | ||
3764 | md5_tfm = crypto_alloc_tfm("md5", 0); | ||
3765 | if (unlikely(md5_tfm == NULL)) | ||
3766 | printk(KERN_WARNING | ||
3767 | "failed to load transform for md5\n"); | ||
3768 | #endif | ||
3769 | |||
3770 | addrconf_verify(0); | 3815 | addrconf_verify(0); |
3771 | rtnetlink_links[PF_INET6] = inet6_rtnetlink_table; | 3816 | rtnetlink_links[PF_INET6] = inet6_rtnetlink_table; |
3772 | #ifdef CONFIG_SYSCTL | 3817 | #ifdef CONFIG_SYSCTL |
@@ -3829,11 +3874,6 @@ void __exit addrconf_cleanup(void) | |||
3829 | 3874 | ||
3830 | rtnl_unlock(); | 3875 | rtnl_unlock(); |
3831 | 3876 | ||
3832 | #ifdef CONFIG_IPV6_PRIVACY | ||
3833 | crypto_free_tfm(md5_tfm); | ||
3834 | md5_tfm = NULL; | ||
3835 | #endif | ||
3836 | |||
3837 | #ifdef CONFIG_PROC_FS | 3877 | #ifdef CONFIG_PROC_FS |
3838 | proc_net_remove("if_inet6"); | 3878 | proc_net_remove("if_inet6"); |
3839 | #endif | 3879 | #endif |