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.

Fixes: 9d8a92628f21 ("ixgbe: remove simple scalar scattered Rx method")

v2 changes:
- updated commit message with 'Fixes'.

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

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);
-- 
1.8.3.1

Reply via email to