|
@@ -303,10 +303,10 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
|
|
|
.disable_policy = 0,
|
|
|
};
|
|
|
|
|
|
-/* Check if a valid qdisc is available */
|
|
|
-static inline bool addrconf_qdisc_ok(const struct net_device *dev)
|
|
|
+/* Check if link is ready: is it up and is a valid qdisc available */
|
|
|
+static inline bool addrconf_link_ready(const struct net_device *dev)
|
|
|
{
|
|
|
- return !qdisc_tx_is_noop(dev);
|
|
|
+ return netif_oper_up(dev) && !qdisc_tx_is_noop(dev);
|
|
|
}
|
|
|
|
|
|
static void addrconf_del_rs_timer(struct inet6_dev *idev)
|
|
@@ -451,7 +451,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
|
|
|
|
|
|
ndev->token = in6addr_any;
|
|
|
|
|
|
- if (netif_running(dev) && addrconf_qdisc_ok(dev))
|
|
|
+ if (netif_running(dev) && addrconf_link_ready(dev))
|
|
|
ndev->if_flags |= IF_READY;
|
|
|
|
|
|
ipv6_mc_init_dev(ndev);
|
|
@@ -3403,7 +3403,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
/* restore routes for permanent addresses */
|
|
|
addrconf_permanent_addr(dev);
|
|
|
|
|
|
- if (!addrconf_qdisc_ok(dev)) {
|
|
|
+ if (!addrconf_link_ready(dev)) {
|
|
|
/* device is not ready yet. */
|
|
|
pr_info("ADDRCONF(NETDEV_UP): %s: link is not ready\n",
|
|
|
dev->name);
|
|
@@ -3418,7 +3418,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
run_pending = 1;
|
|
|
}
|
|
|
} else if (event == NETDEV_CHANGE) {
|
|
|
- if (!addrconf_qdisc_ok(dev)) {
|
|
|
+ if (!addrconf_link_ready(dev)) {
|
|
|
/* device is still not ready. */
|
|
|
break;
|
|
|
}
|