pcap: fix Tx mbuf corruption
[dpdk.git] / lib / librte_pmd_pcap / rte_eth_pcap.c
index 03e6e6c..6a411a9 100644 (file)
 #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
@@ -217,7 +218,6 @@ eth_pcap_tx_dumper(void *queue,
        return num_tx;
 }
 
-#ifdef PCAP_CAN_SEND
 /*
  * Callback to handle sending packets through a real NIC.
  */
@@ -239,8 +239,9 @@ eth_pcap_tx(void *queue,
                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);
        }
 
@@ -248,17 +249,6 @@ eth_pcap_tx(void *queue,
        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)
@@ -549,15 +539,15 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
                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;
        }
@@ -626,13 +616,13 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
        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;
@@ -645,7 +635,7 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
                return -1;
 
        if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-                       &internals, &eth_dev, dict) < 0)
+                       &internals, &eth_dev, kvlist) < 0)
                return -1;
 
        for (i = 0; i < nb_rx_queues; i++) {
@@ -661,13 +651,13 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
        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;
@@ -680,7 +670,7 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
                return -1;
 
        if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-                       &internals, &eth_dev, dict) < 0)
+                       &internals, &eth_dev, kvlist) < 0)
                return -1;
 
        for (i = 0; i < nb_rx_queues; i++) {
@@ -697,8 +687,8 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
 }
 
 
-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;
@@ -729,7 +719,8 @@ rte_pmd_pcap_init(const char *name, const char *params)
                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);
        }
 
        /*
@@ -770,10 +761,17 @@ rte_pmd_pcap_init(const char *name, const char *params)
 
        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);