const u_char *packet;
struct rte_mbuf *mbuf;
struct pcap_rx_queue *pcap_q = queue;
- struct rte_pktmbuf_pool_private *mbp_priv;
uint16_t num_rx = 0;
uint16_t buf_size;
break;
/* Now get the space available for data in the mbuf */
- mbp_priv = rte_mempool_get_priv(pcap_q->mb_pool);
- buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
+ buf_size = (uint16_t)(rte_pktmbuf_data_room_size(pcap_q->mb_pool) -
RTE_PKTMBUF_HEADROOM);
if (header.len <= buf_size) {
return 0;
}
-static struct eth_dev_ops ops = {
- .dev_start = eth_dev_start,
- .dev_stop = eth_dev_stop,
- .dev_close = eth_dev_close,
- .dev_configure = eth_dev_configure,
- .dev_infos_get = eth_dev_info,
- .rx_queue_setup = eth_rx_queue_setup,
- .tx_queue_setup = eth_tx_queue_setup,
- .rx_queue_release = eth_queue_release,
- .tx_queue_release = eth_queue_release,
- .link_update = eth_link_update,
- .stats_get = eth_stats_get,
- .stats_reset = eth_stats_reset,
+static const struct eth_dev_ops ops = {
+ .dev_start = eth_dev_start,
+ .dev_stop = eth_dev_stop,
+ .dev_close = eth_dev_close,
+ .dev_configure = eth_dev_configure,
+ .dev_infos_get = eth_dev_info,
+ .rx_queue_setup = eth_rx_queue_setup,
+ .tx_queue_setup = eth_tx_queue_setup,
+ .rx_queue_release = eth_queue_release,
+ .tx_queue_release = eth_queue_release,
+ .link_update = eth_link_update,
+ .stats_get = eth_stats_get,
+ .stats_reset = eth_stats_reset,
+};
+
+static struct eth_driver rte_pcap_pmd = {
+ .pci_drv = {
+ .name = "rte_pcap_pmd",
+ .drv_flags = RTE_PCI_DRV_DETACHABLE,
+ },
};
/*
goto error;
/* reserve an ethdev entry */
- *eth_dev = rte_eth_dev_allocate(name);
+ *eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
if (*eth_dev == NULL)
goto error;
+ /* check length of device name */
+ if ((strlen((*eth_dev)->data->name) + 1) > sizeof(data->name))
+ goto error;
+
/* now put it all together
* - store queue data in internals,
* - store numa_node info in pci_driver
data->nb_tx_queues = (uint16_t)nb_tx_queues;
data->dev_link = pmd_link;
data->mac_addrs = ð_addr;
+ strncpy(data->name,
+ (*eth_dev)->data->name, strlen((*eth_dev)->data->name));
(*eth_dev)->data = data;
(*eth_dev)->dev_ops = &ops;
(*eth_dev)->pci_dev = pci_dev;
+ (*eth_dev)->driver = &rte_pcap_pmd;
return 0;
- error: if (data)
- rte_free(data);
- if (pci_dev)
- rte_free(pci_dev);
- if (*internals)
- rte_free(*internals);
+error:
+ rte_free(data);
+ rte_free(pci_dev);
+ rte_free(*internals);
+
return -1;
}
ret = rte_kvargs_process(kvlist, ETH_PCAP_IFACE_ARG,
&open_rx_tx_iface, &pcaps);
if (ret < 0)
- return -1;
+ goto free_kvlist;
dumpers.pcaps[0] = pcaps.pcaps[0];
dumpers.names[0] = pcaps.names[0];
dumpers.types[0] = pcaps.types[0];
- return rte_eth_from_pcaps(name, &pcaps, 1, &dumpers, 1,
+ ret = rte_eth_from_pcaps(name, &pcaps, 1, &dumpers, 1,
numa_node, kvlist, 1);
+ goto free_kvlist;
}
/*
}
if (ret < 0)
- return -1;
+ goto free_kvlist;
/*
* We check whether we want to open a TX stream to a real NIC or a
}
if (ret < 0)
- return -1;
+ goto free_kvlist;
if (using_dumpers)
- return rte_eth_from_pcaps_n_dumpers(name, &pcaps, pcaps.num_of_rx,
+ ret = rte_eth_from_pcaps_n_dumpers(name, &pcaps, pcaps.num_of_rx,
&dumpers, dumpers.num_of_tx, numa_node, kvlist);
-
- return rte_eth_from_pcaps(name, &pcaps, pcaps.num_of_rx, &dumpers,
+ else
+ ret = rte_eth_from_pcaps(name, &pcaps, pcaps.num_of_rx, &dumpers,
dumpers.num_of_tx, numa_node, kvlist, 0);
+free_kvlist:
+ rte_kvargs_free(kvlist);
+ return ret;
+}
+
+static int
+rte_pmd_pcap_devuninit(const char *name)
+{
+ struct rte_eth_dev *eth_dev = NULL;
+
+ RTE_LOG(INFO, PMD, "Closing pcap ethdev on numa socket %u\n",
+ rte_socket_id());
+
+ if (name == NULL)
+ return -1;
+
+ /* reserve an ethdev entry */
+ eth_dev = rte_eth_dev_allocated(name);
+ if (eth_dev == NULL)
+ return -1;
+
+ rte_free(eth_dev->data->dev_private);
+ rte_free(eth_dev->data);
+ rte_free(eth_dev->pci_dev);
+
+ rte_eth_dev_release_port(eth_dev);
+
+ return 0;
}
static struct rte_driver pmd_pcap_drv = {
.name = "eth_pcap",
.type = PMD_VDEV,
.init = rte_pmd_pcap_devinit,
+ .uninit = rte_pmd_pcap_devuninit,
};
PMD_REGISTER_DRIVER(pmd_pcap_drv);