[v3] net/mlx5: fix the sysfs port name translation
Checks
Commit Message
With some OFED or upstream kernel of mlx5, the port name fetched from
"/sys/class/net/[DEV]/phys_port_name" may have a tailing "\n" as the
EOL. The sscanf() will return the scanned items number with this EOL.
In such case, the "equal to" condition is considered as false and
the function mlx5_translate_port_name() will recognize the port type
wrongly with UNKNOWN result.
The tailing carriage return character should be removed before
calling the mlx5_translate_port_name(), this was already done in the
NL message handling. In the meanwhile, the possible incorrect line
feed character is also taken into consideration.
Fixes: 654810b56828 ("common/mlx5: share Netlink commands")
Fixes: 420bbdae89f2 ("net/mlx5: fix host physical function representor naming")
Cc: stable@dpdk.org
Signed-off-by: Bing Zhao <bingz@nvidia.com>
---
drivers/net/mlx5/linux/mlx5_ethdev_os.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
Comments
From: Bing Zhao
> With some OFED or upstream kernel of mlx5, the port name fetched from
> "/sys/class/net/[DEV]/phys_port_name" may have a tailing "\n" as the EOL.
> The sscanf() will return the scanned items number with this EOL.
>
> In such case, the "equal to" condition is considered as false and the function
> mlx5_translate_port_name() will recognize the port type wrongly with
> UNKNOWN result.
>
> The tailing carriage return character should be removed before calling the
> mlx5_translate_port_name(), this was already done in the NL message
> handling. In the meanwhile, the possible incorrect line feed character is also
> taken into consideration.
>
> Fixes: 654810b56828 ("common/mlx5: share Netlink commands")
> Fixes: 420bbdae89f2 ("net/mlx5: fix host physical function representor
> naming")
> Cc: stable@dpdk.org
>
> Signed-off-by: Bing Zhao <bingz@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
Hi,
> -----Original Message-----
> From: Bing Zhao <bingz@nvidia.com>
> Sent: Thursday, March 23, 2023 12:54 PM
> To: Slava Ovsiienko <viacheslavo@nvidia.com>; Matan Azrad
> <matan@nvidia.com>; stephen@networkplumber.org
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>;
> stable@dpdk.org
> Subject: [PATCH v3] net/mlx5: fix the sysfs port name translation
>
> With some OFED or upstream kernel of mlx5, the port name fetched from
> "/sys/class/net/[DEV]/phys_port_name" may have a tailing "\n" as the
> EOL. The sscanf() will return the scanned items number with this EOL.
>
> In such case, the "equal to" condition is considered as false and
> the function mlx5_translate_port_name() will recognize the port type
> wrongly with UNKNOWN result.
>
> The tailing carriage return character should be removed before
> calling the mlx5_translate_port_name(), this was already done in the
> NL message handling. In the meanwhile, the possible incorrect line
> feed character is also taken into consideration.
>
> Fixes: 654810b56828 ("common/mlx5: share Netlink commands")
> Fixes: 420bbdae89f2 ("net/mlx5: fix host physical function representor
> naming")
> Cc: stable@dpdk.org
>
> Signed-off-by: Bing Zhao <bingz@nvidia.com>
Patch applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh
@@ -1035,7 +1035,8 @@ int
mlx5_sysfs_switch_info(unsigned int ifindex, struct mlx5_switch_info *info)
{
char ifname[IF_NAMESIZE];
- char port_name[IF_NAMESIZE];
+ char *port_name = NULL;
+ size_t port_name_size = 0;
FILE *file;
struct mlx5_switch_info data = {
.master = 0,
@@ -1048,6 +1049,7 @@ mlx5_sysfs_switch_info(unsigned int ifindex, struct mlx5_switch_info *info)
bool port_switch_id_set = false;
bool device_dir = false;
char c;
+ ssize_t line_size;
if (!if_indextoname(ifindex, ifname)) {
rte_errno = errno;
@@ -1063,8 +1065,21 @@ mlx5_sysfs_switch_info(unsigned int ifindex, struct mlx5_switch_info *info)
file = fopen(phys_port_name, "rb");
if (file != NULL) {
- if (fgets(port_name, IF_NAMESIZE, file) != NULL)
+ char *tail_nl;
+
+ line_size = getline(&port_name, &port_name_size, file);
+ if (line_size < 0) {
+ fclose(file);
+ rte_errno = errno;
+ return -rte_errno;
+ } else if (line_size > 0) {
+ /* Remove tailing newline character. */
+ tail_nl = strchr(port_name, '\n');
+ if (tail_nl)
+ *tail_nl = '\0';
mlx5_translate_port_name(port_name, &data);
+ }
+ free(port_name);
fclose(file);
}
file = fopen(phys_switch_id, "rb");