diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-10-27 15:59:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-10-30 16:49:19 -0400 |
commit | 4d36ec58239eec44d77839ef6c25108efcbbb58c (patch) | |
tree | 7074195389af214ba0081169afb4b64514f2419a /net/mac80211/util.c | |
parent | b59f04cbf8ab4dce63f0d2ed658624b0ad21c67d (diff) |
mac80211: split hardware scan by band
There's currently a very odd bug in mac80211 -- a
hardware scan that is done while the hardware is
really operating on 2.4 GHz will include CCK rates
in the probe request frame, even on 5 GHz (if the
driver uses the mac80211 IEs). Vice versa, if the
hardware is operating on 5 GHz the 2.4 GHz probe
requests will not include CCK rates even though
they should.
Fix this by splitting up cfg80211 scan requests by
band -- recalculating the IEs every time -- and
requesting only per-band scans from the driver.
Apparently this bug hasn't been a problem yet, but
it is imaginable that some older access points get
confused if confronted with such behaviour.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index aeb65b3d2295..aedbaaa067e6 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -872,13 +872,14 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, | |||
872 | } | 872 | } |
873 | 873 | ||
874 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, | 874 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, |
875 | const u8 *ie, size_t ie_len) | 875 | const u8 *ie, size_t ie_len, |
876 | enum ieee80211_band band) | ||
876 | { | 877 | { |
877 | struct ieee80211_supported_band *sband; | 878 | struct ieee80211_supported_band *sband; |
878 | u8 *pos, *supp_rates_len, *esupp_rates_len = NULL; | 879 | u8 *pos, *supp_rates_len, *esupp_rates_len = NULL; |
879 | int i; | 880 | int i; |
880 | 881 | ||
881 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 882 | sband = local->hw.wiphy->bands[band]; |
882 | 883 | ||
883 | pos = buffer; | 884 | pos = buffer; |
884 | 885 | ||
@@ -966,7 +967,8 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, | |||
966 | memcpy(pos, ssid, ssid_len); | 967 | memcpy(pos, ssid, ssid_len); |
967 | pos += ssid_len; | 968 | pos += ssid_len; |
968 | 969 | ||
969 | skb_put(skb, ieee80211_build_preq_ies(local, pos, ie, ie_len)); | 970 | skb_put(skb, ieee80211_build_preq_ies(local, pos, ie, ie_len, |
971 | local->hw.conf.channel->band)); | ||
970 | 972 | ||
971 | ieee80211_tx_skb(sdata, skb, 0); | 973 | ieee80211_tx_skb(sdata, skb, 0); |
972 | } | 974 | } |