gve: Make LRO work for jumbo packets

Each Rx descriptor points to a packet buffer of size 2K, which means
that MTUs greater than 2K see multi-descriptor packets. The TCP-hood of
such packets was being incorrectly determined by looking for a flag on
the last descriptor instead of the first descriptor.

Also fixed and progressed the version number.

Reviewed by:	markj
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D41754
This commit is contained in:
Shailend Chand 2023-09-07 09:28:26 -04:00 committed by Mark Johnston
parent cb8dd292c7
commit 5f62584a9a
3 changed files with 7 additions and 5 deletions

View File

@ -164,6 +164,7 @@ struct gve_rx_ctx {
struct mbuf *mbuf_tail;
uint32_t total_size;
uint8_t frag_cnt;
bool is_tcp;
bool drop_pkt;
};

View File

@ -31,10 +31,10 @@
#include "gve.h"
#include "gve_adminq.h"
#define GVE_DRIVER_VERSION "GVE-FBSD-1.0.0\n"
#define GVE_VERSION_MAJOR 0
#define GVE_VERSION_MINOR 9
#define GVE_VERSION_SUB 0
#define GVE_DRIVER_VERSION "GVE-FBSD-1.0.1\n"
#define GVE_VERSION_MAJOR 1
#define GVE_VERSION_MINOR 0
#define GVE_VERSION_SUB 1
#define GVE_DEFAULT_RX_COPYBREAK 256

View File

@ -546,6 +546,7 @@ gve_rx(struct gve_priv *priv, struct gve_rx_ring *rx, struct gve_rx_desc *desc,
if (is_first_frag) {
mbuf->m_pkthdr.rcvif = priv->ifp;
ctx->is_tcp = desc->flags_seq & GVE_RXF_TCP;
if (gve_needs_rss(desc->flags_seq)) {
gve_set_rss_type(desc->flags_seq, mbuf);
@ -567,7 +568,7 @@ gve_rx(struct gve_priv *priv, struct gve_rx_ring *rx, struct gve_rx_desc *desc,
do_if_input = true;
if (((if_getcapenable(priv->ifp) & IFCAP_LRO) != 0) && /* LRO is enabled */
(desc->flags_seq & GVE_RXF_TCP) && /* pkt is a TCP pkt */
(ctx->is_tcp) && /* pkt is a TCP pkt */
((mbuf->m_pkthdr.csum_flags & CSUM_DATA_VALID) != 0) && /* NIC verified csum */
(rx->lro.lro_cnt != 0) && /* LRO resources exist */
(tcp_lro_rx(&rx->lro, mbuf, 0) == 0))