#include <rte_string_fns.h>
#include <rte_cycles.h>
#include <rte_kvargs.h>
+#include <rte_dev.h>
#include <net/if.h>
-#include "rte_eth_pcap.h"
+#include <pcap.h>
#define RTE_ETH_PCAP_SNAPSHOT_LEN 65535
#define RTE_ETH_PCAP_SNAPLEN 4096
return num_tx;
}
-#ifdef PCAP_CAN_SEND
/*
* Callback to handle sending packets through a real NIC.
*/
mbuf = bufs[i];
ret = pcap_sendpacket(tx_queue->pcap, (u_char*) mbuf->pkt.data,
mbuf->pkt.data_len);
- if(likely(!ret))
- num_tx++;
+ if (unlikely(ret != 0))
+ break;
+ num_tx++;
rte_pktmbuf_free(mbuf);
}
tx_queue->err_pkts += nb_pkts - num_tx;
return num_tx;
}
-#else
-static uint16_t
-eth_pcap_tx(__rte_unused void *queue,
- __rte_unused struct rte_mbuf **bufs,
- __rte_unused uint16_t nb_pkts)
-{
- RTE_LOG(ERR, PMD, "pcap library cannot send packets, please rebuild "
- "with a more up to date libpcap\n");
- return -1;
-}
-#endif
static int
eth_dev_start(struct rte_eth_dev *dev)
const unsigned numa_node,
struct pmd_internals **internals,
struct rte_eth_dev **eth_dev,
- struct args_dict *dict)
+ struct rte_kvargs *kvlist)
{
struct rte_eth_dev_data *data = NULL;
struct rte_pci_device *pci_dev = NULL;
unsigned k_idx;
- struct key_value *pair = NULL;
+ struct rte_kvargs_pair *pair = NULL;
- for (k_idx = 0; k_idx < dict->index; k_idx++) {
- pair = &dict->pairs[k_idx];
+ for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
+ pair = &kvlist->pairs[k_idx];
if (strstr(pair->key, ETH_PCAP_IFACE_ARG) != NULL)
break;
}
return -1;
}
-int
+static int
rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_dumper_t * const tx_queues[],
const unsigned nb_tx_queues,
const unsigned numa_node,
- struct args_dict *dict)
+ struct rte_kvargs *kvlist)
{
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
return -1;
if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
- &internals, ð_dev, dict) < 0)
+ &internals, ð_dev, kvlist) < 0)
return -1;
for (i = 0; i < nb_rx_queues; i++) {
return 0;
}
-int
+static int
rte_eth_from_pcaps(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_t * const tx_queues[],
const unsigned nb_tx_queues,
const unsigned numa_node,
- struct args_dict *dict)
+ struct rte_kvargs *kvlist)
{
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
return -1;
if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
- &internals, ð_dev, dict) < 0)
+ &internals, ð_dev, kvlist) < 0)
return -1;
for (i = 0; i < nb_rx_queues; i++) {
}
-int
-rte_pmd_pcap_init(const char *name, const char *params)
+static int
+rte_pmd_pcap_devinit(const char *name, const char *params)
{
unsigned numa_node, using_dumpers = 0;
int ret;
if (ret < 0)
return -1;
- return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1, numa_node, &dict);
+ return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1,
+ numa_node, kvlist);
}
/*
if (using_dumpers)
return rte_eth_from_pcaps_n_dumpers(pcaps.pcaps, pcaps.num_of_rx,
- dumpers.dumpers, dumpers.num_of_tx, numa_node, &dict);
+ dumpers.dumpers, dumpers.num_of_tx, numa_node, kvlist);
return rte_eth_from_pcaps(pcaps.pcaps, pcaps.num_of_rx, dumpers.pcaps,
- dumpers.num_of_tx, numa_node, &dict);
+ dumpers.num_of_tx, numa_node, kvlist);
}
+static struct rte_driver pmd_pcap_drv = {
+ .name = "eth_pcap",
+ .type = PMD_VDEV,
+ .init = rte_pmd_pcap_devinit,
+};
+
+PMD_REGISTER_DRIVER(pmd_pcap_drv);