On 7/25/2019 9:18 AM, David Marchand wrote: > On Wed, Jul 24, 2019 at 1:55 PM David Marchand > <david.march...@redhat.com> wrote: >> >> Two cores can send multi segment packets on two different pcap ports. >> Because of this, we can't have one single buffer to linearize packets. >> >> Use rte_pktmbuf_read() to copy the packet into a buffer on the stack >> and remove eth_pcap_gather_data(). >> >> Fixes: 6db141c91e1f ("pcap: support jumbo frames") >> Cc: sta...@dpdk.org >> >> Signed-off-by: David Marchand <david.march...@redhat.com> >> --- >> drivers/net/pcap/rte_eth_pcap.c | 90 >> +++++++++++++++-------------------------- >> 1 file changed, 32 insertions(+), 58 deletions(-) >> >> diff --git a/drivers/net/pcap/rte_eth_pcap.c >> b/drivers/net/pcap/rte_eth_pcap.c >> index 5e5aab7..7398b1b 100644 >> --- a/drivers/net/pcap/rte_eth_pcap.c >> +++ b/drivers/net/pcap/rte_eth_pcap.c > > [snip] > >> @@ -336,31 +323,25 @@ struct pmd_devargs_all { >> * dumper */ >> for (i = 0; i < nb_pkts; i++) { >> mbuf = bufs[i]; >> - calculate_timestamp(&header.ts); >> - header.len = mbuf->pkt_len; >> - header.caplen = header.len; >> - >> - if (likely(mbuf->nb_segs == 1)) { >> - pcap_dump((u_char *)dumper, &header, >> - rte_pktmbuf_mtod(mbuf, void*)); >> + len = rte_pktmbuf_pkt_len(mbuf); >> + if (likely(rte_pktmbuf_is_contiguous(mbuf))) { >> + data = rte_pktmbuf_mtod(mbuf, unsigned char *); >> + } else if (len <= sizeof(_data)) { >> + data = rte_pktmbuf_read(mbuf, 0, len, _data); > > We can actually skip the check on contiguous data, since > rte_pktmbuf_read returns a pointer to the mbuf data without copying. > WDYT ?
Right, +1 to skip 'rte_pktmbuf_is_contiguous()' only it can be good to comment 'rte_pktmbuf_read()' usage to say it covers multi-segment too.