- if (monitor) {
- struct shash_node *node;
-
- SHASH_FOR_EACH (node, &monitor->polled_netdevs) {
- struct netdev_notifier *notifier = node->data;
- netdev_get_dev(notifier->netdev)->netdev_class->poll_remove(
- notifier);
- }
-
- shash_destroy(&monitor->polled_netdevs);
- sset_destroy(&monitor->changed_netdevs);
- free(monitor);
- }
-}
-
-static void
-netdev_monitor_cb(struct netdev_notifier *notifier)
-{
- struct netdev_monitor *monitor = notifier->aux;
- const char *name = netdev_get_name(notifier->netdev);
- sset_add(&monitor->changed_netdevs, name);
-}
-
-/* Attempts to add 'netdev' as a netdev monitored by 'monitor'. Returns 0 if
- * successful, otherwise a positive errno value.
- *
- * Adding a given 'netdev' to a monitor multiple times is equivalent to adding
- * it once. */
-int
-netdev_monitor_add(struct netdev_monitor *monitor, struct netdev *netdev)
-{
- const char *netdev_name = netdev_get_name(netdev);
- int error = 0;
- if (!shash_find(&monitor->polled_netdevs, netdev_name)
- && netdev_get_dev(netdev)->netdev_class->poll_add)
- {
- struct netdev_notifier *notifier;
- error = netdev_get_dev(netdev)->netdev_class->poll_add(netdev,
- netdev_monitor_cb, monitor, ¬ifier);
- if (!error) {
- assert(notifier->netdev == netdev);
- shash_add(&monitor->polled_netdevs, netdev_name, notifier);
- }
- }
- return error;