#include <rte_arp.h>
#include <rte_common.h>
#include <rte_ether.h>
-#include <rte_eth_ctrl.h>
#include <rte_icmp.h>
#include <rte_ip.h>
#include <rte_sctp.h>
#include <rte_udp.h>
#include <rte_byteorder.h>
#include <rte_esp.h>
+#include <rte_higig.h>
#ifdef __cplusplus
extern "C" {
* See struct rte_flow_item_mark.
*/
RTE_FLOW_ITEM_TYPE_MARK,
+
+ /**
+ * [META]
+ *
+ * Matches a metadata value specified in mbuf metadata field.
+ * See struct rte_flow_item_meta.
+ */
+ RTE_FLOW_ITEM_TYPE_META,
+
+ /**
+ * Matches a GRE optional key field.
+ *
+ * The value should a big-endian 32bit integer.
+ *
+ * When this item present the K bit is implicitly matched as "1"
+ * in the default mask.
+ *
+ * @p spec/mask type:
+ * @code rte_be32_t * @endcode
+ */
+ RTE_FLOW_ITEM_TYPE_GRE_KEY,
+
+ /**
+ * Matches a GTP extension header: PDU session container.
+ *
+ * Configure flow for GTP packets with extension header type 0x85.
+ *
+ * See struct rte_flow_item_gtp_psc.
+ */
+ RTE_FLOW_ITEM_TYPE_GTP_PSC,
+
+ /**
+ * Matches a PPPoE header.
+ *
+ * Configure flow for PPPoE session packets.
+ *
+ * See struct rte_flow_item_pppoe.
+ */
+ RTE_FLOW_ITEM_TYPE_PPPOES,
+
+ /**
+ * Matches a PPPoE header.
+ *
+ * Configure flow for PPPoE discovery packets.
+ *
+ * See struct rte_flow_item_pppoe.
+ */
+ RTE_FLOW_ITEM_TYPE_PPPOED,
+
+ /**
+ * Matches a PPPoE optional proto_id field.
+ *
+ * It only applies to PPPoE session packets.
+ *
+ * See struct rte_flow_item_pppoe_proto_id.
+ */
+ RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
+
+ /**
+ * Matches Network service header (NSH).
+ * See struct rte_flow_item_nsh.
+ *
+ */
+ RTE_FLOW_ITEM_TYPE_NSH,
+
+ /**
+ * Matches Internet Group Management Protocol (IGMP).
+ * See struct rte_flow_item_igmp.
+ *
+ */
+ RTE_FLOW_ITEM_TYPE_IGMP,
+
+ /**
+ * Matches IP Authentication Header (AH).
+ * See struct rte_flow_item_ah.
+ *
+ */
+ RTE_FLOW_ITEM_TYPE_AH,
+
+ /**
+ * Matches a HIGIG header.
+ * see struct rte_flow_item_higig2_hdr.
+ */
+ RTE_FLOW_ITEM_TYPE_HIGIG2,
};
+/**
+ *
+ * RTE_FLOW_ITEM_TYPE_HIGIG2
+ * Matches higig2 header
+ */
+RTE_STD_C11
+struct rte_flow_item_higig2_hdr {
+ struct rte_higig2_hdr hdr;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_HIGIG2. */
+#ifndef __cplusplus
+static const struct rte_flow_item_higig2_hdr rte_flow_item_higig2_hdr_mask = {
+ .hdr = {
+ .ppt1 = {
+ .classification = 0xffff,
+ .vid = 0xfff,
+ },
+ },
+};
+#endif
+
/**
* RTE_FLOW_ITEM_TYPE_ANY
*
* same order as on the wire.
*/
struct rte_flow_item_eth {
- struct ether_addr dst; /**< Destination MAC. */
- struct ether_addr src; /**< Source MAC. */
+ struct rte_ether_addr dst; /**< Destination MAC. */
+ struct rte_ether_addr src; /**< Source MAC. */
rte_be16_t type; /**< EtherType or TPID. */
};
* Matches an 802.1Q/ad VLAN tag.
*
* The corresponding standard outer EtherType (TPID) values are
- * ETHER_TYPE_VLAN or ETHER_TYPE_QINQ. It can be overridden by the preceding
- * pattern item.
+ * RTE_ETHER_TYPE_VLAN or RTE_ETHER_TYPE_QINQ. It can be overridden by
+ * the preceding pattern item.
*/
struct rte_flow_item_vlan {
rte_be16_t tci; /**< Tag control information. */
* Note: IPv4 options are handled by dedicated pattern items.
*/
struct rte_flow_item_ipv4 {
- struct ipv4_hdr hdr; /**< IPv4 header definition. */
+ struct rte_ipv4_hdr hdr; /**< IPv4 header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_IPV4. */
* RTE_FLOW_ITEM_TYPE_IPV6_EXT.
*/
struct rte_flow_item_ipv6 {
- struct ipv6_hdr hdr; /**< IPv6 header definition. */
+ struct rte_ipv6_hdr hdr; /**< IPv6 header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_IPV6. */
* Matches an ICMP header.
*/
struct rte_flow_item_icmp {
- struct icmp_hdr hdr; /**< ICMP header definition. */
+ struct rte_icmp_hdr hdr; /**< ICMP header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP. */
* Matches a UDP header.
*/
struct rte_flow_item_udp {
- struct udp_hdr hdr; /**< UDP header definition. */
+ struct rte_udp_hdr hdr; /**< UDP header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_UDP. */
* Matches a TCP header.
*/
struct rte_flow_item_tcp {
- struct tcp_hdr hdr; /**< TCP header definition. */
+ struct rte_tcp_hdr hdr; /**< TCP header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_TCP. */
* Matches a SCTP header.
*/
struct rte_flow_item_sctp {
- struct sctp_hdr hdr; /**< SCTP header definition. */
+ struct rte_sctp_hdr hdr; /**< SCTP header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_SCTP. */
* Matches a E-tag header.
*
* The corresponding standard outer EtherType (TPID) value is
- * ETHER_TYPE_ETAG. It can be overridden by the preceding pattern item.
+ * RTE_ETHER_TYPE_ETAG. It can be overridden by the preceding pattern item.
*/
struct rte_flow_item_e_tag {
/**
* Matches an ESP header.
*/
struct rte_flow_item_esp {
- struct esp_hdr hdr; /**< ESP header definition. */
+ struct rte_esp_hdr hdr; /**< ESP header definition. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ESP. */
#ifndef __cplusplus
static const struct rte_flow_item_esp rte_flow_item_esp_mask = {
.hdr = {
- .spi = 0xffffffff,
+ .spi = RTE_BE32(0xffffffff),
},
};
#endif
uint8_t hln; /**< Hardware address length, normally 6. */
uint8_t pln; /**< Protocol address length, normally 4. */
rte_be16_t op; /**< Opcode (1 for request, 2 for reply). */
- struct ether_addr sha; /**< Sender hardware address. */
+ struct rte_ether_addr sha; /**< Sender hardware address. */
rte_be32_t spa; /**< Sender IPv4 address. */
- struct ether_addr tha; /**< Target hardware address. */
+ struct rte_ether_addr tha; /**< Target hardware address. */
rte_be32_t tpa; /**< Target IPv4 address. */
};
struct rte_flow_item_icmp6_nd_opt_sla_eth {
uint8_t type; /**< ND option type, normally 1. */
uint8_t length; /**< ND option length, normally 1. */
- struct ether_addr sla; /**< Source Ethernet LLA. */
+ struct rte_ether_addr sla; /**< Source Ethernet LLA. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_SLA_ETH. */
struct rte_flow_item_icmp6_nd_opt_tla_eth {
uint8_t type; /**< ND option type, normally 2. */
uint8_t length; /**< ND option length, normally 1. */
- struct ether_addr tla; /**< Target Ethernet LLA. */
+ struct rte_ether_addr tla; /**< Target Ethernet LLA. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH. */
};
#endif
+/**
+ * RTE_FLOW_ITEM_TYPE_META.
+ *
+ * Matches a specified metadata value.
+ */
+struct rte_flow_item_meta {
+ rte_be32_t data;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_META. */
+#ifndef __cplusplus
+static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
+ .data = RTE_BE32(UINT32_MAX),
+};
+#endif
+
+/**
+ * RTE_FLOW_ITEM_TYPE_GTP_PSC.
+ *
+ * Matches a GTP PDU extension header with type 0x85.
+ */
+struct rte_flow_item_gtp_psc {
+ uint8_t pdu_type; /**< PDU type. */
+ uint8_t qfi; /**< QoS flow identifier. */
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_GTP_PSC. */
+#ifndef __cplusplus
+static const struct rte_flow_item_gtp_psc
+rte_flow_item_gtp_psc_mask = {
+ .qfi = 0x3f,
+};
+#endif
+
+/**
+ * RTE_FLOW_ITEM_TYPE_PPPOE.
+ *
+ * Matches a PPPoE header.
+ */
+struct rte_flow_item_pppoe {
+ /**
+ * Version (4b), type (4b).
+ */
+ uint8_t version_type;
+ uint8_t code; /**< Message type. */
+ rte_be16_t session_id; /**< Session identifier. */
+ rte_be16_t length; /**< Payload length. */
+};
+
+/**
+ * RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID.
+ *
+ * Matches a PPPoE optional proto_id field.
+ *
+ * It only applies to PPPoE session packets.
+ *
+ * Normally preceded by any of:
+ *
+ * - RTE_FLOW_ITEM_TYPE_PPPOE
+ * - RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID
+ */
+struct rte_flow_item_pppoe_proto_id {
+ rte_be16_t proto_id; /**< PPP protocol identifier. */
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID. */
+#ifndef __cplusplus
+static const struct rte_flow_item_pppoe_proto_id
+rte_flow_item_pppoe_proto_id_mask = {
+ .proto_id = RTE_BE16(0xffff),
+};
+#endif
+
/**
* @warning
* @b EXPERIMENTAL: this structure may change without prior notice
uint32_t id; /**< Integer value to match against. */
};
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_NSH
+ *
+ * Match network service header (NSH), RFC 8300
+ *
+ */
+struct rte_flow_item_nsh {
+ uint32_t version:2;
+ uint32_t oam_pkt:1;
+ uint32_t reserved:1;
+ uint32_t ttl:6;
+ uint32_t length:6;
+ uint32_t reserved1:4;
+ uint32_t mdtype:4;
+ uint32_t next_proto:8;
+ uint32_t spi:24;
+ uint32_t sindex:8;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_NSH. */
+#ifndef __cplusplus
+static const struct rte_flow_item_nsh rte_flow_item_nsh_mask = {
+ .mdtype = 0xf,
+ .next_proto = 0xff,
+ .spi = 0xffffff,
+ .sindex = 0xff,
+};
+#endif
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_IGMP
+ *
+ * Match Internet Group Management Protocol (IGMP), RFC 2236
+ *
+ */
+struct rte_flow_item_igmp {
+ uint32_t type:8;
+ uint32_t max_resp_time:8;
+ uint32_t checksum:16;
+ uint32_t group_addr;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_IGMP. */
+#ifndef __cplusplus
+static const struct rte_flow_item_igmp rte_flow_item_igmp_mask = {
+ .group_addr = 0xffffffff,
+};
+#endif
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_AH
+ *
+ * Match IP Authentication Header (AH), RFC 4302
+ *
+ */
+struct rte_flow_item_ah {
+ uint32_t next_hdr:8;
+ uint32_t payload_len:8;
+ uint32_t reserved:16;
+ uint32_t spi;
+ uint32_t seq_num;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_AH. */
+#ifndef __cplusplus
+static const struct rte_flow_item_ah rte_flow_item_ah_mask = {
+ .spi = 0xffffffff,
+};
+#endif
+
/**
* Matching pattern item definition.
*
/**
* Action types.
*
- * Each possible action is represented by a type. Some have associated
- * configuration structures. Several actions combined in a list can be
- * assigned to a flow rule and are performed in order.
+ * Each possible action is represented by a type.
+ * An action can have an associated configuration object.
+ * Several actions combined in a list can be assigned
+ * to a flow rule and are performed in order.
*
* They fall in three categories:
*
*/
RTE_FLOW_ACTION_TYPE_NVGRE_DECAP,
+ /**
+ * Add outer header whose template is provided in its data buffer
+ *
+ * See struct rte_flow_action_raw_encap.
+ */
+ RTE_FLOW_ACTION_TYPE_RAW_ENCAP,
+
+ /**
+ * Remove outer header whose template is provided in its data buffer.
+ *
+ * See struct rte_flow_action_raw_decap
+ */
+ RTE_FLOW_ACTION_TYPE_RAW_DECAP,
+
/**
* Modify IPv4 source address in the outermost IPv4 header.
*
* No associated configuration structure.
*/
RTE_FLOW_ACTION_TYPE_MAC_SWAP,
+
+ /**
+ * Decrease TTL value directly
+ *
+ * No associated configuration structure.
+ */
+ RTE_FLOW_ACTION_TYPE_DEC_TTL,
+
+ /**
+ * Set TTL value
+ *
+ * See struct rte_flow_action_set_ttl
+ */
+ RTE_FLOW_ACTION_TYPE_SET_TTL,
+
+ /**
+ * Set source MAC address from matched flow.
+ *
+ * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_ETH,
+ * the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
+ *
+ * See struct rte_flow_action_set_mac.
+ */
+ RTE_FLOW_ACTION_TYPE_SET_MAC_SRC,
+
+ /**
+ * Set destination MAC address from matched flow.
+ *
+ * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_ETH,
+ * the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
+ *
+ * See struct rte_flow_action_set_mac.
+ */
+ RTE_FLOW_ACTION_TYPE_SET_MAC_DST,
+
+ /**
+ * Increase sequence number in the outermost TCP header.
+ *
+ * Action configuration specifies the value to increase
+ * TCP sequence number as a big-endian 32 bit integer.
+ *
+ * @p conf type:
+ * @code rte_be32_t * @endcode
+ *
+ * Using this action on non-matching traffic will result in
+ * undefined behavior.
+ */
+ RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ,
+
+ /**
+ * Decrease sequence number in the outermost TCP header.
+ *
+ * Action configuration specifies the value to decrease
+ * TCP sequence number as a big-endian 32 bit integer.
+ *
+ * @p conf type:
+ * @code rte_be32_t * @endcode
+ *
+ * Using this action on non-matching traffic will result in
+ * undefined behavior.
+ */
+ RTE_FLOW_ACTION_TYPE_DEC_TCP_SEQ,
+
+ /**
+ * Increase acknowledgment number in the outermost TCP header.
+ *
+ * Action configuration specifies the value to increase
+ * TCP acknowledgment number as a big-endian 32 bit integer.
+ *
+ * @p conf type:
+ * @code rte_be32_t * @endcode
+
+ * Using this action on non-matching traffic will result in
+ * undefined behavior.
+ */
+ RTE_FLOW_ACTION_TYPE_INC_TCP_ACK,
+
+ /**
+ * Decrease acknowledgment number in the outermost TCP header.
+ *
+ * Action configuration specifies the value to decrease
+ * TCP acknowledgment number as a big-endian 32 bit integer.
+ *
+ * @p conf type:
+ * @code rte_be32_t * @endcode
+ *
+ * Using this action on non-matching traffic will result in
+ * undefined behavior.
+ */
+ RTE_FLOW_ACTION_TYPE_DEC_TCP_ACK,
};
/**
uint64_t bytes; /**< Number of bytes through this rule [out]. */
};
+/**
+ * Hash function types.
+ */
+enum rte_eth_hash_function {
+ RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
+ RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */
+ RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */
+ /**
+ * Symmetric Toeplitz: src, dst will be replaced by
+ * xor(src, dst). For the case with src/dst only,
+ * src or dst address will xor with zero pair.
+ */
+ RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ,
+ RTE_ETH_HASH_FUNCTION_MAX,
+};
+
/**
* RTE_FLOW_ACTION_TYPE_RSS
*
struct rte_flow_item *definition;
};
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ACTION_TYPE_RAW_ENCAP
+ *
+ * Raw tunnel end-point encapsulation data definition.
+ *
+ * The data holds the headers definitions to be applied on the packet.
+ * The data must start with ETH header up to the tunnel item header itself.
+ * When used right after RAW_DECAP (for decapsulating L3 tunnel type for
+ * example MPLSoGRE) the data will just hold layer 2 header.
+ *
+ * The preserve parameter holds which bits in the packet the PMD is not allowed
+ * to change, this parameter can also be NULL and then the PMD is allowed
+ * to update any field.
+ *
+ * size holds the number of bytes in @p data and @p preserve.
+ */
+struct rte_flow_action_raw_encap {
+ uint8_t *data; /**< Encapsulation data. */
+ uint8_t *preserve; /**< Bit-mask of @p data to preserve on output. */
+ size_t size; /**< Size of @p data and @p preserve. */
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ACTION_TYPE_RAW_DECAP
+ *
+ * Raw tunnel end-point decapsulation data definition.
+ *
+ * The data holds the headers definitions to be removed from the packet.
+ * The data must start with ETH header up to the tunnel item header itself.
+ * When used right before RAW_DECAP (for encapsulating L3 tunnel type for
+ * example MPLSoGRE) the data will just hold layer 2 header.
+ *
+ * size holds the number of bytes in @p data.
+ */
+struct rte_flow_action_raw_decap {
+ uint8_t *data; /**< Encapsulation data. */
+ size_t size; /**< Size of @p data and @p preserve. */
+};
+
/**
* @warning
* @b EXPERIMENTAL: this structure may change without prior notice
rte_be16_t port;
};
+/**
+ * RTE_FLOW_ACTION_TYPE_SET_TTL
+ *
+ * Set the TTL value directly for IPv4 or IPv6
+ */
+struct rte_flow_action_set_ttl {
+ uint8_t ttl_value;
+};
+
+/**
+ * RTE_FLOW_ACTION_TYPE_SET_MAC
+ *
+ * Set MAC address from the matched flow
+ */
+struct rte_flow_action_set_mac {
+ uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
+};
+
/*
* Definition of a single action.
*
* A list of actions is terminated by a END action.
*
- * For simple actions without a configuration structure, conf remains NULL.
+ * For simple actions without a configuration object, conf remains NULL.
*/
struct rte_flow_action {
enum rte_flow_action_type type; /**< Action type. */
- const void *conf; /**< Pointer to action configuration structure. */
+ const void *conf; /**< Pointer to action configuration object. */
};
/**