@@ -55,6 +55,10 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated Intel iavf driver.**
+
+ * Added flow subscription support.
+
Removed Items
-------------
new file mode 100644
@@ -0,0 +1,112 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2022 Intel Corporation
+ */
+
+#include <sys/queue.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <rte_debug.h>
+#include <rte_ether.h>
+#include <rte_ethdev.h>
+#include <rte_log.h>
+#include <rte_malloc.h>
+#include <rte_eth_ctrl.h>
+#include <rte_tailq.h>
+#include <rte_flow_driver.h>
+#include <rte_flow.h>
+#include <iavf.h>
+#include "iavf_generic_flow.h"
+
+
+static struct iavf_flow_parser iavf_fsub_parser;
+
+static struct iavf_pattern_match_item iavf_fsub_pattern_list[] = {};
+
+static int
+iavf_fsub_create(__rte_unused struct iavf_adapter *ad,
+ __rte_unused struct rte_flow *flow,
+ __rte_unused void *meta,
+ __rte_unused struct rte_flow_error *error)
+{
+ return -rte_errno;
+}
+
+static int
+iavf_fsub_destroy(__rte_unused struct iavf_adapter *ad,
+ __rte_unused struct rte_flow *flow,
+ __rte_unused struct rte_flow_error *error)
+{
+ return -rte_errno;
+}
+
+static int
+iavf_fsub_validation(__rte_unused struct iavf_adapter *ad,
+ __rte_unused struct rte_flow *flow,
+ __rte_unused void *meta,
+ __rte_unused struct rte_flow_error *error)
+{
+ return -rte_errno;
+};
+
+static int
+iavf_fsub_parse(__rte_unused struct iavf_adapter *ad,
+ __rte_unused struct iavf_pattern_match_item *array,
+ __rte_unused uint32_t array_len,
+ __rte_unused const struct rte_flow_item pattern[],
+ __rte_unused const struct rte_flow_action actions[],
+ __rte_unused void **meta,
+ __rte_unused struct rte_flow_error *error)
+{
+ return -rte_errno;
+}
+
+static int
+iavf_fsub_init(struct iavf_adapter *ad)
+{
+ struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
+ struct iavf_flow_parser *parser;
+
+ if (!vf->vf_res)
+ return -EINVAL;
+
+ if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_FSUB_PF)
+ parser = &iavf_fsub_parser;
+ else
+ return -ENOTSUP;
+
+ return iavf_register_parser(parser, ad);
+}
+
+static void
+iavf_fsub_uninit(struct iavf_adapter *ad)
+{
+ iavf_unregister_parser(&iavf_fsub_parser, ad);
+}
+
+static struct
+iavf_flow_engine iavf_fsub_engine = {
+ .init = iavf_fsub_init,
+ .uninit = iavf_fsub_uninit,
+ .create = iavf_fsub_create,
+ .destroy = iavf_fsub_destroy,
+ .validation = iavf_fsub_validation,
+ .type = IAVF_FLOW_ENGINE_FSUB,
+};
+
+static struct
+iavf_flow_parser iavf_fsub_parser = {
+ .engine = &iavf_fsub_engine,
+ .array = iavf_fsub_pattern_list,
+ .array_len = RTE_DIM(iavf_fsub_pattern_list),
+ .parse_pattern_action = iavf_fsub_parse,
+ .stage = IAVF_FLOW_STAGE_DISTRIBUTOR,
+};
+
+RTE_INIT(iavf_fsub_engine_init)
+{
+ iavf_register_flow_engine(&iavf_fsub_engine);
+}
@@ -1866,6 +1866,8 @@ iavf_register_parser(struct iavf_flow_parser *parser,
{
struct iavf_parser_list *list = NULL;
struct iavf_flow_parser_node *parser_node;
+ struct iavf_flow_parser_node *existing_node;
+ void *temp;
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
parser_node = rte_zmalloc("iavf_parser", sizeof(*parser_node), 0);
@@ -1880,14 +1882,26 @@ iavf_register_parser(struct iavf_flow_parser *parser,
TAILQ_INSERT_TAIL(list, parser_node, node);
} else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR) {
list = &vf->dist_parser_list;
+ RTE_TAILQ_FOREACH_SAFE(existing_node, list, node, temp) {
+ if (existing_node->parser->engine->type ==
+ IAVF_FLOW_ENGINE_FSUB) {
+ TAILQ_INSERT_AFTER(list, existing_node,
+ parser_node, node);
+ goto DONE;
+ }
+ }
TAILQ_INSERT_HEAD(list, parser_node, node);
} else if (parser->engine->type == IAVF_FLOW_ENGINE_IPSEC_CRYPTO) {
list = &vf->ipsec_crypto_parser_list;
TAILQ_INSERT_HEAD(list, parser_node, node);
+ } else if (parser->engine->type == IAVF_FLOW_ENGINE_FSUB) {
+ list = &vf->dist_parser_list;
+ TAILQ_INSERT_HEAD(list, parser_node, node);
} else {
return -EINVAL;
}
+DONE:
return 0;
}
@@ -1902,7 +1916,8 @@ iavf_unregister_parser(struct iavf_flow_parser *parser,
if (parser->engine->type == IAVF_FLOW_ENGINE_HASH)
list = &vf->rss_parser_list;
- else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR)
+ else if ((parser->engine->type == IAVF_FLOW_ENGINE_FDIR) ||
+ (parser->engine->type == IAVF_FLOW_ENGINE_FSUB))
list = &vf->dist_parser_list;
if (list == NULL)
@@ -480,6 +480,7 @@ enum iavf_flow_engine_type {
IAVF_FLOW_ENGINE_IPSEC_CRYPTO,
IAVF_FLOW_ENGINE_FDIR,
IAVF_FLOW_ENGINE_HASH,
+ IAVF_FLOW_ENGINE_FSUB,
IAVF_FLOW_ENGINE_MAX,
};
@@ -502,6 +502,7 @@ iavf_get_vf_resource(struct iavf_adapter *adapter)
VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC |
VIRTCHNL_VF_OFFLOAD_FDIR_PF |
VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF |
+ VIRTCHNL_VF_OFFLOAD_FSUB_PF |
VIRTCHNL_VF_OFFLOAD_REQ_QUEUES |
VIRTCHNL_VF_OFFLOAD_CRC |
VIRTCHNL_VF_OFFLOAD_VLAN_V2 |
@@ -16,6 +16,7 @@ sources = files(
'iavf_hash.c',
'iavf_tm.c',
'iavf_ipsec_crypto.c',
+ 'iavf_fsub.c',
)
if arch_subdir == 'x86'