| /* |
| * 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; |
| } |