summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2011-02-21 15:49:59 +0000
committeradrian <adrian@FreeBSD.org>2011-02-21 15:49:59 +0000
commit0ac5f04e5661ce9e7794d6cd19b04f7656203b62 (patch)
treee3d249e700c46ab12592a751e2b315999aaea012 /sys/net80211
parenta1c161cbf32776ad3d61e0ec7393fcad1a1576cc (diff)
downloadFreeBSD-src-0ac5f04e5661ce9e7794d6cd19b04f7656203b62.zip
FreeBSD-src-0ac5f04e5661ce9e7794d6cd19b04f7656203b62.tar.gz
Default to the lowest negotiated rate for mgmt/multicast traffic in 11n mode
The current code transmits management and multicast frames at MCS 0. What it should do is check whether the negotiated basic set is zero (and the MCS set is not) before making this decision. For now, simply default to the lowest negotiated rate, rather than MCS 0. This fixes the behaviour with at least the DLINK DIR-825, which ACKs but silently ignores block-ack (BA) response frames.
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_proto.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_proto.c b/sys/net80211/ieee80211_proto.c
index edac519..a0ddeb4 100644
--- a/sys/net80211/ieee80211_proto.c
+++ b/sys/net80211/ieee80211_proto.c
@@ -207,6 +207,21 @@ ieee80211_proto_vattach(struct ieee80211vap *vap)
const struct ieee80211_rateset *rs = &ic->ic_sup_rates[i];
vap->iv_txparms[i].ucastrate = IEEE80211_FIXED_RATE_NONE;
+
+ /*
+ * Setting the management rate to MCS 0 assumes that the
+ * BSS Basic rate set is empty and the BSS Basic MCS set
+ * is not.
+ *
+ * Since we're not checking this, default to the lowest
+ * defined rate for this mode.
+ *
+ * At least one 11n AP (DLINK DIR-825) is reported to drop
+ * some MCS management traffic (eg BA response frames.)
+ *
+ * See also: 9.6.0 of the 802.11n-2009 specification.
+ */
+#ifdef NOTYET
if (i == IEEE80211_MODE_11NA || i == IEEE80211_MODE_11NG) {
vap->iv_txparms[i].mgmtrate = 0 | IEEE80211_RATE_MCS;
vap->iv_txparms[i].mcastrate = 0 | IEEE80211_RATE_MCS;
@@ -216,6 +231,9 @@ ieee80211_proto_vattach(struct ieee80211vap *vap)
vap->iv_txparms[i].mcastrate =
rs->rs_rates[0] & IEEE80211_RATE_VAL;
}
+#endif
+ vap->iv_txparms[i].mgmtrate = rs->rs_rates[0] & IEEE80211_RATE_VAL;
+ vap->iv_txparms[i].mcastrate = rs->rs_rates[0] & IEEE80211_RATE_VAL;
vap->iv_txparms[i].maxretry = IEEE80211_TXMAX_DEFAULT;
}
vap->iv_roaming = IEEE80211_ROAMING_AUTO;
OpenPOWER on IntegriCloud