diff options
author | Thomas Graf <tgraf@suug.ch> | 2007-09-14 23:28:01 (GMT) |
---|---|---|
committer | Thomas Graf <tgraf@suug.ch> | 2007-09-14 23:28:01 (GMT) |
commit | 44d362409d5469aed47d19e7908d19bd194493a4 (patch) | |
tree | 5d1e739a4566f3af796273e5c3f78ca53d234df6 /src/nl-link-stats.c | |
download | libnl-44d362409d5469aed47d19e7908d19bd194493a4.zip libnl-44d362409d5469aed47d19e7908d19bd194493a4.tar.gz libnl-44d362409d5469aed47d19e7908d19bd194493a4.tar.bz2 |
Initial import
Diffstat (limited to 'src/nl-link-stats.c')
-rw-r--r-- | src/nl-link-stats.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/nl-link-stats.c b/src/nl-link-stats.c new file mode 100644 index 0000000..8a9200e --- /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 <tgraf@suug.ch> + */ + +#include "utils.h" + +static void print_usage(void) +{ + printf( +"Usage: nl-link-stats <ifindex> [<statistic> ...]\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 = nltool_alloc_handle(); + 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; +} |