@@ -636,6 +636,7 @@ enum index {
ACTION_MODIFY_FIELD_DST_TYPE_VALUE,
ACTION_MODIFY_FIELD_DST_LEVEL,
ACTION_MODIFY_FIELD_DST_LEVEL_VALUE,
+ ACTION_MODIFY_FIELD_DST_TAG_INDEX,
ACTION_MODIFY_FIELD_DST_TYPE_ID,
ACTION_MODIFY_FIELD_DST_CLASS_ID,
ACTION_MODIFY_FIELD_DST_OFFSET,
@@ -643,6 +644,7 @@ enum index {
ACTION_MODIFY_FIELD_SRC_TYPE_VALUE,
ACTION_MODIFY_FIELD_SRC_LEVEL,
ACTION_MODIFY_FIELD_SRC_LEVEL_VALUE,
+ ACTION_MODIFY_FIELD_SRC_TAG_INDEX,
ACTION_MODIFY_FIELD_SRC_TYPE_ID,
ACTION_MODIFY_FIELD_SRC_CLASS_ID,
ACTION_MODIFY_FIELD_SRC_OFFSET,
@@ -859,7 +861,7 @@ static const char *const modify_field_ids[] = {
"ipv6_proto",
"flex_item",
"hash_result",
- "geneve_opt_type", "geneve_opt_class", "geneve_opt_data",
+ "geneve_opt_type", "geneve_opt_class", "geneve_opt_data", "mpls",
NULL
};
@@ -2301,6 +2303,7 @@ static const enum index next_action_sample[] = {
static const enum index action_modify_field_dst[] = {
ACTION_MODIFY_FIELD_DST_LEVEL,
+ ACTION_MODIFY_FIELD_DST_TAG_INDEX,
ACTION_MODIFY_FIELD_DST_TYPE_ID,
ACTION_MODIFY_FIELD_DST_CLASS_ID,
ACTION_MODIFY_FIELD_DST_OFFSET,
@@ -2310,6 +2313,7 @@ static const enum index action_modify_field_dst[] = {
static const enum index action_modify_field_src[] = {
ACTION_MODIFY_FIELD_SRC_LEVEL,
+ ACTION_MODIFY_FIELD_SRC_TAG_INDEX,
ACTION_MODIFY_FIELD_SRC_TYPE_ID,
ACTION_MODIFY_FIELD_SRC_CLASS_ID,
ACTION_MODIFY_FIELD_SRC_OFFSET,
@@ -6398,6 +6402,15 @@ static const struct token token_list[] = {
.call = parse_vc_modify_field_level,
.comp = comp_none,
},
+ [ACTION_MODIFY_FIELD_DST_TAG_INDEX] = {
+ .name = "dst_tag_index",
+ .help = "destination field tag array",
+ .next = NEXT(action_modify_field_dst,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ dst.tag_index)),
+ .call = parse_vc_conf,
+ },
[ACTION_MODIFY_FIELD_DST_TYPE_ID] = {
.name = "dst_type_id",
.help = "destination field type ID",
@@ -6451,6 +6464,15 @@ static const struct token token_list[] = {
.call = parse_vc_modify_field_level,
.comp = comp_none,
},
+ [ACTION_MODIFY_FIELD_SRC_TAG_INDEX] = {
+ .name = "stc_tag_index",
+ .help = "source field tag array",
+ .next = NEXT(action_modify_field_src,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ src.tag_index)),
+ .call = parse_vc_conf,
+ },
[ACTION_MODIFY_FIELD_SRC_TYPE_ID] = {
.name = "src_type_id",
.help = "source field type ID",
@@ -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,15 @@ 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.
+
+.. note::
+
+ For ``RTE_FLOW_FIELD_TAG`` type, the tag array was provided in ``level``
+ field and it is still supported for backwards compatibility.
+ When ``tag_index`` is zero, the tag array is taken from ``level`` field.
``type`` is used to specify (along with ``class_id``) the Geneve option which
is being modified.
@@ -3011,7 +3017,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 |
+-----------------+----------------------------------------------------------+
@@ -84,8 +84,12 @@ API Changes
Also, make sure to start the actual text at the margin.
=======================================================
-* The ``level`` field in experimental structure
- ``struct rte_flow_action_modify_data`` was reduced to 8 bits.
+* ethdev: in experimental structure ``struct rte_flow_action_modify_data``:
+
+ * ``level`` field was reduced to 8 bits.
+
+ * ``tag_index`` field replaced ``level`` field in representing tag array for
+ ``RTE_FLOW_FIELD_TAG`` type.
ABI Changes
@@ -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,38 @@ 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.
+ * Used for VLAN, MPLS or TAG
+ * types.
+ */
+ 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;
};