netdev_dummy_open,
netdev_dummy_close,
- NULL, /* enumerate */
-
netdev_dummy_listen, /* listen */
netdev_dummy_recv, /* recv */
NULL, /* recv_wait */
free(netdev);
}
-/* Initializes 'sset' with a list of the names of all known network devices. */
-static int
-netdev_linux_enumerate(struct sset *sset)
-{
- struct if_nameindex *names;
-
- names = if_nameindex();
- if (names) {
- size_t i;
-
- for (i = 0; names[i].if_name != NULL; i++) {
- sset_add(sset, names[i].if_name);
- }
- if_freenameindex(names);
- return 0;
- } else {
- VLOG_WARN("could not obtain list of network device names: %s",
- strerror(errno));
- return errno;
- }
-}
-
static int
netdev_linux_listen(struct netdev *netdev_)
{
return netdev_dev_linux_cast(netdev_get_dev(netdev))->change_seq;
}
-#define NETDEV_LINUX_CLASS(NAME, CREATE, ENUMERATE, GET_STATS, SET_STATS) \
+#define NETDEV_LINUX_CLASS(NAME, CREATE, GET_STATS, SET_STATS) \
{ \
NAME, \
\
netdev_linux_open, \
netdev_linux_close, \
\
- ENUMERATE, \
- \
netdev_linux_listen, \
netdev_linux_recv, \
netdev_linux_recv_wait, \
NETDEV_LINUX_CLASS(
"system",
netdev_linux_create,
- netdev_linux_enumerate,
netdev_linux_get_stats,
NULL); /* set_stats */
NETDEV_LINUX_CLASS(
"tap",
netdev_linux_create_tap,
- NULL, /* enumerate */
netdev_pseudo_get_stats,
NULL); /* set_stats */
NETDEV_LINUX_CLASS(
"internal",
netdev_linux_create,
- NULL, /* enumerate */
netdev_pseudo_get_stats,
netdev_vport_set_stats);
\f
/* Closes 'netdev'. */
void (*close)(struct netdev *netdev);
-
- /* Enumerates the names of all network devices of this class.
- *
- * The caller has already initialized 'all_names' and might already have
- * added some names to it. This function should not disturb any existing
- * names in 'all_names'.
- *
- * If this netdev class does not support enumeration, this may be a null
- * pointer. */
- int (*enumerate)(struct sset *all_names);
\f
/* ## ----------------- ## */
/* ## Receiving Packets ## */
netdev_vport_open, \
netdev_vport_close, \
\
- NULL, /* enumerate */ \
- \
NULL, /* listen */ \
NULL, /* recv */ \
NULL, /* recv_wait */ \
return !!shash_find_data(&netdev_dev_shash, name);
}
-/* Clears 'sset' and enumerates the names of all known network devices. */
-int
-netdev_enumerate(struct sset *sset)
-{
- struct shash_node *node;
- int error = 0;
-
- netdev_initialize();
- sset_clear(sset);
-
- SHASH_FOR_EACH(node, &netdev_classes) {
- const struct netdev_class *netdev_class = node->data;
- if (netdev_class->enumerate) {
- int retval = netdev_class->enumerate(sset);
- if (retval) {
- VLOG_WARN("failed to enumerate %s network devices: %s",
- netdev_class->type, strerror(retval));
- if (!error) {
- error = retval;
- }
- }
- }
- }
-
- return error;
-}
-
/* Parses 'netdev_name_', which is of the form [type@]name into its component
* pieces. 'name' and 'type' must be freed by the caller. */
void
}
return error;
}
-
-/* Returns a network device that has 'in4' as its IP address, if one exists,
- * otherwise a null pointer. */
-struct netdev *
-netdev_find_dev_by_in4(const struct in_addr *in4)
-{
- struct netdev *netdev;
- struct sset dev_list = SSET_INITIALIZER(&dev_list);
- const char *name;
-
- netdev_enumerate(&dev_list);
- SSET_FOR_EACH (name, &dev_list) {
- struct in_addr dev_in4;
-
- if (!netdev_open(name, "system", &netdev)
- && !netdev_get_in4(netdev, &dev_in4, NULL)
- && dev_in4.s_addr == in4->s_addr) {
- goto exit;
- }
- netdev_close(netdev);
- }
- netdev = NULL;
-
-exit:
- sset_destroy(&dev_list);
- return netdev;
-}
\f
/* Initializes 'netdev_dev' as a netdev device named 'name' of the specified
* 'netdev_class'. This function is ordinarily called from a netdev provider's
bool netdev_exists(const char *name);
bool netdev_is_open(const char *name);
-int netdev_enumerate(struct sset *);
-
void netdev_parse_name(const char *netdev_name, char **name, char **type);
/* Options. */