[dpdk-dev,1/2] ixgbe: fix scalar scatter RX doesn't take into account CRC length

Message ID 1438076509-11650-2-git-send-email-konstantin.ananyev@intel.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Ananyev, Konstantin July 28, 2015, 9:41 a.m. UTC
  For 2.1 release, in attempt to minimize number of RX routines to support,
ixgbe scatter and ixgbe LRO RX routines were merged into one
that can handle both cases.
Though I completely missed the fact, that while LRO could only be used
when HW CRC strip is enabled, scatter RX should work for both cases
(HW CRC strip on/off).
That patch restores missed functionality.

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 drivers/net/ixgbe/ixgbe_rxtx.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
  

Comments

Ananyev, Konstantin July 28, 2015, 11:39 a.m. UTC | #1
Konstantin Ananyev (2):
  ixgbe: fix scalar scatter RX doesn't take into account CRC length
  ixgbe: fix vector scatter RX could produce wrong nb_segs value

 drivers/net/ixgbe/ixgbe_rxtx.c     | 19 +++++++++++++++++++
 drivers/net/ixgbe/ixgbe_rxtx_vec.c |  2 ++
 2 files changed, 21 insertions(+)
  
Wenzhuo Lu July 29, 2015, 1:51 a.m. UTC | #2
Hi,
Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
  
Thomas Monjalon July 29, 2015, 10:59 p.m. UTC | #3
> Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

Applied, thanks
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index a0c8847..a1b25aa 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -1817,6 +1817,25 @@  next_desc:
 		ixgbe_fill_cluster_head_buf(first_seg, &rxd, rxq->port_id,
 					    staterr);
 
+		/*
+		 * Deal with the case, when HW CRC srip is disabled.
+		 * That can't happen when LRO is enabled, but still could
+		 * happen for scattered RX mode.
+		 */
+		first_seg->pkt_len -= rxq->crc_len;
+		if (unlikely(rxm->data_len <= rxq->crc_len)) {
+			struct rte_mbuf *lp;
+
+			for (lp = first_seg; lp->next != rxm; lp = lp->next)
+				;
+
+			first_seg->nb_segs--;
+			lp->data_len -= rxq->crc_len - rxm->data_len;
+			lp->next = NULL;
+			rte_pktmbuf_free_seg(rxm);
+		} else
+			rxm->data_len -= rxq->crc_len;
+
 		/* Prefetch data of first segment, if configured to do so. */
 		rte_packet_prefetch((char *)first_seg->buf_addr +
 			first_seg->data_off);