net/pcap: fix using mbuf after freeing it
[dpdk.git] / drivers / net / pcap / rte_eth_pcap.c
index 48d96fa..075e3be 100644 (file)
@@ -119,7 +119,6 @@ static struct ether_addr eth_addr = {
        .addr_bytes = { 0, 0, 0, 0x1, 0x2, 0x3 }
 };
 
-static const char *drivername = "Pcap PMD";
 static struct rte_eth_link pmd_link = {
                .link_speed = ETH_SPEED_NUM_10G,
                .link_duplex = ETH_LINK_FULL_DUPLEX,
@@ -222,8 +221,10 @@ eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
                                                       mbuf,
                                                       packet,
-                                                      header.caplen) == -1))
+                                                      header.caplen) == -1)) {
+                               rte_pktmbuf_free(mbuf);
                                break;
+                       }
                }
 
                mbuf->pkt_len = (uint16_t)header.caplen;
@@ -245,7 +246,7 @@ calculate_timestamp(struct timeval *ts) {
 
        cycles = rte_get_timer_cycles() - start_cycles;
        cur_time.tv_sec = cycles / hz;
-       cur_time.tv_usec = (cycles % hz) * 10e6 / hz;
+       cur_time.tv_usec = (cycles % hz) * 1e6 / hz;
        timeradd(&start_time, &cur_time, ts);
 }
 
@@ -292,9 +293,9 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        }
                }
 
-               rte_pktmbuf_free(mbuf);
                num_tx++;
                tx_bytes += mbuf->pkt_len;
+               rte_pktmbuf_free(mbuf);
        }
 
        /*
@@ -550,14 +551,12 @@ eth_dev_info(struct rte_eth_dev *dev,
 {
        struct pmd_internals *internals = dev->data->dev_private;
 
-       dev_info->driver_name = drivername;
        dev_info->if_index = internals->if_index;
        dev_info->max_mac_addrs = 1;
        dev_info->max_rx_pktlen = (uint32_t) -1;
        dev_info->max_rx_queues = dev->data->nb_rx_queues;
        dev_info->max_tx_queues = dev->data->nb_tx_queues;
        dev_info->min_rx_bufsize = 0;
-       dev_info->pci_dev = NULL;
 }
 
 static void
@@ -788,6 +787,8 @@ open_tx_iface(const char *key, const char *value, void *extra_args)
        return 0;
 }
 
+static struct rte_vdev_driver pmd_pcap_drv;
+
 static int
 pmd_init_internals(const char *name, const unsigned int nb_rx_queues,
                const unsigned int nb_tx_queues,
@@ -840,7 +841,7 @@ pmd_init_internals(const char *name, const unsigned int nb_rx_queues,
        (*eth_dev)->driver = NULL;
        data->dev_flags = RTE_ETH_DEV_DETACHABLE;
        data->kdrv = RTE_KDRV_NONE;
-       data->drv_name = drivername;
+       data->drv_name = pmd_pcap_drv.driver.name;
        data->numa_node = numa_node;
 
        return 0;
@@ -935,7 +936,7 @@ eth_from_pcaps(const char *name, struct pmd_devargs *rx_queues,
 }
 
 static int
-pmd_pcap_devinit(const char *name, const char *params)
+pmd_pcap_probe(const char *name, const char *params)
 {
        unsigned int is_rx_pcap = 0, is_tx_pcap = 0;
        struct rte_kvargs *kvlist;
@@ -1034,7 +1035,7 @@ free_kvlist:
 }
 
 static int
-pmd_pcap_devuninit(const char *name)
+pmd_pcap_remove(const char *name)
 {
        struct rte_eth_dev *eth_dev = NULL;
 
@@ -1058,12 +1059,13 @@ pmd_pcap_devuninit(const char *name)
 }
 
 static struct rte_vdev_driver pmd_pcap_drv = {
-       .init = pmd_pcap_devinit,
-       .uninit = pmd_pcap_devuninit,
+       .probe = pmd_pcap_probe,
+       .remove = pmd_pcap_remove,
 };
 
-DRIVER_REGISTER_VDEV(net_pcap, pmd_pcap_drv);
-DRIVER_REGISTER_PARAM_STRING(net_pcap,
+RTE_PMD_REGISTER_VDEV(net_pcap, pmd_pcap_drv);
+RTE_PMD_REGISTER_ALIAS(net_pcap, eth_pcap);
+RTE_PMD_REGISTER_PARAM_STRING(net_pcap,
        ETH_PCAP_RX_PCAP_ARG "=<string> "
        ETH_PCAP_TX_PCAP_ARG "=<string> "
        ETH_PCAP_RX_IFACE_ARG "=<ifc> "