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

tools: ynl: add sample for devlink

Add a sample to show off how to issue basic devlink requests.
For added testing issue get requests while walking a dump.

$ ./devlink
netdevsim/netdevsim1:
driver: netdevsim
running fw:
fw.mgmt: 10.20.30
...
netdevsim/netdevsim2:
driver: netdevsim
running fw:
fw.mgmt: 10.20.30
...

Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+61
+1
tools/net/ynl/samples/.gitignore
··· 1 + devlink 1 2 netdev
+60
tools/net/ynl/samples/devlink.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <stdio.h> 3 + #include <string.h> 4 + 5 + #include <ynl.h> 6 + 7 + #include "devlink-user.h" 8 + 9 + int main(int argc, char **argv) 10 + { 11 + struct devlink_get_list *devs; 12 + struct ynl_sock *ys; 13 + 14 + ys = ynl_sock_create(&ynl_devlink_family, NULL); 15 + if (!ys) 16 + return 1; 17 + 18 + devs = devlink_get_dump(ys); 19 + if (!devs) 20 + goto err_close; 21 + 22 + ynl_dump_foreach(devs, d) { 23 + struct devlink_info_get_req *info_req; 24 + struct devlink_info_get_rsp *info_rsp; 25 + 26 + printf("%s/%s:\n", d->bus_name, d->dev_name); 27 + 28 + info_req = devlink_info_get_req_alloc(); 29 + devlink_info_get_req_set_bus_name(info_req, d->bus_name); 30 + devlink_info_get_req_set_dev_name(info_req, d->dev_name); 31 + 32 + info_rsp = devlink_info_get(ys, info_req); 33 + devlink_info_get_req_free(info_req); 34 + if (!info_rsp) 35 + goto err_free_devs; 36 + 37 + if (info_rsp->_present.info_driver_name_len) 38 + printf(" driver: %s\n", info_rsp->info_driver_name); 39 + if (info_rsp->n_info_version_running) 40 + printf(" running fw:\n"); 41 + for (unsigned i = 0; i < info_rsp->n_info_version_running; i++) 42 + printf(" %s: %s\n", 43 + info_rsp->info_version_running[i].info_version_name, 44 + info_rsp->info_version_running[i].info_version_value); 45 + printf(" ...\n"); 46 + devlink_info_get_rsp_free(info_rsp); 47 + } 48 + devlink_get_list_free(devs); 49 + 50 + ynl_sock_destroy(ys); 51 + 52 + return 0; 53 + 54 + err_free_devs: 55 + devlink_get_list_free(devs); 56 + err_close: 57 + fprintf(stderr, "YNL: %s\n", ys->err.msg); 58 + ynl_sock_destroy(ys); 59 + return 2; 60 + }