Re: [PATCH v13 08/16] net/pcap: support VLAN insert and strip

David Marchand
2026-02-23T11:35:06Z

On Tue, 10 Feb 2026 at 01:03, Stephen Hemminger
<stephen@networkplumber.org> wrote:
>
> Driver can easily insert VLAN tag strip and insertion similar
> to how it is handled in virtio and af_packet.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

[snip]

> @@ -383,6 +393,56 @@ calculate_timestamp(struct timeval *ts) {
> }
> }
>
> +

Unneeded empty line.

> +/*
> + * If Vlan offload flag is present, insert the vlan.
> + * Returns the mbuf to send, or NULL on error.
> + */
> +static inline int
> +eth_pcap_tx_vlan(struct pcap_tx_queue *tx_queue, struct rte_mbuf **mbuf)
> +{
> + struct rte_mbuf *mb = *mbuf;
> +
> + if ((mb->ol_flags & RTE_MBUF_F_TX_VLAN) == 0)
> + return 0;
> +
> + if (unlikely(mb->data_len < RTE_ETHER_HDR_LEN)) {
> + PMD_TX_LOG(ERR, "mbuf missing ether header");
> + goto error;
> + }
> +
> + /* Need at another buffer to hold VLAN header? */
> + if (!RTE_MBUF_DIRECT(mb) || rte_mbuf_refcnt_read(mb) > 1) {
> + struct rte_mbuf *mh = rte_pktmbuf_alloc(mb->pool);
> + if (unlikely(mh == NULL)) {
> + PMD_TX_LOG(ERR, "mbuf pool exhausted on transmit vlan");
> + goto error;
> + }
> +
> + /* Extract original ethernet header into new mbuf */
> + memcpy(rte_pktmbuf_mtod(mh, void *), rte_pktmbuf_mtod(mb, void *), RTE_ETHER_HDR_LEN);
> + mh->nb_segs = mb->nb_segs + 1;
> + mh->data_len = RTE_ETHER_HDR_LEN;
> + mh->pkt_len = mb->pkt_len;
> + mh->ol_flags = mb->ol_flags;
> +
> + mb->data_len -= RTE_ETHER_HDR_LEN;
> + mh->next = mb;
> +
> + *mbuf = mh;
> + }

Could this segment allocation+chaining be moved in rte_vlan_insert?

This would help solve this issue in other sw drivers that currently
just drop (indirect) mbufs.
We might need an additional input param for driver that don't want
multiseg / existing users... ?

--
David Marchand