[PATCH v2 5/5] ethdev: add MPLS header modification support
Ori Kam
orika at nvidia.com
Sun May 21 21:03:02 CEST 2023
Hi Michael,
> -----Original Message-----
> From: Michael Baum <michaelba at nvidia.com>
> Sent: Thursday, May 18, 2023 8:40 PM
>
> Add support for MPLS modify header using "RTE_FLOW_FIELD_MPLS" id.
>
> Since MPLS heaser might appear more the one time in inner/outer/tunnel,
> a new field was added to "rte_flow_action_modify_data" structure in
> addition to "level" field.
> The "tag_index" field is the index of the header inside encapsulation
> level. It is used for modify multiple MPLS headers in same encapsulation
> level.
>
> This addition enables to modify multiple VLAN headers too, so the
> description of "RTE_FLOW_FIELD_VLAN_XXXX" was updated.
>
> Signed-off-by: Michael Baum <michaelba at nvidia.com>
> ---
[Snip]
> diff --git a/doc/guides/prog_guide/rte_flow.rst
> b/doc/guides/prog_guide/rte_flow.rst
> index ec812de335..591e43b5ac 100644
> --- a/doc/guides/prog_guide/rte_flow.rst
> +++ b/doc/guides/prog_guide/rte_flow.rst
> @@ -2925,8 +2925,7 @@ See ``enum rte_flow_field_id`` for the list of
> supported fields.
>
> ``width`` defines a number of bits to use from ``src`` field.
>
> -``level`` is used to access any packet field on any encapsulation level
> -as well as any tag element in the tag array:
> +``level`` is used to access any packet field on any encapsulation level:
>
> - ``0`` means the default behaviour. Depending on the packet type,
> it can mean outermost, innermost or anything in between.
> @@ -2934,8 +2933,9 @@ as well as any tag element in the tag array:
> - ``2`` and subsequent values requests access to the specified packet
> encapsulation level, from outermost to innermost (lower to higher values).
>
> -For the tag array (in case of multiple tags are supported and present)
> -``level`` translates directly into the array index.
> +``tag_index`` is the index of the header inside encapsulation level.
> +It is used for modify either ``VLAN`` or ``MPLS`` or ``TAG`` headers which
> +multiple of them might be supported in same encapsulation level.
>
This is an API change and must be documented as such in the release notes.
I suggest to avoid breaking working apps that it will be documented that
for this release when using tag the PMD will look at level and tag_id
If both equal to 0 --> the requested tag is zero
If tag_id == 0 and level != 0 PMD will selected the tag based on level, but will output a warning
If tag_id != 0 and level == 0 PMD will select the tag based on the tag_id
> ``type`` is used to specify (along with ``class_id``) the Geneve option which
> is being modified.
> @@ -3011,7 +3011,9 @@ and provide immediate value 0xXXXX85XX.
>
> +=================+============================================
> ==============+
> | ``field`` | ID: packet field, mark, meta, tag, immediate, pointer |
> +-----------------+----------------------------------------------------------+
> - | ``level`` | encapsulation level of a packet field or tag array index |
> + | ``level`` | encapsulation level of a packet field |
> + +-----------------+----------------------------------------------------------+
> + | ``tag_index`` | tag index inside encapsulation level |
> +-----------------+----------------------------------------------------------+
> | ``type`` | geneve option type |
> +-----------------+----------------------------------------------------------+
> diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
> index f30d4b033f..34e536d662 100644
> --- a/lib/ethdev/rte_flow.h
> +++ b/lib/ethdev/rte_flow.h
> @@ -3740,8 +3740,8 @@ enum rte_flow_field_id {
> RTE_FLOW_FIELD_START = 0, /**< Start of a packet. */
> RTE_FLOW_FIELD_MAC_DST, /**< Destination MAC
> Address. */
> RTE_FLOW_FIELD_MAC_SRC, /**< Source MAC Address. */
> - RTE_FLOW_FIELD_VLAN_TYPE, /**< 802.1Q Tag Identifier. */
> - RTE_FLOW_FIELD_VLAN_ID, /**< 802.1Q VLAN Identifier.
> */
> + RTE_FLOW_FIELD_VLAN_TYPE, /**< VLAN Tag Identifier. */
> + RTE_FLOW_FIELD_VLAN_ID, /**< VLAN Identifier. */
> RTE_FLOW_FIELD_MAC_TYPE, /**< EtherType. */
> RTE_FLOW_FIELD_IPV4_DSCP, /**< IPv4 DSCP. */
> RTE_FLOW_FIELD_IPV4_TTL, /**< IPv4 Time To Live. */
> @@ -3775,7 +3775,8 @@ enum rte_flow_field_id {
> RTE_FLOW_FIELD_HASH_RESULT, /**< Hash result. */
> RTE_FLOW_FIELD_GENEVE_OPT_TYPE, /**< GENEVE option type */
> RTE_FLOW_FIELD_GENEVE_OPT_CLASS,/**< GENEVE option class */
> - RTE_FLOW_FIELD_GENEVE_OPT_DATA /**< GENEVE option data */
> + RTE_FLOW_FIELD_GENEVE_OPT_DATA, /**< GENEVE option
> data */
> + RTE_FLOW_FIELD_MPLS /**< MPLS header. */
> };
>
> /**
> @@ -3789,7 +3790,7 @@ struct rte_flow_action_modify_data {
> RTE_STD_C11
> union {
> struct {
> - /** Encapsulation level or tag index or flex item
> handle. */
> + /** Encapsulation level and tag index or flex item
> handle. */
> union {
> struct {
> /**
> @@ -3820,20 +3821,36 @@ struct rte_flow_action_modify_data {
> *
> * Values other than @p 0 are not
> * necessarily supported.
> + *
> + * @note that for MPLS field,
> + * encapsulation level also include
> + * tunnel since MPLS may appear in
> + * outer, inner or tunnel.
> */
> uint8_t level;
> - /**
> - * Geneve option type. relevant only
> - * for
> RTE_FLOW_FIELD_GENEVE_OPT_XXXX
> - * modification type.
> - */
> - uint8_t type;
> - /**
> - * Geneve option class. relevant only
> - * for
> RTE_FLOW_FIELD_GENEVE_OPT_XXXX
> - * modification type.
> - */
> - rte_be16_t class_id;
> + union {
> + /**
> + * Tag index array inside
> + * encapsulation level.
> + */
I think it is also worth noting that this is used also for VLAN and MPLS.
> + uint8_t tag_index;
> + /**
> + * Geneve option identifier.
> + * relevant only for
> + *
> RTE_FLOW_FIELD_GENEVE_OPT_XXXX
> + * modification type.
> + */
> + struct {
> + /**
> + * Geneve option
> type.
> + */
> + uint8_t type;
> + /**
> + * Geneve option
> class.
> + */
> + rte_be16_t class_id;
> + };
> + };
> };
> struct rte_flow_item_flex_handle
> *flex_handle;
> };
> --
> 2.25.1
More information about the dev
mailing list