Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools: ynl: add sample for ethtool

Configuring / reading ring sizes and counts is a fairly common
operation for ethtool netlink. Present a sample doing that with
YNL:

$ ./ethtool
Channels:
enp1s0: combined 1
eni1np1: combined 1
eni2np1: combined 1
Rings:
enp1s0: rx 256 tx 256
eni1np1: rx 0 tx 0
eni2np1: rx 0 tx 0

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
f561ff23 2d7be507

+66
+1
tools/net/ynl/samples/.gitignore
··· 1 + ethtool 1 2 devlink 2 3 netdev
+65
tools/net/ynl/samples/ethtool.c
··· 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 + }