Modify Header Action
A new MODIFY_FIELD action is added to the NVIDIA® PMD. This is the generic API that allows manipulating any packet header field by copying data from another packet field or mark, metadata, tag, or an immediate value (or pointer to it).
The modify field RTE flow action supports three operations: set, add, and sub. We currently support only the "set" operation.
Support is provided for any packet header field as well as meta/tag/mark and an immediate value can be used as a source. Supported types can be found in: rte_flow_field_id
.
Encapsulation levels are not supported, just outermost header can be manipulated for now.
Offsets can only be 4-bytes aligned: 32, 64 and 96 for IPv6.
The special
ITEM_START ID
is not supported as cross packet header field boundaries is now supported yet.Cannot use Mark as source nor as destination.
Can work only on group > 0
Syntax:
<match criteria> / actions modify_field op set dst_type <type> [dst_level <level>] src_type <type> [src_level <level>] width <width in bits>
Copy src port to tag zero:
testpmd> flow create 0 ingress group 1 pattern eth / end actions modify_field op set dst_type tag dst_level 0 src_type tcp_port_dst width 16 / rss / end
Copy src_ipv4 field to dst_ipv4 field:
testpmd> flow create 0 ingress group 1 pattern eth / end actions modify_field op set dst_type ipv4_dst src_type ipv4_src width 32 / count / rss / end
Copy src_mac field to dst_mac field:
testpmd> flow create 0 ingress group 1 pattern eth / end actions modify_field op set dst_type mac_dst src_type mac_src width 48 / count / rss / end
struct rte_eth_header_field_data {
enum rte_eth_header_field field;
uint16_t index;
uint16_t offset;
};
/* RTE_FLOW_ACTION_TYPE_COPY_HEADER_FIELD
* Overwrite the destination header field with the value
* from the source header field data. */
struct rte_flow_action_copy_header_field {
struct rte_eth_header_field_data dest;
struct rte_eth_header_field_data source;
uint16_t width;
};
/* RTE_FLOW_ACTION_TYPE_SWAP_HEADER_FIELD
* Swap the destination header field with the value
* from the source header field data. */
struct rte_flow_action_swap_header_field {
struct rte_eth_header_field_data dest;
struct rte_eth_header_field_data source;
uint16_t width;
};
/* RTE_FLOW_ACTION_TYPE_SET_HEADER_FIELD
* Set the destination header field with the value
* from the immediate data. */
struct rte_flow_action_set_header_field {
struct rte_eth_header_field_data dest;
uint8_t *data;
uint16_t width;
};
/* RTE_FLOW_ACTION_TYPE_ADD_HEADER_FIELD
* Add/subtract the value from the
* destination header field. */
struct rte_flow_action_set_header_field {
struct rte_eth_header_field_data dest;
int64_t data;
};
enum rte_eth_field {
RTE_ETH_HEADER_NONE = 0,
RTE_ETH_HEADER_MAC_DST,*
RTE_ETH_HEADER_MAC_SRC,*
RTE_ETH_HEADER_VLAN_TYPE,
RTE_ETH_HEADER_VLAN_ID,
RTE_ETH_HEADER_MAC_TYPE,
RTE_ETH_HEADER_IPV4_DSCP,*
RTE_ETH_HEADER_IPV4_TTL,*
RTE_ETH_HEADER_IPV4_SRC,*
RTE_ETH_HEADER_IPV4_DST,*
RTE_ETH_HEADER_IPV6_DSCP,*
RTE_ETH_HEADER_IPV6_HOPLIMIT,*
RTE_ETH_HEADER_IPV6_SRC,*
RTE_ETH_HEADER_IPV6_DST,*
RTE_ETH_HEADER_TCP_PORT_SRC,*
RTE_ETH_HEADER_TCP_PORT_DST,*
RTE_ETH_HEADER_TCP_SEQ_NUM,
RTE_ETH_HEADER_TCP_ACK_NUM,
RTE_ETH_HEADER_TCP_FLAGS,
RTE_ETH_HEADER_UDP_PORT_SRC,*
RTE_ETH_HEADER_UDP_PORT_DST,*
RTE_ETH_HEADER_VXLAN_VNI,
RTE_ETH_HEADER_GENEVE_VNI,
RTE_ETH_HEADER_GTP_TEID,
RTE_ETH_HEADER_MARK,*
RTE_ETH_HEADER_META,*
RTE_ETH_HEADER_TAG*,
};