xref: /linux/tools/net/ynl/tests/devlink.c (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
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