X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnetdev.c;h=27ef0c350159075617ec515cfcab9d29991fefb9;hb=c8544aa15f8811e9d6329d4a5e612ff7acb926c9;hp=771db5a5adfbdc9dd458838333d56ae25392350f;hpb=dbba996be2f0d96f4d2999d51c4ef1d16809bad9;p=openvswitch diff --git a/lib/netdev.c b/lib/netdev.c index 771db5a5..27ef0c35 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -886,32 +886,21 @@ netdev_get_carrier(const struct netdev *netdev) 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'. */ @@ -1549,6 +1538,15 @@ netdev_monitor_poll(struct netdev_monitor *monitor, char **devnamep) } } +/* 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. */