From patchwork Tue Aug 24 06:28:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Yuying" X-Patchwork-Id: 97264 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DD50AA0C46; Tue, 24 Aug 2021 08:45:28 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A3D2740687; Tue, 24 Aug 2021 08:45:28 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id AD53F4014E for ; Tue, 24 Aug 2021 08:45:27 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10085"; a="216971631" X-IronPort-AV: E=Sophos;i="5.84,346,1620716400"; d="scan'208";a="216971631" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Aug 2021 23:45:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,346,1620716400"; d="scan'208";a="535667449" Received: from dpdk-yyzhang2.sh.intel.com ([10.67.117.158]) by fmsmga002.fm.intel.com with ESMTP; 23 Aug 2021 23:45:25 -0700 From: Yuying Zhang To: dev@dpdk.org, qi.z.zhang@intel.com, junfeng.guo@intel.com Cc: Yuying Zhang Date: Tue, 24 Aug 2021 06:28:53 +0000 Message-Id: <20210824062854.2775724-1-yuying.zhang@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH RFC 1/2] net/ice/base: add VXLAN support for switch filter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add ipv4/ipv6 vxlan any support in switch filter. Add inner ipv6 and outer ipv6 support of vxlan protocol in switch filter. Signed-off-by: Yuying Zhang --- drivers/net/ice/base/ice_protocol_type.h | 6 + drivers/net/ice/base/ice_switch.c | 204 ++++++++++++++++++++++- drivers/net/ice/base/ice_switch.h | 12 ++ 3 files changed, 221 insertions(+), 1 deletion(-) diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h index cef8354f77..96133b4df3 100644 --- a/drivers/net/ice/base/ice_protocol_type.h +++ b/drivers/net/ice/base/ice_protocol_type.h @@ -112,6 +112,12 @@ enum ice_sw_tunnel_type { ICE_SW_TUN_IPV6_NAT_T, ICE_SW_TUN_IPV4_L2TPV3, ICE_SW_TUN_IPV6_L2TPV3, + ICE_SW_TUN_IPV4_VXLAN_IPV4, + ICE_SW_TUN_IPV4_VXLAN_IPV6, + ICE_SW_TUN_IPV6_VXLAN_IPV4, + ICE_SW_TUN_IPV6_VXLAN_IPV6, + ICE_SW_TUN_PROFID_IPV4_VXLAN, + ICE_SW_TUN_PROFID_IPV6_VXLAN, ICE_SW_TUN_PROFID_IPV6_ESP, ICE_SW_TUN_PROFID_IPV6_AH, ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3, diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c index 9179f66c20..082075a38d 100644 --- a/drivers/net/ice/base/ice_switch.c +++ b/drivers/net/ice/base/ice_switch.c @@ -180,6 +180,62 @@ static const u8 dummy_udp_tun_tcp_packet[] = { 0x00, 0x00, 0x00, 0x00 }; +static const struct ice_dummy_pkt_offsets dummy_udp_tun_ipv6_tcp_packet_offsets[] = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_IPV4_OFOS, 14 }, + { ICE_UDP_OF, 34 }, + { ICE_VXLAN, 42 }, + { ICE_GENEVE, 42 }, + { ICE_VXLAN_GPE, 42 }, + { ICE_MAC_IL, 50 }, + { ICE_IPV6_IL, 64 }, + { ICE_TCP_IL, 104 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +static const u8 dummy_udp_tun_ipv6_tcp_packet[] = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x08, 0x00, /* ICE_ETYPE_OL 12 */ + + 0x45, 0x00, 0x00, 0x5a, /* ICE_IPV4_OFOS 14 */ + 0x00, 0x01, 0x00, 0x00, + 0x40, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x12, 0xb5, /* ICE_UDP_OF 34 */ + 0x00, 0x46, 0x00, 0x00, + + 0x00, 0x00, 0x65, 0x58, /* ICE_VXLAN 42 */ + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_IL 50 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x86, 0xdd, + + 0x60, 0x00, 0x00, 0x00, /* ICE_IPV4_IL 64 */ + 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 104 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x50, 0x02, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + static const struct ice_dummy_pkt_offsets dummy_udp_tun_udp_packet_offsets[] = { { ICE_MAC_OFOS, 0 }, { ICE_ETYPE_OL, 12 }, @@ -228,6 +284,59 @@ static const u8 dummy_udp_tun_udp_packet[] = { 0x00, 0x08, 0x00, 0x00, }; +static const struct ice_dummy_pkt_offsets dummy_udp_tun_ipv6_udp_packet_offsets[] = { + { ICE_MAC_OFOS, 0 }, + { ICE_ETYPE_OL, 12 }, + { ICE_IPV4_OFOS, 14 }, + { ICE_UDP_OF, 34 }, + { ICE_VXLAN, 42 }, + { ICE_GENEVE, 42 }, + { ICE_VXLAN_GPE, 42 }, + { ICE_MAC_IL, 50 }, + { ICE_IPV6_IL, 64 }, + { ICE_UDP_ILOS, 104 }, + { ICE_PROTOCOL_LAST, 0 }, +}; + +static const u8 dummy_udp_tun_ipv6_udp_packet[] = { + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x08, 0x00, /* ICE_ETYPE_OL 12 */ + + 0x45, 0x00, 0x00, 0x4e, /* ICE_IPV4_OFOS 14 */ + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x12, 0xb5, /* ICE_UDP_OF 34 */ + 0x00, 0x3a, 0x00, 0x00, + + 0x00, 0x00, 0x65, 0x58, /* ICE_VXLAN 42 */ + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_MAC_IL 50 */ + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x86, 0xdd, + + 0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_IL 64 */ + 0x00, 0x58, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 104 */ + 0x00, 0x08, 0x00, 0x00, +}; + /* offset info for MAC + IPv4 + UDP dummy packet */ static const struct ice_dummy_pkt_offsets dummy_udp_packet_offsets[] = { { ICE_MAC_OFOS, 0 }, @@ -1871,6 +1980,10 @@ static enum ice_sw_tunnel_type ice_get_tun_type_for_recipe(u8 rid, bool vlan) bool non_tun_valid = false; bool pppoe_valid = false; bool vxlan_valid = false; + bool ipv4_vxlan_ipv4_valid = false; + bool ipv4_vxlan_ipv6_valid = false; + bool ipv6_vxlan_ipv4_valid = false; + bool ipv6_vxlan_ipv6_valid = false; bool gre_valid = false; bool gtp_valid = false; bool flag_valid = false; @@ -1887,8 +2000,17 @@ static enum ice_sw_tunnel_type ice_get_tun_type_for_recipe(u8 rid, bool vlan) } for (i = 0; i < 12; i++) { - if (vxlan_profile[i] == j) + if (vxlan_profile[i] == j) { vxlan_valid = true; + if (i < 3) + ipv4_vxlan_ipv4_valid = true; + else if (i < 6) + ipv6_vxlan_ipv4_valid = true; + else if (i < 9) + ipv4_vxlan_ipv6_valid = true; + else if (i < 12) + ipv6_vxlan_ipv6_valid = true; + } } for (i = 0; i < 7; i++) { @@ -1949,6 +2071,21 @@ static enum ice_sw_tunnel_type ice_get_tun_type_for_recipe(u8 rid, bool vlan) } } + if (tun_type == ICE_SW_TUN_VXLAN) { + if (ipv4_vxlan_ipv4_valid && ipv4_vxlan_ipv6_valid) + tun_type = ICE_SW_TUN_PROFID_IPV4_VXLAN; + else if (ipv6_vxlan_ipv4_valid && ipv6_vxlan_ipv6_valid) + tun_type = ICE_SW_TUN_PROFID_IPV6_VXLAN; + else if (ipv4_vxlan_ipv4_valid) + tun_type = ICE_SW_TUN_IPV4_VXLAN_IPV4; + else if (ipv4_vxlan_ipv6_valid) + tun_type = ICE_SW_TUN_IPV4_VXLAN_IPV6; + else if (ipv6_vxlan_ipv4_valid) + tun_type = ICE_SW_TUN_IPV6_VXLAN_IPV4; + else if (ipv6_vxlan_ipv6_valid) + tun_type = ICE_SW_TUN_IPV6_VXLAN_IPV6; + } + if (profile_num == 1 && (flag_valid || non_tun_valid || pppoe_valid)) { for (j = 0; j < ICE_MAX_NUM_PROFILES; j++) { if (ice_is_bit_set(recipe_to_profile[rid], j)) { @@ -7357,6 +7494,8 @@ static bool ice_tun_type_match_word(enum ice_sw_tunnel_type tun_type, u16 *mask) case ICE_SW_TUN_VXLAN_GPE: case ICE_SW_TUN_GENEVE: case ICE_SW_TUN_VXLAN: + case ICE_SW_TUN_PROFID_IPV4_VXLAN: + case ICE_SW_TUN_PROFID_IPV6_VXLAN: case ICE_SW_TUN_NVGRE: case ICE_SW_TUN_UDP: case ICE_ALL_TUNNELS: @@ -7620,6 +7759,42 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo, case ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP: ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_TCP, bm); return; + case ICE_SW_TUN_PROFID_IPV4_VXLAN: + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_TCP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_UDP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_OTHER, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_TCP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_UDP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_OTHER, bm); + return; + case ICE_SW_TUN_PROFID_IPV6_VXLAN: + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_TCP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_UDP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_OTHER, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_TCP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_UDP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_OTHER, bm); + return; + case ICE_SW_TUN_IPV4_VXLAN_IPV4: + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_TCP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_UDP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV4_OTHER, bm); + return; + case ICE_SW_TUN_IPV6_VXLAN_IPV4: + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_TCP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_UDP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV4_OTHER, bm); + return; + case ICE_SW_TUN_IPV4_VXLAN_IPV6: + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_TCP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_UDP, bm); + ice_set_bit(ICE_PROFID_IPV4_TUN_M_IPV6_OTHER, bm); + return; + case ICE_SW_TUN_IPV6_VXLAN_IPV6: + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_TCP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_UDP, bm); + ice_set_bit(ICE_PROFID_IPV6_TUN_M_IPV6_OTHER, bm); + return; case ICE_SW_TUN_AND_NON_TUN: case ICE_SW_TUN_AND_NON_TUN_QINQ: default: @@ -7640,6 +7815,8 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo, bool ice_is_prof_rule(enum ice_sw_tunnel_type type) { switch (type) { + case ICE_SW_TUN_PROFID_IPV4_VXLAN: + case ICE_SW_TUN_PROFID_IPV6_VXLAN: case ICE_SW_TUN_PROFID_IPV6_ESP: case ICE_SW_TUN_PROFID_IPV6_AH: case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3: @@ -8228,8 +8405,27 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt, return; } + if (tun_type == ICE_SW_TUN_IPV4_VXLAN_IPV6 || + tun_type == ICE_SW_TUN_IPV6_VXLAN_IPV6) { + if (tcp) { + *pkt = dummy_udp_tun_ipv6_tcp_packet; + *pkt_len = sizeof(dummy_udp_tun_ipv6_tcp_packet); + *offsets = dummy_udp_tun_ipv6_tcp_packet_offsets; + return; + } + + *pkt = dummy_udp_tun_ipv6_udp_packet; + *pkt_len = sizeof(dummy_udp_tun_ipv6_udp_packet); + *offsets = dummy_udp_tun_ipv6_udp_packet_offsets; + return; + } + if (tun_type == ICE_SW_TUN_VXLAN || tun_type == ICE_SW_TUN_GENEVE || tun_type == ICE_SW_TUN_VXLAN_GPE || tun_type == ICE_SW_TUN_UDP || + tun_type == ICE_SW_TUN_PROFID_IPV4_VXLAN || + tun_type == ICE_SW_TUN_PROFID_IPV6_VXLAN || + tun_type == ICE_SW_TUN_IPV4_VXLAN_IPV4 || + tun_type == ICE_SW_TUN_IPV6_VXLAN_IPV4 || tun_type == ICE_SW_TUN_GENEVE_VLAN || tun_type == ICE_SW_TUN_VXLAN_VLAN) { if (tcp) { @@ -8445,6 +8641,12 @@ ice_fill_adv_packet_tun(struct ice_hw *hw, enum ice_sw_tunnel_type tun_type, case ICE_SW_TUN_AND_NON_TUN: case ICE_SW_TUN_VXLAN_GPE: case ICE_SW_TUN_VXLAN: + case ICE_SW_TUN_PROFID_IPV4_VXLAN: + case ICE_SW_TUN_PROFID_IPV6_VXLAN: + case ICE_SW_TUN_IPV4_VXLAN_IPV4: + case ICE_SW_TUN_IPV4_VXLAN_IPV6: + case ICE_SW_TUN_IPV6_VXLAN_IPV4: + case ICE_SW_TUN_IPV6_VXLAN_IPV6: case ICE_SW_TUN_VXLAN_VLAN: case ICE_SW_TUN_UDP: if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, &open_port)) diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h index 980bae5806..8258d06e6d 100644 --- a/drivers/net/ice/base/ice_switch.h +++ b/drivers/net/ice/base/ice_switch.h @@ -20,6 +20,18 @@ #define ICE_PROFID_IPV4_UDP 5 #define ICE_PROFID_IPV6_TCP 7 #define ICE_PROFID_IPV6_UDP 8 +#define ICE_PROFID_IPV4_TUN_M_IPV4_TCP 10 +#define ICE_PROFID_IPV4_TUN_M_IPV4_UDP 11 +#define ICE_PROFID_IPV4_TUN_M_IPV4_OTHER 12 +#define ICE_PROFID_IPV6_TUN_M_IPV4_TCP 16 +#define ICE_PROFID_IPV6_TUN_M_IPV4_UDP 17 +#define ICE_PROFID_IPV6_TUN_M_IPV4_OTHER 18 +#define ICE_PROFID_IPV4_TUN_M_IPV6_TCP 22 +#define ICE_PROFID_IPV4_TUN_M_IPV6_UDP 23 +#define ICE_PROFID_IPV4_TUN_M_IPV6_OTHER 24 +#define ICE_PROFID_IPV6_TUN_M_IPV6_TCP 25 +#define ICE_PROFID_IPV6_TUN_M_IPV6_UDP 26 +#define ICE_PROFID_IPV6_TUN_M_IPV6_OTHER 27 #define ICE_PROFID_PPPOE_PAY 34 #define ICE_PROFID_PPPOE_IPV4_TCP 35 #define ICE_PROFID_PPPOE_IPV4_UDP 36 From patchwork Tue Aug 24 06:28:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Yuying" X-Patchwork-Id: 97265 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D45D7A0C46; Tue, 24 Aug 2021 08:45:36 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F1F27410E3; Tue, 24 Aug 2021 08:45:31 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id 19A284115F for ; Tue, 24 Aug 2021 08:45:29 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10085"; a="216971636" X-IronPort-AV: E=Sophos;i="5.84,346,1620716400"; d="scan'208";a="216971636" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Aug 2021 23:45:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,346,1620716400"; d="scan'208";a="535667489" Received: from dpdk-yyzhang2.sh.intel.com ([10.67.117.158]) by fmsmga002.fm.intel.com with ESMTP; 23 Aug 2021 23:45:28 -0700 From: Yuying Zhang To: dev@dpdk.org, qi.z.zhang@intel.com, junfeng.guo@intel.com Cc: Yuying Zhang Date: Tue, 24 Aug 2021 06:28:54 +0000 Message-Id: <20210824062854.2775724-2-yuying.zhang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210824062854.2775724-1-yuying.zhang@intel.com> References: <20210824062854.2775724-1-yuying.zhang@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH RFC 2/2] net/ice: add support of VXLAN in switch filter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add support of ipv4/ipv6 vxlan any pattern and outer/inner ipv6 vxlan pattern in switch filter. Pattern ipv4/ipv6_vxlan_any supports no input set. +-------------------------------------+---------------------------+ | Pattern | Input Set | +-------------------------------------+---------------------------+ | pattern_eth_ipv4_udp_vxlan_any | dst mac, no input set | | pattern_eth_ipv6_udp_vxlan_any | dst mac, no input set | | pattern_eth_ipv4_udp_vxlan_eth_ipv4 | dst mac, inner dst/src ip | | pattern_eth_ipv4_udp_vxlan_eth_ipv6 | dst mac, inner dst/src ip | | pattern_eth_ipv6_udp_vxlan_eth_ipv4 | dst mac, inner dst/src ip | | pattern_eth_ipv6_udp_vxlan_eth_ipv6 | dst mac, inner dst/src ip | +-------------------------------------+---------------------------+ Signed-off-by: Yuying Zhang --- drivers/net/ice/ice_generic_flow.c | 33 +++++++++++++++++++++--- drivers/net/ice/ice_generic_flow.h | 6 +++++ drivers/net/ice/ice_switch_filter.c | 40 ++++++++++++++++++++++++++--- 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 66b5743abf..29a5df69cb 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -364,6 +364,26 @@ enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_icmp[] = { RTE_FLOW_ITEM_TYPE_END, }; +/* IPv4 VXLAN ANY */ +enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_any[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV4, + RTE_FLOW_ITEM_TYPE_UDP, + RTE_FLOW_ITEM_TYPE_VXLAN, + RTE_FLOW_ITEM_TYPE_ANY, + RTE_FLOW_ITEM_TYPE_END, +}; + +/* IPv6 VXLAN ANY */ +enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_any[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_UDP, + RTE_FLOW_ITEM_TYPE_VXLAN, + RTE_FLOW_ITEM_TYPE_ANY, + RTE_FLOW_ITEM_TYPE_END, +}; + /* IPv4 VXLAN MAC IPv4 */ enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4[] = { RTE_FLOW_ITEM_TYPE_ETH, @@ -2162,14 +2182,19 @@ static struct ice_ptype_match ice_ptype_map[] = { {pattern_eth_qinq_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY}, {pattern_eth_vlan_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP}, {pattern_eth_vlan_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY}, + {pattern_eth_ipv4_udp_vxlan_any, ICE_MAC_IPV4_TUN_IPV4_PAY}, + {pattern_eth_ipv6_udp_vxlan_any, ICE_MAC_IPV6_TUN_IPV4_PAY}, {pattern_eth_ipv4_udp_vxlan_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, {pattern_eth_ipv4_udp_vxlan_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, {pattern_eth_ipv4_udp_vxlan_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, {pattern_eth_ipv4_udp_vxlan_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, - {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_PAY}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_UDP_PAY}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_TCP}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_SCTP}, + {pattern_eth_ipv4_udp_vxlan_eth_ipv6, ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_PAY}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv4, ICE_MAC_IPV6_TUN_MAC_IPV4_PAY}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv6, ICE_MAC_IPV6_TUN_MAC_IPV6_PAY}, {pattern_eth_ipv4_nvgre_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, {pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h index 8845a3e156..f998ee7d71 100644 --- a/drivers/net/ice/ice_generic_flow.h +++ b/drivers/net/ice/ice_generic_flow.h @@ -176,6 +176,12 @@ 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 ANY */ +extern enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_any[]; + +/* IPv6 VXLAN ANY */ +extern enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_any[]; + /* 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[]; diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index f222cb9cb0..399b315bf1 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -72,6 +72,9 @@ #define ICE_SW_INSET_DIST_VXLAN_IPV4 ( \ ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_DMAC | \ ICE_INSET_VXLAN_VNI) +#define ICE_SW_INSET_DIST_VXLAN_IPV6 ( \ + ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_DMAC | \ + ICE_INSET_VXLAN_VNI) #define ICE_SW_INSET_DIST_NVGRE_IPV4_TCP ( \ ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \ ICE_INSET_TCP_SRC_PORT | ICE_INSET_TCP_DST_PORT | \ @@ -99,6 +102,9 @@ 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_PERM_TUNNEL_IPV6 ( \ + ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | \ + ICE_INSET_IPV6_NEXT_HDR | ICE_INSET_IPV6_TC) #define ICE_SW_INSET_MAC_PPPOE ( \ ICE_INSET_VLAN_OUTER | ICE_INSET_VLAN_INNER | \ ICE_INSET_DMAC | ICE_INSET_ETHERTYPE | ICE_INSET_PPPOE_SESSION) @@ -182,9 +188,14 @@ ice_pattern_match_item ice_switch_pattern_dist_list[] = { {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_any, ICE_INSET_DMAC, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_any, ICE_INSET_DMAC, 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_udp_vxlan_eth_ipv6, ICE_INSET_DMAC, ICE_SW_INSET_DIST_VXLAN_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv4, ICE_INSET_DMAC, ICE_SW_INSET_DIST_VXLAN_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv6, ICE_INSET_DMAC, ICE_SW_INSET_DIST_VXLAN_IPV6, 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}, @@ -261,9 +272,14 @@ ice_pattern_match_item ice_switch_pattern_perm_list[] = { {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_any, ICE_INSET_NONE, ICE_INSET_NONE, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_any, ICE_INSET_NONE, 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_udp_vxlan_eth_ipv6, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV6, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv4, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV4, ICE_INSET_NONE}, + {pattern_eth_ipv6_udp_vxlan_eth_ipv6, ICE_INSET_NONE, ICE_SW_INSET_PERM_TUNNEL_IPV6, 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}, @@ -480,6 +496,7 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[], bool inner_ipv6_valid = 0; bool inner_tcp_valid = 0; bool inner_udp_valid = 0; + bool any_valid = 0; uint16_t j, k, t = 0; if (*tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ || @@ -1371,6 +1388,10 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[], gtpu_psc_valid = 1; break; + case RTE_FLOW_ITEM_TYPE_ANY: + any_valid = 1; + break; + case RTE_FLOW_ITEM_TYPE_VOID: break; @@ -1486,10 +1507,23 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[], } } + if (vxlan_valid) { + if (ipv4_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV4_VXLAN_IPV4; + if (ipv4_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV4_VXLAN_IPV6; + if (ipv6_valid && inner_ipv4_valid) + *tun_type = ICE_SW_TUN_IPV6_VXLAN_IPV4; + if (ipv6_valid && inner_ipv6_valid) + *tun_type = ICE_SW_TUN_IPV6_VXLAN_IPV6; + if (ipv6_valid && any_valid) + *tun_type = ICE_SW_TUN_PROFID_IPV6_VXLAN; + if (ipv4_valid && any_valid) + *tun_type = ICE_SW_TUN_PROFID_IPV4_VXLAN; + } + if (*tun_type == ICE_NON_TUN) { - if (vxlan_valid) - *tun_type = ICE_SW_TUN_VXLAN; - else if (nvgre_valid) + if (nvgre_valid) *tun_type = ICE_SW_TUN_NVGRE; else if (ipv4_valid && tcp_valid) *tun_type = ICE_SW_IPV4_TCP;