@@ -1014,6 +1014,70 @@ int flow_nic_set_hasher_fields(struct flow_nic_dev *ndev, int hsh_idx,
return profile_inline_ops->flow_nic_set_hasher_fields_inline(ndev, hsh_idx, rss_conf);
}
+static int flow_get_aged_flows(struct flow_eth_dev *dev,
+ uint16_t caller_id,
+ void **context,
+ uint32_t nb_contexts,
+ struct rte_flow_error *error)
+{
+ const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops();
+
+ if (profile_inline_ops == NULL) {
+ NT_LOG_DBGX(ERR, FILTER, "profile_inline_ops uninitialized");
+ return -1;
+ }
+
+ if (nb_contexts > 0 && !context) {
+ error->type = RTE_FLOW_ERROR_TYPE_UNSPECIFIED;
+ error->message = "rte_flow_get_aged_flows - empty context";
+ return -1;
+ }
+
+ return profile_inline_ops->flow_get_aged_flows_profile_inline(dev, caller_id, context,
+ nb_contexts, error);
+}
+
+static int flow_info_get(struct flow_eth_dev *dev, uint8_t caller_id,
+ struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info,
+ struct rte_flow_error *error)
+{
+ (void)dev;
+ (void)caller_id;
+ (void)port_info;
+ (void)queue_info;
+ (void)error;
+
+ const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops();
+
+ if (profile_inline_ops == NULL) {
+ NT_LOG_DBGX(ERR, FILTER, "profile_inline module uninitialized");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int flow_configure(struct flow_eth_dev *dev, uint8_t caller_id,
+ const struct rte_flow_port_attr *port_attr, uint16_t nb_queue,
+ const struct rte_flow_queue_attr *queue_attr[], struct rte_flow_error *error)
+{
+ (void)dev;
+ (void)caller_id;
+ (void)port_attr;
+ (void)queue_attr;
+ (void)nb_queue;
+ (void)error;
+
+ const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops();
+
+ if (profile_inline_ops == NULL) {
+ NT_LOG_DBGX(ERR, FILTER, "profile_inline module uninitialized");
+ return -1;
+ }
+
+ return 0;
+}
+
int flow_get_flm_stats(struct flow_nic_dev *ndev, uint64_t *data, uint64_t size)
{
const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops();
@@ -1042,6 +1106,13 @@ static const struct flow_filter_ops ops = {
.flow_flush = flow_flush,
.flow_dev_dump = flow_dev_dump,
.flow_get_flm_stats = flow_get_flm_stats,
+ .flow_get_aged_flows = flow_get_aged_flows,
+
+ /*
+ * NT Flow asynchronous operations API
+ */
+ .flow_info_get = flow_info_get,
+ .flow_configure = flow_configure,
/*
* Other
@@ -731,6 +731,91 @@ static int eth_flow_dev_dump(struct rte_eth_dev *eth_dev,
return res;
}
+static int eth_flow_get_aged_flows(struct rte_eth_dev *eth_dev,
+ void **context,
+ uint32_t nb_contexts,
+ struct rte_flow_error *error)
+{
+ const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops();
+
+ if (flow_filter_ops == NULL) {
+ NT_LOG_DBGX(ERR, NTNIC, "flow_filter module uninitialized");
+ return -1;
+ }
+
+ struct pmd_internals *internals = (struct pmd_internals *)eth_dev->data->dev_private;
+
+ static struct rte_flow_error flow_error = {
+ .type = RTE_FLOW_ERROR_TYPE_NONE,
+ .message = "none" };
+
+ uint16_t caller_id = get_caller_id(eth_dev->data->port_id);
+
+ int res = flow_filter_ops->flow_get_aged_flows(internals->flw_dev, caller_id, context,
+ nb_contexts, &flow_error);
+
+ convert_error(error, &flow_error);
+ return res;
+}
+
+/*
+ * NT Flow asynchronous operations API
+ */
+
+static int eth_flow_info_get(struct rte_eth_dev *dev, struct rte_flow_port_info *port_info,
+ struct rte_flow_queue_info *queue_info, struct rte_flow_error *error)
+{
+ const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops();
+
+ if (flow_filter_ops == NULL) {
+ NT_LOG_DBGX(ERR, FILTER, "flow_filter module uninitialized");
+ return -1;
+ }
+
+ struct pmd_internals *internals = dev->data->dev_private;
+
+ static struct rte_flow_error flow_error = {
+ .type = RTE_FLOW_ERROR_TYPE_NONE,
+ .message = "none" };
+
+ int res = flow_filter_ops->flow_info_get(internals->flw_dev,
+ get_caller_id(dev->data->port_id),
+ (struct rte_flow_port_info *)port_info,
+ (struct rte_flow_queue_info *)queue_info,
+ &flow_error);
+
+ convert_error(error, &flow_error);
+ return res;
+}
+
+static int eth_flow_configure(struct rte_eth_dev *dev, const struct rte_flow_port_attr *port_attr,
+ uint16_t nb_queue, const struct rte_flow_queue_attr *queue_attr[],
+ struct rte_flow_error *error)
+{
+ const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops();
+
+ if (flow_filter_ops == NULL) {
+ NT_LOG_DBGX(ERR, FILTER, "flow_filter module uninitialized");
+ return -1;
+ }
+
+ struct pmd_internals *internals = dev->data->dev_private;
+
+ static struct rte_flow_error flow_error = {
+ .type = RTE_FLOW_ERROR_TYPE_NONE,
+ .message = "none" };
+
+ int res = flow_filter_ops->flow_configure(internals->flw_dev,
+ get_caller_id(dev->data->port_id),
+ (const struct rte_flow_port_attr *)port_attr,
+ nb_queue,
+ (const struct rte_flow_queue_attr **)queue_attr,
+ &flow_error);
+
+ convert_error(error, &flow_error);
+ return res;
+}
+
static int poll_statistics(struct pmd_internals *internals)
{
int flow;
@@ -857,6 +942,9 @@ static const struct rte_flow_ops dev_flow_ops = {
.destroy = eth_flow_destroy,
.flush = eth_flow_flush,
.dev_dump = eth_flow_dev_dump,
+ .get_aged_flows = eth_flow_get_aged_flows,
+ .info_get = eth_flow_info_get,
+ .configure = eth_flow_configure,
};
void dev_flow_init(void)
@@ -286,6 +286,12 @@ struct profile_inline_ops {
FILE *file,
struct rte_flow_error *error);
+ int (*flow_get_aged_flows_profile_inline)(struct flow_eth_dev *dev,
+ uint16_t caller_id,
+ void **context,
+ uint32_t nb_contexts,
+ struct rte_flow_error *error);
+
int (*flow_nic_set_hasher_fields_inline)(struct flow_nic_dev *ndev,
int hsh_idx,
struct nt_eth_rss_conf rss_conf);
@@ -355,6 +361,21 @@ struct flow_filter_ops {
int (*flow_nic_set_hasher_fields)(struct flow_nic_dev *ndev, int hsh_idx,
struct nt_eth_rss_conf rss_conf);
int (*hw_mod_hsh_rcp_flush)(struct flow_api_backend_s *be, int start_idx, int count);
+
+ int (*flow_get_aged_flows)(struct flow_eth_dev *dev,
+ uint16_t caller_id,
+ void **context,
+ uint32_t nb_contexts,
+ struct rte_flow_error *error);
+
+ int (*flow_info_get)(struct flow_eth_dev *dev, uint8_t caller_id,
+ struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info,
+ struct rte_flow_error *error);
+
+ int (*flow_configure)(struct flow_eth_dev *dev, uint8_t caller_id,
+ const struct rte_flow_port_attr *port_attr, uint16_t nb_queue,
+ const struct rte_flow_queue_attr *queue_attr[],
+ struct rte_flow_error *error);
};
void register_dev_flow_ops(const struct rte_flow_ops *ops);