diff options
| author | dyoung <dyoung@NetBSD.org> | 2004-03-17 17:00:34 +0000 |
|---|---|---|
| committer | dyoung <dyoung@NetBSD.org> | 2004-03-17 17:00:34 +0000 |
| commit | 73a618d5f3b34c476fdbf4e9fe5fce014d947dd4 (patch) | |
| tree | b683ae77b94e408bfa8802e5b0fa03d51b620403 /sys/dev | |
| parent | fcac5c14aa06a92abf76d76e7de15751c80e266c (diff) | |
In wi(4), wi_choose_rate used to contain device-independent code.
I have pulled that code into the function ieee80211_rssadapt_choose
so that I can re-use it in ath(4), atw(4), and in other drivers.
In rssadapt(9), I have also created a struct ieee80211_rssadapt_expavgctl
that contains parameters for rate adaptation. When IEEE80211_RSSADAPT_DEBUG
is enabled, I will using sysctl to expose an ieee80211_rssadapt_expavgctl
for each wireless device.
Also in rssadapt(9), I have introduced an interpolate() macro which
makes the exponential-averaging code more compact.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/wi.c | 62 |
1 files changed, 12 insertions, 50 deletions
diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c index d311ef44797..6a0f32655dd 100644 --- a/sys/dev/ic/wi.c +++ b/sys/dev/ic/wi.c @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.154 2004/02/10 01:08:05 dyoung Exp $ */ +/* $NetBSD: wi.c,v 1.155 2004/03/17 17:00:34 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.154 2004/02/10 01:08:05 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.155 2004/03/17 17:00:34 dyoung Exp $"); #define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ @@ -849,58 +849,20 @@ wi_choose_rate(struct ieee80211com *ic, struct ieee80211_node *ni, struct ieee80211_frame *wh, u_int len) { struct wi_softc *sc = ic->ic_if.if_softc; - struct ieee80211_rssadapt *ra; - u_int16_t (*thrs)[IEEE80211_RATE_SIZE]; - struct wi_node *wn; - int flags = 0, i, rateidx = 0, s, thridx, top; - struct ieee80211_rateset *rs; - - s = splnet(); - - wn = (void*)ni; - ra = &wn->wn_rssadapt; - rs = &ni->ni_rates; - - if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) - flags |= IEEE80211_RATE_BASIC; - - for (i = 0, top = IEEE80211_RSSADAPT_BKT0; - i < IEEE80211_RSSADAPT_BKTS; - i++, top <<= IEEE80211_RSSADAPT_BKTPOWER) { - thridx = i; - if (len <= top) - break; - } + struct wi_node *wn = (void*)ni; + struct ieee80211_rssadapt *ra = &wn->wn_rssadapt; + int do_not_adapt, i, rateidx, s; - thrs = &ra->ra_rate_thresh[thridx]; + do_not_adapt = (ic->ic_opmode != IEEE80211_M_HOSTAP) && + (sc->sc_flags & WI_FLAGS_RSSADAPTSTA) == 0; - if (ic->ic_fixed_rate != -1) { - if ((rs->rs_rates[ic->ic_fixed_rate] & flags) == flags) { - ni->ni_txrate = ic->ic_fixed_rate; - return; - } - flags |= IEEE80211_RATE_BASIC; - i = ic->ic_fixed_rate; - } else - i = rs->rs_nrates; + s = splnet(); - while (--i >= 0) { - rateidx = i; - if ((rs->rs_rates[i] & flags) != flags) - continue; - if (ic->ic_opmode != IEEE80211_M_HOSTAP && - (sc->sc_flags & WI_FLAGS_RSSADAPTSTA) == 0) - break; - if ((*thrs)[i] < ra->ra_avg_rssi) - break; - } + rateidx = ieee80211_rssadapt_choose(ra, &ni->ni_rates, wh, len, + ic->ic_fixed_rate, + ((ic->ic_if.if_flags & IFF_DEBUG) == 0) ? NULL : ic->ic_if.if_xname, + do_not_adapt); - if (ic->ic_if.if_flags & IFF_DEBUG) - printf("%s: dst %s threshold[%d, %d.%d] %d < %d\n", - ic->ic_if.if_xname, ether_sprintf(wh->i_addr1), len, - (rs->rs_rates[rateidx] & IEEE80211_RATE_VAL) / 2, - (rs->rs_rates[rateidx] & IEEE80211_RATE_VAL) * 5 % 10, - (*thrs)[rateidx], ra->ra_avg_rssi); if (ic->ic_opmode != IEEE80211_M_HOSTAP) { /* choose the slowest pending rate so that we don't * accidentally send a packet on the MAC's queue |
