I just came across an 802.11n AP that doesn't announce 802.11n rates. The net80211 code dutifully sets the channel up as an 11n channel and populates the HT rate set as empty. So, amrr gets very confused when this occurs. And so does iwn. There's two things to fix: * amrr should not treat the node as 11n if there are no 11n rates; * iwn should not assume that if the channel is 11n, that the rate is an MCS rate.
Responsible Changed From-To: freebsd-bugs->freebsd-wireless Over to maintainer(s).
Author: adrian Date: Thu Oct 31 02:04:53 2013 New Revision: 257412 URL: http://svnweb.freebsd.org/changeset/base/257412 Log: Don't treat the node as an 11n node if 11n rates are disabled. For now, the AMRR code only knows about _either_ MCS or non-MCS rates. It doesn't know how to downgrade (ie, doing 11b CCK rates if MCS0 isn't reliable.) PR: kern/183428 Modified: head/sys/net80211/ieee80211_amrr.c Modified: head/sys/net80211/ieee80211_amrr.c ============================================================================== --- head/sys/net80211/ieee80211_amrr.c Thu Oct 31 02:03:30 2013 (r257411) +++ head/sys/net80211/ieee80211_amrr.c Thu Oct 31 02:04:53 2013 (r257412) @@ -131,6 +131,12 @@ amrr_deinit(struct ieee80211vap *vap) free(vap->iv_rs, M_80211_RATECTL); } +/* + * Return whether 11n rates are possible. + * + * Some 11n devices may return HT information but no HT rates. + * Thus, we shouldn't treat them as an 11n node. + */ static int amrr_node_is_11n(struct ieee80211_node *ni) { @@ -139,6 +145,8 @@ amrr_node_is_11n(struct ieee80211_node * return (0); if (ni->ni_chan == IEEE80211_CHAN_ANYC) return (0); + if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && ni->ni_htrates.rs_nrates == 0) + return (0); return (IEEE80211_IS_CHAN_HT(ni->ni_chan)); } _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Author: adrian Date: Thu Oct 31 02:21:48 2013 New Revision: 257415 URL: http://svnweb.freebsd.org/changeset/base/257415 Log: Don't base the rate table selection based on the channel mode; it needs to check whether there are rate entries in there or not. PR: kern/183428 Modified: head/sys/dev/iwn/if_iwn.c Modified: head/sys/dev/iwn/if_iwn.c ============================================================================== --- head/sys/dev/iwn/if_iwn.c Thu Oct 31 02:14:28 2013 (r257414) +++ head/sys/dev/iwn/if_iwn.c Thu Oct 31 02:21:48 2013 (r257415) @@ -4312,6 +4312,7 @@ iwn_set_link_quality(struct iwn_softc *s struct iwn_cmd_link_quality linkq; uint8_t txant; int i, rate, txrate; + int is_11n; DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); @@ -4326,15 +4327,25 @@ iwn_set_link_quality(struct iwn_softc *s linkq.ampdu_threshold = 3; linkq.ampdu_limit = htole16(4000); /* 4ms */ + /* + * Are we using 11n rates? Ensure the channel is + * 11n _and_ we have some 11n rates, or don't + * try. + */ + if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && ni->ni_htrates.rs_nrates > 0) + is_11n = 1; + else + is_11n = 0; + /* Start at highest available bit-rate. */ - if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + if (is_11n) txrate = ni->ni_htrates.rs_nrates - 1; else txrate = rs->rs_nrates - 1; for (i = 0; i < IWN_MAX_TX_RETRIES; i++) { uint32_t plcp; - if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + if (is_11n) rate = IEEE80211_RATE_MCS | txrate; else rate = RV(rs->rs_rates[txrate]); _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
batch change: For bugs that match the following - Status Is In progress AND - Untouched since 2018-01-01. AND - Affects Base System OR Documentation DO: Reset to open status. Note: I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed.
There is a commit referencing this PR, but it's still not closed and has been inactive for some time. Closing the PR as fixed but feel free to re-open it if the issue hasn't been completely resolved. Thanks