Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Feb 2011 15:49:59 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r218916 - head/sys/net80211
Message-ID:  <201102211549.p1LFnx0H075012@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Mon Feb 21 15:49:59 2011
New Revision: 218916
URL: http://svn.freebsd.org/changeset/base/218916

Log:
  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.

Modified:
  head/sys/net80211/ieee80211_proto.c

Modified: head/sys/net80211/ieee80211_proto.c
==============================================================================
--- head/sys/net80211/ieee80211_proto.c	Mon Feb 21 14:28:31 2011	(r218915)
+++ head/sys/net80211/ieee80211_proto.c	Mon Feb 21 15:49:59 2011	(r218916)
@@ -207,6 +207,21 @@ ieee80211_proto_vattach(struct ieee80211
 		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 ieee80211
 			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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102211549.p1LFnx0H075012>