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