struct list rxes; /* List of child "netdev_rx_dummy"s. */
};
+static const struct netdev_class dummy_class;
+
/* Max 'recv_queue_len' in struct netdev_dummy. */
#define NETDEV_DUMMY_MAX_QUEUE 100
bool listening;
};
-static struct shash dummy_netdevs = SHASH_INITIALIZER(&dummy_netdevs);
-
static const struct netdev_rx_class netdev_rx_dummy_class;
static unixctl_cb_func netdev_dummy_set_admin_state;
static void
netdev_dummy_run(void)
{
+ struct shash dummy_netdevs;
struct shash_node *node;
+ shash_init(&dummy_netdevs);
+ netdev_get_devices(&dummy_class, &dummy_netdevs);
SHASH_FOR_EACH (node, &dummy_netdevs) {
struct netdev_dummy *dev = node->data;
size_t i;
dev->streams[i] = dev->streams[--dev->n_streams];
}
}
+
+ netdev_close(&dev->up);
}
+ shash_destroy(&dummy_netdevs);
}
static void
static void
netdev_dummy_wait(void)
{
+ struct shash dummy_netdevs;
struct shash_node *node;
+ shash_init(&dummy_netdevs);
+ netdev_get_devices(&dummy_class, &dummy_netdevs);
SHASH_FOR_EACH (node, &dummy_netdevs) {
struct netdev_dummy *dev = node->data;
size_t i;
}
stream_recv_wait(s->stream);
}
+ netdev_close(&dev->up);
}
+ shash_destroy(&dummy_netdevs);
}
static int
list_init(&netdev->rxes);
- shash_add(&dummy_netdevs, name, netdev);
-
*netdevp = &netdev->up;
return 0;
struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
size_t i;
- shash_find_and_delete(&dummy_netdevs,
- netdev_get_name(netdev_));
pstream_close(netdev->pstream);
for (i = 0; i < netdev->n_streams; i++) {
dummy_stream_close(&netdev->streams[i]);
int argc, const char *argv[], void *aux OVS_UNUSED)
{
struct netdev_dummy *dummy_dev;
+ struct netdev *netdev;
int i;
- dummy_dev = shash_find_data(&dummy_netdevs, argv[1]);
- if (!dummy_dev) {
+ netdev = netdev_from_name(argv[1]);
+ if (!netdev || !is_dummy_class(netdev->netdev_class)) {
unixctl_command_reply_error(conn, "no such dummy netdev");
- return;
+ goto exit;
}
+ dummy_dev = netdev_dummy_cast(netdev);
for (i = 2; i < argc; i++) {
struct ofpbuf *packet;
packet = eth_from_packet_or_flow(argv[i]);
if (!packet) {
unixctl_command_reply_error(conn, "bad packet syntax");
- return;
+ goto exit;
}
dummy_dev->stats.rx_packets++;
}
unixctl_command_reply(conn, NULL);
+
+exit:
+ netdev_close(netdev);
}
static void
}
if (argc > 2) {
- struct netdev_dummy *dummy_dev;
+ struct netdev *netdev = netdev_from_name(argv[1]);
+ if (netdev && is_dummy_class(netdev->netdev_class)) {
+ struct netdev_dummy *dummy_dev = netdev_dummy_cast(netdev);
- dummy_dev = shash_find_data(&dummy_netdevs, argv[1]);
- if (dummy_dev) {
netdev_dummy_set_admin_state__(dummy_dev, up);
+ netdev_close(netdev);
} else {
unixctl_command_reply_error(conn, "Unknown Dummy Interface");
+ netdev_close(netdev);
return;
}
} else {
+ struct shash dummy_netdevs;
struct shash_node *node;
+ shash_init(&dummy_netdevs);
+ netdev_get_devices(&dummy_class, &dummy_netdevs);
SHASH_FOR_EACH (node, &dummy_netdevs) {
- netdev_dummy_set_admin_state__(node->data, up);
+ struct netdev *netdev = node->data;
+ netdev_dummy_set_admin_state__(netdev_dummy_cast(netdev), up);
+ netdev_close(netdev);
}
+ shash_destroy(&dummy_netdevs);
}
unixctl_command_reply(conn, "OK");
}