@@ -1903,6 +1903,22 @@ RTE_TRACE_POINT(
rte_trace_point_emit_int(ret);
)
+RTE_TRACE_POINT(
+ rte_tm_trace_node_query,
+ RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t node_id,
+ uint32_t *parent_node_id, uint32_t *priority,
+ uint32_t *weight, uint32_t *level_id,
+ struct rte_tm_node_params *params, int ret),
+ rte_trace_point_emit_u16(port_id);
+ rte_trace_point_emit_u32(node_id);
+ rte_trace_point_emit_ptr(parent_node_id);
+ rte_trace_point_emit_ptr(priority);
+ rte_trace_point_emit_ptr(weight);
+ rte_trace_point_emit_ptr(level_id);
+ rte_trace_point_emit_ptr(params);
+ rte_trace_point_emit_int(ret);
+)
+
RTE_TRACE_POINT(
rte_tm_trace_node_delete,
RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t node_id, int ret),
@@ -694,6 +694,9 @@ RTE_TRACE_POINT_REGISTER(rte_tm_trace_mark_vlan_dei,
RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_add,
lib.ethdev.tm.node_add)
+RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_query,
+ lib.ethdev.tm.node_query)
+
RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_capabilities_get,
lib.ethdev.tm.node_capabilities_get)
@@ -301,6 +301,31 @@ int rte_tm_node_add(uint16_t port_id,
return ret;
}
+int rte_tm_node_query(uint16_t port_id,
+ uint32_t node_id,
+ uint32_t *parent_node_id,
+ uint32_t *priority,
+ uint32_t *weight,
+ uint32_t *level_id,
+ struct rte_tm_node_params *params,
+ struct rte_tm_error *error)
+{
+ struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+ int ret;
+
+ if (dev == NULL)
+ return -EINVAL;
+
+ ret = RTE_TM_FUNC(port_id, node_query)(dev,
+ node_id, parent_node_id, priority, weight, level_id,
+ params, error);
+
+ rte_tm_trace_node_query(port_id, node_id, parent_node_id, priority,
+ weight, level_id, params, ret);
+
+ return ret;
+}
+
/* Delete node from traffic manager hierarchy */
int rte_tm_node_delete(uint16_t port_id,
uint32_t node_id,
@@ -1599,6 +1599,54 @@ rte_tm_node_add(uint16_t port_id,
const struct rte_tm_node_params *params,
struct rte_tm_error *error);
+/**
+ * Return information about a traffic management node
+ *
+ * Return information about a hierarchy node, using the same format of parameters
+ * as was passed to the rte_rm_node_add() function.
+ * Each of the "out" parameters pointers (except error) may be passed as NULL if the
+ * information is not needed by the caller. For example, to one may check if a node id
+ * is in use by:
+ *
+ * struct rte_tm_error error;
+ * int ret = rte_tm_node_query(port, node_id, NULL, NULL, NULL, NULL, NULL, &error);
+ * if (ret == ENOENT) ...
+ *
+ * @param[in] port_id
+ * The port identifier of the Ethernet device.
+ * @param[in] node_id
+ * Node ID. Should be a valid node id.
+ * @param[out] parent_node_id
+ * Parent node ID.
+ * @param[out] priority
+ * Node priority. The highest node priority is zero. Used by the SP algorithm
+ * running on the parent of the current node for scheduling this child node.
+ * @param[out] weight
+ * Node weight. The node weight is relative to the weight sum of all siblings
+ * that have the same priority. The lowest weight is one. Used by the WFQ
+ * algorithm running on the parent of the current node for scheduling this
+ * child node.
+ * @param[out] level_id
+ * The node level in the scheduler hierarchy.
+ * @param[out] params
+ * Node parameters, as would be used when creating the node.
+ * @param[out] error
+ * Error details. Filled in only on error, when not NULL.
+ * @return
+ * 0 on success, non-zero error code otherwise.
+ * -EINVAL - port or node id value is invalid
+ * -ENOENT - no node exists with the provided id
+ */
+int
+rte_tm_node_query(uint16_t port_id,
+ uint32_t node_id,
+ uint32_t *parent_node_id,
+ uint32_t *priority,
+ uint32_t *weight,
+ uint32_t *level_id,
+ struct rte_tm_node_params *params,
+ struct rte_tm_error *error);
+
/**
* Traffic manager node delete
*
@@ -119,6 +119,16 @@ typedef int (*rte_tm_node_resume_t)(struct rte_eth_dev *dev,
uint32_t node_id,
struct rte_tm_error *error);
+/** @internal Traffic manager node query */
+typedef int (*rte_tm_node_query_t)(const struct rte_eth_dev *dev,
+ uint32_t node_id,
+ uint32_t *parent_node_id,
+ uint32_t *priority,
+ uint32_t *weight,
+ uint32_t *level_id,
+ struct rte_tm_node_params *params,
+ struct rte_tm_error *error);
+
/** @internal Traffic manager hierarchy commit */
typedef int (*rte_tm_hierarchy_commit_t)(struct rte_eth_dev *dev,
int clear_on_fail,
@@ -248,6 +258,8 @@ struct rte_tm_ops {
rte_tm_node_suspend_t node_suspend;
/** Traffic manager node resume */
rte_tm_node_resume_t node_resume;
+ /** Traffic manager node resume */
+ rte_tm_node_query_t node_query;
/** Traffic manager hierarchy commit */
rte_tm_hierarchy_commit_t hierarchy_commit;