From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8FA5E45B68; Fri, 18 Oct 2024 08:31:53 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C896140430; Fri, 18 Oct 2024 08:31:44 +0200 (CEST) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id CC5F640265 for ; Fri, 18 Oct 2024 08:31:39 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4XVFF94l4qz1jB4n; Fri, 18 Oct 2024 14:30:21 +0800 (CST) Received: from kwepemf500004.china.huawei.com (unknown [7.202.181.242]) by mail.maildlp.com (Postfix) with ESMTPS id 0A0E21A0171; Fri, 18 Oct 2024 14:31:38 +0800 (CST) Received: from localhost.localdomain (10.28.79.22) by kwepemf500004.china.huawei.com (7.202.181.242) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Fri, 18 Oct 2024 14:31:37 +0800 From: Jie Hai To: , , , Yisen Zhuang CC: , , Subject: [PATCH 2/4] net/hns3: support general tunnel flow match Date: Fri, 18 Oct 2024 14:19:39 +0800 Message-ID: <20241018061941.29960-3-haijie1@huawei.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20241018061941.29960-1-haijie1@huawei.com> References: <20241018061941.29960-1-haijie1@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.28.79.22] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To kwepemf500004.china.huawei.com (7.202.181.242) 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 From: Chengwen Feng In the current driver implementation, if you want to configure the same action for all tunnel packets, you need to configure a rule for each specific tunnel packet. e.g: flow create 0 ingress pattern ipv4 / udp / vxlan / end actions ... flow create 0 ingress pattern ipv4 / udp / vxlan-gpe / end actions ... flow create 0 ingress pattern ipv4 / udp / geneve / end actions ... flow create 0 ingress pattern ipv4 / nvgre / end actions ... flow create 0 ingress pattern ipv6 / udp / vxlan / end actions ... flow create 0 ingress pattern ipv6 / udp / vxlan-gpe / end actions ... flow create 0 ingress pattern ipv6 / udp / geneve / end actions ... flow create 0 ingress pattern ipv6 / nvgre / end actions ... It occupies entry rule resources and is inconvenient to use. The hardware supports 'tunnel packet' meta-data bit, this bit was set when the hardware detects any type of supported tunnel packets. This commit supports general tunnel match by identify RTE_FLOW_ITEM_TYPE_PTYPE, and only support PTYPE_TUNNEL (0xf000). We will treat it (0xf000) as a general tunnel, all tunnel types that hardware recognized will match it. After this commit, we could just create one rule per case: case1: match all tunnel packets rule1: flow create 0 ingress pattern ptype packet_type is 0xf000 / end actions ... case2: match all ipv4 tunnel packets rule2: flow create 0 ingress pattern ipv4 ptype packet_type is 0xf000 / end actions ... case3: match all ipv6 tunnel packets rule3: flow create 0 ingress pattern ipv6 ptype packet_type is 0xf000 / end actions ... Signed-off-by: Chengwen Feng Signed-off-by: Jie Hai --- doc/guides/nics/features/hns3.ini | 1 + drivers/net/hns3/hns3_flow.c | 45 ++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/doc/guides/nics/features/hns3.ini b/doc/guides/nics/features/hns3.ini index 8b623d30778c..d4472f904bc1 100644 --- a/doc/guides/nics/features/hns3.ini +++ b/doc/guides/nics/features/hns3.ini @@ -59,6 +59,7 @@ icmp = Y ipv4 = Y ipv6 = Y nvgre = Y +ptype = P sctp = Y tcp = Y udp = Y diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c index e287420fb0f8..89ee2c6c6614 100644 --- a/drivers/net/hns3/hns3_flow.c +++ b/drivers/net/hns3/hns3_flow.c @@ -155,13 +155,15 @@ static enum rte_flow_item_type first_items[] = { RTE_FLOW_ITEM_TYPE_NVGRE, RTE_FLOW_ITEM_TYPE_VXLAN, RTE_FLOW_ITEM_TYPE_GENEVE, - RTE_FLOW_ITEM_TYPE_VXLAN_GPE + RTE_FLOW_ITEM_TYPE_VXLAN_GPE, + RTE_FLOW_ITEM_TYPE_PTYPE }; static enum rte_flow_item_type L2_next_items[] = { RTE_FLOW_ITEM_TYPE_VLAN, RTE_FLOW_ITEM_TYPE_IPV4, - RTE_FLOW_ITEM_TYPE_IPV6 + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_PTYPE }; static enum rte_flow_item_type L3_next_items[] = { @@ -169,7 +171,8 @@ static enum rte_flow_item_type L3_next_items[] = { RTE_FLOW_ITEM_TYPE_UDP, RTE_FLOW_ITEM_TYPE_SCTP, RTE_FLOW_ITEM_TYPE_NVGRE, - RTE_FLOW_ITEM_TYPE_ICMP + RTE_FLOW_ITEM_TYPE_ICMP, + RTE_FLOW_ITEM_TYPE_PTYPE }; static enum rte_flow_item_type L4_next_items[] = { @@ -1204,6 +1207,32 @@ hns3_parse_geneve(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, return 0; } +static int +hns3_parse_ptype(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, + struct rte_flow_error *error) +{ + const struct rte_flow_item_ptype *spec = item->spec; + const struct rte_flow_item_ptype *mask = item->mask; + + if (spec == NULL || mask == NULL) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "PTYPE must set spec and mask at the same time!"); + + if (spec->packet_type != RTE_PTYPE_TUNNEL_MASK || + (mask->packet_type & RTE_PTYPE_TUNNEL_MASK) != RTE_PTYPE_TUNNEL_MASK) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM_MASK, item, + "PTYPE only support general tunnel!"); + + /* + * Set tunnel_type to non-zero, so that meta-data's tunnel packet bit + * will be set, then hardware will match tunnel packet. + */ + rule->key_conf.spec.tunnel_type = 1; + return 0; +} + static int hns3_parse_tunnel(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, struct rte_flow_error *error) @@ -1237,6 +1266,9 @@ hns3_parse_tunnel(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, case RTE_FLOW_ITEM_TYPE_GENEVE: ret = hns3_parse_geneve(item, rule, error); break; + case RTE_FLOW_ITEM_TYPE_PTYPE: + ret = hns3_parse_ptype(item, rule, error); + break; default: return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, @@ -1336,7 +1368,12 @@ is_tunnel_packet(enum rte_flow_item_type type) if (type == RTE_FLOW_ITEM_TYPE_VXLAN_GPE || type == RTE_FLOW_ITEM_TYPE_VXLAN || type == RTE_FLOW_ITEM_TYPE_NVGRE || - type == RTE_FLOW_ITEM_TYPE_GENEVE) + type == RTE_FLOW_ITEM_TYPE_GENEVE || + /* + * Here treat PTYPE as tunnel type because driver only support PTYPE_TUNNEL, + * other PTYPE will return error in hns3_parse_ptype() later. + */ + type == RTE_FLOW_ITEM_TYPE_PTYPE) return true; return false; } -- 2.22.0