static int iavf_flow_destroy(struct rte_eth_dev *dev,
struct rte_flow *flow,
struct rte_flow_error *error);
-static int iavf_flow_flush(struct rte_eth_dev *dev,
- struct rte_flow_error *error);
static int iavf_flow_query(struct rte_eth_dev *dev,
struct rte_flow *flow,
const struct rte_flow_action *actions,
*engine = iavf_parse_engine(ad, flow, &vf->rss_parser_list, pattern,
actions, error);
- if (*engine != NULL)
+ if (*engine)
return 0;
*engine = iavf_parse_engine(ad, flow, &vf->dist_parser_list, pattern,
actions, error);
- if (*engine == NULL)
- return -EINVAL;
+ if (!*engine) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+ "Failed to create parser engine.");
+ return -rte_errno;
+ }
return 0;
}
return flow;
}
+static bool
+iavf_flow_is_valid(struct rte_flow *flow)
+{
+ struct iavf_flow_engine *engine;
+ void *temp;
+
+ if (flow && flow->engine) {
+ TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
+ if (engine == flow->engine)
+ return true;
+ }
+ }
+
+ return false;
+}
+
static int
iavf_flow_destroy(struct rte_eth_dev *dev,
struct rte_flow *flow,
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
int ret = 0;
- if (!flow || !flow->engine || !flow->engine->destroy) {
+ if (!iavf_flow_is_valid(flow) || !flow->engine->destroy) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_HANDLE,
- NULL, "Invalid flow");
+ NULL, "Invalid flow destroy");
return -rte_errno;
}
return ret;
}
-static int
+int
iavf_flow_flush(struct rte_eth_dev *dev,
struct rte_flow_error *error)
{
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
struct rte_flow_query_count *count = data;
- if (!flow || !flow->engine || !flow->engine->query_count) {
+ if (!iavf_flow_is_valid(flow) || !flow->engine->query_count) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_HANDLE,
- NULL, "Invalid flow");
+ NULL, "Invalid flow query");
return -rte_errno;
}