diff options
author | Jesse Gross <jesse@nicira.com> | 2010-10-27 15:29:16 -0700 |
---|---|---|
committer | Jesse Gross <jesse@nicira.com> | 2010-11-16 15:17:38 -0800 |
commit | efa3112b7c340203decf0061e7d1d12be03a150f (patch) | |
tree | 250c53a9496f6e3bd213f05f81164de0fb4eb364 /lib/netdev.c | |
parent | 58453fde168c5938afe445f8e22f8aa96d02083f (diff) | |
download | openvswitch-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.c | 33 |
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'. */ |