summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/netdev-patch.c2
-rw-r--r--lib/netdev-provider.h6
-rw-r--r--lib/netdev-tunnel.c4
-rw-r--r--lib/netdev-vport.c7
-rw-r--r--lib/netdev-vport.h1
-rw-r--r--lib/netdev.c33
-rw-r--r--lib/netdev.h2
7 files changed, 32 insertions, 23 deletions
diff --git a/lib/netdev-patch.c b/lib/netdev-patch.c
index 7e8b1990e..d2a064332 100644
--- a/lib/netdev-patch.c
+++ b/lib/netdev-patch.c
@@ -200,7 +200,7 @@ const struct netdev_class netdev_patch_class = {
netdev_vport_get_etheraddr,
netdev_vport_get_mtu,
NULL, /* get_ifindex */
- netdev_vport_get_carrier,
+ NULL, /* get_carrier */
netdev_vport_get_stats,
netdev_vport_set_stats,
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index c0ed4ef60..fb610d751 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -259,7 +259,11 @@ struct netdev_class {
int (*get_ifindex)(const struct netdev *netdev);
/* Sets 'carrier' to true if carrier is active (link light is on) on
- * 'netdev'. */
+ * 'netdev'.
+ *
+ * May be null if device does not provide carrier status (will be always
+ * up as long as device is up).
+ */
int (*get_carrier)(const struct netdev *netdev, bool *carrier);
/* Retrieves current device stats for 'netdev' into 'stats'.
diff --git a/lib/netdev-tunnel.c b/lib/netdev-tunnel.c
index d0ecd98e2..2c3fca54e 100644
--- a/lib/netdev-tunnel.c
+++ b/lib/netdev-tunnel.c
@@ -256,7 +256,7 @@ const struct netdev_class netdev_gre_class = {
netdev_vport_get_etheraddr,
netdev_vport_get_mtu,
NULL, /* get_ifindex */
- netdev_vport_get_carrier,
+ NULL, /* get_carrier */
netdev_vport_get_stats,
netdev_vport_set_stats,
@@ -316,7 +316,7 @@ const struct netdev_class netdev_capwap_class = {
netdev_vport_get_etheraddr,
netdev_vport_get_mtu,
NULL, /* get_ifindex */
- netdev_vport_get_carrier,
+ NULL, /* get_carrier */
netdev_vport_get_stats,
netdev_vport_set_stats,
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 0153ac78d..84dda8143 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -114,13 +114,6 @@ netdev_vport_get_mtu(const struct netdev *netdev, int *mtup)
}
int
-netdev_vport_get_carrier(const struct netdev *netdev OVS_UNUSED, bool *carrier)
-{
- *carrier = true;
- return 0;
-}
-
-int
netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
{
const char *name = netdev_get_name(netdev);
diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h
index b4016606f..dc65fe78e 100644
--- a/lib/netdev-vport.h
+++ b/lib/netdev-vport.h
@@ -27,7 +27,6 @@ int netdev_vport_set_etheraddr(struct netdev *,
int netdev_vport_get_etheraddr(const struct netdev *,
uint8_t mac[ETH_ADDR_LEN]);
int netdev_vport_get_mtu(const struct netdev *, int *mtup);
-int netdev_vport_get_carrier(const struct netdev *, bool *carrier);
int netdev_vport_get_stats(const struct netdev *, struct netdev_stats *);
int netdev_vport_set_stats(struct netdev *, const struct netdev_stats *);
int netdev_vport_update_flags(struct netdev *, enum netdev_flags off,
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'. */
diff --git a/lib/netdev.h b/lib/netdev.h
index cd5c8c300..93997aee7 100644
--- a/lib/netdev.h
+++ b/lib/netdev.h
@@ -127,7 +127,7 @@ int netdev_set_etheraddr(struct netdev *, const uint8_t mac[6]);
int netdev_get_etheraddr(const struct netdev *, uint8_t mac[6]);
/* PHY interface. */
-int netdev_get_carrier(const struct netdev *, bool *carrier);
+bool netdev_get_carrier(const struct netdev *);
int netdev_get_features(struct netdev *,
uint32_t *current, uint32_t *advertised,
uint32_t *supported, uint32_t *peer);