On Fri, Oct 16, 2026 at 11:52 PM Joshua Washington <[email protected]> wrote:
>
> On Fri, Oct 16, 2026 at 10:46 AM Tathagat Priyadarshi
> <[email protected]> wrote:
> >
> > The device requires non-TSO packets to be 17 to 9728 bytes long, as
> > noted in the Linux driver, but packets of any length are posted. The
> > device treats an out-of-range packet as coming from a malicious
> > driver: it drops the packet and disables the datapath, stalling all
> > queues.
> >
> > Drop such packets in the driver and count them in a new invalid_pkts
> > counter.
> >
> > Fixes: 4022f9999f56 ("net/gve: support basic Tx data path for DQO")
> > Cc: [email protected]
> >
> > Signed-off-by: Tathagat Priyadarshi <[email protected]>
> Acked-by: Joshua Washington <[email protected]>
> > ---
> > drivers/net/gve/base/gve_desc_dqo.h | 2 ++
> > drivers/net/gve/gve_ethdev.c | 1 +
> > drivers/net/gve/gve_ethdev.h | 1 +
> > drivers/net/gve/gve_tx_dqo.c | 17 +++++++++++++++++
> > 4 files changed, 21 insertions(+)
> >
> > diff --git a/drivers/net/gve/base/gve_desc_dqo.h
> > b/drivers/net/gve/base/gve_desc_dqo.h
> > index c1534959c2..d50d88765e 100644
> > --- a/drivers/net/gve/base/gve_desc_dqo.h
> > +++ b/drivers/net/gve/base/gve_desc_dqo.h
> > @@ -12,6 +12,8 @@
> >
> > #define GVE_TX_MAX_HDR_SIZE_DQO 255
> > #define GVE_TX_MIN_TSO_MSS_DQO 88
> > +#define GVE_TX_MIN_PKT_SIZE_DQO 17
> > +#define GVE_TX_MAX_PKT_SIZE_DQO 9728
> >
> > /* Basic TX descriptor (DTYPE 0x0C) */
> > struct gve_tx_pkt_desc_dqo {
> > diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c
> > index 1dfbe8f396..53b0a0ec63 100644
> > --- a/drivers/net/gve/gve_ethdev.c
> > +++ b/drivers/net/gve/gve_ethdev.c
> > @@ -1044,6 +1044,7 @@ static const struct gve_xstats_name_offset
> > tx_xstats_name_offset[] = {
> > { "errors", TX_QUEUE_STATS_OFFSET(errors) },
> > { "too_many_descs", TX_QUEUE_STATS_OFFSET(too_many_descs) },
> > { "invalid_mbufs", TX_QUEUE_STATS_OFFSET(invalid_mbufs) },
> > + { "invalid_pkts", TX_QUEUE_STATS_OFFSET(invalid_pkts) },
> > };
> >
> > static const struct gve_xstats_name_offset rx_xstats_name_offset[] = {
> > diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h
> > index 66cb31dadb..be744d955b 100644
> > --- a/drivers/net/gve/gve_ethdev.h
> > +++ b/drivers/net/gve/gve_ethdev.h
> > @@ -115,6 +115,7 @@ struct gve_tx_stats {
> > uint64_t errors;
> > uint64_t too_many_descs;
> > uint64_t invalid_mbufs;
> > + uint64_t invalid_pkts;
> > };
> >
> > struct gve_rx_stats {
> > diff --git a/drivers/net/gve/gve_tx_dqo.c b/drivers/net/gve/gve_tx_dqo.c
> > index 46a03d482d..f686a8c110 100644
> > --- a/drivers/net/gve/gve_tx_dqo.c
> > +++ b/drivers/net/gve/gve_tx_dqo.c
> > @@ -123,6 +123,17 @@ gve_tx_clean_descs_dqo(struct gve_tx_queue *txq,
> > uint16_t nb_descs) {
> > gve_tx_clean_dqo(txq);
> > }
> >
> > +/* Validate packet lengths against the device limits. */
> > +static inline bool
> > +gve_tx_validate_pkt(const struct rte_mbuf *tx_pkt, bool is_tso)
>
> Minor nit (not worth blocking over, but maybe can be done as the
> patches are being merged): can this be renamed to
> gve_tx_validate_pkt_len? This is one step of many in the packet
> validation pipeline.
Thanks for the review, Joshua. Agreed on renaming to gve_tx_validate_pkt_len.
This change impacts patches 9/10 and 10/10. I am happy to submit a v5
series if preferred,
or the maintainer can rename it upon applying.
>
> > +{
> > + if (!is_tso)
> > + return tx_pkt->pkt_len >= GVE_TX_MIN_PKT_SIZE_DQO &&
> > + tx_pkt->pkt_len <= GVE_TX_MAX_PKT_SIZE_DQO;
> > +
> > + return true;
> > +}
> > +
> > /* Max descriptors a single packet may use. A larger packet can never pass
> > * gve_can_tx(): one slot is always reserved, the cacheline overlap margin
> > * must stay free, and up to GVE_TX_MIN_RE_INTERVAL - 1 descriptors posted
> > @@ -306,6 +317,12 @@ gve_tx_burst_dqo(void *tx_queue, struct rte_mbuf
> > **tx_pkts, uint16_t nb_pkts)
> > tso = !!(ol_flags & RTE_MBUF_F_TX_TCP_SEG);
> > csum = !!(ol_flags & GVE_TX_CKSUM_OFFLOAD_MASK_DQO);
> >
> > + if (!gve_tx_validate_pkt(tx_pkt, tso)) {
> > + txq->stats.invalid_pkts++;
> > + rte_pktmbuf_free(tx_pkt);
> > + continue;
> > + }
> > +
> > nb_descs = gve_tx_pkt_nb_data_descs(tx_pkt);
> > nb_descs += tso;
> >
> > --
> > 2.43.0
> >