The mlx5_core kernel driver creates a sysctl variable dev.mlx5_core.0.ifname: mce0
Using this the device index and interface name are obtained The interface name can be used by PMD to communicate with FreeBSD network stack Signed-off-by: Srikanth Kaka <srikant...@oneconvergence.com> Signed-off-by: Vag Singh <vag.si...@oneconvergence.com> Signed-off-by: Anand Thulasiram <av...@juniper.net> --- drivers/common/mlx5/freebsd/mlx5_common_os.c | 44 ++++++++++++++++++++ drivers/common/mlx5/freebsd/mlx5_common_os.h | 6 +++ 2 files changed, 50 insertions(+) diff --git a/drivers/common/mlx5/freebsd/mlx5_common_os.c b/drivers/common/mlx5/freebsd/mlx5_common_os.c index 9c3cd1e4e6..23370857eb 100644 --- a/drivers/common/mlx5/freebsd/mlx5_common_os.c +++ b/drivers/common/mlx5/freebsd/mlx5_common_os.c @@ -4,14 +4,58 @@ #include <unistd.h> #include <stdio.h> +#include <net/if.h> #include <sys/sysctl.h> #include <rte_errno.h> #include "mlx5_common.h" #include "mlx5_common_log.h" +#include "mlx5_common_os.h" #include "mlx5_glue.h" +/** + * Derive IB dev index from devpath + */ +int +mlx5_get_ibvindex(const char *ibdev_path) +{ + unsigned int ibv_idx; + + MLX5_ASSERT(ibdev_path); + if (sscanf(ibdev_path, "/sys/class/infiniband/mlx5_%u", + &ibv_idx) != 1) + ibv_idx = -1; + + return ibv_idx; +} + +int +mlx5_get_ifname_sysfs(const char *ibdev_path, char *ifname) +{ + char buffer[MLX5_SYSCTL_BY_NAME_SIZE]; + char name[IF_NAMESIZE]; + size_t len = IF_NAMESIZE; + unsigned int idx; + + idx = mlx5_get_ibvindex(ibdev_path); + if (idx < 0) { + rte_errno = EINVAL; + return -rte_errno; + } + + snprintf(buffer, sizeof(buffer), "dev.mlx5_core.%u.ifname", idx); + if (sysctlbyname(buffer, &name, &len, NULL, 0)) { + DRV_LOG(ERR, "port %u failed to get interface name: %s", + idx, strerror(errno)); + rte_errno = errno; + return -rte_errno; + } + strncpy(ifname, name, IF_NAMESIZE); + + return 0; +} + /** * Initialization routine for run-time dependency on rdma-core. */ diff --git a/drivers/common/mlx5/freebsd/mlx5_common_os.h b/drivers/common/mlx5/freebsd/mlx5_common_os.h index dab67ecbf0..60e7c4f21f 100644 --- a/drivers/common/mlx5/freebsd/mlx5_common_os.h +++ b/drivers/common/mlx5/freebsd/mlx5_common_os.h @@ -18,6 +18,8 @@ #include "mlx5_autoconf.h" #include "mlx5_glue.h" +#define MLX5_SYSCTL_BY_NAME_SIZE 100 + /** * Get device name. Given an ibv_device pointer - return a * pointer to the corresponding device name. @@ -287,4 +289,8 @@ mlx5_os_free(void *addr) { free(addr); } + +int +mlx5_get_ibvindex(const char *ibdev_path); + #endif /* RTE_PMD_MLX5_COMMON_OS_H_ */ -- 2.30.2