Hi Zhike,

I've tested the behavior before and after this patch and can verify that the 
packets are being correctly truncated.

Code looks good to me too.

Reviewed-by: Cian Ferriter <cian.ferri...@intel.com>

Thanks,
Cian

> -----Original Message-----
> From: Zhike Wang <wangzk...@163.com>
> Sent: Monday 9 December 2019 01:53
> To: dev@dpdk.org
> Cc: wangzh...@jd.com; Yigit, Ferruh <ferruh.yi...@intel.com>; Ferriter, Cian
> <cian.ferri...@intel.com>; Zhike Wang <wangzk...@163.com>
> Subject: [PATCH v2] net/pcap: truncate packet if it is too large
> 
> From: Zhike Wang <wangzh...@jd.com>
> 
> Previously large packet would be dropped, instead now it is better to keep it
> via truncating it.
> 
> Signed-off-by: Zhike Wang <wangzk...@163.com>
> ---
>  drivers/net/pcap/rte_eth_pcap.c | 16 ++++++----------
>  1 file changed, 6 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/pcap/rte_eth_pcap.c
> b/drivers/net/pcap/rte_eth_pcap.c index aa7ef6f..b4c79d1 100644
> --- a/drivers/net/pcap/rte_eth_pcap.c
> +++ b/drivers/net/pcap/rte_eth_pcap.c
> @@ -313,7 +313,7 @@ struct pmd_devargs_all {
>       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 @@ struct pmd_devargs_all {
>        * 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);
>       }
> 
> --
> 1.8.3.1
> 

Reply via email to