@@ -636,11 +636,15 @@ enum index {
ACTION_MODIFY_FIELD_DST_TYPE_VALUE,
ACTION_MODIFY_FIELD_DST_LEVEL,
ACTION_MODIFY_FIELD_DST_LEVEL_VALUE,
+ ACTION_MODIFY_FIELD_DST_TYPE_ID,
+ ACTION_MODIFY_FIELD_DST_CLASS_ID,
ACTION_MODIFY_FIELD_DST_OFFSET,
ACTION_MODIFY_FIELD_SRC_TYPE,
ACTION_MODIFY_FIELD_SRC_TYPE_VALUE,
ACTION_MODIFY_FIELD_SRC_LEVEL,
ACTION_MODIFY_FIELD_SRC_LEVEL_VALUE,
+ ACTION_MODIFY_FIELD_SRC_TYPE_ID,
+ ACTION_MODIFY_FIELD_SRC_CLASS_ID,
ACTION_MODIFY_FIELD_SRC_OFFSET,
ACTION_MODIFY_FIELD_SRC_VALUE,
ACTION_MODIFY_FIELD_SRC_POINTER,
@@ -854,7 +858,8 @@ static const char *const modify_field_ids[] = {
"ipv4_ecn", "ipv6_ecn", "gtp_psc_qfi", "meter_color",
"ipv6_proto",
"flex_item",
- "hash_result", NULL
+ "hash_result",
+ "geneve_opt_type", "geneve_opt_class", "geneve_opt_data", NULL
};
static const char *const meter_colors[] = {
@@ -2295,6 +2300,8 @@ static const enum index next_action_sample[] = {
static const enum index action_modify_field_dst[] = {
ACTION_MODIFY_FIELD_DST_LEVEL,
+ ACTION_MODIFY_FIELD_DST_TYPE_ID,
+ ACTION_MODIFY_FIELD_DST_CLASS_ID,
ACTION_MODIFY_FIELD_DST_OFFSET,
ACTION_MODIFY_FIELD_SRC_TYPE,
ZERO,
@@ -2302,6 +2309,8 @@ 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_TYPE_ID,
+ ACTION_MODIFY_FIELD_SRC_CLASS_ID,
ACTION_MODIFY_FIELD_SRC_OFFSET,
ACTION_MODIFY_FIELD_SRC_VALUE,
ACTION_MODIFY_FIELD_SRC_POINTER,
@@ -6388,6 +6397,24 @@ static const struct token token_list[] = {
.call = parse_vc_modify_field_level,
.comp = comp_none,
},
+ [ACTION_MODIFY_FIELD_DST_TYPE_ID] = {
+ .name = "dst_type_id",
+ .help = "destination field type ID",
+ .next = NEXT(action_modify_field_dst,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ dst.type)),
+ .call = parse_vc_conf,
+ },
+ [ACTION_MODIFY_FIELD_DST_CLASS_ID] = {
+ .name = "dst_class",
+ .help = "destination field class ID",
+ .next = NEXT(action_modify_field_dst,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ dst.class_id)),
+ .call = parse_vc_conf,
+ },
[ACTION_MODIFY_FIELD_DST_OFFSET] = {
.name = "dst_offset",
.help = "destination field bit offset",
@@ -6423,6 +6450,24 @@ static const struct token token_list[] = {
.call = parse_vc_modify_field_level,
.comp = comp_none,
},
+ [ACTION_MODIFY_FIELD_SRC_TYPE_ID] = {
+ .name = "src_type_id",
+ .help = "source field type ID",
+ .next = NEXT(action_modify_field_src,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ src.type)),
+ .call = parse_vc_conf,
+ },
+ [ACTION_MODIFY_FIELD_SRC_CLASS_ID] = {
+ .name = "src_class",
+ .help = "source field class ID",
+ .next = NEXT(action_modify_field_src,
+ NEXT_ENTRY(COMMON_UNSIGNED)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_action_modify_field,
+ src.class_id)),
+ .call = parse_vc_conf,
+ },
[ACTION_MODIFY_FIELD_SRC_OFFSET] = {
.name = "src_offset",
.help = "source field bit offset",
@@ -2917,23 +2917,36 @@ The immediate value ``RTE_FLOW_FIELD_VALUE`` (or a pointer to it
``RTE_FLOW_FIELD_START`` is used to point to the beginning of a packet.
See ``enum rte_flow_field_id`` for the list of supported fields.
-``op`` selects the operation to perform on a destination field.
+``op`` selects the operation to perform on a destination field:
+
- ``set`` copies the data from ``src`` field to ``dst`` field.
- ``add`` adds together ``dst`` and ``src`` and stores the result into ``dst``.
-- ``sub`` subtracts ``src`` from ``dst`` and stores the result into ``dst``
+- ``sub`` subtracts ``src`` from ``dst`` and stores the result into ``dst``.
``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.
+as well as any tag element in the tag array:
+
- ``0`` means the default behaviour. Depending on the packet type, it can
-mean outermost, innermost or anything in between.
+ mean outermost, innermost or anything in between.
+
- ``1`` requests access to the outermost packet encapsulation level.
+
- ``2`` and subsequent values requests access to the specified packet
-encapsulation level, from outermost to innermost (lower to higher values).
+ 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.
+``type`` is used to specify (along with ``class_id``) the Geneve option which
+is being modified.
+This field is relevant only for ``RTE_FLOW_FIELD_GENEVE_OPT_XXXX`` type.
+
+``class_id`` is used to specify (along with ``type``) the Geneve option which
+is being modified.
+This field is relevant only for ``RTE_FLOW_FIELD_GENEVE_OPT_XXXX`` type.
+
``flex_handle`` is used to specify the flex item pointer which is being
modified. ``flex_handle`` and ``level`` are mutually exclusive.
@@ -2991,6 +3004,10 @@ value as sequence of bytes {xxx, xxx, 0x85, xxx, xxx, xxx}.
+-----------------+----------------------------------------------------------+
| ``level`` | encapsulation level of a packet field or tag array index |
+-----------------+----------------------------------------------------------+
+ | ``type`` | geneve option type |
+ +-----------------+----------------------------------------------------------+
+ | ``class_id`` | geneve option class ID |
+ +-----------------+----------------------------------------------------------+
| ``flex_handle`` | flex item handle of a packet field |
+-----------------+----------------------------------------------------------+
| ``offset`` | number of bits to skip at the beginning |
@@ -3773,6 +3773,9 @@ enum rte_flow_field_id {
RTE_FLOW_FIELD_IPV6_PROTO, /**< IPv6 next header. */
RTE_FLOW_FIELD_FLEX_ITEM, /**< Flex item. */
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 */
};
/**
@@ -3788,7 +3791,53 @@ struct rte_flow_action_modify_data {
struct {
/** Encapsulation level or tag index or flex item handle. */
union {
- uint32_t level;
+ struct {
+ /**
+ * Packet encapsulation level containing
+ * the field modify to.
+ *
+ * - @p 0 requests the default behavior.
+ * Depending on the packet type, it
+ * can mean outermost, innermost or
+ * anything in between.
+ *
+ * It basically stands for the
+ * innermost encapsulation level
+ * modification can be performed on
+ * according to PMD and device
+ * capabilities.
+ *
+ * - @p 1 requests modification to be
+ * performed on the outermost packet
+ * encapsulation level.
+ *
+ * - @p 2 and subsequent values request
+ * modification to be performed on
+ * the specified inner packet
+ * encapsulation level, from
+ * outermost to innermost (lower to
+ * higher values).
+ *
+ * Values other than @p 0 are not
+ * necessarily supported.
+ *
+ * For RTE_FLOW_FIELD_TAG it represents
+ * the tag element in the tag array.
+ */
+ 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;
+ };
struct rte_flow_item_flex_handle *flex_handle;
};
/** Number of bits to skip from a field. */