X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_switch_filter.c;h=6b0c1bff1ec81632a3d74a66333db86caa107a9a;hb=39e4a2577fd05199f53182b7c8509aeed40dc07f;hp=c4b00b6a2f94cbe35e3f499e2a0aaee2b09ad911;hpb=5a70f91c9ccc85901d6a4de66e4753fa7c11f654;p=dpdk.git diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index c4b00b6a2f..6b0c1bff1e 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -31,15 +31,26 @@ #define ICE_PPP_IPV4_PROTO 0x0021 #define ICE_PPP_IPV6_PROTO 0x0057 #define ICE_IPV4_PROTO_NVGRE 0x002F +#define ICE_SW_PRI_BASE 6 #define ICE_SW_INSET_ETHER ( \ ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_ETHERTYPE) #define ICE_SW_INSET_MAC_VLAN ( \ - ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_ETHERTYPE | \ - ICE_INSET_VLAN_OUTER) + ICE_SW_INSET_ETHER | ICE_INSET_VLAN_INNER) +#define ICE_SW_INSET_MAC_QINQ ( \ + ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_VLAN_INNER | \ + ICE_INSET_VLAN_OUTER) #define ICE_SW_INSET_MAC_IPV4 ( \ ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \ ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS) +#define ICE_SW_INSET_MAC_QINQ_IPV4 ( \ + ICE_SW_INSET_MAC_QINQ | ICE_SW_INSET_MAC_IPV4) +#define ICE_SW_INSET_MAC_QINQ_IPV4_TCP ( \ + ICE_SW_INSET_MAC_QINQ_IPV4 | \ + ICE_INSET_TCP_DST_PORT | ICE_INSET_TCP_SRC_PORT) +#define ICE_SW_INSET_MAC_QINQ_IPV4_UDP ( \ + ICE_SW_INSET_MAC_QINQ_IPV4 | \ + ICE_INSET_UDP_DST_PORT | ICE_INSET_UDP_SRC_PORT) #define ICE_SW_INSET_MAC_IPV4_TCP ( \ ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \ ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS | \ @@ -52,6 +63,14 @@ ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \ ICE_INSET_IPV6_TC | ICE_INSET_IPV6_HOP_LIMIT | \ ICE_INSET_IPV6_NEXT_HDR) +#define ICE_SW_INSET_MAC_QINQ_IPV6 ( \ + ICE_SW_INSET_MAC_QINQ | ICE_SW_INSET_MAC_IPV6) +#define ICE_SW_INSET_MAC_QINQ_IPV6_TCP ( \ + ICE_SW_INSET_MAC_QINQ_IPV6 | \ + ICE_INSET_TCP_DST_PORT | ICE_INSET_TCP_SRC_PORT) +#define ICE_SW_INSET_MAC_QINQ_IPV6_UDP ( \ + ICE_SW_INSET_MAC_QINQ_IPV6 | \ + ICE_INSET_UDP_DST_PORT | ICE_INSET_UDP_SRC_PORT) #define ICE_SW_INSET_MAC_IPV6_TCP ( \ ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \ ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TC | \ @@ -61,38 +80,38 @@ ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TC | \ ICE_INSET_UDP_DST_PORT | ICE_INSET_UDP_SRC_PORT) #define ICE_SW_INSET_DIST_NVGRE_IPV4 ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_NVGRE_TNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_DMAC | \ + ICE_INSET_NVGRE_TNI) #define ICE_SW_INSET_DIST_VXLAN_IPV4 ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_VXLAN_VNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_DMAC | \ + ICE_INSET_VXLAN_VNI) #define ICE_SW_INSET_DIST_NVGRE_IPV4_TCP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_TCP_SRC_PORT | ICE_INSET_TUN_TCP_DST_PORT | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_NVGRE_TNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_TCP_SRC_PORT | ICE_INSET_TCP_DST_PORT | \ + ICE_INSET_DMAC | ICE_INSET_NVGRE_TNI) #define ICE_SW_INSET_DIST_NVGRE_IPV4_UDP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_UDP_SRC_PORT | ICE_INSET_TUN_UDP_DST_PORT | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_NVGRE_TNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_UDP_SRC_PORT | ICE_INSET_UDP_DST_PORT | \ + ICE_INSET_DMAC | ICE_INSET_NVGRE_TNI) #define ICE_SW_INSET_DIST_VXLAN_IPV4_TCP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_TCP_SRC_PORT | ICE_INSET_TUN_TCP_DST_PORT | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_VXLAN_VNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_TCP_SRC_PORT | ICE_INSET_TCP_DST_PORT | \ + ICE_INSET_DMAC | ICE_INSET_VXLAN_VNI) #define ICE_SW_INSET_DIST_VXLAN_IPV4_UDP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_UDP_SRC_PORT | ICE_INSET_TUN_UDP_DST_PORT | \ - ICE_INSET_TUN_DMAC | ICE_INSET_TUN_VXLAN_VNI | ICE_INSET_IPV4_DST) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_UDP_SRC_PORT | ICE_INSET_UDP_DST_PORT | \ + ICE_INSET_DMAC | ICE_INSET_VXLAN_VNI) #define ICE_SW_INSET_PERM_TUNNEL_IPV4 ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_IPV4_PROTO | ICE_INSET_TUN_IPV4_TOS) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_TOS) #define ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_TCP_SRC_PORT | ICE_INSET_TUN_TCP_DST_PORT | \ - ICE_INSET_TUN_IPV4_TOS) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_TCP_SRC_PORT | ICE_INSET_TCP_DST_PORT | \ + ICE_INSET_IPV4_TOS) #define ICE_SW_INSET_PERM_TUNNEL_IPV4_UDP ( \ - ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \ - ICE_INSET_TUN_UDP_SRC_PORT | ICE_INSET_TUN_UDP_DST_PORT | \ - ICE_INSET_TUN_IPV4_TOS) + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ + ICE_INSET_UDP_SRC_PORT | ICE_INSET_UDP_DST_PORT | \ + ICE_INSET_IPV4_TOS) #define ICE_SW_INSET_MAC_PPPOE ( \ ICE_INSET_VLAN_OUTER | ICE_INSET_VLAN_INNER | \ ICE_INSET_DMAC | ICE_INSET_ETHERTYPE | ICE_INSET_PPPOE_SESSION) @@ -130,6 +149,30 @@ #define ICE_SW_INSET_MAC_IPV6_PFCP ( \ ICE_SW_INSET_MAC_IPV6 | \ ICE_INSET_PFCP_S_FIELD | ICE_INSET_PFCP_SEID) +#define ICE_SW_INSET_MAC_IPV4_GTPU ( \ + ICE_SW_INSET_MAC_IPV4 | ICE_INSET_GTPU_TEID) +#define ICE_SW_INSET_MAC_IPV6_GTPU ( \ + ICE_SW_INSET_MAC_IPV6 | ICE_INSET_GTPU_TEID) +#define ICE_SW_INSET_MAC_GTPU_OUTER ( \ + ICE_INSET_DMAC | ICE_INSET_GTPU_TEID) +#define ICE_SW_INSET_MAC_GTPU_EH_OUTER ( \ + ICE_SW_INSET_MAC_GTPU_OUTER | ICE_INSET_GTPU_QFI) +#define ICE_SW_INSET_GTPU_IPV4 ( \ + ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST) +#define ICE_SW_INSET_GTPU_IPV6 ( \ + ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST) +#define ICE_SW_INSET_GTPU_IPV4_UDP ( \ + ICE_SW_INSET_GTPU_IPV4 | ICE_INSET_UDP_SRC_PORT | \ + ICE_INSET_UDP_DST_PORT) +#define ICE_SW_INSET_GTPU_IPV4_TCP ( \ + ICE_SW_INSET_GTPU_IPV4 | ICE_INSET_TCP_SRC_PORT | \ + ICE_INSET_TCP_DST_PORT) +#define ICE_SW_INSET_GTPU_IPV6_UDP ( \ + ICE_SW_INSET_GTPU_IPV6 | ICE_INSET_UDP_SRC_PORT | \ + ICE_INSET_UDP_DST_PORT) +#define ICE_SW_INSET_GTPU_IPV6_TCP ( \ + ICE_SW_INSET_GTPU_IPV6 | ICE_INSET_TCP_SRC_PORT | \ + ICE_INSET_TCP_DST_PORT) struct sw_meta { struct ice_adv_lkup_elem *list; @@ -137,214 +180,173 @@ struct sw_meta { struct ice_adv_rule_info rule_info; }; -static struct ice_flow_parser ice_switch_dist_parser_os; -static struct ice_flow_parser ice_switch_dist_parser_comms; +static struct ice_flow_parser ice_switch_dist_parser; static struct ice_flow_parser ice_switch_perm_parser; static struct -ice_pattern_match_item ice_switch_pattern_dist_comms[] = { - {pattern_ethertype, - ICE_SW_INSET_ETHER, ICE_INSET_NONE}, - {pattern_ethertype_vlan, - ICE_SW_INSET_MAC_VLAN, ICE_INSET_NONE}, - {pattern_eth_ipv4, - ICE_SW_INSET_MAC_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp, - ICE_SW_INSET_MAC_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_tcp, - ICE_SW_INSET_MAC_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv6, - ICE_SW_INSET_MAC_IPV6, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp, - ICE_SW_INSET_MAC_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv6_tcp, - ICE_SW_INSET_MAC_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4, - ICE_SW_INSET_DIST_VXLAN_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, - ICE_SW_INSET_DIST_VXLAN_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, - ICE_SW_INSET_DIST_VXLAN_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4, - ICE_SW_INSET_DIST_NVGRE_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_udp, - ICE_SW_INSET_DIST_NVGRE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, - ICE_SW_INSET_DIST_NVGRE_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes, - ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes, - ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE}, - {pattern_eth_pppoes_proto, - ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_proto, - ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4, - ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4_udp, - ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6, - ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6_udp, - ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4, - ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4_udp, - ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6, - ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6_udp, - ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_esp, - ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_esp, - ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv6_esp, - ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp_esp, - ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv4_ah, - ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE}, - {pattern_eth_ipv6_ah, - ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp_ah, - ICE_INSET_NONE, ICE_INSET_NONE}, - {pattern_eth_ipv4_l2tp, - ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE}, - {pattern_eth_ipv6_l2tp, - ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE}, - {pattern_eth_ipv4_pfcp, - ICE_INSET_NONE, ICE_INSET_NONE}, - {pattern_eth_ipv6_pfcp, - ICE_INSET_NONE, ICE_INSET_NONE}, -}; - -static struct -ice_pattern_match_item ice_switch_pattern_dist_os[] = { - {pattern_ethertype, - ICE_SW_INSET_ETHER, ICE_INSET_NONE}, - {pattern_ethertype_vlan, - ICE_SW_INSET_MAC_VLAN, ICE_INSET_NONE}, - {pattern_eth_arp, - ICE_INSET_NONE, ICE_INSET_NONE}, - {pattern_eth_ipv4, - ICE_SW_INSET_MAC_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp, - ICE_SW_INSET_MAC_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_tcp, - ICE_SW_INSET_MAC_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv6, - ICE_SW_INSET_MAC_IPV6, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp, - ICE_SW_INSET_MAC_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv6_tcp, - ICE_SW_INSET_MAC_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4, - ICE_SW_INSET_DIST_VXLAN_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, - ICE_SW_INSET_DIST_VXLAN_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, - ICE_SW_INSET_DIST_VXLAN_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4, - ICE_SW_INSET_DIST_NVGRE_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_udp, - ICE_SW_INSET_DIST_NVGRE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, - ICE_SW_INSET_DIST_NVGRE_IPV4_TCP, ICE_INSET_NONE}, +ice_pattern_match_item ice_switch_pattern_dist_list[] = { + {pattern_ethertype, ICE_SW_INSET_ETHER, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_ethertype_vlan, ICE_SW_INSET_MAC_VLAN, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_ethertype_qinq, ICE_SW_INSET_MAC_QINQ, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_arp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4, ICE_SW_INSET_MAC_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp, ICE_SW_INSET_MAC_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_tcp, ICE_SW_INSET_MAC_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6, ICE_SW_INSET_MAC_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp, ICE_SW_INSET_MAC_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_tcp, ICE_SW_INSET_MAC_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_VXLAN_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_VXLAN_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_VXLAN_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_NVGRE_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_NVGRE_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_INSET_IPV4_DST, ICE_SW_INSET_DIST_NVGRE_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4_tcp, ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4_udp, ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6_tcp, ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6_udp, ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4_tcp, ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4_udp, ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6_tcp, ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6_udp, ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_esp, ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_esp, ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_esp, ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_esp, ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_ah, ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_ah, ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_ah, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_l2tp, ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_l2tp, ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_pfcp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_pfcp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4, ICE_SW_INSET_MAC_QINQ_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4_tcp, ICE_SW_INSET_MAC_QINQ_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4_udp, ICE_SW_INSET_MAC_QINQ_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6, ICE_SW_INSET_MAC_QINQ_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6_tcp, ICE_SW_INSET_MAC_QINQ_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6_udp, ICE_SW_INSET_MAC_QINQ_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu, ICE_SW_INSET_MAC_IPV4_GTPU, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu, ICE_SW_INSET_MAC_IPV6_GTPU, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, }; static struct -ice_pattern_match_item ice_switch_pattern_perm[] = { - {pattern_ethertype, - ICE_SW_INSET_ETHER, ICE_INSET_NONE}, - {pattern_ethertype_vlan, - ICE_SW_INSET_MAC_VLAN, ICE_INSET_NONE}, - {pattern_eth_ipv4, - ICE_SW_INSET_MAC_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp, - ICE_SW_INSET_MAC_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_tcp, - ICE_SW_INSET_MAC_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv6, - ICE_SW_INSET_MAC_IPV6, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp, - ICE_SW_INSET_MAC_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv6_tcp, - ICE_SW_INSET_MAC_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4, - ICE_SW_INSET_PERM_TUNNEL_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, - ICE_SW_INSET_PERM_TUNNEL_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, - ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4, - ICE_SW_INSET_PERM_TUNNEL_IPV4, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_udp, - ICE_SW_INSET_PERM_TUNNEL_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, - ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes, - ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes, - ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE}, - {pattern_eth_pppoes_proto, - ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_proto, - ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4, - ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv4_udp, - ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6, - ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_pppoes_ipv6_udp, - ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4, - ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv4_udp, - ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6, - ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6_tcp, - ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE}, - {pattern_eth_vlan_pppoes_ipv6_udp, - ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE}, - {pattern_eth_ipv4_esp, - ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv4_udp_esp, - ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv6_esp, - ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp_esp, - ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE}, - {pattern_eth_ipv4_ah, - ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE}, - {pattern_eth_ipv6_ah, - ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE}, - {pattern_eth_ipv6_udp_ah, - ICE_INSET_NONE, ICE_INSET_NONE}, - {pattern_eth_ipv4_l2tp, - ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE}, - {pattern_eth_ipv6_l2tp, - ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE}, - {pattern_eth_ipv4_pfcp, - ICE_INSET_NONE, ICE_INSET_NONE}, - {pattern_eth_ipv6_pfcp, - ICE_INSET_NONE, ICE_INSET_NONE}, +ice_pattern_match_item ice_switch_pattern_perm_list[] = { + {pattern_ethertype, ICE_SW_INSET_ETHER, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_ethertype_vlan, ICE_SW_INSET_MAC_VLAN, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_ethertype_qinq, ICE_SW_INSET_MAC_QINQ, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_arp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4, ICE_SW_INSET_MAC_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp, ICE_SW_INSET_MAC_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_tcp, ICE_SW_INSET_MAC_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6, ICE_SW_INSET_MAC_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp, ICE_SW_INSET_MAC_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_tcp, ICE_SW_INSET_MAC_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4_tcp, ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv4_udp, ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6_tcp, ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_pppoes_ipv6_udp, ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4_tcp, ICE_SW_INSET_MAC_PPPOE_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv4_udp, ICE_SW_INSET_MAC_PPPOE_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6_tcp, ICE_SW_INSET_MAC_PPPOE_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_vlan_pppoes_ipv6_udp, ICE_SW_INSET_MAC_PPPOE_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_esp, ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_udp_esp, ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_esp, ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_esp, ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_ah, ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_ah, ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_ah, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_l2tp, ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_l2tp, ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_pfcp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_pfcp, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4, ICE_SW_INSET_MAC_QINQ_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4_tcp, ICE_SW_INSET_MAC_QINQ_IPV4_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv4_udp, ICE_SW_INSET_MAC_QINQ_IPV4_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6, ICE_SW_INSET_MAC_QINQ_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6_tcp, ICE_SW_INSET_MAC_QINQ_IPV6_TCP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_ipv6_udp, ICE_SW_INSET_MAC_QINQ_IPV6_UDP, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes, ICE_SW_INSET_MAC_PPPOE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_proto, ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_ipv4, ICE_SW_INSET_MAC_PPPOE_IPV4, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_qinq_pppoes_ipv6, ICE_SW_INSET_MAC_PPPOE_IPV6, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu, ICE_SW_INSET_MAC_IPV4_GTPU, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu, ICE_SW_INSET_MAC_IPV6_GTPU, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV4_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6_udp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_UDP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, + {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_SW_INSET_MAC_GTPU_EH_OUTER, ICE_SW_INSET_GTPU_IPV6_TCP, ICE_INSET_NONE}, }; static int @@ -447,12 +449,13 @@ ice_switch_filter_rule_free(struct rte_flow *flow) rte_free(flow->rule); } -static uint64_t -ice_switch_inset_get(const struct rte_flow_item pattern[], +static bool +ice_switch_parse_pattern(const struct rte_flow_item pattern[], struct rte_flow_error *error, struct ice_adv_lkup_elem *list, uint16_t *lkups_num, - enum ice_sw_tunnel_type *tun_type) + enum ice_sw_tunnel_type *tun_type, + const struct ice_pattern_match_item *pattern_match_item) { const struct rte_flow_item *item = pattern; enum rte_flow_item_type item_type; @@ -472,20 +475,37 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], const struct rte_flow_item_ah *ah_spec, *ah_mask; const struct rte_flow_item_l2tpv3oip *l2tp_spec, *l2tp_mask; const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask; - uint64_t input_set = ICE_INSET_NONE; + const struct rte_flow_item_gtp *gtp_spec, *gtp_mask; + const struct rte_flow_item_gtp_psc *gtp_psc_spec, *gtp_psc_mask; + uint64_t outer_input_set = ICE_INSET_NONE; + uint64_t inner_input_set = ICE_INSET_NONE; + uint64_t *input = NULL; uint16_t input_set_byte = 0; bool pppoe_elem_valid = 0; bool pppoe_patt_valid = 0; bool pppoe_prot_valid = 0; + bool inner_vlan_valid = 0; + bool outer_vlan_valid = 0; bool tunnel_valid = 0; bool profile_rule = 0; bool nvgre_valid = 0; bool vxlan_valid = 0; + bool qinq_valid = 0; bool ipv6_valid = 0; bool ipv4_valid = 0; bool udp_valid = 0; bool tcp_valid = 0; - uint16_t j, t = 0; + bool gtpu_valid = 0; + bool gtpu_psc_valid = 0; + bool inner_ipv4_valid = 0; + bool inner_ipv6_valid = 0; + bool inner_tcp_valid = 0; + bool inner_udp_valid = 0; + uint16_t j, k, t = 0; + + if (*tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ || + *tun_type == ICE_NON_TUN_QINQ) + qinq_valid = 1; for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { @@ -494,7 +514,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Not support range"); - return 0; + return false; } item_type = item->type; @@ -505,30 +525,24 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], if (eth_spec && eth_mask) { const uint8_t *a = eth_mask->src.addr_bytes; const uint8_t *b = eth_mask->dst.addr_bytes; + if (tunnel_valid) + input = &inner_input_set; + else + input = &outer_input_set; for (j = 0; j < RTE_ETHER_ADDR_LEN; j++) { - if (a[j] && tunnel_valid) { - input_set |= - ICE_INSET_TUN_SMAC; - break; - } else if (a[j]) { - input_set |= - ICE_INSET_SMAC; + if (a[j]) { + *input |= ICE_INSET_SMAC; break; } } for (j = 0; j < RTE_ETHER_ADDR_LEN; j++) { - if (b[j] && tunnel_valid) { - input_set |= - ICE_INSET_TUN_DMAC; - break; - } else if (b[j]) { - input_set |= - ICE_INSET_DMAC; + if (b[j]) { + *input |= ICE_INSET_DMAC; break; } } if (eth_mask->type) - input_set |= ICE_INSET_ETHERTYPE; + *input |= ICE_INSET_ETHERTYPE; list[t].type = (tunnel_valid == 0) ? ICE_MAC_OFOS : ICE_MAC_IL; struct ice_ether_hdr *h; @@ -571,7 +585,14 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], case RTE_FLOW_ITEM_TYPE_IPV4: ipv4_spec = item->spec; ipv4_mask = item->mask; - ipv4_valid = 1; + if (tunnel_valid) { + inner_ipv4_valid = 1; + input = &inner_input_set; + } else { + ipv4_valid = 1; + input = &outer_input_set; + } + if (ipv4_spec && ipv4_mask) { /* Check IPv4 mask and update input set */ if (ipv4_mask->hdr.version_ihl || @@ -582,39 +603,20 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid IPv4 mask."); - return 0; + return false; } - if (tunnel_valid) { - if (ipv4_mask->hdr.type_of_service) - input_set |= - ICE_INSET_TUN_IPV4_TOS; - if (ipv4_mask->hdr.src_addr) - input_set |= - ICE_INSET_TUN_IPV4_SRC; - if (ipv4_mask->hdr.dst_addr) - input_set |= - ICE_INSET_TUN_IPV4_DST; - if (ipv4_mask->hdr.time_to_live) - input_set |= - ICE_INSET_TUN_IPV4_TTL; - if (ipv4_mask->hdr.next_proto_id) - input_set |= - ICE_INSET_TUN_IPV4_PROTO; - } else { - if (ipv4_mask->hdr.src_addr) - input_set |= ICE_INSET_IPV4_SRC; - if (ipv4_mask->hdr.dst_addr) - input_set |= ICE_INSET_IPV4_DST; - if (ipv4_mask->hdr.time_to_live) - input_set |= ICE_INSET_IPV4_TTL; - if (ipv4_mask->hdr.next_proto_id) - input_set |= - ICE_INSET_IPV4_PROTO; - if (ipv4_mask->hdr.type_of_service) - input_set |= - ICE_INSET_IPV4_TOS; - } + if (ipv4_mask->hdr.src_addr) + *input |= ICE_INSET_IPV4_SRC; + if (ipv4_mask->hdr.dst_addr) + *input |= ICE_INSET_IPV4_DST; + if (ipv4_mask->hdr.time_to_live) + *input |= ICE_INSET_IPV4_TTL; + if (ipv4_mask->hdr.next_proto_id) + *input |= ICE_INSET_IPV4_PROTO; + if (ipv4_mask->hdr.type_of_service) + *input |= ICE_INSET_IPV4_TOS; + list[t].type = (tunnel_valid == 0) ? ICE_IPV4_OFOS : ICE_IPV4_IL; if (ipv4_mask->hdr.src_addr) { @@ -663,62 +665,42 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], case RTE_FLOW_ITEM_TYPE_IPV6: ipv6_spec = item->spec; ipv6_mask = item->mask; - ipv6_valid = 1; + if (tunnel_valid) { + inner_ipv6_valid = 1; + input = &inner_input_set; + } else { + ipv6_valid = 1; + input = &outer_input_set; + } + if (ipv6_spec && ipv6_mask) { if (ipv6_mask->hdr.payload_len) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid IPv6 mask"); - return 0; + return false; } for (j = 0; j < ICE_IPV6_ADDR_LENGTH; j++) { - if (ipv6_mask->hdr.src_addr[j] && - tunnel_valid) { - input_set |= - ICE_INSET_TUN_IPV6_SRC; - break; - } else if (ipv6_mask->hdr.src_addr[j]) { - input_set |= ICE_INSET_IPV6_SRC; + if (ipv6_mask->hdr.src_addr[j]) { + *input |= ICE_INSET_IPV6_SRC; break; } } for (j = 0; j < ICE_IPV6_ADDR_LENGTH; j++) { - if (ipv6_mask->hdr.dst_addr[j] && - tunnel_valid) { - input_set |= - ICE_INSET_TUN_IPV6_DST; - break; - } else if (ipv6_mask->hdr.dst_addr[j]) { - input_set |= ICE_INSET_IPV6_DST; + if (ipv6_mask->hdr.dst_addr[j]) { + *input |= ICE_INSET_IPV6_DST; break; } } - if (ipv6_mask->hdr.proto && - tunnel_valid) - input_set |= - ICE_INSET_TUN_IPV6_NEXT_HDR; - else if (ipv6_mask->hdr.proto) - input_set |= - ICE_INSET_IPV6_NEXT_HDR; - if (ipv6_mask->hdr.hop_limits && - tunnel_valid) - input_set |= - ICE_INSET_TUN_IPV6_HOP_LIMIT; - else if (ipv6_mask->hdr.hop_limits) - input_set |= - ICE_INSET_IPV6_HOP_LIMIT; - if ((ipv6_mask->hdr.vtc_flow & - rte_cpu_to_be_32 - (RTE_IPV6_HDR_TC_MASK)) && - tunnel_valid) - input_set |= - ICE_INSET_TUN_IPV6_TC; - else if (ipv6_mask->hdr.vtc_flow & - rte_cpu_to_be_32 - (RTE_IPV6_HDR_TC_MASK)) - input_set |= ICE_INSET_IPV6_TC; + if (ipv6_mask->hdr.proto) + *input |= ICE_INSET_IPV6_NEXT_HDR; + if (ipv6_mask->hdr.hop_limits) + *input |= ICE_INSET_IPV6_HOP_LIMIT; + if (ipv6_mask->hdr.vtc_flow & + rte_cpu_to_be_32(RTE_IPV6_HDR_TC_MASK)) + *input |= ICE_INSET_IPV6_TC; list[t].type = (tunnel_valid == 0) ? ICE_IPV6_OFOS : ICE_IPV6_IL; @@ -781,7 +763,14 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], case RTE_FLOW_ITEM_TYPE_UDP: udp_spec = item->spec; udp_mask = item->mask; - udp_valid = 1; + if (tunnel_valid) { + inner_udp_valid = 1; + input = &inner_input_set; + } else { + udp_valid = 1; + input = &outer_input_set; + } + if (udp_spec && udp_mask) { /* Check UDP mask and update input set*/ if (udp_mask->hdr.dgram_len || @@ -790,24 +779,14 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid UDP mask"); - return 0; + return false; } - if (tunnel_valid) { - if (udp_mask->hdr.src_port) - input_set |= - ICE_INSET_TUN_UDP_SRC_PORT; - if (udp_mask->hdr.dst_port) - input_set |= - ICE_INSET_TUN_UDP_DST_PORT; - } else { - if (udp_mask->hdr.src_port) - input_set |= - ICE_INSET_UDP_SRC_PORT; - if (udp_mask->hdr.dst_port) - input_set |= - ICE_INSET_UDP_DST_PORT; - } + if (udp_mask->hdr.src_port) + *input |= ICE_INSET_UDP_SRC_PORT; + if (udp_mask->hdr.dst_port) + *input |= ICE_INSET_UDP_DST_PORT; + if (*tun_type == ICE_SW_TUN_VXLAN && tunnel_valid == 0) list[t].type = ICE_UDP_OF; @@ -834,7 +813,14 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], case RTE_FLOW_ITEM_TYPE_TCP: tcp_spec = item->spec; tcp_mask = item->mask; - tcp_valid = 1; + if (tunnel_valid) { + inner_tcp_valid = 1; + input = &inner_input_set; + } else { + tcp_valid = 1; + input = &outer_input_set; + } + if (tcp_spec && tcp_mask) { /* Check TCP mask and update input set */ if (tcp_mask->hdr.sent_seq || @@ -848,24 +834,13 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid TCP mask"); - return 0; + return false; } - if (tunnel_valid) { - if (tcp_mask->hdr.src_port) - input_set |= - ICE_INSET_TUN_TCP_SRC_PORT; - if (tcp_mask->hdr.dst_port) - input_set |= - ICE_INSET_TUN_TCP_DST_PORT; - } else { - if (tcp_mask->hdr.src_port) - input_set |= - ICE_INSET_TCP_SRC_PORT; - if (tcp_mask->hdr.dst_port) - input_set |= - ICE_INSET_TCP_DST_PORT; - } + if (tcp_mask->hdr.src_port) + *input |= ICE_INSET_TCP_SRC_PORT; + if (tcp_mask->hdr.dst_port) + *input |= ICE_INSET_TCP_DST_PORT; list[t].type = ICE_TCP_IL; if (tcp_mask->hdr.src_port) { list[t].h_u.l4_hdr.src_port = @@ -895,24 +870,18 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid SCTP mask"); - return 0; + return false; } + if (tunnel_valid) + input = &inner_input_set; + else + input = &outer_input_set; + + if (sctp_mask->hdr.src_port) + *input |= ICE_INSET_SCTP_SRC_PORT; + if (sctp_mask->hdr.dst_port) + *input |= ICE_INSET_SCTP_DST_PORT; - if (tunnel_valid) { - if (sctp_mask->hdr.src_port) - input_set |= - ICE_INSET_TUN_SCTP_SRC_PORT; - if (sctp_mask->hdr.dst_port) - input_set |= - ICE_INSET_TUN_SCTP_DST_PORT; - } else { - if (sctp_mask->hdr.src_port) - input_set |= - ICE_INSET_SCTP_SRC_PORT; - if (sctp_mask->hdr.dst_port) - input_set |= - ICE_INSET_SCTP_DST_PORT; - } list[t].type = ICE_SCTP_IL; if (sctp_mask->hdr.src_port) { list[t].h_u.sctp_hdr.src_port = @@ -945,10 +914,11 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid VXLAN item"); - return 0; + return false; } vxlan_valid = 1; tunnel_valid = 1; + input = &inner_input_set; if (vxlan_spec && vxlan_mask) { list[t].type = ICE_VXLAN; if (vxlan_mask->vni[0] || @@ -962,8 +932,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], (vxlan_mask->vni[2] << 16) | (vxlan_mask->vni[1] << 8) | vxlan_mask->vni[0]; - input_set |= - ICE_INSET_TUN_VXLAN_VNI; + *input |= ICE_INSET_VXLAN_VNI; input_set_byte += 2; } t++; @@ -983,10 +952,11 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid NVGRE item"); - return 0; + return false; } nvgre_valid = 1; tunnel_valid = 1; + input = &inner_input_set; if (nvgre_spec && nvgre_mask) { list[t].type = ICE_NVGRE; if (nvgre_mask->tni[0] || @@ -1000,8 +970,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], (nvgre_mask->tni[2] << 16) | (nvgre_mask->tni[1] << 8) | nvgre_mask->tni[0]; - input_set |= - ICE_INSET_TUN_NVGRE_TNI; + *input |= ICE_INSET_NVGRE_TNI; input_set_byte += 2; } t++; @@ -1021,25 +990,47 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid VLAN item"); - return 0; + return false; } + + if (qinq_valid) { + if (!outer_vlan_valid) + outer_vlan_valid = 1; + else + inner_vlan_valid = 1; + } + + input = &outer_input_set; + if (vlan_spec && vlan_mask) { - list[t].type = ICE_VLAN_OFOS; + if (qinq_valid) { + if (!inner_vlan_valid) { + list[t].type = ICE_VLAN_EX; + *input |= + ICE_INSET_VLAN_OUTER; + } else { + list[t].type = ICE_VLAN_IN; + *input |= + ICE_INSET_VLAN_INNER; + } + } else { + list[t].type = ICE_VLAN_OFOS; + *input |= ICE_INSET_VLAN_INNER; + } + if (vlan_mask->tci) { list[t].h_u.vlan_hdr.vlan = vlan_spec->tci; list[t].m_u.vlan_hdr.vlan = vlan_mask->tci; - input_set |= ICE_INSET_VLAN_OUTER; input_set_byte += 2; } if (vlan_mask->inner_type) { - list[t].h_u.vlan_hdr.type = - vlan_spec->inner_type; - list[t].m_u.vlan_hdr.type = - vlan_mask->inner_type; - input_set |= ICE_INSET_ETHERTYPE; - input_set_byte += 2; + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid VLAN input set."); + return false; } t++; } @@ -1059,9 +1050,10 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid pppoe item"); - return 0; + return false; } pppoe_patt_valid = 1; + input = &outer_input_set; if (pppoe_spec && pppoe_mask) { /* Check pppoe mask and update input set */ if (pppoe_mask->length || @@ -1071,7 +1063,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid pppoe mask"); - return 0; + return false; } list[t].type = ICE_PPPOE; if (pppoe_mask->session_id) { @@ -1079,7 +1071,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], pppoe_spec->session_id; list[t].m_u.pppoe_hdr.session_id = pppoe_mask->session_id; - input_set |= ICE_INSET_PPPOE_SESSION; + *input |= ICE_INSET_PPPOE_SESSION; input_set_byte += 2; } t++; @@ -1101,8 +1093,9 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid pppoe proto item"); - return 0; + return false; } + input = &outer_input_set; if (pppoe_proto_spec && pppoe_proto_mask) { if (pppoe_elem_valid) t--; @@ -1112,7 +1105,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], pppoe_proto_spec->proto_id; list[t].m_u.pppoe_hdr.ppp_prot_id = pppoe_proto_mask->proto_id; - input_set |= ICE_INSET_PPPOE_PROTO; + *input |= ICE_INSET_PPPOE_PROTO; input_set_byte += 2; pppoe_prot_valid = 1; } @@ -1139,7 +1132,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid esp item"); - return 0; + return false; } /* Check esp mask and update input set */ if (esp_mask && esp_mask->hdr.seq) { @@ -1147,10 +1140,10 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid esp mask"); - return 0; + return false; } - - if (!esp_spec && !esp_mask && !input_set) { + input = &outer_input_set; + if (!esp_spec && !esp_mask && !(*input)) { profile_rule = 1; if (ipv6_valid && udp_valid) *tun_type = @@ -1158,7 +1151,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], else if (ipv6_valid) *tun_type = ICE_SW_TUN_PROFID_IPV6_ESP; else if (ipv4_valid) - return 0; + goto inset_check; } else if (esp_spec && esp_mask && esp_mask->hdr.spi){ if (udp_valid) @@ -1169,7 +1162,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], esp_spec->hdr.spi; list[t].m_u.esp_hdr.spi = esp_mask->hdr.spi; - input_set |= ICE_INSET_ESP_SPI; + *input |= ICE_INSET_ESP_SPI; input_set_byte += 4; t++; } @@ -1195,7 +1188,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid ah item"); - return 0; + return false; } /* Check ah mask and update input set */ if (ah_mask && @@ -1207,10 +1200,11 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid ah mask"); - return 0; + return false; } - if (!ah_spec && !ah_mask && !input_set) { + input = &outer_input_set; + if (!ah_spec && !ah_mask && !(*input)) { profile_rule = 1; if (ipv6_valid && udp_valid) *tun_type = @@ -1218,7 +1212,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], else if (ipv6_valid) *tun_type = ICE_SW_TUN_PROFID_IPV6_AH; else if (ipv4_valid) - return 0; + goto inset_check; } else if (ah_spec && ah_mask && ah_mask->spi){ list[t].type = ICE_AH; @@ -1226,14 +1220,14 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], ah_spec->spi; list[t].m_u.ah_hdr.spi = ah_mask->spi; - input_set |= ICE_INSET_AH_SPI; + *input |= ICE_INSET_AH_SPI; input_set_byte += 4; t++; } if (!profile_rule) { if (udp_valid) - return 0; + goto inset_check; else if (ipv6_valid) *tun_type = ICE_SW_TUN_IPV6_AH; else if (ipv4_valid) @@ -1250,15 +1244,16 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid l2tp item"); - return 0; + return false; } - if (!l2tp_spec && !l2tp_mask && !input_set) { + input = &outer_input_set; + if (!l2tp_spec && !l2tp_mask && !(*input)) { if (ipv6_valid) *tun_type = ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3; else if (ipv4_valid) - return 0; + goto inset_check; } else if (l2tp_spec && l2tp_mask && l2tp_mask->session_id){ list[t].type = ICE_L2TPV3; @@ -1266,7 +1261,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], l2tp_spec->session_id; list[t].m_u.l2tpv3_sess_hdr.session_id = l2tp_mask->session_id; - input_set |= ICE_INSET_L2TPV3OIP_SESSION_ID; + *input |= ICE_INSET_L2TPV3OIP_SESSION_ID; input_set_byte += 4; t++; } @@ -1294,7 +1289,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid PFCP item"); - return -ENOTSUP; + return false; } if (pfcp_spec && pfcp_mask) { /* Check pfcp mask and update input set */ @@ -1305,7 +1300,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "Invalid pfcp mask"); - return -ENOTSUP; + return false; } if (pfcp_mask->s_field && pfcp_spec->s_field == 0x01 && @@ -1326,8 +1321,75 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], *tun_type = ICE_SW_TUN_PROFID_IPV4_PFCP_NODE; else - return -ENOTSUP; + return false; + } + break; + + case RTE_FLOW_ITEM_TYPE_GTPU: + gtp_spec = item->spec; + gtp_mask = item->mask; + if (gtp_spec && !gtp_mask) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid GTP item"); + return false; + } + if (gtp_spec && gtp_mask) { + if (gtp_mask->v_pt_rsv_flags || + gtp_mask->msg_type || + gtp_mask->msg_len) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid GTP mask"); + return false; + } + input = &outer_input_set; + if (gtp_mask->teid) + *input |= ICE_INSET_GTPU_TEID; + list[t].type = ICE_GTP; + list[t].h_u.gtp_hdr.teid = + gtp_spec->teid; + list[t].m_u.gtp_hdr.teid = + gtp_mask->teid; + input_set_byte += 4; + t++; + } + tunnel_valid = 1; + gtpu_valid = 1; + break; + + case RTE_FLOW_ITEM_TYPE_GTP_PSC: + gtp_psc_spec = item->spec; + gtp_psc_mask = item->mask; + if (gtp_psc_spec && !gtp_psc_mask) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid GTPU_EH item"); + return false; + } + if (gtp_psc_spec && gtp_psc_mask) { + if (gtp_psc_mask->hdr.type) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "Invalid GTPU_EH mask"); + return false; + } + input = &outer_input_set; + if (gtp_psc_mask->hdr.qfi) + *input |= ICE_INSET_GTPU_QFI; + list[t].type = ICE_GTP; + list[t].h_u.gtp_hdr.qfi = + gtp_psc_spec->hdr.qfi; + list[t].m_u.gtp_hdr.qfi = + gtp_psc_mask->hdr.qfi; + input_set_byte += 1; + t++; } + gtpu_psc_valid = 1; break; case RTE_FLOW_ITEM_TYPE_VOID: @@ -1337,12 +1399,31 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, pattern, "Invalid pattern item."); - goto out; + return false; } } + if (*tun_type == ICE_SW_TUN_PPPOE_PAY && + inner_vlan_valid && outer_vlan_valid) + *tun_type = ICE_SW_TUN_PPPOE_PAY_QINQ; + else if (*tun_type == ICE_SW_TUN_PPPOE && + inner_vlan_valid && outer_vlan_valid) + *tun_type = ICE_SW_TUN_PPPOE_QINQ; + else if (*tun_type == ICE_NON_TUN && + inner_vlan_valid && outer_vlan_valid) + *tun_type = ICE_NON_TUN_QINQ; + else if (*tun_type == ICE_SW_TUN_AND_NON_TUN && + inner_vlan_valid && outer_vlan_valid) + *tun_type = ICE_SW_TUN_AND_NON_TUN_QINQ; + if (pppoe_patt_valid && !pppoe_prot_valid) { - if (ipv6_valid && udp_valid) + if (inner_vlan_valid && outer_vlan_valid && ipv4_valid) + *tun_type = ICE_SW_TUN_PPPOE_IPV4_QINQ; + else if (inner_vlan_valid && outer_vlan_valid && ipv6_valid) + *tun_type = ICE_SW_TUN_PPPOE_IPV6_QINQ; + else if (inner_vlan_valid && outer_vlan_valid) + *tun_type = ICE_SW_TUN_PPPOE_QINQ; + else if (ipv6_valid && udp_valid) *tun_type = ICE_SW_TUN_PPPOE_IPV6_UDP; else if (ipv6_valid && tcp_valid) *tun_type = ICE_SW_TUN_PPPOE_IPV6_TCP; @@ -1358,6 +1439,74 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], *tun_type = ICE_SW_TUN_PPPOE; } + if (gtpu_valid && gtpu_psc_valid) { + if (ipv4_valid && inner_ipv4_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV4_UDP; + else if (ipv4_valid && inner_ipv4_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV4_TCP; + else if (ipv4_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV4; + else if (ipv4_valid && inner_ipv6_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV6_UDP; + else if (ipv4_valid && inner_ipv6_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV6_TCP; + else if (ipv4_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_EH_IPV6; + else if (ipv6_valid && inner_ipv4_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV4_UDP; + else if (ipv6_valid && inner_ipv4_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV4_TCP; + else if (ipv6_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV4; + else if (ipv6_valid && inner_ipv6_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV6_UDP; + else if (ipv6_valid && inner_ipv6_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP; + else if (ipv6_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_EH_IPV6; + else if (ipv4_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_NO_PAY; + else if (ipv6_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_NO_PAY; + } else if (gtpu_valid) { + if (ipv4_valid && inner_ipv4_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV4_UDP; + else if (ipv4_valid && inner_ipv4_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV4_TCP; + else if (ipv4_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV4; + else if (ipv4_valid && inner_ipv6_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV6_UDP; + else if (ipv4_valid && inner_ipv6_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV6_TCP; + else if (ipv4_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_IPV6; + else if (ipv6_valid && inner_ipv4_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV4_UDP; + else if (ipv6_valid && inner_ipv4_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV4_TCP; + else if (ipv6_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV4; + else if (ipv6_valid && inner_ipv6_valid && inner_udp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV6_UDP; + else if (ipv6_valid && inner_ipv6_valid && inner_tcp_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV6_TCP; + else if (ipv6_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_IPV6; + else if (ipv4_valid) + *tun_type = ICE_SW_TUN_IPV4_GTPU_NO_PAY; + else if (ipv6_valid) + *tun_type = ICE_SW_TUN_IPV6_GTPU_NO_PAY; + } + + if (*tun_type == ICE_SW_TUN_IPV4_GTPU_NO_PAY || + *tun_type == ICE_SW_TUN_IPV6_GTPU_NO_PAY) { + for (k = 0; k < t; k++) { + if (list[k].type == ICE_GTP) + list[k].type = ICE_GTP_NO_PAY; + } + } + if (*tun_type == ICE_NON_TUN) { if (vxlan_valid) *tun_type = ICE_SW_TUN_VXLAN; @@ -1378,19 +1527,25 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], RTE_FLOW_ERROR_TYPE_ITEM, item, "too much input set"); - return -ENOTSUP; + return false; } *lkups_num = t; - return input_set; -out: - return 0; +inset_check: + if ((!outer_input_set && !inner_input_set && + !ice_is_prof_rule(*tun_type)) || (outer_input_set & + ~pattern_match_item->input_set_mask_o) || + (inner_input_set & ~pattern_match_item->input_set_mask_i)) + return false; + + return true; } static int ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { @@ -1405,17 +1560,32 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, case RTE_FLOW_ACTION_TYPE_VF: rule_info->sw_act.fltr_act = ICE_FWD_TO_VSI; act_vf = action->conf; + + if (act_vf->id >= ad->real_hw.num_vfs && + !act_vf->original) { + rte_flow_error_set(error, + EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, + actions, + "Invalid vf id"); + return -rte_errno; + } + if (act_vf->original) rule_info->sw_act.vsi_handle = ad->real_hw.avf.bus.func; else rule_info->sw_act.vsi_handle = act_vf->id; break; + + case RTE_FLOW_ACTION_TYPE_DROP: + rule_info->sw_act.fltr_act = ICE_DROP_PACKET; + break; + default: rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, actions, - "Invalid action type or queue number"); + "Invalid action type"); return -rte_errno; } } @@ -1423,7 +1593,10 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, rule_info->sw_act.src = rule_info->sw_act.vsi_handle; rule_info->sw_act.flag = ICE_FLTR_RX; rule_info->rx = 1; - rule_info->priority = 5; + /* 0 denotes lowest priority of recipe and highest priority + * of rte_flow. Change rte_flow priority into recipe priority. + */ + rule_info->priority = ICE_SW_PRI_BASE - priority; return 0; } @@ -1431,11 +1604,12 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, static int ice_switch_parse_action(struct ice_pf *pf, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { struct ice_vsi *vsi = pf->main_vsi; - struct rte_eth_dev *dev = pf->adapter->eth_dev; + struct rte_eth_dev_data *dev_data = pf->adapter->pf.dev_data; const struct rte_flow_action_queue *act_q; const struct rte_flow_action_rss *act_qgrop; uint16_t base_queue, i; @@ -1466,18 +1640,18 @@ ice_switch_parse_action(struct ice_pf *pf, goto error; if ((act_qgrop->queue[0] + act_qgrop->queue_num) > - dev->data->nb_rx_queues) - goto error; + dev_data->nb_rx_queues) + goto error1; for (i = 0; i < act_qgrop->queue_num - 1; i++) if (act_qgrop->queue[i + 1] != act_qgrop->queue[i] + 1) - goto error; + goto error2; rule_info->sw_act.qgrp_size = act_qgrop->queue_num; break; case RTE_FLOW_ACTION_TYPE_QUEUE: act_q = action->conf; - if (act_q->index >= dev->data->nb_rx_queues) + if (act_q->index >= dev_data->nb_rx_queues) goto error; rule_info->sw_act.fltr_act = ICE_FWD_TO_Q; @@ -1501,7 +1675,10 @@ ice_switch_parse_action(struct ice_pf *pf, rule_info->sw_act.vsi_handle = vsi->idx; rule_info->rx = 1; rule_info->sw_act.src = vsi->idx; - rule_info->priority = 5; + /* 0 denotes lowest priority of recipe and highest priority + * of rte_flow. Change rte_flow priority into recipe priority. + */ + rule_info->priority = ICE_SW_PRI_BASE - priority; return 0; @@ -1511,6 +1688,20 @@ error: actions, "Invalid action type or queue number"); return -rte_errno; + +error1: + rte_flow_error_set(error, + EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, + actions, + "Invalid queue region indexes"); + return -rte_errno; + +error2: + rte_flow_error_set(error, + EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, + actions, + "Discontinuous queue region"); + return -rte_errno; } static int @@ -1553,37 +1744,17 @@ ice_switch_check_action(const struct rte_flow_action *actions, return 0; } -static bool -ice_is_profile_rule(enum ice_sw_tunnel_type tun_type) -{ - switch (tun_type) { - case ICE_SW_TUN_PROFID_IPV6_ESP: - case ICE_SW_TUN_PROFID_IPV6_AH: - case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3: - case ICE_SW_TUN_PROFID_IPV6_NAT_T: - case ICE_SW_TUN_PROFID_IPV4_PFCP_NODE: - case ICE_SW_TUN_PROFID_IPV4_PFCP_SESSION: - case ICE_SW_TUN_PROFID_IPV6_PFCP_NODE: - case ICE_SW_TUN_PROFID_IPV6_PFCP_SESSION: - return true; - default: - break; - } - - return false; -} - static int ice_switch_parse_pattern_action(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 ice_pf *pf = &ad->pf; - uint64_t inputset = 0; int ret = 0; struct sw_meta *sw_meta_ptr = NULL; struct ice_adv_rule_info rule_info; @@ -1591,6 +1762,7 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, uint16_t lkups_num = 0; const struct rte_flow_item *item = pattern; uint16_t item_num = 0; + uint16_t vlan_num = 0; enum ice_sw_tunnel_type tun_type = ICE_NON_TUN; struct ice_pattern_match_item *pattern_match_item = NULL; @@ -1606,6 +1778,10 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, if (eth_mask->type == UINT16_MAX) tun_type = ICE_SW_TUN_AND_NON_TUN; } + + if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) + vlan_num++; + /* reserve one more memory slot for ETH which may * consume 2 lookup items. */ @@ -1613,6 +1789,11 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, item_num++; } + if (vlan_num == 2 && tun_type == ICE_SW_TUN_AND_NON_TUN) + tun_type = ICE_SW_TUN_AND_NON_TUN_QINQ; + else if (vlan_num == 2) + tun_type = ICE_NON_TUN_QINQ; + list = rte_zmalloc(NULL, item_num * sizeof(*list), 0); if (!list) { rte_flow_error_set(error, EINVAL, @@ -1631,7 +1812,8 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, } pattern_match_item = - ice_search_pattern_match_item(pattern, array, array_len, error); + ice_search_pattern_match_item(ad, pattern, array, array_len, + error); if (!pattern_match_item) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, @@ -1639,10 +1821,8 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, goto error; } - inputset = ice_switch_inset_get - (pattern, error, list, &lkups_num, &tun_type); - if ((!inputset && !ice_is_profile_rule(tun_type)) || - (inputset & ~pattern_match_item->input_set_mask)) { + if (!ice_switch_parse_pattern(pattern, error, list, &lkups_num, + &tun_type, pattern_match_item)) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_SPEC, pattern, @@ -1654,25 +1834,18 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, rule_info.tun_type = tun_type; ret = ice_switch_check_action(actions, error); - if (ret) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Invalid input action number"); + if (ret) goto error; - } if (ad->hw.dcf_enabled) - ret = ice_switch_parse_dcf_action((void *)ad, actions, error, - &rule_info); + ret = ice_switch_parse_dcf_action((void *)ad, actions, priority, + error, &rule_info); else - ret = ice_switch_parse_action(pf, actions, error, &rule_info); + ret = ice_switch_parse_action(pf, actions, priority, error, + &rule_info); - if (ret) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Invalid input action"); + if (ret) goto error; - } if (meta) { *meta = sw_meta_ptr; @@ -1797,19 +1970,15 @@ ice_switch_init(struct ice_adapter *ad) { int ret = 0; struct ice_flow_parser *dist_parser; - struct ice_flow_parser *perm_parser = &ice_switch_perm_parser; + struct ice_flow_parser *perm_parser; - if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) - dist_parser = &ice_switch_dist_parser_comms; - else if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT) - dist_parser = &ice_switch_dist_parser_os; - else - return -EINVAL; - - if (ad->devargs.pipe_mode_support) + if (ad->devargs.pipe_mode_support) { + perm_parser = &ice_switch_perm_parser; ret = ice_register_parser(perm_parser, ad); - else + } else { + dist_parser = &ice_switch_dist_parser; ret = ice_register_parser(dist_parser, ad); + } return ret; } @@ -1817,17 +1986,15 @@ static void ice_switch_uninit(struct ice_adapter *ad) { struct ice_flow_parser *dist_parser; - struct ice_flow_parser *perm_parser = &ice_switch_perm_parser; - - if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) - dist_parser = &ice_switch_dist_parser_comms; - else - dist_parser = &ice_switch_dist_parser_os; + struct ice_flow_parser *perm_parser; - if (ad->devargs.pipe_mode_support) + if (ad->devargs.pipe_mode_support) { + perm_parser = &ice_switch_perm_parser; ice_unregister_parser(perm_parser, ad); - else + } else { + dist_parser = &ice_switch_dist_parser; ice_unregister_parser(dist_parser, ad); + } } static struct @@ -1843,19 +2010,10 @@ ice_flow_engine ice_switch_engine = { }; static struct -ice_flow_parser ice_switch_dist_parser_os = { - .engine = &ice_switch_engine, - .array = ice_switch_pattern_dist_os, - .array_len = RTE_DIM(ice_switch_pattern_dist_os), - .parse_pattern_action = ice_switch_parse_pattern_action, - .stage = ICE_FLOW_STAGE_DISTRIBUTOR, -}; - -static struct -ice_flow_parser ice_switch_dist_parser_comms = { +ice_flow_parser ice_switch_dist_parser = { .engine = &ice_switch_engine, - .array = ice_switch_pattern_dist_comms, - .array_len = RTE_DIM(ice_switch_pattern_dist_comms), + .array = ice_switch_pattern_dist_list, + .array_len = RTE_DIM(ice_switch_pattern_dist_list), .parse_pattern_action = ice_switch_parse_pattern_action, .stage = ICE_FLOW_STAGE_DISTRIBUTOR, }; @@ -1863,8 +2021,8 @@ ice_flow_parser ice_switch_dist_parser_comms = { static struct ice_flow_parser ice_switch_perm_parser = { .engine = &ice_switch_engine, - .array = ice_switch_pattern_perm, - .array_len = RTE_DIM(ice_switch_pattern_perm), + .array = ice_switch_pattern_perm_list, + .array_len = RTE_DIM(ice_switch_pattern_perm_list), .parse_pattern_action = ice_switch_parse_pattern_action, .stage = ICE_FLOW_STAGE_PERMISSION, };