summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2012-07-20 02:18:47 +0000
committeradrian <adrian@FreeBSD.org>2012-07-20 02:18:47 +0000
commita343cd677988ffdff20f93e0e0145cea2c9bd73a (patch)
tree00ff0d13691531708b5ff21424764df629ade979
parent0ca2458360cdd9693d8b7bde0ea513f34a0dd337 (diff)
downloadFreeBSD-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.
-rw-r--r--tools/tools/ath/athratestats/main.c74
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);
}
OpenPOWER on IntegriCloud