1e0aa0c61SJakub Kicinski // SPDX-License-Identifier: GPL-2.0 2e0aa0c61SJakub Kicinski #include <stdio.h> 3e0aa0c61SJakub Kicinski #include <string.h> 4e0aa0c61SJakub Kicinski 5e0aa0c61SJakub Kicinski #include <ynl.h> 6e0aa0c61SJakub Kicinski 7*db20b374SJakub Kicinski #include <kselftest_harness.h> 8*db20b374SJakub Kicinski 9e0aa0c61SJakub Kicinski #include "devlink-user.h" 10e0aa0c61SJakub Kicinski 11*db20b374SJakub Kicinski FIXTURE(devlink) 12*db20b374SJakub Kicinski { 13*db20b374SJakub Kicinski struct ynl_sock *ys; 14*db20b374SJakub Kicinski }; 15*db20b374SJakub Kicinski 16*db20b374SJakub Kicinski FIXTURE_SETUP(devlink) 17*db20b374SJakub Kicinski { 18*db20b374SJakub Kicinski self->ys = ynl_sock_create(&ynl_devlink_family, NULL); 19*db20b374SJakub Kicinski ASSERT_NE(NULL, self->ys) 20*db20b374SJakub Kicinski TH_LOG("failed to create devlink socket"); 21*db20b374SJakub Kicinski } 22*db20b374SJakub Kicinski 23*db20b374SJakub Kicinski FIXTURE_TEARDOWN(devlink) 24*db20b374SJakub Kicinski { 25*db20b374SJakub Kicinski ynl_sock_destroy(self->ys); 26*db20b374SJakub Kicinski } 27*db20b374SJakub Kicinski 28*db20b374SJakub Kicinski TEST_F(devlink, dump) 29e0aa0c61SJakub Kicinski { 30e0aa0c61SJakub Kicinski struct devlink_get_list *devs; 31e0aa0c61SJakub Kicinski 32*db20b374SJakub Kicinski devs = devlink_get_dump(self->ys); 33*db20b374SJakub Kicinski ASSERT_NE(NULL, devs) { 34*db20b374SJakub Kicinski TH_LOG("dump failed: %s", self->ys->err.msg); 35*db20b374SJakub Kicinski } 36e0aa0c61SJakub Kicinski 37*db20b374SJakub Kicinski if (ynl_dump_empty(devs)) { 38*db20b374SJakub Kicinski devlink_get_list_free(devs); 39*db20b374SJakub Kicinski SKIP(return, "no entries in dump"); 40*db20b374SJakub Kicinski } 41*db20b374SJakub Kicinski 42*db20b374SJakub Kicinski ynl_dump_foreach(devs, d) { 43*db20b374SJakub Kicinski EXPECT_TRUE((bool)d->_len.bus_name); 44*db20b374SJakub Kicinski EXPECT_TRUE((bool)d->_len.dev_name); 45*db20b374SJakub Kicinski ksft_print_msg("%s/%s\n", d->bus_name, d->dev_name); 46*db20b374SJakub Kicinski } 47*db20b374SJakub Kicinski 48*db20b374SJakub Kicinski devlink_get_list_free(devs); 49*db20b374SJakub Kicinski } 50*db20b374SJakub Kicinski 51*db20b374SJakub Kicinski TEST_F(devlink, info) 52*db20b374SJakub Kicinski { 53*db20b374SJakub Kicinski struct devlink_get_list *devs; 54*db20b374SJakub Kicinski 55*db20b374SJakub Kicinski devs = devlink_get_dump(self->ys); 56*db20b374SJakub Kicinski ASSERT_NE(NULL, devs) { 57*db20b374SJakub Kicinski TH_LOG("dump failed: %s", self->ys->err.msg); 58*db20b374SJakub Kicinski } 59*db20b374SJakub Kicinski 60*db20b374SJakub Kicinski if (ynl_dump_empty(devs)) { 61*db20b374SJakub Kicinski devlink_get_list_free(devs); 62*db20b374SJakub Kicinski SKIP(return, "no devices to query"); 63*db20b374SJakub Kicinski } 64e0aa0c61SJakub Kicinski 65e0aa0c61SJakub Kicinski ynl_dump_foreach(devs, d) { 66e0aa0c61SJakub Kicinski struct devlink_info_get_req *info_req; 67e0aa0c61SJakub Kicinski struct devlink_info_get_rsp *info_rsp; 68*db20b374SJakub Kicinski unsigned int i; 69e0aa0c61SJakub Kicinski 70*db20b374SJakub Kicinski EXPECT_TRUE((bool)d->_len.bus_name); 71*db20b374SJakub Kicinski EXPECT_TRUE((bool)d->_len.dev_name); 72*db20b374SJakub Kicinski ksft_print_msg("%s/%s:\n", d->bus_name, d->dev_name); 73e0aa0c61SJakub Kicinski 74e0aa0c61SJakub Kicinski info_req = devlink_info_get_req_alloc(); 75*db20b374SJakub Kicinski ASSERT_NE(NULL, info_req); 76e0aa0c61SJakub Kicinski devlink_info_get_req_set_bus_name(info_req, d->bus_name); 77e0aa0c61SJakub Kicinski devlink_info_get_req_set_dev_name(info_req, d->dev_name); 78e0aa0c61SJakub Kicinski 79*db20b374SJakub Kicinski info_rsp = devlink_info_get(self->ys, info_req); 80e0aa0c61SJakub Kicinski devlink_info_get_req_free(info_req); 81*db20b374SJakub Kicinski ASSERT_NE(NULL, info_rsp) { 82*db20b374SJakub Kicinski devlink_get_list_free(devs); 83*db20b374SJakub Kicinski TH_LOG("info_get failed: %s", self->ys->err.msg); 84*db20b374SJakub Kicinski } 85e0aa0c61SJakub Kicinski 86*db20b374SJakub Kicinski EXPECT_TRUE((bool)info_rsp->_len.info_driver_name); 87e0aa0c61SJakub Kicinski if (info_rsp->_len.info_driver_name) 88*db20b374SJakub Kicinski ksft_print_msg(" driver: %s\n", 89*db20b374SJakub Kicinski info_rsp->info_driver_name); 90e0aa0c61SJakub Kicinski if (info_rsp->_count.info_version_running) 91*db20b374SJakub Kicinski ksft_print_msg(" running fw:\n"); 92e0aa0c61SJakub Kicinski for (i = 0; i < info_rsp->_count.info_version_running; i++) 93*db20b374SJakub Kicinski ksft_print_msg(" %s: %s\n", 94e0aa0c61SJakub Kicinski info_rsp->info_version_running[i].info_version_name, 95e0aa0c61SJakub Kicinski info_rsp->info_version_running[i].info_version_value); 96e0aa0c61SJakub Kicinski devlink_info_get_rsp_free(info_rsp); 97e0aa0c61SJakub Kicinski } 98e0aa0c61SJakub Kicinski devlink_get_list_free(devs); 99e0aa0c61SJakub Kicinski } 100*db20b374SJakub Kicinski 101*db20b374SJakub Kicinski TEST_HARNESS_MAIN 102