xref: /linux/tools/net/ynl/tests/ethtool.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 
7e0aa0c61SJakub Kicinski #include <net/if.h>
8e0aa0c61SJakub Kicinski 
9*1419fbf5SJakub Kicinski #include <kselftest_harness.h>
10*1419fbf5SJakub Kicinski 
11e0aa0c61SJakub Kicinski #include "ethtool-user.h"
12e0aa0c61SJakub Kicinski 
13*1419fbf5SJakub Kicinski FIXTURE(ethtool)
14*1419fbf5SJakub Kicinski {
15*1419fbf5SJakub Kicinski 	struct ynl_sock *ys;
16*1419fbf5SJakub Kicinski };
17*1419fbf5SJakub Kicinski 
18*1419fbf5SJakub Kicinski FIXTURE_SETUP(ethtool)
19*1419fbf5SJakub Kicinski {
20*1419fbf5SJakub Kicinski 	self->ys = ynl_sock_create(&ynl_ethtool_family, NULL);
21*1419fbf5SJakub Kicinski 	ASSERT_NE(NULL, self->ys)
22*1419fbf5SJakub Kicinski 		TH_LOG("failed to create ethtool socket");
23*1419fbf5SJakub Kicinski }
24*1419fbf5SJakub Kicinski 
25*1419fbf5SJakub Kicinski FIXTURE_TEARDOWN(ethtool)
26*1419fbf5SJakub Kicinski {
27*1419fbf5SJakub Kicinski 	ynl_sock_destroy(self->ys);
28*1419fbf5SJakub Kicinski }
29*1419fbf5SJakub Kicinski 
30*1419fbf5SJakub Kicinski TEST_F(ethtool, channels)
31e0aa0c61SJakub Kicinski {
32e0aa0c61SJakub Kicinski 	struct ethtool_channels_get_req_dump creq = {};
33e0aa0c61SJakub Kicinski 	struct ethtool_channels_get_list *channels;
34e0aa0c61SJakub Kicinski 
35*1419fbf5SJakub Kicinski 	creq._present.header = 1; /* ethtool needs an empty nest */
36*1419fbf5SJakub Kicinski 	channels = ethtool_channels_get_dump(self->ys, &creq);
37*1419fbf5SJakub Kicinski 	ASSERT_NE(NULL, channels) {
38*1419fbf5SJakub Kicinski 		TH_LOG("channels dump failed: %s", self->ys->err.msg);
39*1419fbf5SJakub Kicinski 	}
40e0aa0c61SJakub Kicinski 
41*1419fbf5SJakub Kicinski 	if (ynl_dump_empty(channels)) {
42*1419fbf5SJakub Kicinski 		ethtool_channels_get_list_free(channels);
43*1419fbf5SJakub Kicinski 		SKIP(return, "no entries in channels dump");
44*1419fbf5SJakub Kicinski 	}
45e0aa0c61SJakub Kicinski 
46e0aa0c61SJakub Kicinski 	ynl_dump_foreach(channels, dev) {
47*1419fbf5SJakub Kicinski 		EXPECT_TRUE((bool)dev->header._len.dev_name);
48*1419fbf5SJakub Kicinski 		ksft_print_msg("%8s: ", dev->header.dev_name);
49*1419fbf5SJakub Kicinski 		EXPECT_TRUE(dev->_present.rx_count ||
50*1419fbf5SJakub Kicinski 			    dev->_present.tx_count ||
51*1419fbf5SJakub Kicinski 			    dev->_present.combined_count);
52e0aa0c61SJakub Kicinski 		if (dev->_present.rx_count)
53e0aa0c61SJakub Kicinski 			printf("rx %d ", dev->rx_count);
54e0aa0c61SJakub Kicinski 		if (dev->_present.tx_count)
55e0aa0c61SJakub Kicinski 			printf("tx %d ", dev->tx_count);
56e0aa0c61SJakub Kicinski 		if (dev->_present.combined_count)
57e0aa0c61SJakub Kicinski 			printf("combined %d ", dev->combined_count);
58e0aa0c61SJakub Kicinski 		printf("\n");
59e0aa0c61SJakub Kicinski 	}
60e0aa0c61SJakub Kicinski 	ethtool_channels_get_list_free(channels);
61*1419fbf5SJakub Kicinski }
62e0aa0c61SJakub Kicinski 
63*1419fbf5SJakub Kicinski TEST_F(ethtool, rings)
64*1419fbf5SJakub Kicinski {
65*1419fbf5SJakub Kicinski 	struct ethtool_rings_get_req_dump rreq = {};
66*1419fbf5SJakub Kicinski 	struct ethtool_rings_get_list *rings;
67e0aa0c61SJakub Kicinski 
68*1419fbf5SJakub Kicinski 	rreq._present.header = 1; /* ethtool needs an empty nest */
69*1419fbf5SJakub Kicinski 	rings = ethtool_rings_get_dump(self->ys, &rreq);
70*1419fbf5SJakub Kicinski 	ASSERT_NE(NULL, rings) {
71*1419fbf5SJakub Kicinski 		TH_LOG("rings dump failed: %s", self->ys->err.msg);
72*1419fbf5SJakub Kicinski 	}
73*1419fbf5SJakub Kicinski 
74*1419fbf5SJakub Kicinski 	if (ynl_dump_empty(rings)) {
75*1419fbf5SJakub Kicinski 		ethtool_rings_get_list_free(rings);
76*1419fbf5SJakub Kicinski 		SKIP(return, "no entries in rings dump");
77*1419fbf5SJakub Kicinski 	}
78*1419fbf5SJakub Kicinski 
79e0aa0c61SJakub Kicinski 	ynl_dump_foreach(rings, dev) {
80*1419fbf5SJakub Kicinski 		EXPECT_TRUE((bool)dev->header._len.dev_name);
81*1419fbf5SJakub Kicinski 		ksft_print_msg("%8s: ", dev->header.dev_name);
82*1419fbf5SJakub Kicinski 		EXPECT_TRUE(dev->_present.rx || dev->_present.tx);
83e0aa0c61SJakub Kicinski 		if (dev->_present.rx)
84e0aa0c61SJakub Kicinski 			printf("rx %d ", dev->rx);
85e0aa0c61SJakub Kicinski 		if (dev->_present.tx)
86e0aa0c61SJakub Kicinski 			printf("tx %d ", dev->tx);
87e0aa0c61SJakub Kicinski 		printf("\n");
88e0aa0c61SJakub Kicinski 	}
89e0aa0c61SJakub Kicinski 	ethtool_rings_get_list_free(rings);
90e0aa0c61SJakub Kicinski }
91*1419fbf5SJakub Kicinski 
92*1419fbf5SJakub Kicinski TEST_HARNESS_MAIN
93