summaryrefslogtreecommitdiff
path: root/lib/netdev.c
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2010-10-27 15:29:16 -0700
committerJesse Gross <jesse@nicira.com>2010-11-16 15:17:38 -0800
commitefa3112b7c340203decf0061e7d1d12be03a150f (patch)
tree250c53a9496f6e3bd213f05f81164de0fb4eb364 /lib/netdev.c
parent58453fde168c5938afe445f8e22f8aa96d02083f (diff)
downloadopenvswitch-lts-1.0.tar.gz
netdev: Fix carrier status for down interfaces.lts-1.0
Currently netdev_get_carrier() returns both a carrier status and an error code. However, usage of the error code was inconsistent: most callers either ignored it or didn't perform their task if an error occured, which prevented bond rebalancing. This makes the handling consistent by translating an error into a down status in the netdev library. Bug #3959
Diffstat (limited to 'lib/netdev.c')
-rw-r--r--lib/netdev.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/lib/netdev.c b/lib/netdev.c
index 24c2a88fa..db4bb6ef2 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -909,19 +909,32 @@ netdev_arp_lookup(const struct netdev *netdev,
return error;
}
-/* Sets 'carrier' to true if carrier is active (link light is on) on
- * 'netdev'. */
-int
-netdev_get_carrier(const struct netdev *netdev, bool *carrier)
+/* Returns true if carrier is active (link light is on) on 'netdev'. */
+bool
+netdev_get_carrier(const struct netdev *netdev)
{
- int error = (netdev_get_dev(netdev)->netdev_class->get_carrier
- ? netdev_get_dev(netdev)->netdev_class->get_carrier(netdev,
- carrier)
- : EOPNOTSUPP);
+ int error;
+ enum netdev_flags flags;
+ bool carrier;
+
+ netdev_get_flags(netdev, &flags);
+ if (!(flags & NETDEV_UP)) {
+ return false;
+ }
+
+ if (!netdev_get_dev(netdev)->netdev_class->get_carrier) {
+ return true;
+ }
+
+ error = netdev_get_dev(netdev)->netdev_class->get_carrier(netdev,
+ &carrier);
if (error) {
- *carrier = false;
+ VLOG_DBG("%s: failed to get network device carrier status, assuming "
+ "down: %s", netdev_get_name(netdev), strerror(error));
+ carrier = false;
}
- return error;
+
+ return carrier;
}
/* Retrieves current device stats for 'netdev'. */