svn commit: r225165 -
user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample
Adrian Chadd
adrian at FreeBSD.org
Thu Aug 25 07:28:07 UTC 2011
Author: adrian
Date: Thu Aug 25 07:28:07 2011
New Revision: 225165
URL: http://svn.freebsd.org/changeset/base/225165
Log:
Begin teaching ath_rate_sample about aggregate packets.
I'm hoping to (just) teach ath_rate_sample about the multiple packet
attempt/success/failure as if the rate completion routine was called
for each packet. (Which seems a bit over the top.)
This still doesn't choose/stick to the fastest throughput, primarily because:
* there's no probe/sounding frame support yet - ie, if ath_rate_sample
decides to sample a higher rate to see if it's better, the aggregate
code still aggregates;
* .. and the rate API doesn't really get anywhere enough info to make
aggregate decisions - primarily because the rate API gets called before
any aggregate is formed. So it can't do things like choose a rate
based on how long the potential aggregate is (eg, if higher MCS rates
work fine for short bursts, but not for longer bursts); and
* Rate assignment is only done once, it isn't recalculated in the software
retry path. I think that'll be one of my next things to refactor out.
Modified:
user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c
Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c Thu Aug 25 07:24:49 2011 (r225164)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c Thu Aug 25 07:28:07 2011 (r225165)
@@ -498,7 +498,8 @@ update_stats(struct ath_softc *sc, struc
int rix1, int tries1,
int rix2, int tries2,
int rix3, int tries3,
- int short_tries, int tries, int status)
+ int short_tries, int tries, int status,
+ int nframes, int nbad)
{
struct sample_node *sn = ATH_NODE_SAMPLE(an);
struct sample_softc *ssc = ATH_SOFTC_SAMPLE(sc);
@@ -540,7 +541,7 @@ update_stats(struct ath_softc *sc, struc
/* just average the first few packets */
int avg_tx = sn->stats[size_bin][rix0].average_tx_time;
int packets = sn->stats[size_bin][rix0].total_packets;
- sn->stats[size_bin][rix0].average_tx_time = (tt+(avg_tx*packets))/(packets+1);
+ sn->stats[size_bin][rix0].average_tx_time = (tt+(avg_tx*packets))/(packets+nframes);
} else {
/* use a ewma */
sn->stats[size_bin][rix0].average_tx_time =
@@ -550,36 +551,37 @@ update_stats(struct ath_softc *sc, struc
if (status != 0) {
int y;
- sn->stats[size_bin][rix0].successive_failures++;
+ sn->stats[size_bin][rix0].successive_failures += nbad;
for (y = size_bin+1; y < NUM_PACKET_SIZE_BINS; y++) {
/*
* Also say larger packets failed since we
* assume if a small packet fails at a
* bit-rate then a larger one will also.
*/
- sn->stats[y][rix0].successive_failures++;
+ sn->stats[y][rix0].successive_failures += nbad;
sn->stats[y][rix0].last_tx = ticks;
sn->stats[y][rix0].tries += tries;
- sn->stats[y][rix0].total_packets++;
+ sn->stats[y][rix0].total_packets += nframes;
}
} else {
- sn->stats[size_bin][rix0].packets_acked++;
+ sn->stats[size_bin][rix0].packets_acked += nframes;
sn->stats[size_bin][rix0].successive_failures = 0;
}
sn->stats[size_bin][rix0].tries += tries;
sn->stats[size_bin][rix0].last_tx = ticks;
- sn->stats[size_bin][rix0].total_packets++;
+ sn->stats[size_bin][rix0].total_packets += nframes;
if (rix0 == sn->current_sample_rix[size_bin]) {
IEEE80211_NOTE(an->an_node.ni_vap, IEEE80211_MSG_RATECTL,
&an->an_node,
-"%s: size %d %s sample rate %d tries (%d/%d) tt %d avg_tt (%d/%d)",
+"%s: size %d %s sample rate %d tries (%d/%d) tt %d avg_tt (%d/%d) nfrm %d nbad %d",
__func__,
size,
status ? "FAIL" : "OK",
rix0, short_tries, tries, tt,
sn->stats[size_bin][rix0].average_tx_time,
- sn->stats[size_bin][rix0].perfect_tx_time);
+ sn->stats[size_bin][rix0].perfect_tx_time,
+ nframes, nbad);
sn->sample_tt[size_bin] = tt;
sn->current_sample_rix[size_bin] = -1;
}
@@ -642,7 +644,8 @@ ath_rate_tx_complete(struct ath_softc *s
0, 0,
0, 0,
0, 0,
- short_tries, long_tries, ts->ts_status);
+ short_tries, long_tries, ts->ts_status,
+ nframes, nbad);
} else {
int finalTSIdx = ts->ts_finaltsi;
int i;
@@ -689,7 +692,8 @@ ath_rate_tx_complete(struct ath_softc *s
rc[2].rix, rc[2].tries,
rc[3].rix, rc[3].tries,
short_tries, long_tries,
- long_tries > rc[0].tries);
+ long_tries > rc[0].tries,
+ nframes, nbad);
long_tries -= rc[0].tries;
}
@@ -700,7 +704,8 @@ ath_rate_tx_complete(struct ath_softc *s
rc[3].rix, rc[3].tries,
0, 0,
short_tries, long_tries,
- ts->ts_status);
+ ts->ts_status,
+ nframes, nbad);
long_tries -= rc[1].tries;
}
@@ -711,7 +716,8 @@ ath_rate_tx_complete(struct ath_softc *s
0, 0,
0, 0,
short_tries, long_tries,
- ts->ts_status);
+ ts->ts_status,
+ nframes, nbad);
long_tries -= rc[2].tries;
}
@@ -722,7 +728,8 @@ ath_rate_tx_complete(struct ath_softc *s
0, 0,
0, 0,
short_tries, long_tries,
- ts->ts_status);
+ ts->ts_status,
+ nframes, nbad);
}
}
}
More information about the svn-src-user
mailing list