[PATCH v3 3/3] net/iavf: enable Protocol Agnostic Flow Offloading FDIR
Junfeng Guo
junfeng.guo at intel.com
Fri Apr 8 11:12:18 CEST 2022
This patch enabled Protocol Agnostic Flow Offloading FDIR in AVF.
Signed-off-by: Junfeng Guo <junfeng.guo at intel.com>
---
doc/guides/rel_notes/release_22_07.rst | 4 ++
drivers/net/iavf/iavf_fdir.c | 67 ++++++++++++++++++++++++++
drivers/net/iavf/iavf_generic_flow.c | 6 +++
drivers/net/iavf/iavf_generic_flow.h | 3 ++
4 files changed, 80 insertions(+)
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..43eab0b6d5 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,10 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated Intel iavf driver.**
+
+ * Added Protocol Agnostic Flow Offloading support in AVF Flow Director.
+
Removed Items
-------------
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index e9a3566c0d..f236260502 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -194,6 +194,7 @@
IAVF_INSET_TUN_TCP_DST_PORT)
static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
+ {iavf_pattern_raw, IAVF_INSET_NONE, IAVF_INSET_NONE},
{iavf_pattern_ethertype, IAVF_FDIR_INSET_ETH, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_udp, IAVF_FDIR_INSET_ETH_IPV4_UDP, IAVF_INSET_NONE},
@@ -720,6 +721,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
struct virtchnl_proto_hdrs *hdrs =
&filter->add_fltr.rule_cfg.proto_hdrs;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
+ const struct rte_flow_item_raw *raw_spec, *raw_mask;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
@@ -746,6 +748,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
enum rte_flow_item_type next_type;
uint8_t tun_inner = 0;
uint16_t ether_type, flags_version;
+ uint8_t item_num = 0;
int layer = 0;
uint8_t ipv6_addr_mask[16] = {
@@ -763,8 +766,72 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
RTE_FLOW_ERROR_TYPE_ITEM, item,
"Not support range");
}
+ item_num++;
switch (item_type) {
+ case RTE_FLOW_ITEM_TYPE_RAW: {
+ raw_spec = item->spec;
+ raw_mask = item->mask;
+
+ if (item_num != 1)
+ return -rte_errno;
+
+ if (raw_spec->length != raw_mask->length)
+ return -rte_errno;
+
+ uint16_t pkt_len = 0;
+ uint16_t tmp_val = 0;
+ uint8_t tmp = 0;
+ int i, j;
+
+ pkt_len = raw_spec->length;
+
+ for (i = 0, j = 0; i < pkt_len; i += 2, j++) {
+ tmp = raw_spec->pattern[i];
+ if (tmp >= 'a' && tmp <= 'f')
+ tmp_val = tmp - 'a' + 10;
+ if (tmp >= 'A' && tmp <= 'F')
+ tmp_val = tmp - 'A' + 10;
+ if (tmp >= '0' && tmp <= '9')
+ tmp_val = tmp - '0';
+
+ tmp_val *= 16;
+ tmp = raw_spec->pattern[i + 1];
+ if (tmp >= 'a' && tmp <= 'f')
+ tmp_val += (tmp - 'a' + 10);
+ if (tmp >= 'A' && tmp <= 'F')
+ tmp_val += (tmp - 'A' + 10);
+ if (tmp >= '0' && tmp <= '9')
+ tmp_val += (tmp - '0');
+
+ hdrs->raw.spec[j] = tmp_val;
+
+ tmp = raw_mask->pattern[i];
+ if (tmp >= 'a' && tmp <= 'f')
+ tmp_val = tmp - 'a' + 10;
+ if (tmp >= 'A' && tmp <= 'F')
+ tmp_val = tmp - 'A' + 10;
+ if (tmp >= '0' && tmp <= '9')
+ tmp_val = tmp - '0';
+
+ tmp_val *= 16;
+ tmp = raw_mask->pattern[i + 1];
+ if (tmp >= 'a' && tmp <= 'f')
+ tmp_val += (tmp - 'a' + 10);
+ if (tmp >= 'A' && tmp <= 'F')
+ tmp_val += (tmp - 'A' + 10);
+ if (tmp >= '0' && tmp <= '9')
+ tmp_val += (tmp - '0');
+
+ hdrs->raw.mask[j] = tmp_val;
+ }
+
+ hdrs->raw.pkt_len = pkt_len / 2;
+ hdrs->tunnel_level = 0;
+ hdrs->count = 0;
+ return 0;
+ }
+
case RTE_FLOW_ITEM_TYPE_ETH:
eth_spec = item->spec;
eth_mask = item->mask;
diff --git a/drivers/net/iavf/iavf_generic_flow.c b/drivers/net/iavf/iavf_generic_flow.c
index ddc1fdd22b..e1a611e319 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -48,6 +48,12 @@ const struct rte_flow_ops iavf_flow_ops = {
.query = iavf_flow_query,
};
+/* raw */
+enum rte_flow_item_type iavf_pattern_raw[] = {
+ RTE_FLOW_ITEM_TYPE_RAW,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
/* empty */
enum rte_flow_item_type iavf_pattern_empty[] = {
RTE_FLOW_ITEM_TYPE_END,
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index f6af176073..52eb1caf29 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -180,6 +180,9 @@
#define IAVF_INSET_L2TPV2 \
(IAVF_PROT_L2TPV2 | IAVF_L2TPV2_SESSION_ID)
+/* raw pattern */
+extern enum rte_flow_item_type iavf_pattern_raw[];
+
/* empty pattern */
extern enum rte_flow_item_type iavf_pattern_empty[];
--
2.25.1
More information about the dev
mailing list