@@ -3669,6 +3669,26 @@ Enqueueing a flow rule creation operation is similar to simple creation.
A valid handle in case of success is returned. It must be destroyed later
by calling ``rte_flow_async_destroy()`` even if the rule is rejected by HW.
+Enqueue creation by index operation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Enqueueing a flow rule creation operation to insert a rule at a table index.
+
+.. code-block:: c
+
+ struct rte_flow *
+ rte_flow_async_create_by_index(uint16_t port_id,
+ uint32_t queue_id,
+ const struct rte_flow_op_attr *op_attr,
+ struct rte_flow_template_table *template_table,
+ uint32_t rule_index,
+ const struct rte_flow_action actions[],
+ uint8_t actions_template_index,
+ void *user_data,
+ struct rte_flow_error *error);
+
+A valid handle in case of success is returned. It must be destroyed later
+by calling ``rte_flow_async_destroy()`` even if the rule is rejected by HW.
+
Enqueue destruction operation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -69,6 +69,13 @@ New Features
``rte_event_dev_config::nb_single_link_event_port_queues`` parameter
required for eth_rx, eth_tx, crypto and timer eventdev adapters.
+* **Added index-based rules insertion in flow API.**
+
+ * Added ``rte_flow_table_insertion_type`` to allow the creation
+ of index-based template tables in addition to pattern-based tables.
+ * Introduced new function ``rte_flow_async_create_by_index()``
+ to insert rules by index into index-based template tables.
+
Removed Items
-------------
@@ -1765,6 +1765,30 @@ rte_flow_async_create(uint16_t port_id,
return flow;
}
+struct rte_flow *
+rte_flow_async_create_by_index(uint16_t port_id,
+ uint32_t queue_id,
+ const struct rte_flow_op_attr *op_attr,
+ struct rte_flow_template_table *template_table,
+ uint32_t rule_index,
+ const struct rte_flow_action actions[],
+ uint8_t actions_template_index,
+ void *user_data,
+ struct rte_flow_error *error)
+{
+ struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+ const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+ struct rte_flow *flow;
+
+ flow = ops->async_create_by_index(dev, queue_id,
+ op_attr, template_table, rule_index,
+ actions, actions_template_index,
+ user_data, error);
+ if (flow == NULL)
+ flow_err(port_id, -rte_errno, error);
+ return flow;
+}
+
int
rte_flow_async_destroy(uint16_t port_id,
uint32_t queue_id,
@@ -5187,6 +5187,23 @@ rte_flow_actions_template_destroy(uint16_t port_id,
*/
struct rte_flow_template_table;
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Template table flow rules insertion type.
+ */
+enum rte_flow_table_insertion_type {
+ /**
+ * Pattern-based insertion.
+ */
+ RTE_FLOW_TABLE_INSERTION_TYPE_PATTERN,
+ /**
+ * Index-based insertion.
+ */
+ RTE_FLOW_TABLE_INSERTION_TYPE_INDEX,
+};
+
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
@@ -5202,6 +5219,10 @@ struct rte_flow_template_table_attr {
* Maximum number of flow rules that this table holds.
*/
uint32_t nb_flows;
+ /**
+ * Insertion type for flow rules.
+ */
+ enum rte_flow_table_insertion_type insertion_type;
};
/**
@@ -5336,6 +5357,50 @@ rte_flow_async_create(uint16_t port_id,
void *user_data,
struct rte_flow_error *error);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enqueue rule creation operation.
+ *
+ * @param port_id
+ * Port identifier of Ethernet device.
+ * @param queue_id
+ * Flow queue used to insert the rule.
+ * @param[in] op_attr
+ * Rule creation operation attributes.
+ * @param[in] template_table
+ * Template table to select templates from.
+ * @param[in] rule_index
+ * Rule index in the table.
+ * @param[in] actions
+ * List of actions to be used.
+ * The list order should match the order in the actions template.
+ * @param[in] actions_template_index
+ * Actions template index in the table.
+ * @param[in] user_data
+ * The user data that will be returned on the completion events.
+ * @param[out] error
+ * Perform verbose error reporting if not NULL.
+ * PMDs initialize this structure in case of error only.
+ *
+ * @return
+ * Handle on success, NULL otherwise and rte_errno is set.
+ * The rule handle doesn't mean that the rule has been populated.
+ * Only completion result indicates that if there was success or failure.
+ */
+__rte_experimental
+struct rte_flow *
+rte_flow_async_create_by_index(uint16_t port_id,
+ uint32_t queue_id,
+ const struct rte_flow_op_attr *op_attr,
+ struct rte_flow_template_table *template_table,
+ uint32_t rule_index,
+ const struct rte_flow_action actions[],
+ uint8_t actions_template_index,
+ void *user_data,
+ struct rte_flow_error *error);
+
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
@@ -221,6 +221,17 @@ struct rte_flow_ops {
uint8_t actions_template_index,
void *user_data,
struct rte_flow_error *err);
+ /** See rte_flow_async_create_by_index() */
+ struct rte_flow *(*async_create_by_index)
+ (struct rte_eth_dev *dev,
+ uint32_t queue_id,
+ const struct rte_flow_op_attr *op_attr,
+ struct rte_flow_template_table *template_table,
+ uint32_t rule_index,
+ const struct rte_flow_action actions[],
+ uint8_t actions_template_index,
+ void *user_data,
+ struct rte_flow_error *err);
/** See rte_flow_async_destroy() */
int (*async_destroy)
(struct rte_eth_dev *dev,
@@ -298,6 +298,9 @@ EXPERIMENTAL {
rte_flow_get_q_aged_flows;
rte_mtr_meter_policy_get;
rte_mtr_meter_profile_get;
+
+ # added in 23.03
+ rte_flow_async_create_by_index;
};
INTERNAL {