1 // SPDX-License-Identifier: GPL-2.0 2 #include <stdio.h> 3 #include <string.h> 4 5 #include <ynl.h> 6 7 #include <net/if.h> 8 9 #include "ethtool-user.h" 10 11 int main(int argc, char **argv) 12 { 13 struct ethtool_channels_get_req_dump creq = {}; 14 struct ethtool_rings_get_req_dump rreq = {}; 15 struct ethtool_channels_get_list *channels; 16 struct ethtool_rings_get_list *rings; 17 struct ynl_sock *ys; 18 19 ys = ynl_sock_create(&ynl_ethtool_family, NULL); 20 if (!ys) 21 return 1; 22 23 creq._present.header = 1; /* ethtool needs an empty nest, sigh */ 24 channels = ethtool_channels_get_dump(ys, &creq); 25 if (!channels) 26 goto err_close; 27 28 printf("Channels:\n"); 29 ynl_dump_foreach(channels, dev) { 30 printf(" %8s: ", dev->header.dev_name); 31 if (dev->_present.rx_count) 32 printf("rx %d ", dev->rx_count); 33 if (dev->_present.tx_count) 34 printf("tx %d ", dev->tx_count); 35 if (dev->_present.combined_count) 36 printf("combined %d ", dev->combined_count); 37 printf("\n"); 38 } 39 ethtool_channels_get_list_free(channels); 40 41 rreq._present.header = 1; /* ethtool needs an empty nest.. */ 42 rings = ethtool_rings_get_dump(ys, &rreq); 43 if (!rings) 44 goto err_close; 45 46 printf("Rings:\n"); 47 ynl_dump_foreach(rings, dev) { 48 printf(" %8s: ", dev->header.dev_name); 49 if (dev->_present.rx) 50 printf("rx %d ", dev->rx); 51 if (dev->_present.tx) 52 printf("tx %d ", dev->tx); 53 printf("\n"); 54 } 55 ethtool_rings_get_list_free(rings); 56 57 ynl_sock_destroy(ys); 58 59 return 0; 60 61 err_close: 62 fprintf(stderr, "YNL (%d): %s\n", ys->err.code, ys->err.msg); 63 ynl_sock_destroy(ys); 64 return 2; 65 } 66