[PATCH v4 09/10] net/gve: enforce DQO Tx packet length limits
Joshua Washington
joshwash at google.com
Fri Oct 16 20:22:17 CEST 2026
On Fri, Oct 16, 2026 at 10:46 AM Tathagat Priyadarshi
<tathagat.dpdk at gmail.com> 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: stable at dpdk.org
>
> Signed-off-by: Tathagat Priyadarshi <tathagat.dpdk at gmail.com>
Acked-by: Joshua Washington <joshwash at google.com>
> ---
> 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.
> +{
> + 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
>
More information about the dev
mailing list