mac80211: fix supported rates IE if AP doesn't give us it's rates
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 28 Apr 2010 15:03:15 +0000 (17:03 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 2 Aug 2010 17:21:27 +0000 (10:21 -0700)
commit 76f273640134f3eb8257179cd5b3bc6ba5fe4a96 upstream.

If AP do not provide us supported rates before assiociation, send
all rates we are supporting instead of empty information element.

v1 -> v2: Add comment.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
net/mac80211/mlme.c

index 4a15df1f9645971be36bb8d6438c42614ff3b371..5bea319e3e54b7d17cad18f4a71a353b3b5b6f68 100644 (file)
@@ -269,12 +269,6 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
        if (wk->bss->wmm_used)
                wmm = 1;
 
-       /* get all rates supported by the device and the AP as
-        * some APs don't like getting a superset of their rates
-        * in the association request (e.g. D-Link DAP 1353 in
-        * b-only mode) */
-       rates_len = ieee80211_compatible_rates(wk->bss, sband, &rates);
-
        if ((wk->bss->cbss.capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
            (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
                capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
@@ -309,6 +303,17 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
        *pos++ = wk->ssid_len;
        memcpy(pos, wk->ssid, wk->ssid_len);
 
+       if (wk->bss->supp_rates_len) {
+               /* get all rates supported by the device and the AP as
+                * some APs don't like getting a superset of their rates
+                * in the association request (e.g. D-Link DAP 1353 in
+                * b-only mode) */
+               rates_len = ieee80211_compatible_rates(wk->bss, sband, &rates);
+       } else {
+               rates = ~0;
+               rates_len = sband->n_bitrates;
+       }
+
        /* add all rates which were marked to be used above */
        supp_rates_len = rates_len;
        if (supp_rates_len > 8)