diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 8f8c9d715fb8..e432ead8381f 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -137,6 +137,7 @@ struct qdf_nbuf_cb { /* Note: MAX: 40 bytes */ struct { uint32_t lro_eligible:1, + no_peer_lro_ineligible:1, tcp_proto:1, tcp_pure_ack:1, ipv6_proto:1, @@ -251,6 +252,8 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, #define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible) +#define QDF_NBUF_CB_RX_LRO_INELIGIBLE(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.no_peer_lro_ineligible) #define QDF_NBUF_CB_RX_LRO_DESC(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_desc) #define QDF_NBUF_CB_RX_LRO_CTX(skb) \ diff --git a/qdf/linux/src/qdf_lro.c b/qdf/linux/src/qdf_lro.c index a3ab6abedd14..5437c8993d84 100644 --- a/qdf/linux/src/qdf_lro.c +++ b/qdf/linux/src/qdf_lro.c @@ -328,6 +328,7 @@ bool qdf_lro_get_info(qdf_lro_ctx_t lro_ctx, qdf_nbuf_t nbuf, int hw_lro_eligible = QDF_NBUF_CB_RX_LRO_ELIGIBLE(nbuf) && (!QDF_NBUF_CB_RX_TCP_PURE_ACK(nbuf)); + int rx_data_before_peer_rx = QDF_NBUF_CB_RX_LRO_INELIGIBLE(nbuf); if (unlikely(!lro_ctx)) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, @@ -335,7 +336,7 @@ bool qdf_lro_get_info(qdf_lro_ctx_t lro_ctx, qdf_nbuf_t nbuf, return false; } - if (!hw_lro_eligible) + if (!hw_lro_eligible || rx_data_before_peer_rx) return false; iph = (struct iphdr *)info->iph;