X-Git-Url: http://git.onelab.eu/?p=libnl.git;a=blobdiff_plain;f=src%2Fnl-link-stats.c;fp=src%2Fnl-link-stats.c;h=9e20e21d3ba262703c130422ad2922541805c184;hp=0000000000000000000000000000000000000000;hb=4cee2ecb3b8afa0637e6f5fe4c57985a4bc740ff;hpb=2df2fbe518d5a221ce6e3ee88a3fb23fb1b94b27 diff --git a/src/nl-link-stats.c b/src/nl-link-stats.c new file mode 100644 index 0000000..9e20e21 --- /dev/null +++ b/src/nl-link-stats.c @@ -0,0 +1,109 @@ +/* + * src/nl-link-stats.c Retrieve link statistics + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * Copyright (c) 2003-2006 Thomas Graf + */ + +#include "utils.h" + +static void print_usage(void) +{ + printf( +"Usage: nl-link-stats [ ...]\n" +" ifindex := { all | number }\n" +" statistic := { (rx|tx)_packets | (rx|tx)_bytes | (rx|tx)_errors |\n" +" (rx|tx)_dropped | (rx|tx)_compressed | (rx|tx)_fifo_err |\n" \ +" rx_len_err | rx_over_err | rx_crc_err | rx_frame_err |\n" +" rx_missed_err | tx_abort_err | tx_carrier_err |\n" +" tx_hbeat_err | tx_win_err | tx_collision | multicast }\n"); + exit(1); +} + +static char **gargv; +static int gargc; + +static void dump_stat(struct rtnl_link *link, int id) +{ + uint64_t st = rtnl_link_get_stat(link, id); + char buf[62]; + + printf("%s.%s %" PRIu64 "\n", rtnl_link_get_name(link), + rtnl_link_stat2str(id, buf, sizeof(buf)), st); +} + +static void dump_stats(struct nl_object *obj, void *arg) +{ + int i; + struct rtnl_link *link = (struct rtnl_link *) obj; + + if (!strcasecmp(gargv[0], "all")) { + for (i = 0; i < RTNL_LINK_STATS_MAX; i++) + dump_stat(link, i); + } else { + for (i = 0; i < gargc; i++) { + int id = rtnl_link_str2stat(gargv[i]); + + if (id < 0) + fprintf(stderr, "Warning: Unknown statistic " + "\"%s\"\n", gargv[i]); + else + dump_stat(link, id); + } + } +} + +int main(int argc, char *argv[]) +{ + struct nl_handle *nlh; + struct nl_cache *link_cache; + int err = 1; + + if (nltool_init(argc, argv) < 0) + return -1; + + if (argc < 3 || !strcmp(argv[1], "-h")) + print_usage(); + + nlh = nl_handle_alloc_nondefault(nltool_cbset); + if (!nlh) + return -1; + + if (nltool_connect(nlh, NETLINK_ROUTE) < 0) + goto errout; + + link_cache = nltool_alloc_link_cache(nlh); + if (!link_cache) + goto errout_close; + + gargv = &argv[2]; + gargc = argc - 2; + + if (!strcasecmp(argv[1], "all")) + nl_cache_foreach(link_cache, dump_stats, NULL); + else { + int ifindex = strtoul(argv[1], NULL, 0); + struct rtnl_link *link = rtnl_link_get(link_cache, ifindex); + + if (!link) { + fprintf(stderr, "Could not find ifindex %d\n", ifindex); + goto errout_link_cache; + } + + dump_stats((struct nl_object *) link, NULL); + rtnl_link_put(link); + } + + err = 0; +errout_link_cache: + nl_cache_free(link_cache); +errout_close: + nl_close(nlh); +errout: + nl_handle_destroy(nlh); + return err; +}