summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authordyoung <dyoung@NetBSD.org>2004-03-17 17:00:34 +0000
committerdyoung <dyoung@NetBSD.org>2004-03-17 17:00:34 +0000
commit73a618d5f3b34c476fdbf4e9fe5fce014d947dd4 (patch)
treeb683ae77b94e408bfa8802e5b0fa03d51b620403 /sys/dev
parentfcac5c14aa06a92abf76d76e7de15751c80e266c (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.c62
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