Add API mlx5_flow_dump_rule to support the feature. Modify mlx5_socket since one extra arg flow_ptr is added.
Signed-off-by: Haifei Luo <haif...@nvidia.com> --- drivers/net/mlx5/linux/mlx5_socket.c | 27 ++++++++++++++++++------- drivers/net/mlx5/mlx5.h | 3 +++ drivers/net/mlx5/mlx5_flow.c | 38 ++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_socket.c b/drivers/net/mlx5/linux/mlx5_socket.c index 1938453..88ca8e1 100644 --- a/drivers/net/mlx5/linux/mlx5_socket.c +++ b/drivers/net/mlx5/linux/mlx5_socket.c @@ -32,12 +32,15 @@ mlx5_pmd_socket_handle(void *cb __rte_unused) { int conn_sock; - int ret; + int ret, j; struct cmsghdr *cmsg = NULL; - int data; + #define LENGTH 9 + /*The first byte for port_id and the rest for flowptr.*/ + int data[LENGTH]; + uint64_t flow_ptr = 0; char buf[CMSG_SPACE(sizeof(int))] = { 0 }; struct iovec io = { - .iov_base = &data, + .iov_base = &data[0], .iov_len = sizeof(data), }; struct msghdr msg = { @@ -50,7 +53,9 @@ int fd; FILE *file = NULL; struct rte_eth_dev *dev; + struct rte_flow_error err; + memset(data, 0, sizeof(data)); /* Accept the connection from the client. */ conn_sock = accept(server_socket, NULL, NULL); if (conn_sock < 0) { @@ -88,15 +93,23 @@ } /* Dump flow. */ dev = &rte_eth_devices[port_id]; - ret = mlx5_flow_dev_dump(dev, file, NULL); + /*The first byte in data for port_id and the following 8 for flowptr*/ + for (j = 1; j < LENGTH; j++) + flow_ptr = (flow_ptr << 8) + data[j]; + if (flow_ptr == 0) + ret = mlx5_flow_dev_dump(dev, file, NULL); + else + ret = mlx5_flow_dump_rule(dev, + (struct rte_flow *)((uintptr_t)flow_ptr), file, &err); + /* Set-up the ancillary data and reply. */ msg.msg_controllen = 0; msg.msg_control = NULL; msg.msg_iovlen = 1; msg.msg_iov = &io; - data = -ret; - io.iov_len = sizeof(data); - io.iov_base = &data; + data[0] = -ret; + io.iov_len = sizeof(data[0]); + io.iov_base = &data[0]; do { ret = sendmsg(conn_sock, &msg, 0); } while (ret < 0 && errno == EINTR); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index a281fd2..c5d4cee 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1222,6 +1222,9 @@ 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_dump_rule(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); diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index ab5be3d..6d031ba 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -635,6 +635,7 @@ enum mlx5_expansion { .isolate = mlx5_flow_isolate, .query = mlx5_flow_query, .dev_dump = mlx5_flow_dev_dump, + .dev_single_dump = mlx5_flow_dump_rule, .get_aged_flows = mlx5_flow_get_aged_flows, .shared_action_create = mlx5_shared_action_create, .shared_action_destroy = mlx5_shared_action_destroy, @@ -7200,6 +7201,43 @@ struct mlx5_meter_domains_infos * sh->tx_domain, file); } +int +mlx5_flow_dump_rule(struct rte_eth_dev *dev, struct rte_flow *flow_idx, + FILE *file, + struct rte_flow_error *error __rte_unused) +{ + struct mlx5_priv *priv = dev->data->dev_private; + uint32_t handle_idx; + int ret; + struct mlx5_flow_handle *dh; + struct rte_flow *flow = mlx5_ipool_get(priv->sh->ipool + [MLX5_IPOOL_RTE_FLOW], (uintptr_t)(void *)flow_idx); + + if (!priv->config.dv_flow_en) { + if (fputs("device dv flow disabled\n", file) <= 0) + return -errno; + return -ENOTSUP; + } + + if (!flow) + return -ENOENT; + handle_idx = flow->dev_handles; + while (handle_idx) { + dh = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], + handle_idx); + if (!dh) + return -ENOENT; + if (dh->drv_flow) { + ret = mlx5_devx_cmd_flow_single_dump(dh->drv_flow, + file); + if (ret) + return -ENOENT; + } + handle_idx = dh->next.next; + } + return 0; +} + /** * Get aged-out flows. * -- 1.8.3.1