diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h index 9446a721..45474f13 100644 --- a/rdma/include/uapi/rdma/rdma_netlink.h +++ b/rdma/include/uapi/rdma/rdma_netlink.h @@ -388,6 +388,10 @@ enum rdma_nldev_attr { RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY, /* u32 */ RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY, /* u32 */ + /* Netdev information for relevant protocols, like RoCE and iWARP */ + RDMA_NLDEV_ATTR_NDEV_INDEX, /* u32 */ + RDMA_NLDEV_ATTR_NDEV_NAME, /* string */ + RDMA_NLDEV_ATTR_MAX }; #endif /* _RDMA_NETLINK_H */ diff --git a/rdma/link.c b/rdma/link.c index 66bcd50e..7e914c87 100644 --- a/rdma/link.c +++ b/rdma/link.c @@ -205,6 +205,26 @@ static void link_print_phys_state(struct rd *rd, struct nlattr **tb) pr_out("physical_state %s ", phys_state_to_str(phys_state)); } +static void link_print_netdev(struct rd *rd, struct nlattr **tb) +{ + const char *netdev_name; + uint32_t idx; + + if (!tb[RDMA_NLDEV_ATTR_NDEV_NAME] || !tb[RDMA_NLDEV_ATTR_NDEV_INDEX]) + return; + + netdev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_NDEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_NDEV_INDEX]); + if (rd->json_output) { + jsonw_string_field(rd->jw, "netdev", netdev_name); + jsonw_uint_field(rd->jw, "netdev_index", idx); + } else { + pr_out("netdev %s ", netdev_name); + if (rd->show_details) + pr_out("netdev_index %u ", idx); + } +} + static int link_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -241,6 +261,7 @@ static int link_parse_cb(const struct nlmsghdr *nlh, void *data) link_print_lmc(rd, tb); link_print_state(rd, tb); link_print_phys_state(rd, tb); + link_print_netdev(rd, tb); if (rd->show_details) link_print_caps(rd, tb); diff --git a/rdma/utils.c b/rdma/utils.c index 5c1e736a..49c967f3 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -391,6 +391,8 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_RES_LKEY] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_RES_IOVA] = MNL_TYPE_U64, [RDMA_NLDEV_ATTR_RES_MRLEN] = MNL_TYPE_U64, + [RDMA_NLDEV_ATTR_NDEV_INDEX] = MNL_TYPE_U32, + [RDMA_NLDEV_ATTR_NDEV_NAME] = MNL_TYPE_NUL_STRING, }; int rd_attr_cb(const struct nlattr *attr, void *data)