Download raw body.
fix net80211 802.11g compatibility check
I have a WIP fix for qwx which relies on ieee80211_iserp_sta() to
detect whether an AP supports 802.11g, rather than 802.11b only.
And I encountered an access point which qwx could not connect to when
my WIP fix is applied.
This AP allows 11g clients but blocks 11b clients by not announcing
support for 11b rates in its beacons.
ieee80211_iserp_sta() is supposed to detect whether a peer supports ERP/11g.
Yet it will return false for APs which do not announce support for any
of the 11b (pre-11g) data rates in their beacons.
This code seems to be based on the last sentence in this paragraph from
the 802.11 standard (I am from quoting from the 2012 / 11n version):
18. Extended Rate PHY (ERP) specification
[...]
18.1.2 Introduction
The ERP builds on the payload data rates of 1 and 2 Mb/s, as described
in Clause 15, that use DSSS modulation and builds on the payload data
rates of 1, 2, 5.5, and 11 Mb/s, as described in Clause 16, that use
DSSS and CCK.
The ERP draws from Clause 17 to provide additional payload data rates
of 6, 9, 12, 18, 24, 36, 48, and 54 Mb/s. Of these rates, transmission
and reception capability for 1, 2, 5.5, 6, 11, 12, and 24 Mb/s data
rates is mandatory.
To summarize:
ERP rates are the OFDM rates: 6, 9, 12, 18, 24, 36, 48, and 54 Mb/s.
These rates were introduced with 11g. The mandatory ones are: 6, 12, and 24.
The CCK rates are 1, 2, 5.5, and 11. These were already present in 11b.
They are not relevant when checking for EP/11g support. The mandatory
ones are 1, 2, and 5. Current APs may choose to disable support even
for the mandatory ones, which makes ieee80211_iserp_sta() return false
even though the AP supports ERP/11g.
Fix below. ok?
(Rate arrays in beacons and in our code represent data rates in units
of 512Kb/s. Divide by 2 to get Mbit/s: 12 -> 6, 24 -> 12, 48 -> 24)
(Clause 18 used to be called Clause 19 in earlier standard revisions.)
M sys/net80211/ieee80211_node.c | 7+ 3-
1 file changed, 7 insertions(+), 3 deletions(-)
commit - d640f8310f2c7fb76506646c2f836023d40fa2ae
commit + 8716e27d44c511046d01f245922e9015a72552fb
blob - ccf47c6cf6750600db391afa5be8d4e792b8821c
blob + f38a0917731c91e2e68fe3c8350ac847e19c1fb6
--- sys/net80211/ieee80211_node.c
+++ sys/net80211/ieee80211_node.c
@@ -2706,13 +2706,17 @@ ieee80211_node_addba_request_ac_vo_to(void *arg)
int
ieee80211_iserp_sta(const struct ieee80211_node *ni)
{
- static const u_int8_t rates[] = { 2, 4, 11, 22, 12, 24, 48 };
+ static const u_int8_t rates[] = { 12, 24, 48 };
const struct ieee80211_rateset *rs = &ni->ni_rates;
int i, j;
/*
- * A STA supports ERP operation if it includes all the Clause 19
- * mandatory rates in its supported rate set.
+ * A STA supports ERP operation if it includes all mandatory legacy
+ * OFDM rates in its supported rate set.
+ * We used to check for mandatory CCK rates here as well. However,
+ * there are APs which deliberately disable CCK rates to prevent
+ * 11b clients from connecting. We want to detect such APs as 11g,
+ * because otherwise we will fail to connect to them.
*/
for (i = 0; i < nitems(rates); i++) {
for (j = 0; j < rs->rs_nrates; j++) {
fix net80211 802.11g compatibility check