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 (at) 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 68 if (rtnl_wilddump_stats_req_filter(&rth, AF_UNSPEC, 69 RTM_GETSTATS, 70 filt_mask) < 0) { 71 perror("Cannont send dump request"); 72 return -1; 73 } 74 75 if (rtnl_dump_filter(&rth, lu->print_ifla_xstats, stdout) < 0) { 76 fprintf(stderr, "Dump terminated\n"); 77 return -1; 78 } 79 80 return 0; 81 } 82