+ const char *pstream;
+ const char *pcap;
+
+ ovs_mutex_lock(&netdev->mutex);
+ netdev->ifindex = smap_get_int(args, "ifindex", -EOPNOTSUPP);
+
+ pstream = smap_get(args, "pstream");
+ if (!pstream
+ || !netdev->pstream
+ || strcmp(pstream_get_name(netdev->pstream), pstream)) {
+ pstream_close(netdev->pstream);
+ netdev->pstream = NULL;
+
+ if (pstream) {
+ int error;
+
+ error = pstream_open(pstream, &netdev->pstream, DSCP_DEFAULT);
+ if (error) {
+ VLOG_WARN("%s: open failed (%s)",
+ pstream, ovs_strerror(error));
+ }
+ }
+ }
+
+ if (netdev->rx_pcap) {
+ fclose(netdev->rx_pcap);
+ }
+ if (netdev->tx_pcap && netdev->tx_pcap != netdev->rx_pcap) {
+ fclose(netdev->tx_pcap);
+ }
+ netdev->rx_pcap = netdev->tx_pcap = NULL;
+ pcap = smap_get(args, "pcap");
+ if (pcap) {
+ netdev->rx_pcap = netdev->tx_pcap = pcap_open(pcap, "ab");
+ } else {
+ const char *rx_pcap = smap_get(args, "rx_pcap");
+ const char *tx_pcap = smap_get(args, "tx_pcap");
+
+ if (rx_pcap) {
+ netdev->rx_pcap = pcap_open(rx_pcap, "ab");
+ }
+ if (tx_pcap) {
+ netdev->tx_pcap = pcap_open(tx_pcap, "ab");
+ }
+ }
+
+ ovs_mutex_unlock(&netdev->mutex);
+
+ return 0;
+}
+
+static struct netdev_rx *
+netdev_dummy_rx_alloc(void)
+{
+ struct netdev_rx_dummy *rx = xzalloc(sizeof *rx);
+ return &rx->up;
+}
+
+static int
+netdev_dummy_rx_construct(struct netdev_rx *rx_)
+{
+ struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
+ struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
+
+ ovs_mutex_lock(&netdev->mutex);
+ list_push_back(&netdev->rxes, &rx->node);
+ list_init(&rx->recv_queue);
+ rx->recv_queue_len = 0;
+ ovs_mutex_unlock(&netdev->mutex);
+
+ return 0;
+}
+
+static void
+netdev_dummy_rx_destruct(struct netdev_rx *rx_)
+{
+ struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
+ struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
+
+ ovs_mutex_lock(&netdev->mutex);
+ list_remove(&rx->node);
+ ofpbuf_list_delete(&rx->recv_queue);
+ ovs_mutex_unlock(&netdev->mutex);
+}
+
+static void
+netdev_dummy_rx_dealloc(struct netdev_rx *rx_)
+{
+ struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
+
+ free(rx);
+}
+
+static int
+netdev_dummy_rx_recv(struct netdev_rx *rx_, void *buffer, size_t size)
+{
+ struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
+ struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);