net/pcap: truncate packet if it is too large
authorZhike Wang <wangzhike@jd.com>
Mon, 9 Dec 2019 01:53:09 +0000 (09:53 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 17 Jan 2020 18:45:23 +0000 (19:45 +0100)
Previously large packet would be dropped, instead now it is better to
keep it via truncating it.

Signed-off-by: Zhike Wang <wangzhike@jd.com>
Reviewed-by: Cian Ferriter <cian.ferriter@intel.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
drivers/net/pcap/rte_eth_pcap.c

index aa7ef6f..b4c79d1 100644 (file)
@@ -313,7 +313,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        struct pcap_pkthdr header;
        pcap_dumper_t *dumper;
        unsigned char temp_data[RTE_ETH_PCAP_SNAPLEN];
-       size_t len;
+       size_t len, caplen;
 
        pp = rte_eth_devices[dumper_q->port_id].process_private;
        dumper = pp->tx_dumper[dumper_q->queue_id];
@@ -325,28 +325,24 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
         * dumper */
        for (i = 0; i < nb_pkts; i++) {
                mbuf = bufs[i];
-               len = rte_pktmbuf_pkt_len(mbuf);
+               len = caplen = rte_pktmbuf_pkt_len(mbuf);
                if (unlikely(!rte_pktmbuf_is_contiguous(mbuf) &&
                                len > sizeof(temp_data))) {
-                       PMD_LOG(ERR,
-                               "Dropping multi segment PCAP packet. Size (%zd) > max size (%zd).",
-                               len, sizeof(temp_data));
-                       rte_pktmbuf_free(mbuf);
-                       continue;
+                       caplen = sizeof(temp_data);
                }
 
                calculate_timestamp(&header.ts);
                header.len = len;
-               header.caplen = header.len;
+               header.caplen = caplen;
                /* rte_pktmbuf_read() returns a pointer to the data directly
                 * in the mbuf (when the mbuf is contiguous) or, otherwise,
                 * a pointer to temp_data after copying into it.
                 */
                pcap_dump((u_char *)dumper, &header,
-                       rte_pktmbuf_read(mbuf, 0, len, temp_data));
+                       rte_pktmbuf_read(mbuf, 0, caplen, temp_data));
 
                num_tx++;
-               tx_bytes += len;
+               tx_bytes += caplen;
                rte_pktmbuf_free(mbuf);
        }