Download raw body.
fix association to 11g-only APs
OK
On 2025 Oct 08 (Wed) at 11:49:11 +0200 (+0200), Stefan Sperling wrote:
:When I replaced ieee80211_iserp_sta() with a check for the extended
:rates information element I wrongly assumed that this information
:element would always be present if 11g is supported. However, the
:xrates IE only appears in 11b/g mixed mode. APs which have 802.11b
:rates completely disabled can announce all rates via the regular
:rates IE and never send the xrates IE.
:
:Ensure that we recognize such APs as 11g-capable regardless of the
:missing xrates IE. Otherwise assocation can fail due to a mismatch
:of basic rates.
:
:Problem reported by landry@
:
:
:M sys/net80211/ieee80211_node.c | 27+ 3-
:
:1 file changed, 27 insertions(+), 3 deletions(-)
:
:commit - b8b7e987f417088024ed43ff3a6ae432124e0952
:commit + 6c9aaa207a9b063d2d0aeab7053af3632a5034a6
:blob - 8251692acf39a015ec12afa4f342e5518f9e42de
:blob + 7c6f51ab9831d139571c9ae2eb35c6fcfc300243
:--- sys/net80211/ieee80211_node.c
:+++ sys/net80211/ieee80211_node.c
:@@ -2625,6 +2625,28 @@ ieee80211_clear_vhtcaps(struct ieee80211_node *ni)
: }
: #endif
:
:+int
:+ieee80211_node_is_11g(struct ieee80211_node *ni)
:+{
:+ struct ieee80211_rateset *rs = &ni->ni_rates;
:+ const struct ieee80211_rateset *rs_ofdm = &ieee80211_std_rateset_11a;
:+ int i, j;
:+
:+ if (!IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
:+ return 0;
:+
:+ /* 2GHz station which supports 11a OFDM rates implies 11g. */
:+ for (i = 0; i < rs->rs_nrates; i++) {
:+ for (j = 0; j < rs_ofdm->rs_nrates; j++) {
:+ if ((rs->rs_rates[i] & IEEE80211_RATE_VAL) ==
:+ (rs_ofdm->rs_rates[j] & IEEE80211_RATE_VAL))
:+ return 1;
:+ }
:+ }
:+
:+ return 0;
:+}
:+
: /*
: * Install received rate set information in the node's state block.
: */
:@@ -2653,10 +2675,12 @@ ieee80211_setup_rates(struct ieee80211com *ic, struct
: memcpy(rs->rs_rates + rs->rs_nrates, xrates+2, nxrates);
: rs->rs_nrates += nxrates;
:
:- /* 11g support implies ERP support */
:- if (nxrates > 0 && IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
:- ni->ni_flags |= IEEE80211_NODE_ERP;
: }
:+
:+ /* 11g support implies ERP support */
:+ if (ieee80211_node_is_11g(ni))
:+ ni->ni_flags |= IEEE80211_NODE_ERP;
:+
: return ieee80211_fix_rate(ic, ni, flags);
: }
:
:
--
Two percent of zero is almost nothing.
fix association to 11g-only APs