On 6/12/2026 4:14 PM, Xingui Yang wrote:
> The tx_vlan set command currently only accepts a VLAN ID in range
> [0, 4095].  This patch adds support for an extended format that includes
> 802.1p priority and CFI bits, allowing users to set the VLAN priority
> tag when inserting VLAN headers in TX packets.
> 
> The extended format is:
>   bit 0-11:  VLAN ID (0-4095)
>   bit 12:    CFI (Canonical Format Indicator)
>   bit 13-15: Priority (0-7, 802.1p CoS)
> 
> This is consistent with the VLAN tag structure used by
> rte_eth_dev_set_vlan_pvid() where the PVID field encodes VLAN ID, CFI
> and priority in the same format.
> 
> A new command line option --enable-vlan-priority is added to enable this
> feature. By default, the feature is disabled to maintain backward
> compatibility with existing users. When enabled, the
> vlan_id_is_invalid() function allows any 16-bit value to pass, while the
> full 16-bit value (including CFI and priority bits) is passed to the
> driver for hardware VLAN insertion.
> 
> Signed-off-by: Xingui Yang <[email protected]>
> ---
>  app/test-pmd/config.c     | 24 +++++++++++++++---------
>  app/test-pmd/parameters.c |  6 ++++++
>  app/test-pmd/testpmd.c    |  5 +++++
>  app/test-pmd/testpmd.h    |  2 ++
>  4 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index 36b9b023e2..80cde109e6 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -1241,12 +1241,18 @@ void print_valid_ports(void)
>  }
>  
>  static int
> -vlan_id_is_invalid(uint16_t vlan_id)
> +vlan_id_is_invalid(uint16_t vlan_id, int vlan_priority_ena)
>  {
> -     if (vlan_id < 4096)
> -             return 0;
> -     fprintf(stderr, "Invalid vlan_id %d (must be < 4096)\n", vlan_id);
> -     return 1;
> +     if (!vlan_priority_ena && vlan_id >= 4096) {
> +             fprintf(stderr, "Invalid vlan_id %d (must be < 4096)\n", 
> vlan_id);
> +             return 1;
> +     }
> +
> +     /*
> +      * When vlan_priority_ena is enabled, allow any 16-bit value
> +      * to pass priority and CFI bits to the driver.
> +      */
> +     return 0;
>  }
>  
>  static uint32_t
> @@ -6876,7 +6882,7 @@ rx_vft_set(portid_t port_id, uint16_t vlan_id, int on)
>  
>       if (port_id_is_invalid(port_id, ENABLED_WARN))
>               return 1;
> -     if (vlan_id_is_invalid(vlan_id))
> +     if (vlan_id_is_invalid(vlan_id, vlan_priority_insert_ena))

Just vlan_id_is_invalid(vlan_id, false) because Rx is no need to impl this.

>               return 1;
>       diag = rte_eth_dev_vlan_filter(port_id, vlan_id, on);
>       if (diag == 0)
> @@ -6923,7 +6929,7 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
>       struct rte_eth_dev_info dev_info;
>       int ret;
>  
> -     if (vlan_id_is_invalid(vlan_id))
> +     if (vlan_id_is_invalid(vlan_id, vlan_priority_insert_ena))
>               return;
>  
>       if (ports[port_id].dev_conf.txmode.offloads &
> @@ -6954,9 +6960,9 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, 
> uint16_t vlan_id_outer)
>       struct rte_eth_dev_info dev_info;
>       int ret;
>  
> -     if (vlan_id_is_invalid(vlan_id))
> +     if (vlan_id_is_invalid(vlan_id, vlan_priority_insert_ena))
>               return;
> -     if (vlan_id_is_invalid(vlan_id_outer))
> +     if (vlan_id_is_invalid(vlan_id_outer, vlan_priority_insert_ena))
>               return;
>  
>       ret = eth_dev_info_get_print_err(port_id, &dev_info);
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 8c3b1244e7..3f37498d3b 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -117,6 +117,8 @@ enum {
>       TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND_NUM,
>  #define TESTPMD_OPT_ENABLE_HW_QINQ_STRIP "enable-hw-qinq-strip"
>       TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM,
> +#define TESTPMD_OPT_ENABLE_VLAN_PRIORITY "enable-vlan-priority"
> +     TESTPMD_OPT_ENABLE_VLAN_PRIORITY_NUM,

How about TESTPMD_OPT_ENABLE_VLAN_INSERT_PRI "enable-vlan-insert-pri"

>  #define TESTPMD_OPT_ENABLE_DROP_EN "enable-drop-en"
>       TESTPMD_OPT_ENABLE_DROP_EN_NUM,
>  #define TESTPMD_OPT_DISABLE_RSS "disable-rss"
> @@ -461,6 +463,7 @@ usage(char* progname)
>       printf("  --enable-hw-vlan-strip: enable hardware vlan strip.\n");
>       printf("  --enable-hw-vlan-extend: enable hardware vlan extend.\n");
>       printf("  --enable-hw-qinq-strip: enable hardware qinq strip.\n");
> +     printf("  --enable-vlan-priority: enable vlan priority insert.\n");
>       printf("  --enable-drop-en: enable per queue packet drop.\n");
>       printf("  --disable-rss: disable rss.\n");
>       printf("  --enable-rss: Force rss even for single-queue operation.\n");
> @@ -1259,6 +1262,9 @@ launch_args_parse(int argc, char** argv)
>               case TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM:
>                       rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
>                       break;
> +             case TESTPMD_OPT_ENABLE_VLAN_PRIORITY_NUM:
> +                     vlan_priority_insert_ena = 1;

How about tx_insert_vlan_pri_en

> +                     break;
>               case TESTPMD_OPT_ENABLE_DROP_EN_NUM:
>                       rx_drop_en = 1;
>                       break;
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 457bb6d3fe..0239ec59de 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -307,6 +307,11 @@ uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of 
> mbuf mempool cache. */
>  /* current configuration is in DCB or not,0 means it is not in DCB mode */
>  uint8_t dcb_config = 0;
>  
> +/*
> + * Configurable value of vlan priority insert enable.
> + */
> +uint8_t vlan_priority_insert_ena;
> +
>  /*
>   * Configurable number of RX/TX queues.
>   */
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
> index 04fdc2db42..104a6e73be 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -618,6 +618,8 @@ extern uint64_t noisy_lkup_num_reads_writes;
>  
>  extern uint8_t dcb_config;
>  
> +extern uint8_t vlan_priority_insert_ena;
> +
>  extern uint32_t mbuf_data_size_n;
>  extern uint16_t mbuf_data_size[MAX_SEGS_BUFFER_SPLIT];
>  /**< Mbuf data space size. */

We need also update the testpmd document

Thanks

Reply via email to