return carrier;
}
-/* Returns true if 'netdev' is up according to its MII. */
-bool
-netdev_get_miimon(const struct netdev *netdev)
+/* Attempts to force netdev_get_carrier() to poll 'netdev''s MII registers for
+ * link status instead of checking 'netdev''s carrier. 'netdev''s MII
+ * registers will be polled once ever 'interval' milliseconds. If 'netdev'
+ * does not support MII, another method may be used as a fallback. If
+ * 'interval' is less than or equal to zero, reverts netdev_get_carrier() to
+ * its normal behavior.
+ *
+ * Returns 0 if successful, otherwise a positive errno value. */
+int
+netdev_set_miimon_interval(struct netdev *netdev, long long int interval)
{
- int error;
- enum netdev_flags flags;
- bool miimon;
-
- netdev_get_flags(netdev, &flags);
- if (!(flags & NETDEV_UP)) {
- return false;
- }
-
- if (!netdev_get_dev(netdev)->netdev_class->get_miimon) {
- return true;
- }
-
- error = netdev_get_dev(netdev)->netdev_class->get_miimon(netdev, &miimon);
-
- if (error) {
- VLOG_DBG("%s: failed to get network device MII status, assuming "
- "down: %s", netdev_get_name(netdev), strerror(error));
- miimon = false;
- }
-
- return miimon;
+ struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
+ return (netdev_dev->netdev_class->set_miimon_interval
+ ? netdev_dev->netdev_class->set_miimon_interval(netdev, interval)
+ : EOPNOTSUPP);
}
/* Retrieves current device stats for 'netdev'. */
: EOPNOTSUPP);
}
+/* Returns a sequence number which indicates changes in one of 'netdev''s
+ * properties. The returned sequence will be nonzero so that callers have a
+ * value which they may use as a reset when tracking 'netdev'.
+ *
+ * The returned sequence number will change whenever 'netdev''s flags,
+ * features, ethernet address, or carrier changes. It may change for other
+ * reasons as well, or no reason at all. */
+unsigned int
+netdev_change_seq(const struct netdev *netdev)
+{
+ return netdev_get_dev(netdev)->netdev_class->change_seq(netdev);
+}
+
/* If 'netdev' is a VLAN network device (e.g. one created with vconfig(8)),
* sets '*vlan_vid' to the VLAN VID associated with that device and returns 0.
* Otherwise returns a errno value (specifically ENOENT if 'netdev_name' is the
}
}
+/* Clears all notifications from 'monitor'. May be called instead of
+ * netdev_monitor_poll() by clients which don't care specifically which netdevs
+ * have changed. */
+void
+netdev_monitor_flush(struct netdev_monitor *monitor)
+{
+ sset_clear(&monitor->changed_netdevs);
+}
+
/* Registers with the poll loop to wake up from the next call to poll_block()
* when netdev_monitor_poll(monitor) would indicate that a device has
* changed. */