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;
}
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;
}
};
static int
-iavf_hash_default_set(struct iavf_adapter *ad)
+iavf_hash_default_set(struct iavf_adapter *ad, bool add)
{
struct virtchnl_rss_cfg *rss_cfg;
uint16_t i;
rss_cfg->proto_hdrs = *iavf_hash_default_hdrs[i];
rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
- ret = iavf_add_del_rss_cfg(ad, rss_cfg, true);
+ ret = iavf_add_del_rss_cfg(ad, rss_cfg, add);
if (ret) {
- PMD_DRV_LOG(ERR, "fail to add RSS configure");
+ PMD_DRV_LOG(ERR, "fail to %s RSS configure",
+ add ? "add" : "delete");
rte_free(rss_cfg);
return ret;
}
return ret;
}
- ret = iavf_hash_default_set(ad);
+ ret = iavf_hash_default_set(ad, true);
if (ret) {
PMD_DRV_LOG(ERR, "fail to set default RSS");
iavf_unregister_parser(parser, ad);
static void
iavf_hash_uninit(struct iavf_adapter *ad)
{
+ if (iavf_hash_default_set(ad, false))
+ PMD_DRV_LOG(ERR, "fail to delete default RSS");
+
iavf_unregister_parser(&iavf_hash_parser, ad);
}