diff options
author | Denis V. Lunev <den@openvz.org> | 2008-04-03 16:30:17 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-03 16:30:17 -0400 |
commit | 439e23857a21c3a953826eed23c818697a97de1a (patch) | |
tree | 72d751492b9bafb55da3c6a35cea9e17573f938b | |
parent | af2681828af5f2b42e12e8b16ba0cf113cf486c8 (diff) |
[IPV6]: Event type in addrconf_ifdown is mis-used.
addrconf_ifdown is broken in respect to the usage of how
parameter. This function is called with (event != NETDEV_DOWN) and (2)
on the IPv6 stop. It the latter case inet6_dev from loopback device
should be destroyed.
Signed-off-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv6/addrconf.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e7a1882db048..4fa9da0be19a 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2469,7 +2469,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2469 | /* Step 1: remove reference to ipv6 device from parent device. | 2469 | /* Step 1: remove reference to ipv6 device from parent device. |
2470 | Do not dev_put! | 2470 | Do not dev_put! |
2471 | */ | 2471 | */ |
2472 | if (how == 1) { | 2472 | if (how) { |
2473 | idev->dead = 1; | 2473 | idev->dead = 1; |
2474 | 2474 | ||
2475 | /* protected by rtnl_lock */ | 2475 | /* protected by rtnl_lock */ |
@@ -2501,12 +2501,12 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2501 | write_lock_bh(&idev->lock); | 2501 | write_lock_bh(&idev->lock); |
2502 | 2502 | ||
2503 | /* Step 3: clear flags for stateless addrconf */ | 2503 | /* Step 3: clear flags for stateless addrconf */ |
2504 | if (how != 1) | 2504 | if (!how) |
2505 | idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); | 2505 | idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); |
2506 | 2506 | ||
2507 | /* Step 4: clear address list */ | 2507 | /* Step 4: clear address list */ |
2508 | #ifdef CONFIG_IPV6_PRIVACY | 2508 | #ifdef CONFIG_IPV6_PRIVACY |
2509 | if (how == 1 && del_timer(&idev->regen_timer)) | 2509 | if (how && del_timer(&idev->regen_timer)) |
2510 | in6_dev_put(idev); | 2510 | in6_dev_put(idev); |
2511 | 2511 | ||
2512 | /* clear tempaddr list */ | 2512 | /* clear tempaddr list */ |
@@ -2543,7 +2543,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2543 | 2543 | ||
2544 | /* Step 5: Discard multicast list */ | 2544 | /* Step 5: Discard multicast list */ |
2545 | 2545 | ||
2546 | if (how == 1) | 2546 | if (how) |
2547 | ipv6_mc_destroy_dev(idev); | 2547 | ipv6_mc_destroy_dev(idev); |
2548 | else | 2548 | else |
2549 | ipv6_mc_down(idev); | 2549 | ipv6_mc_down(idev); |
@@ -2552,7 +2552,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2552 | 2552 | ||
2553 | /* Shot the device (if unregistered) */ | 2553 | /* Shot the device (if unregistered) */ |
2554 | 2554 | ||
2555 | if (how == 1) { | 2555 | if (how) { |
2556 | addrconf_sysctl_unregister(idev); | 2556 | addrconf_sysctl_unregister(idev); |
2557 | neigh_parms_release(&nd_tbl, idev->nd_parms); | 2557 | neigh_parms_release(&nd_tbl, idev->nd_parms); |
2558 | neigh_ifdown(&nd_tbl, dev); | 2558 | neigh_ifdown(&nd_tbl, dev); |