int a80211stats_init(int argc, char *argv[]) { #else int main(int argc, char *argv[]) { #endif int c, len; struct ieee80211req_sta_info *si; u_int8_t buf[24*1024], *cp; struct iwreq iwr; int allnodes = 0; const char *ifname = "ath0"; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket"); if (argc > 1 && strcmp(argv[1], "-i") == 0) { if (argc < 2) { fprintf(stderr, "%s: missing interface name for -i\n", argv[0]); exit(-1); } ifname = argv[2]; argc -= 2, argv += 2; } strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); while ((c = getopt(argc, argv, "ai:")) != -1) switch (c) { case 'a': allnodes++; break; case 'i': strncpy(ifr.ifr_name, optarg, sizeof (ifr.ifr_name)); break; default: errx(1, "usage: 80211stats [-a] [-i device] [mac...]\n"); /*NOTREACHED*/ } if (argc == optind && !allnodes) { struct ieee80211_stats stats; /* no args, just show global stats */ ifr.ifr_data = (caddr_t) &stats; if (ioctl(s, SIOCG80211STATS, &ifr) < 0) err(1, ifr.ifr_name); printstats(stdout, &stats); return 0; } if (allnodes) { /* * Retrieve station/neighbor table and print stats for each. */ (void) memset(&iwr, 0, sizeof(iwr)); (void) strncpy(iwr.ifr_name, ifr.ifr_name, sizeof(iwr.ifr_name)); iwr.u.data.pointer = (void *) buf; iwr.u.data.length = sizeof(buf); if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) err(1, "unable to get station information"); len = iwr.u.data.length; if (len >= sizeof(struct ieee80211req_sta_info)) { cp = buf; do { si = (struct ieee80211req_sta_info *) cp; print_sta_stats(stdout, si->isi_macaddr); cp += si->isi_len, len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info)); } } else { /* * Print stats for specified stations. */ for (c = optind; c < argc; c++) { const struct ether_addr *ea = ether_aton(argv[c]); if (ea != NULL) print_sta_stats(stdout, ea->ether_addr_octet); } } return 0; }
int main(int argc, char *argv[]) { int c, len; struct ieee80211req_sta_info *si; u_int8_t buf[24*1024], *cp; struct iwreq iwr; int allnodes = 0; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket"); strncpy(ifr.ifr_name, "ath0", sizeof (ifr.ifr_name)); while ((c = getopt(argc, argv, "ai:")) != -1) switch (c) { case 'a': allnodes++; break; case 'i': strncpy(ifr.ifr_name, optarg, sizeof (ifr.ifr_name)); ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; break; default: errx(1, "usage: %s [-a] [-i device] [mac...]\n"); /*NOTREACHED*/ } if (argc == optind && !allnodes) { struct ieee80211_stats *stats; /* no args, just show global stats */ /* fetch both ieee80211_stats, and mac_stats, including multicast and unicast stats */ stats = malloc(sizeof(struct ieee80211_stats)+ 2* sizeof(struct ieee80211_mac_stats)); if (!stats) { fprintf (stderr, "Unable to allocate memory for stats\n"); return -1; } ifr.ifr_data = (caddr_t) stats; if (ioctl(s, SIOCG80211STATS, &ifr) < 0) err(1, ifr.ifr_name); printstats(stdout, stats); /* MAC stats uses, u_int64_t, there is a 8 byte hole in between stats and mac stats, * account for that. */ print_mac_stats(stdout, (struct ieee80211_mac_stats*)(((void*)stats)+sizeof(*stats)+8), 1); /* multicast stats */ print_mac_stats(stdout, &((struct ieee80211_mac_stats *)(((void*)stats)+sizeof(*stats)+8))[1], 0); free(stats); return 0; } if (allnodes) { /* * Retrieve station/neighbor table and print stats for each. */ (void) memset(&iwr, 0, sizeof(iwr)); (void) strncpy(iwr.ifr_name, ifr.ifr_name, sizeof(iwr.ifr_name)); iwr.ifr_name[sizeof(iwr.ifr_name) - 1] = '\0'; iwr.u.data.pointer = (void *) buf; iwr.u.data.length = sizeof(buf); if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) err(1, "unable to get station information"); len = iwr.u.data.length; if (len >= sizeof(struct ieee80211req_sta_info)) { cp = buf; do { si = (struct ieee80211req_sta_info *) cp; print_sta_stats(stdout, si->isi_macaddr); cp += si->isi_len, len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info)); } } else { /* * Print stats for specified stations. */ for (c = optind; c < argc; c++) { const struct ether_addr *ea = ether_aton(argv[c]); if (ea != NULL) print_sta_stats(stdout, ea->ether_addr_octet); } } }