]>
Commit | Line | Data |
---|---|---|
2b99748a SH |
1 | /* |
2 | * iplink_stats.c Extended statistics commands | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | * | |
9 | * Authors: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> | |
10 | */ | |
11 | ||
12 | #include <stdio.h> | |
13 | #include <stdlib.h> | |
14 | #include <string.h> | |
15 | #include <linux/if_link.h> | |
16 | #include <netinet/ether.h> | |
17 | ||
18 | #include "utils.h" | |
19 | #include "ip_common.h" | |
20 | ||
21 | static void print_explain(FILE *f) | |
22 | { | |
23 | fprintf(f, "Usage: ... xstats type TYPE [ ARGS ]\n"); | |
24 | } | |
25 | ||
26 | int iplink_ifla_xstats(int argc, char **argv) | |
27 | { | |
28 | struct link_util *lu = NULL; | |
29 | __u32 filt_mask; | |
30 | ||
31 | if (!argc) { | |
32 | fprintf(stderr, "xstats: missing argument\n"); | |
33 | return -1; | |
34 | } | |
35 | ||
36 | if (matches(*argv, "type") == 0) { | |
37 | NEXT_ARG(); | |
38 | lu = get_link_kind(*argv); | |
39 | if (!lu) | |
40 | invarg("invalid type", *argv); | |
41 | } else if (matches(*argv, "help") == 0) { | |
42 | print_explain(stdout); | |
43 | return 0; | |
44 | } else { | |
45 | invarg("unknown argument", *argv); | |
46 | } | |
47 | ||
48 | if (!lu) { | |
49 | print_explain(stderr); | |
50 | return -1; | |
51 | } | |
52 | ||
53 | if (!lu->print_ifla_xstats) { | |
54 | fprintf(stderr, "xstats: link type %s doesn't support xstats\n", | |
55 | lu->id); | |
56 | return -1; | |
57 | } | |
58 | ||
59 | if (lu->parse_ifla_xstats && | |
60 | lu->parse_ifla_xstats(lu, argc-1, argv+1)) | |
61 | return -1; | |
62 | ||
63 | if (strstr(lu->id, "_slave")) | |
64 | filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS_SLAVE); | |
65 | else | |
66 | filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS); | |
67 | ||
56eeeda9 | 68 | if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask) < 0) { |
2b99748a SH |
69 | perror("Cannont send dump request"); |
70 | return -1; | |
71 | } | |
72 | ||
73 | if (rtnl_dump_filter(&rth, lu->print_ifla_xstats, stdout) < 0) { | |
74 | fprintf(stderr, "Dump terminated\n"); | |
75 | return -1; | |
76 | } | |
77 | ||
78 | return 0; | |
79 | } |