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.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index e7a1882db048..e08955baedff 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -371,25 +371,26 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
371 */ 371 */
372 in6_dev_hold(ndev); 372 in6_dev_hold(ndev);
373 373
374#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
375 if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
376 printk(KERN_INFO
377 "%s: Disabled Multicast RS\n",
378 dev->name);
379 ndev->cnf.rtr_solicits = 0;
380 }
381#endif
382
374#ifdef CONFIG_IPV6_PRIVACY 383#ifdef CONFIG_IPV6_PRIVACY
375 setup_timer(&ndev->regen_timer, ipv6_regen_rndid, (unsigned long)ndev); 384 setup_timer(&ndev->regen_timer, ipv6_regen_rndid, (unsigned long)ndev);
376 if ((dev->flags&IFF_LOOPBACK) || 385 if ((dev->flags&IFF_LOOPBACK) ||
377 dev->type == ARPHRD_TUNNEL || 386 dev->type == ARPHRD_TUNNEL ||
378#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) 387 dev->type == ARPHRD_TUNNEL6 ||
379 dev->type == ARPHRD_SIT || 388 dev->type == ARPHRD_SIT ||
380#endif
381 dev->type == ARPHRD_NONE) { 389 dev->type == ARPHRD_NONE) {
382 printk(KERN_INFO 390 printk(KERN_INFO
383 "%s: Disabled Privacy Extensions\n", 391 "%s: Disabled Privacy Extensions\n",
384 dev->name); 392 dev->name);
385 ndev->cnf.use_tempaddr = -1; 393 ndev->cnf.use_tempaddr = -1;
386
387 if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
388 printk(KERN_INFO
389 "%s: Disabled Multicast RS\n",
390 dev->name);
391 ndev->cnf.rtr_solicits = 0;
392 }
393 } else { 394 } else {
394 in6_dev_hold(ndev); 395 in6_dev_hold(ndev);
395 ipv6_regen_rndid((unsigned long) ndev); 396 ipv6_regen_rndid((unsigned long) ndev);
@@ -2456,7 +2457,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
2456 2457
2457 ASSERT_RTNL(); 2458 ASSERT_RTNL();
2458 2459
2459 if (dev == init_net.loopback_dev && how == 1) 2460 if ((dev->flags & IFF_LOOPBACK) && how == 1)
2460 how = 0; 2461 how = 0;
2461 2462
2462 rt6_ifdown(dev); 2463 rt6_ifdown(dev);
@@ -2469,7 +2470,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
2469 /* Step 1: remove reference to ipv6 device from parent device. 2470 /* Step 1: remove reference to ipv6 device from parent device.
2470 Do not dev_put! 2471 Do not dev_put!
2471 */ 2472 */
2472 if (how == 1) { 2473 if (how) {
2473 idev->dead = 1; 2474 idev->dead = 1;
2474 2475
2475 /* protected by rtnl_lock */ 2476 /* protected by rtnl_lock */
@@ -2501,12 +2502,12 @@ static int addrconf_ifdown(struct net_device *dev, int how)
2501 write_lock_bh(&idev->lock); 2502 write_lock_bh(&idev->lock);
2502 2503
2503 /* Step 3: clear flags for stateless addrconf */ 2504 /* Step 3: clear flags for stateless addrconf */
2504 if (how != 1) 2505 if (!how)
2505 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); 2506 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
2506 2507
2507 /* Step 4: clear address list */ 2508 /* Step 4: clear address list */
2508#ifdef CONFIG_IPV6_PRIVACY 2509#ifdef CONFIG_IPV6_PRIVACY
2509 if (how == 1 && del_timer(&idev->regen_timer)) 2510 if (how && del_timer(&idev->regen_timer))
2510 in6_dev_put(idev); 2511 in6_dev_put(idev);
2511 2512
2512 /* clear tempaddr list */ 2513 /* clear tempaddr list */
@@ -2543,7 +2544,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
2543 2544
2544 /* Step 5: Discard multicast list */ 2545 /* Step 5: Discard multicast list */
2545 2546
2546 if (how == 1) 2547 if (how)
2547 ipv6_mc_destroy_dev(idev); 2548 ipv6_mc_destroy_dev(idev);
2548 else 2549 else
2549 ipv6_mc_down(idev); 2550 ipv6_mc_down(idev);
@@ -2552,7 +2553,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
2552 2553
2553 /* Shot the device (if unregistered) */ 2554 /* Shot the device (if unregistered) */
2554 2555
2555 if (how == 1) { 2556 if (how) {
2556 addrconf_sysctl_unregister(idev); 2557 addrconf_sysctl_unregister(idev);
2557 neigh_parms_release(&nd_tbl, idev->nd_parms); 2558 neigh_parms_release(&nd_tbl, idev->nd_parms);
2558 neigh_ifdown(&nd_tbl, dev); 2559 neigh_ifdown(&nd_tbl, dev);