-struct ice_flow_pattern {
- enum rte_flow_item_type *items;
- uint64_t sw_fields;
-};
-
-#define ICE_INSET_NONE 0x00000000000000000ULL
-
-/* bit0 ~ bit 7 */
-#define ICE_INSET_SMAC 0x0000000000000001ULL
-#define ICE_INSET_DMAC 0x0000000000000002ULL
-#define ICE_INSET_ETHERTYPE 0x0000000000000020ULL
-
-/* bit 8 ~ bit 15 */
-#define ICE_INSET_IPV4_SRC 0x0000000000000100ULL
-#define ICE_INSET_IPV4_DST 0x0000000000000200ULL
-#define ICE_INSET_IPV6_SRC 0x0000000000000400ULL
-#define ICE_INSET_IPV6_DST 0x0000000000000800ULL
-#define ICE_INSET_SRC_PORT 0x0000000000001000ULL
-#define ICE_INSET_DST_PORT 0x0000000000002000ULL
-#define ICE_INSET_ARP 0x0000000000004000ULL
-
-/* bit 16 ~ bit 31 */
-#define ICE_INSET_IPV4_TOS 0x0000000000010000ULL
-#define ICE_INSET_IPV4_PROTO 0x0000000000020000ULL
-#define ICE_INSET_IPV4_TTL 0x0000000000040000ULL
-#define ICE_INSET_IPV6_TOS 0x0000000000100000ULL
-#define ICE_INSET_IPV6_PROTO 0x0000000000200000ULL
-#define ICE_INSET_IPV6_HOP_LIMIT 0x0000000000400000ULL
-#define ICE_INSET_ICMP 0x0000000001000000ULL
-#define ICE_INSET_ICMP6 0x0000000002000000ULL
-
-/* bit 32 ~ bit 47, tunnel fields */
-#define ICE_INSET_TUN_SMAC 0x0000000100000000ULL
-#define ICE_INSET_TUN_DMAC 0x0000000200000000ULL
-#define ICE_INSET_TUN_IPV4_SRC 0x0000000400000000ULL
-#define ICE_INSET_TUN_IPV4_DST 0x0000000800000000ULL
-#define ICE_INSET_TUN_IPV4_TTL 0x0000001000000000ULL
-#define ICE_INSET_TUN_IPV4_PROTO 0x0000002000000000ULL
-#define ICE_INSET_TUN_IPV6_SRC 0x0000004000000000ULL
-#define ICE_INSET_TUN_IPV6_DST 0x0000008000000000ULL
-#define ICE_INSET_TUN_IPV6_TTL 0x0000010000000000ULL
-#define ICE_INSET_TUN_IPV6_PROTO 0x0000020000000000ULL
-#define ICE_INSET_TUN_SRC_PORT 0x0000040000000000ULL
-#define ICE_INSET_TUN_DST_PORT 0x0000080000000000ULL
-#define ICE_INSET_TUN_ID 0x0000100000000000ULL
-
-/* bit 48 ~ bit 55 */
-#define ICE_INSET_LAST_ETHER_TYPE 0x0001000000000000ULL
-
-#define ICE_FLAG_VLAN_INNER 0x00000001ULL
-#define ICE_FLAG_VLAN_OUTER 0x00000002ULL
-
-#define INSET_ETHER ( \
- ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_ETHERTYPE)
-#define INSET_MAC_IPV4 ( \
- ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
- ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS)
-#define INSET_MAC_IPV4_L4 ( \
- ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
- ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS | ICE_INSET_DST_PORT | \
- ICE_INSET_SRC_PORT)
-#define INSET_MAC_IPV4_ICMP ( \
- ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
- ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS | ICE_INSET_ICMP)
-#define INSET_MAC_IPV6 ( \
- ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
- ICE_INSET_IPV6_TOS | ICE_INSET_IPV6_HOP_LIMIT)
-#define INSET_MAC_IPV6_L4 ( \
- ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
- ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TOS | \
- ICE_INSET_DST_PORT | ICE_INSET_SRC_PORT)
-#define INSET_MAC_IPV6_ICMP ( \
- ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
- ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TOS | ICE_INSET_ICMP6)
-#define INSET_TUNNEL_IPV4_TYPE1 ( \
- ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
- ICE_INSET_TUN_IPV4_TTL | ICE_INSET_TUN_IPV4_PROTO)
-#define INSET_TUNNEL_IPV4_TYPE2 ( \
- ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
- ICE_INSET_TUN_IPV4_TTL | ICE_INSET_TUN_IPV4_PROTO | \
- ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT)
-#define INSET_TUNNEL_IPV4_TYPE3 ( \
- ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
- ICE_INSET_TUN_IPV4_TTL | ICE_INSET_ICMP)
-#define INSET_TUNNEL_IPV6_TYPE1 ( \
- ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
- ICE_INSET_TUN_IPV6_TTL | ICE_INSET_TUN_IPV6_PROTO)
-#define INSET_TUNNEL_IPV6_TYPE2 ( \
- ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
- ICE_INSET_TUN_IPV6_TTL | ICE_INSET_TUN_IPV6_PROTO | \
- ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT)
-#define INSET_TUNNEL_IPV6_TYPE3 ( \
- ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
- ICE_INSET_TUN_IPV6_TTL | ICE_INSET_ICMP6)
+/* protocol */
+
+#define ICE_PROT_MAC_INNER (1ULL << 1)
+#define ICE_PROT_MAC_OUTER (1ULL << 2)
+#define ICE_PROT_VLAN_INNER (1ULL << 3)
+#define ICE_PROT_VLAN_OUTER (1ULL << 4)
+#define ICE_PROT_IPV4_INNER (1ULL << 5)
+#define ICE_PROT_IPV4_OUTER (1ULL << 6)
+#define ICE_PROT_IPV6_INNER (1ULL << 7)
+#define ICE_PROT_IPV6_OUTER (1ULL << 8)
+#define ICE_PROT_TCP_INNER (1ULL << 9)
+#define ICE_PROT_TCP_OUTER (1ULL << 10)
+#define ICE_PROT_UDP_INNER (1ULL << 11)
+#define ICE_PROT_UDP_OUTER (1ULL << 12)
+#define ICE_PROT_SCTP_INNER (1ULL << 13)
+#define ICE_PROT_SCTP_OUTER (1ULL << 14)
+#define ICE_PROT_ICMP4_INNER (1ULL << 15)
+#define ICE_PROT_ICMP4_OUTER (1ULL << 16)
+#define ICE_PROT_ICMP6_INNER (1ULL << 17)
+#define ICE_PROT_ICMP6_OUTER (1ULL << 18)
+#define ICE_PROT_VXLAN (1ULL << 19)
+#define ICE_PROT_NVGRE (1ULL << 20)
+#define ICE_PROT_GTPU (1ULL << 21)
+#define ICE_PROT_PPPOE_S (1ULL << 22)
+#define ICE_PROT_ESP (1ULL << 23)
+#define ICE_PROT_AH (1ULL << 24)
+#define ICE_PROT_L2TPV3OIP (1ULL << 25)
+#define ICE_PROT_PFCP (1ULL << 26)
+
+/* field */
+
+#define ICE_SMAC (1ULL << 63)
+#define ICE_DMAC (1ULL << 62)
+#define ICE_ETHERTYPE (1ULL << 61)
+#define ICE_IP_SRC (1ULL << 60)
+#define ICE_IP_DST (1ULL << 59)
+#define ICE_IP_PROTO (1ULL << 58)
+#define ICE_IP_TTL (1ULL << 57)
+#define ICE_IP_TOS (1ULL << 56)
+#define ICE_SPORT (1ULL << 55)
+#define ICE_DPORT (1ULL << 54)
+#define ICE_ICMP_TYPE (1ULL << 53)
+#define ICE_ICMP_CODE (1ULL << 52)
+#define ICE_VXLAN_VNI (1ULL << 51)
+#define ICE_NVGRE_TNI (1ULL << 50)
+#define ICE_GTPU_TEID (1ULL << 49)
+#define ICE_GTPU_QFI (1ULL << 48)
+#define ICE_PPPOE_SESSION (1ULL << 47)
+#define ICE_PPPOE_PROTO (1ULL << 46)
+#define ICE_ESP_SPI (1ULL << 45)
+#define ICE_AH_SPI (1ULL << 44)
+#define ICE_L2TPV3OIP_SESSION_ID (1ULL << 43)
+#define ICE_PFCP_SEID (1ULL << 42)
+#define ICE_PFCP_S_FIELD (1ULL << 41)
+
+/* input set */
+
+#define ICE_INSET_NONE 0ULL
+
+/* non-tunnel */
+
+#define ICE_INSET_SMAC (ICE_PROT_MAC_OUTER | ICE_SMAC)
+#define ICE_INSET_DMAC (ICE_PROT_MAC_OUTER | ICE_DMAC)
+#define ICE_INSET_VLAN_INNER (ICE_PROT_VLAN_INNER)
+#define ICE_INSET_VLAN_OUTER (ICE_PROT_VLAN_OUTER)
+#define ICE_INSET_ETHERTYPE (ICE_ETHERTYPE)
+
+#define ICE_INSET_IPV4_SRC \
+ (ICE_PROT_IPV4_OUTER | ICE_IP_SRC)
+#define ICE_INSET_IPV4_DST \
+ (ICE_PROT_IPV4_OUTER | ICE_IP_DST)
+#define ICE_INSET_IPV4_TOS \
+ (ICE_PROT_IPV4_OUTER | ICE_IP_TOS)
+#define ICE_INSET_IPV4_PROTO \
+ (ICE_PROT_IPV4_OUTER | ICE_IP_PROTO)
+#define ICE_INSET_IPV4_TTL \
+ (ICE_PROT_IPV4_OUTER | ICE_IP_TTL)
+#define ICE_INSET_IPV6_SRC \
+ (ICE_PROT_IPV6_OUTER | ICE_IP_SRC)
+#define ICE_INSET_IPV6_DST \
+ (ICE_PROT_IPV6_OUTER | ICE_IP_DST)
+#define ICE_INSET_IPV6_NEXT_HDR \
+ (ICE_PROT_IPV6_OUTER | ICE_IP_PROTO)
+#define ICE_INSET_IPV6_HOP_LIMIT \
+ (ICE_PROT_IPV6_OUTER | ICE_IP_TTL)
+#define ICE_INSET_IPV6_TC \
+ (ICE_PROT_IPV6_OUTER | ICE_IP_TOS)
+
+#define ICE_INSET_TCP_SRC_PORT \
+ (ICE_PROT_TCP_OUTER | ICE_SPORT)
+#define ICE_INSET_TCP_DST_PORT \
+ (ICE_PROT_TCP_OUTER | ICE_DPORT)
+#define ICE_INSET_UDP_SRC_PORT \
+ (ICE_PROT_UDP_OUTER | ICE_SPORT)
+#define ICE_INSET_UDP_DST_PORT \
+ (ICE_PROT_UDP_OUTER | ICE_DPORT)
+#define ICE_INSET_SCTP_SRC_PORT \
+ (ICE_PROT_SCTP_OUTER | ICE_SPORT)
+#define ICE_INSET_SCTP_DST_PORT \
+ (ICE_PROT_SCTP_OUTER | ICE_DPORT)
+#define ICE_INSET_ICMP4_SRC_PORT \
+ (ICE_PROT_ICMP4_OUTER | ICE_SPORT)
+#define ICE_INSET_ICMP4_DST_PORT \
+ (ICE_PROT_ICMP4_OUTER | ICE_DPORT)
+#define ICE_INSET_ICMP6_SRC_PORT \
+ (ICE_PROT_ICMP6_OUTER | ICE_SPORT)
+#define ICE_INSET_ICMP6_DST_PORT \
+ (ICE_PROT_ICMP6_OUTER | ICE_DPORT)
+#define ICE_INSET_ICMP4_TYPE \
+ (ICE_PROT_ICMP4_OUTER | ICE_ICMP_TYPE)
+#define ICE_INSET_ICMP4_CODE \
+ (ICE_PROT_ICMP4_OUTER | ICE_ICMP_CODE)
+#define ICE_INSET_ICMP6_TYPE \
+ (ICE_PROT_ICMP6_OUTER | ICE_ICMP_TYPE)
+#define ICE_INSET_ICMP6_CODE \
+ (ICE_PROT_ICMP6_OUTER | ICE_ICMP_CODE)
+
+/* tunnel */
+
+#define ICE_INSET_TUN_SMAC \
+ (ICE_PROT_MAC_INNER | ICE_SMAC)
+#define ICE_INSET_TUN_DMAC \
+ (ICE_PROT_MAC_INNER | ICE_DMAC)
+
+#define ICE_INSET_TUN_IPV4_SRC \
+ (ICE_PROT_IPV4_INNER | ICE_IP_SRC)
+#define ICE_INSET_TUN_IPV4_DST \
+ (ICE_PROT_IPV4_INNER | ICE_IP_DST)
+#define ICE_INSET_TUN_IPV4_TTL \
+ (ICE_PROT_IPV4_INNER | ICE_IP_TTL)
+#define ICE_INSET_TUN_IPV4_PROTO \
+ (ICE_PROT_IPV4_INNER | ICE_IP_PROTO)
+#define ICE_INSET_TUN_IPV4_TOS \
+ (ICE_PROT_IPV4_INNER | ICE_IP_TOS)
+#define ICE_INSET_TUN_IPV6_SRC \
+ (ICE_PROT_IPV6_INNER | ICE_IP_SRC)
+#define ICE_INSET_TUN_IPV6_DST \
+ (ICE_PROT_IPV6_INNER | ICE_IP_DST)
+#define ICE_INSET_TUN_IPV6_HOP_LIMIT \
+ (ICE_PROT_IPV6_INNER | ICE_IP_TTL)
+#define ICE_INSET_TUN_IPV6_NEXT_HDR \
+ (ICE_PROT_IPV6_INNER | ICE_IP_PROTO)
+#define ICE_INSET_TUN_IPV6_TC \
+ (ICE_PROT_IPV6_INNER | ICE_IP_TOS)
+
+#define ICE_INSET_TUN_TCP_SRC_PORT \
+ (ICE_PROT_TCP_INNER | ICE_SPORT)
+#define ICE_INSET_TUN_TCP_DST_PORT \
+ (ICE_PROT_TCP_INNER | ICE_DPORT)
+#define ICE_INSET_TUN_UDP_SRC_PORT \
+ (ICE_PROT_UDP_INNER | ICE_SPORT)
+#define ICE_INSET_TUN_UDP_DST_PORT \
+ (ICE_PROT_UDP_INNER | ICE_DPORT)
+#define ICE_INSET_TUN_SCTP_SRC_PORT \
+ (ICE_PROT_SCTP_INNER | ICE_SPORT)
+#define ICE_INSET_TUN_SCTP_DST_PORT \
+ (ICE_PROT_SCTP_INNER | ICE_DPORT)
+#define ICE_INSET_TUN_ICMP4_SRC_PORT \
+ (ICE_PROT_ICMP4_INNER | ICE_SPORT)
+#define ICE_INSET_TUN_ICMP4_DST_PORT \
+ (ICE_PROT_ICMP4_INNER | ICE_DPORT)
+#define ICE_INSET_TUN_ICMP6_SRC_PORT \
+ (ICE_PROT_ICMP6_INNER | ICE_SPORT)
+#define ICE_INSET_TUN_ICMP6_DST_PORT \
+ (ICE_PROT_ICMP6_INNER | ICE_DPORT)
+#define ICE_INSET_TUN_ICMP4_TYPE \
+ (ICE_PROT_ICMP4_INNER | ICE_ICMP_TYPE)
+#define ICE_INSET_TUN_ICMP4_CODE \
+ (ICE_PROT_ICMP4_INNER | ICE_ICMP_CODE)
+#define ICE_INSET_TUN_ICMP6_TYPE \
+ (ICE_PROT_ICMP6_INNER | ICE_ICMP_TYPE)
+#define ICE_INSET_TUN_ICMP6_CODE \
+ (ICE_PROT_ICMP6_INNER | ICE_ICMP_CODE)
+
+#define ICE_INSET_TUN_VXLAN_VNI \
+ (ICE_PROT_VXLAN | ICE_VXLAN_VNI)
+#define ICE_INSET_TUN_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)
+
+/* empty pattern */
+extern enum rte_flow_item_type pattern_empty[];