From: Sepherosa Ziehau Date: Wed, 29 Nov 2006 15:12:10 +0000 (+0000) Subject: Don't use unprocessed (e.g. negociated) peer node's rate set to fill X-Git-Tag: v2.0.1~4053 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/8ec51a39812ec931f77655905868541024dd6585 Don't use unprocessed (e.g. negociated) peer node's rate set to fill Supported rates ie of Association Request, instead, use own supported rate set (i.e. ieee80211com.ic_sup_rates). In the orginal way, following senario is broken: - STA is 11b - AP is 11g STA will send out sorted AP's rate set in Association Request. Obviously STA will not be able to receive at any data rates > 11Mbit/s. So this breaks IEEE Std 802.11b subclause 10.3.3.1.2: "... The STA must be able to receive at each of the data rates listed in the set. ...". --- diff --git a/sys/netproto/802_11/wlan/ieee80211_output.c b/sys/netproto/802_11/wlan/ieee80211_output.c index 0c12400d4f..18a3201bb2 100644 --- a/sys/netproto/802_11/wlan/ieee80211_output.c +++ b/sys/netproto/802_11/wlan/ieee80211_output.c @@ -30,7 +30,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/net80211/ieee80211_output.c,v 1.26.2.8 2006/09/02 15:06:04 sam Exp $ - * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211_output.c,v 1.6 2006/11/28 15:17:36 sephe Exp $ + * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211_output.c,v 1.7 2006/11/29 15:12:10 sephe Exp $ */ #include "opt_inet.h" @@ -1272,7 +1272,9 @@ ieee80211_send_mgmt(struct ieee80211com *ic, struct ieee80211_node *ni, break; case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: - case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: + case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: { + const struct ieee80211_rateset *rs; + /* * asreq frame format * [2] capability information @@ -1324,8 +1326,11 @@ ieee80211_send_mgmt(struct ieee80211com *ic, struct ieee80211_node *ni, } frm = ieee80211_add_ssid(frm, ni->ni_essid, ni->ni_esslen); - frm = ieee80211_add_rates(frm, &ni->ni_rates); - frm = ieee80211_add_xrates(frm, &ni->ni_rates); + + rs = &ic->ic_sup_rates[ieee80211_chan2mode(ic, ni->ni_chan)]; + frm = ieee80211_add_rates(frm, rs); + frm = ieee80211_add_xrates(frm, rs); + if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) frm = ieee80211_add_wme_info(frm, &ic->ic_wme); if (ic->ic_opt_ie != NULL) { @@ -1336,6 +1341,7 @@ ieee80211_send_mgmt(struct ieee80211com *ic, struct ieee80211_node *ni, timer = IEEE80211_TRANS_WAIT; break; + } case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: