+static int
+sfc_flow_query(struct rte_eth_dev *dev,
+ struct rte_flow *flow,
+ const struct rte_flow_action *action,
+ void *data,
+ struct rte_flow_error *error)
+{
+ struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
+ const struct sfc_flow_ops_by_spec *ops;
+ int ret;
+
+ sfc_adapter_lock(sa);
+
+ ops = sfc_flow_get_ops_by_spec(flow);
+ if (ops == NULL || ops->query == NULL) {
+ ret = rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
+ "No backend to handle this flow");
+ goto fail_no_backend;
+ }
+
+ if (sa->state != SFC_ETHDEV_STARTED) {
+ ret = rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
+ "Can't query the flow: the adapter is not started");
+ goto fail_not_started;
+ }
+
+ ret = ops->query(dev, flow, action, data, error);
+ if (ret != 0)
+ goto fail_query;
+
+ sfc_adapter_unlock(sa);
+
+ return 0;
+
+fail_query:
+fail_not_started:
+fail_no_backend:
+ sfc_adapter_unlock(sa);
+ return ret;
+}
+