HI Thomas,
#1, okay. Will change the place for comments.
#2, yes, I can change the description.
Thank you so much.
-----Original Message-----
From: Thomas Monjalon <thomas@monjalon.net>
Sent: Wednesday, April 14, 2021 6:33 PM
To: Haifei Luo <haifeil@nvidia.com>
Cc: dev@dpdk.org; Ori Kam <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Raslan Darawsheh <rasland@nvidia.com>; Xueming(Steven) Li <xuemingl@nvidia.com>; Haifei Luo <haifeil@nvidia.com>; ajit.khaparde@broadcom.com; Xiaoyun Li <xiaoyun.li@intel.com>; Matan Azrad <matan@nvidia.com>; Shahaf Shuler <shahafs@nvidia.com>; Jerin Jacob <jerinj@marvell.com>; Nithin Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar K <kirankumark@marvell.com>; Ferruh Yigit <ferruh.yigit@intel.com>; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Subject: Re: [PATCH v5 1/3] ethdev: dump single flow rule
External email: Use caution opening links or attachments
14/04/2021 11:51, Haifei Luo:
> Previous implementations support dump all the flows. Add new arg
> rte_flow in rte_flow_dev_dump to dump one flow.
Rewording:
The API supported dumping all the flow rules.
A parameter is added to allow dumping a specific flow rule.
> --- a/doc/guides/nics/mlx5.rst
> +++ b/doc/guides/nics/mlx5.rst
> @@ -1837,13 +1837,16 @@ all flows with assistance of external tools.
>
> .. code-block:: console
>
> - testpmd> flow dump <port> <output_file>
> + To dump all flows:
> + testpmd> flow dump <port> all <output_file>
> + and dump one flow:
> + testpmd> flow dump <port> rule <rule_id> <output_file>
Comments should not be in the code block.
> --- a/lib/librte_ethdev/rte_flow.h
> +++ b/lib/librte_ethdev/rte_flow.h
> @@ -3232,6 +3232,8 @@ enum rte_flow_conv_op {
> *
> * @param[in] port_id
> * The port identifier of the Ethernet device.
> + * @param[in] flow
> + * The pointer of flow rule to dump. Dump all rules if NULL.
Sorry for not making it explicit,
when fixing "rte flow" I thought you would replace it also above in the existing function description.
I think "The pointer of" is useless in general but I'm OK if you want to keep it.
To Ferruh and Andrew: we could make the ethdev API description lighter and more pleasant to read.
@@ -1932,7 +1932,7 @@ struct rte_flow_shared_action *
return -errno;
}
}
- ret = rte_flow_dev_dump(port_id, file, &error);
+ ret = rte_flow_dev_dump(port_id, NULL, file, &error);
if (ret) {
port_flow_complain(&error);
printf("Failed to dump flow: %s\n", strerror(-ret));
@@ -1837,13 +1837,16 @@ all flows with assistance of external tools.
.. code-block:: console
- testpmd> flow dump <port> <output_file>
+ To dump all flows:
+ testpmd> flow dump <port> all <output_file>
+ and dump one flow:
+ testpmd> flow dump <port> rule <rule_id> <output_file>
- call rte_flow_dev_dump api:
.. code-block:: console
- rte_flow_dev_dump(port, file, NULL);
+ rte_flow_dev_dump(port, flow, file, NULL);
#. Dump human-readable flows from raw file:
@@ -1851,4 +1854,4 @@ all flows with assistance of external tools.
.. code-block:: console
- mlx_steering_dump.py -f <output_file>
+ mlx_steering_dump.py -f <output_file> -flowptr <flow_ptr>
@@ -84,7 +84,7 @@
}
/* Dump flow. */
dev = &rte_eth_devices[port_id];
- ret = mlx5_flow_dev_dump(dev, file, NULL);
+ ret = mlx5_flow_dev_dump(dev, NULL, file, NULL);
/* Set-up the ancillary data and reply. */
msg.msg_controllen = 0;
msg.msg_control = NULL;
@@ -1245,8 +1245,8 @@ void mlx5_flow_async_pool_query_handle(struct mlx5_dev_ctx_shared *sh,
void mlx5_counter_free(struct rte_eth_dev *dev, uint32_t cnt);
int mlx5_counter_query(struct rte_eth_dev *dev, uint32_t cnt,
bool clear, uint64_t *pkts, uint64_t *bytes);
-int mlx5_flow_dev_dump(struct rte_eth_dev *dev, FILE *file,
- struct rte_flow_error *error);
+int mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow,
+ FILE *file, struct rte_flow_error *error);
void mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev);
int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts,
uint32_t nb_contexts, struct rte_flow_error *error);
@@ -7154,7 +7154,7 @@ struct mlx5_meter_domains_infos *
* 0 on success, a nagative value otherwise.
*/
int
-mlx5_flow_dev_dump(struct rte_eth_dev *dev,
+mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow_idx,
FILE *file,
struct rte_flow_error *error __rte_unused)
{
@@ -7166,8 +7166,11 @@ struct mlx5_meter_domains_infos *
return -errno;
return -ENOTSUP;
}
- return mlx5_devx_cmd_flow_dump(sh->fdb_domain, sh->rx_domain,
- sh->tx_domain, file);
+
+ if (!flow_idx)
+ return mlx5_devx_cmd_flow_dump(sh->fdb_domain,
+ sh->rx_domain, sh->tx_domain, file);
+ return -ENOTSUP;
}
/**
@@ -807,7 +807,7 @@
static int
otx2_flow_dev_dump(struct rte_eth_dev *dev,
- FILE *file,
+ struct rte_flow *flow, FILE *file,
struct rte_flow_error *error)
{
struct otx2_eth_dev *hw = dev->data->dev_private;
@@ -822,6 +822,13 @@
"Invalid file");
return -EINVAL;
}
+ if (flow != NULL) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_HANDLE,
+ NULL,
+ "Invalid argument");
+ return -EINVAL;
+ }
max_prio = hw->npc_flow.flow_max_priority;
@@ -1027,7 +1027,8 @@ enum rte_flow_conv_item_spec_type {
}
int
-rte_flow_dev_dump(uint16_t port_id, FILE *file, struct rte_flow_error *error)
+rte_flow_dev_dump(uint16_t port_id, struct rte_flow *flow,
+ FILE *file, 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);
@@ -1037,7 +1038,7 @@ enum rte_flow_conv_item_spec_type {
return -rte_errno;
if (likely(!!ops->dev_dump)) {
fts_enter(dev);
- ret = ops->dev_dump(dev, file, error);
+ ret = ops->dev_dump(dev, flow, file, error);
fts_exit(dev);
return flow_err(port_id, ret, error);
}
@@ -3232,6 +3232,8 @@ enum rte_flow_conv_op {
*
* @param[in] port_id
* The port identifier of the Ethernet device.
+ * @param[in] flow
+ * The pointer of flow rule to dump. Dump all rules if NULL.
* @param[in] file
* A pointer to a file for output.
* @param[out] error
@@ -3242,7 +3244,8 @@ enum rte_flow_conv_op {
*/
__rte_experimental
int
-rte_flow_dev_dump(uint16_t port_id, FILE *file, struct rte_flow_error *error);
+rte_flow_dev_dump(uint16_t port_id, struct rte_flow *flow,
+ FILE *file, struct rte_flow_error *error);
/**
* Check if mbuf dynamic field for metadata is registered.
@@ -75,6 +75,7 @@ struct rte_flow_ops {
/** See rte_flow_dev_dump(). */
int (*dev_dump)
(struct rte_eth_dev *dev,
+ struct rte_flow *flow,
FILE *file,
struct rte_flow_error *error);
/** See rte_flow_get_aged_flows() */