Sync some patchs from upstreaming, includind some bugfixes, hns3 pmd flow rule priority feature, hns3 pmd outer VLAN flow match feature, and support dump reigser names and filter. This patch set is modified as follows: - net/hns3: fix cannot fully use hardware flow director table - net/hns3: fix error code for repeatedly create counter - net/hns3: support flow rule priority - common/nfp: use new kvargs process API - net/tap: use new kvargs process API - net/sfc: use new kvargs process API - kvargs: rework process API - net/hns3: fix variable type - net/hns3: fix pointer offset - net/hns3: fix error log - net/hns3: support filtering registers by module names - net/hns3: support reporting names of registers - net/hns3: refactor register dump - net/hns3: remove separators between register module - net/hns3: fix dump counter of registers - net/hns3: remove some basic address dump - telemetry: register command with private argument - ethdev: fix race on ports in telemetry endpoints - ethdev: add telemetry command for registers - ethdev: add report of register names and filter - net/hns3: support outer VLAN flow match - net/hns3: register VLAN flow match mode parameter - net/hns3: support general tunnel flow match - net/hns3: restrict tunnel flow rule to one header - net/hns3: remove ROH devices - net/hns3: dump queue head and tail pointer info - dmadev: fix potential null pointer access - net/hns3: verify reset type from firmware - ethdev: verify queue ID in Tx done cleanup Signed-off-by: Dengdui Huang <huangdengdui@huawei.com> (cherry picked from commit a1c828e1eb9cf716187d2a7656023e95bdce9b55)
156 lines
5.5 KiB
Diff
156 lines
5.5 KiB
Diff
From 969605f0cc24c8917317fe83462c3165e4901771 Mon Sep 17 00:00:00 2001
|
|
From: Chengwen Feng <fengchengwen@huawei.com>
|
|
Date: Fri, 18 Oct 2024 14:19:39 +0800
|
|
Subject: [PATCH] net/hns3: support general tunnel flow match
|
|
|
|
[ upstream commit 90294fa5bc3ab8d0592bbde190dcc8b614850aad ]
|
|
|
|
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 <fengchengwen@huawei.com>
|
|
Signed-off-by: Jie Hai <haijie1@huawei.com>
|
|
---
|
|
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 338b4e6..a9480d6 100644
|
|
--- a/doc/guides/nics/features/hns3.ini
|
|
+++ b/doc/guides/nics/features/hns3.ini
|
|
@@ -57,6 +57,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 e287420..89ee2c6 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.33.0
|
|
|