diff options
author | adrian <adrian@FreeBSD.org> | 2012-07-20 02:18:47 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2012-07-20 02:18:47 +0000 |
commit | a343cd677988ffdff20f93e0e0145cea2c9bd73a (patch) | |
tree | 00ff0d13691531708b5ff21424764df629ade979 /tools/tools | |
parent | 0ca2458360cdd9693d8b7bde0ea513f34a0dd337 (diff) | |
download | FreeBSD-src-a343cd677988ffdff20f93e0e0145cea2c9bd73a.zip FreeBSD-src-a343cd677988ffdff20f93e0e0145cea2c9bd73a.tar.gz |
Use the rate control table to display the rate rather than the rix,
making the output of this program much more meaningful.
Diffstat (limited to 'tools/tools')
-rw-r--r-- | tools/tools/ath/athratestats/main.c | 74 |
1 files changed, 61 insertions, 13 deletions
diff --git a/tools/tools/ath/athratestats/main.c b/tools/tools/ath/athratestats/main.c index ef62bc2..bc44eff 100644 --- a/tools/tools/ath/athratestats/main.c +++ b/tools/tools/ath/athratestats/main.c @@ -62,10 +62,31 @@ struct ath_ratestats { struct ath_rateioctl re; }; +static inline int +dot11rate(struct ath_rateioctl_rt *rt, int rix) +{ + + if (rt->ratecode[rix] & IEEE80211_RATE_MCS) + return rt->ratecode[rix] & ~(IEEE80211_RATE_MCS); + else + return (rt->ratecode[rix] / 2); +} + +static const char * +dot11str(struct ath_rateioctl_rt *rt, int rix) +{ + if (rix == -1) + return ""; + else if (rt->ratecode[rix] & IEEE80211_RATE_MCS) + return "MCS"; + else + return " Mb"; +} + static void -ath_sample_stats(struct ath_ratestats *r, uint8_t *buf) +ath_sample_stats(struct ath_ratestats *r, struct ath_rateioctl_rt *rt, + struct sample_node *sn) { - struct sample_node *sn = (void *) buf; uint32_t mask; int rix, y; @@ -74,17 +95,21 @@ ath_sample_stats(struct ath_ratestats *r, uint8_t *buf) sn->ratemask); for (y = 0; y < NUM_PACKET_SIZE_BINS; y++) { - printf("[%4u] cur rix %d since switch: packets %d ticks %u\n", + printf("[%4u] cur rate %d %s since switch: " + "packets %d ticks %u\n", bin_to_size(y), - sn->current_rix[y], + dot11rate(rt, sn->current_rix[y]), + dot11str(rt, sn->current_rix[y]), sn->packets_since_switch[y], sn->ticks_since_switch[y]); - printf("[%4u] last sample (%d) cur sample (%d) " + printf("[%4u] last sample (%d %s) cur sample (%d %s) " "packets sent %d\n", bin_to_size(y), - sn->last_sample_rix[y], - sn->current_sample_rix[y], + dot11rate(rt, sn->last_sample_rix[y]), + dot11str(rt, sn->last_sample_rix[y]), + dot11rate(rt, sn->current_sample_rix[y]), + dot11str(rt, sn->current_sample_rix[y]), sn->packets_sent[y]); printf("[%4u] packets since sample %d sample tt %u\n", @@ -98,9 +123,10 @@ ath_sample_stats(struct ath_ratestats *r, uint8_t *buf) for (y = 0; y < NUM_PACKET_SIZE_BINS; y++) { if (sn->stats[y][rix].total_packets == 0) continue; - printf("[%2u:%4u] %8ju:%-8ju (%3d%%) " + printf("[%2u %s:%4u] %8ju:%-8ju (%3d%%) " "(EWMA %3d.%1d%%) T %8ju F %4d avg %5u last %u\n", - rix, + dot11rate(rt, rix), + dot11str(rt, rix), bin_to_size(y), (uintmax_t) sn->stats[y][rix].total_packets, (uintmax_t) sn->stats[y][rix].packets_acked, @@ -144,7 +170,7 @@ ath_rate_ioctl(struct ath_ratestats *r) err(1, "ioctl"); } -#define STATS_BUF_SIZE 4096 +#define STATS_BUF_SIZE 8192 int main(int argc, const char *argv[]) { @@ -152,6 +178,8 @@ main(int argc, const char *argv[]) struct ether_addr *e; uint8_t *buf; struct ath_rateioctl_tlv *av; + struct sample_node *sn = NULL; + struct ath_rateioctl_rt *rt = NULL; buf = calloc(1, STATS_BUF_SIZE); if (buf == NULL) @@ -175,11 +203,28 @@ main(int argc, const char *argv[]) ath_rate_ioctl(&r); /* - * Ensure the TLV entry in question is actually the sample - * rate TLV. + * For now, hard-code the TLV order and contents. Ew! */ av = (struct ath_rateioctl_tlv *) buf; + if (av->tlv_id != ATH_RATE_TLV_RATETABLE) { + fprintf(stderr, "unexpected rate control TLV (got 0x%x, " + "expected 0x%x\n", + av->tlv_id, + ATH_RATE_TLV_RATETABLE); + exit(127); + } + if (av->tlv_len != sizeof(struct ath_rateioctl_rt)) { + fprintf(stderr, "unexpected TLV len (got %d bytes, " + "expected %d bytes\n", + av->tlv_len, + sizeof(struct ath_rateioctl_rt)); + exit(127); + } + rt = (void *) (buf + sizeof(struct ath_rateioctl_tlv)); + /* Next */ + av = (void *) (buf + sizeof(struct ath_rateioctl_tlv) + + sizeof(struct ath_rateioctl_rt)); if (av->tlv_id != ATH_RATE_TLV_SAMPLENODE) { fprintf(stderr, "unexpected rate control TLV (got 0x%x, " "expected 0x%x\n", @@ -194,7 +239,10 @@ main(int argc, const char *argv[]) sizeof(struct sample_node)); exit(127); } + sn = (void *) (buf + sizeof(struct ath_rateioctl_tlv) + + sizeof(struct ath_rateioctl_rt) + + sizeof(struct ath_rateioctl_tlv)); - ath_sample_stats(&r, buf + sizeof(struct ath_rateioctl_tlv)); + ath_sample_stats(&r, rt, sn); } |