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