numam-dpdk/drivers/net/ice/ice_generic_flow.h
Junfeng Guo 25be39cc17 net/ice: enable protocol agnostic flow offloading in FDIR
Protocol agnostic flow offloading in Flow Director is enabled by this
patch based on the Parser Library, using existing rte_flow raw API.

Note that the raw flow requires:
1. byte string of raw target packet bits.
2. byte string of mask of target packet.

Here is an example:
FDIR matching ipv4 dst addr with 1.2.3.4 and redirect to queue 3:

flow create 0 ingress pattern raw \
pattern spec \
00000000000000000000000008004500001400004000401000000000000001020304 \
pattern mask \
000000000000000000000000000000000000000000000000000000000000ffffffff \
/ end actions queue index 3 / mark id 3 / end

Note that mask of some key bits (e.g., 0x0800 to indicate ipv4 proto)
is optional in our cases. To avoid redundancy, we just omit the mask
of 0x0800 (with 0xFFFF) in the mask byte string example. The prefix
'0x' for the spec and mask byte (hex) strings are also omitted here.

Also update the ice feature list with rte_flow item raw.

Signed-off-by: Junfeng Guo <junfeng.guo@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
2021-11-03 13:01:31 +01:00

531 lines
22 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2019 Intel Corporation
*/
#ifndef _ICE_GENERIC_FLOW_H_
#define _ICE_GENERIC_FLOW_H_
#include <rte_flow_driver.h>
/* protocol */
#define ICE_PROT_MAC BIT_ULL(1)
#define ICE_PROT_VLAN BIT_ULL(2)
#define ICE_PROT_IPV4 BIT_ULL(3)
#define ICE_PROT_IPV6 BIT_ULL(4)
#define ICE_PROT_TCP BIT_ULL(5)
#define ICE_PROT_UDP BIT_ULL(6)
#define ICE_PROT_SCTP BIT_ULL(7)
#define ICE_PROT_ICMP4 BIT_ULL(8)
#define ICE_PROT_ICMP6 BIT_ULL(9)
#define ICE_PROT_VXLAN BIT_ULL(10)
#define ICE_PROT_NVGRE BIT_ULL(11)
#define ICE_PROT_GTPU BIT_ULL(12)
#define ICE_PROT_PPPOE_S BIT_ULL(13)
#define ICE_PROT_ESP BIT_ULL(14)
#define ICE_PROT_AH BIT_ULL(15)
#define ICE_PROT_L2TPV3OIP BIT_ULL(16)
#define ICE_PROT_PFCP BIT_ULL(17)
#define ICE_PROT_NAT_T_ESP BIT_ULL(18)
/* field */
#define ICE_SMAC BIT_ULL(63)
#define ICE_DMAC BIT_ULL(62)
#define ICE_ETHERTYPE BIT_ULL(61)
#define ICE_IP_SRC BIT_ULL(60)
#define ICE_IP_DST BIT_ULL(59)
#define ICE_IP_PROTO BIT_ULL(58)
#define ICE_IP_TTL BIT_ULL(57)
#define ICE_IP_TOS BIT_ULL(56)
#define ICE_SPORT BIT_ULL(55)
#define ICE_DPORT BIT_ULL(54)
#define ICE_ICMP_TYPE BIT_ULL(53)
#define ICE_ICMP_CODE BIT_ULL(52)
#define ICE_VXLAN_VNI BIT_ULL(51)
#define ICE_NVGRE_TNI BIT_ULL(50)
#define ICE_GTPU_TEID BIT_ULL(49)
#define ICE_GTPU_QFI BIT_ULL(48)
#define ICE_PPPOE_SESSION BIT_ULL(47)
#define ICE_PPPOE_PROTO BIT_ULL(46)
#define ICE_ESP_SPI BIT_ULL(45)
#define ICE_AH_SPI BIT_ULL(44)
#define ICE_L2TPV3OIP_SESSION_ID BIT_ULL(43)
#define ICE_PFCP_SEID BIT_ULL(42)
#define ICE_PFCP_S_FIELD BIT_ULL(41)
#define ICE_IP_PK_ID BIT_ULL(40)
/* input set */
#define ICE_INSET_NONE 0ULL
#define ICE_INSET_SMAC (ICE_SMAC)
#define ICE_INSET_DMAC (ICE_DMAC)
#define ICE_INSET_VLAN (ICE_PROT_VLAN)
#define ICE_INSET_VLAN_INNER (ICE_PROT_VLAN)
#define ICE_INSET_VLAN_OUTER (ICE_PROT_VLAN)
#define ICE_INSET_ETHERTYPE (ICE_ETHERTYPE)
#define ICE_INSET_IPV4_SRC (ICE_PROT_IPV4 | ICE_IP_SRC)
#define ICE_INSET_IPV4_DST (ICE_PROT_IPV4 | ICE_IP_DST)
#define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
#define ICE_INSET_IPV4_PROTO (ICE_PROT_IPV4 | ICE_IP_PROTO)
#define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
#define ICE_INSET_IPV4_PKID (ICE_PROT_IPV4 | ICE_IP_PK_ID)
#define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
#define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
#define ICE_INSET_IPV6_NEXT_HDR (ICE_PROT_IPV6 | ICE_IP_PROTO)
#define ICE_INSET_IPV6_HOP_LIMIT (ICE_PROT_IPV6 | ICE_IP_TTL)
#define ICE_INSET_IPV6_TC (ICE_PROT_IPV6 | ICE_IP_TOS)
#define ICE_INSET_IPV6_PKID (ICE_PROT_IPV6 | ICE_IP_PK_ID)
#define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
#define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
#define ICE_INSET_UDP_SRC_PORT (ICE_PROT_UDP | ICE_SPORT)
#define ICE_INSET_UDP_DST_PORT (ICE_PROT_UDP | ICE_DPORT)
#define ICE_INSET_SCTP_SRC_PORT (ICE_PROT_SCTP | ICE_SPORT)
#define ICE_INSET_SCTP_DST_PORT (ICE_PROT_SCTP | ICE_DPORT)
#define ICE_INSET_ICMP4_SRC_PORT (ICE_PROT_ICMP4 | ICE_SPORT)
#define ICE_INSET_ICMP4_DST_PORT (ICE_PROT_ICMP4 | ICE_DPORT)
#define ICE_INSET_ICMP6_SRC_PORT (ICE_PROT_ICMP6 | ICE_SPORT)
#define ICE_INSET_ICMP6_DST_PORT (ICE_PROT_ICMP6 | ICE_DPORT)
#define ICE_INSET_ICMP4_TYPE (ICE_PROT_ICMP4 | ICE_ICMP_TYPE)
#define ICE_INSET_ICMP4_CODE (ICE_PROT_ICMP4 | ICE_ICMP_CODE)
#define ICE_INSET_ICMP6_TYPE (ICE_PROT_ICMP6 | ICE_ICMP_TYPE)
#define ICE_INSET_ICMP6_CODE (ICE_PROT_ICMP6 | ICE_ICMP_CODE)
/* tunnel */
#define ICE_INSET_VXLAN_VNI \
(ICE_PROT_VXLAN | ICE_VXLAN_VNI)
#define ICE_INSET_NVGRE_TNI \
(ICE_PROT_NVGRE | ICE_NVGRE_TNI)
#define ICE_INSET_GTPU_TEID \
(ICE_PROT_GTPU | ICE_GTPU_TEID)
#define ICE_INSET_GTPU_QFI \
(ICE_PROT_GTPU | ICE_GTPU_QFI)
#define ICE_INSET_PPPOE_SESSION \
(ICE_PROT_PPPOE_S | ICE_PPPOE_SESSION)
#define ICE_INSET_PPPOE_PROTO \
(ICE_PROT_PPPOE_S | ICE_PPPOE_PROTO)
#define ICE_INSET_ESP_SPI \
(ICE_PROT_ESP | ICE_ESP_SPI)
#define ICE_INSET_AH_SPI \
(ICE_PROT_AH | ICE_AH_SPI)
#define ICE_INSET_L2TPV3OIP_SESSION_ID \
(ICE_PROT_L2TPV3OIP | ICE_L2TPV3OIP_SESSION_ID)
#define ICE_INSET_PFCP_S_FIELD \
(ICE_PROT_PFCP | ICE_PFCP_S_FIELD)
#define ICE_INSET_PFCP_SEID \
(ICE_PROT_PFCP | ICE_PFCP_S_FIELD | ICE_PFCP_SEID)
#define ICE_INSET_NAT_T_ESP_SPI \
(ICE_PROT_NAT_T_ESP | ICE_ESP_SPI)
/* empty pattern */
extern enum rte_flow_item_type pattern_empty[];
/* raw pattern */
extern enum rte_flow_item_type pattern_raw[];
/* L2 */
extern enum rte_flow_item_type pattern_ethertype[];
extern enum rte_flow_item_type pattern_ethertype_vlan[];
extern enum rte_flow_item_type pattern_ethertype_qinq[];
/* ARP */
extern enum rte_flow_item_type pattern_eth_arp[];
/* non-tunnel IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv4[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_icmp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv4_icmp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
/* non-tunnel IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_icmp6[];
extern enum rte_flow_item_type pattern_eth_vlan_ipv6_icmp6[];
extern enum rte_flow_item_type pattern_eth_qinq_ipv6_icmp6[];
/* IPv4 VXLAN IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_icmp[];
/* IPv4 VXLAN MAC IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_icmp[];
/* IPv6 VXLAN IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_icmp[];
/* IPv6 VXLAN MAC IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_icmp[];
/* IPv4 VXLAN IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_icmp6[];
/* IPv4 VXLAN MAC IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_icmp6[];
/* IPv6 VXLAN IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_icmp6[];
/* IPv6 VXLAN MAC IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_icmp6[];
/* IPv4 NVGRE IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_icmp[];
/* IPv4 NVGRE MAC IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_icmp[];
/* IPv6 NVGRE IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_icmp[];
/* IPv6 NVGRE MAC IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_icmp[];
/* IPv4 NVGRE IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_icmp6[];
/* IPv4 NVGRE MAC IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_icmp6[];
/* IPv6 NVGRE IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_icmp6[];
/* IPv6 NVGRE MAC IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_icmp6[];
/* IPv4 GTPU (EH) */
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh[];
/* IPv6 GTPU (EH) */
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh[];
/* IPv4 GTPU IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_icmp[];
/* IPv4 GTPU IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_icmp[];
/* IPv6 GTPU IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_icmp[];
/* IPv6 GTPU IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_icmp[];
/* IPv4 GTPU EH IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_icmp[];
/* IPv4 GTPU EH IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_icmp[];
/* IPv6 GTPU EH IPv4 */
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_icmp[];
/* IPv6 GTPU EH IPv6 */
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_icmp[];
/* PPPoE */
extern enum rte_flow_item_type pattern_eth_pppoed[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoed[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoed[];
extern enum rte_flow_item_type pattern_eth_pppoes[];
extern enum rte_flow_item_type pattern_eth_pppoes_proto[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_proto[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_proto[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv4[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_udp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_tcp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_sctp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv4_icmp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_icmp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_icmp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv6[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_udp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_tcp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_sctp[];
extern enum rte_flow_item_type pattern_eth_pppoes_ipv6_icmp6[];
extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[];
extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[];
/* ESP */
extern enum rte_flow_item_type pattern_eth_ipv4_esp[];
extern enum rte_flow_item_type pattern_eth_ipv4_udp_esp[];
extern enum rte_flow_item_type pattern_eth_ipv6_esp[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_esp[];
/* AH */
extern enum rte_flow_item_type pattern_eth_ipv4_ah[];
extern enum rte_flow_item_type pattern_eth_ipv6_ah[];
extern enum rte_flow_item_type pattern_eth_ipv6_udp_ah[];
/* L2TP */
extern enum rte_flow_item_type pattern_eth_ipv4_l2tp[];
extern enum rte_flow_item_type pattern_eth_ipv6_l2tp[];
/* PFCP */
extern enum rte_flow_item_type pattern_eth_ipv4_pfcp[];
extern enum rte_flow_item_type pattern_eth_ipv6_pfcp[];
struct ice_adapter;
extern const struct rte_flow_ops ice_flow_ops;
/* engine types. */
enum ice_flow_engine_type {
ICE_FLOW_ENGINE_NONE = 0,
ICE_FLOW_ENGINE_FDIR,
ICE_FLOW_ENGINE_SWITCH,
ICE_FLOW_ENGINE_HASH,
ICE_FLOW_ENGINE_ACL,
ICE_FLOW_ENGINE_MAX,
};
/**
* classification stages.
* for non-pipeline mode, we have two classification stages: Distributor/RSS
* for pipeline-mode we have three classification stages:
* Permission/Distributor/RSS
*/
enum ice_flow_classification_stage {
ICE_FLOW_STAGE_NONE = 0,
ICE_FLOW_STAGE_RSS,
ICE_FLOW_STAGE_PERMISSION,
ICE_FLOW_STAGE_DISTRIBUTOR,
ICE_FLOW_STAGE_MAX,
};
/* pattern structure */
struct ice_pattern_match_item {
enum rte_flow_item_type *pattern_list;
/* pattern_list must end with RTE_FLOW_ITEM_TYPE_END */
uint64_t input_set_mask_o; /* used for tunnel outer or non tunnel fields */
uint64_t input_set_mask_i; /* only used for tunnel inner fields */
void *meta;
};
enum ice_flow_redirect_type {
ICE_FLOW_REDIRECT_VSI,
};
struct ice_flow_redirect {
enum ice_flow_redirect_type type;
union {
struct {
uint16_t vsi_handle;
uint16_t new_vsi_num;
};
};
};
typedef int (*engine_init_t)(struct ice_adapter *ad);
typedef void (*engine_uninit_t)(struct ice_adapter *ad);
typedef int (*engine_create_t)(struct ice_adapter *ad,
struct rte_flow *flow,
void *meta,
struct rte_flow_error *error);
typedef int (*engine_destroy_t)(struct ice_adapter *ad,
struct rte_flow *flow,
struct rte_flow_error *error);
typedef int (*engine_query_t)(struct ice_adapter *ad,
struct rte_flow *flow,
struct rte_flow_query_count *count,
struct rte_flow_error *error);
typedef int(*engine_redirect_t)(struct ice_adapter *ad,
struct rte_flow *flow,
struct ice_flow_redirect *redirect);
typedef void (*engine_free_t) (struct rte_flow *flow);
typedef int (*parse_pattern_action_t)(struct ice_adapter *ad,
struct ice_pattern_match_item *array,
uint32_t array_len,
const struct rte_flow_item pattern[],
const struct rte_flow_action actions[],
uint32_t priority,
void **meta,
struct rte_flow_error *error);
/* Struct to store engine created. */
struct ice_flow_engine {
TAILQ_ENTRY(ice_flow_engine) node;
engine_init_t init;
engine_uninit_t uninit;
engine_create_t create;
engine_destroy_t destroy;
engine_query_t query_count;
engine_redirect_t redirect;
engine_free_t free;
enum ice_flow_engine_type type;
};
TAILQ_HEAD(ice_engine_list, ice_flow_engine);
/* Struct to store flow created. */
struct rte_flow {
TAILQ_ENTRY(rte_flow) node;
struct ice_flow_engine *engine;
void *rule;
};
struct ice_flow_parser {
struct ice_flow_engine *engine;
struct ice_pattern_match_item *array;
uint32_t array_len;
parse_pattern_action_t parse_pattern_action;
enum ice_flow_classification_stage stage;
};
/* Struct to store parser created. */
struct ice_flow_parser_node {
TAILQ_ENTRY(ice_flow_parser_node) node;
struct ice_flow_parser *parser;
};
void ice_register_flow_engine(struct ice_flow_engine *engine);
int ice_flow_init(struct ice_adapter *ad);
void ice_flow_uninit(struct ice_adapter *ad);
int ice_register_parser(struct ice_flow_parser *parser,
struct ice_adapter *ad);
void ice_unregister_parser(struct ice_flow_parser *parser,
struct ice_adapter *ad);
struct ice_pattern_match_item *
ice_search_pattern_match_item(struct ice_adapter *ad,
const struct rte_flow_item pattern[],
struct ice_pattern_match_item *array,
uint32_t array_len,
struct rte_flow_error *error);
int
ice_flow_redirect(struct ice_adapter *ad,
struct ice_flow_redirect *rd);
#endif