diff options
Diffstat (limited to 'net/ieee80211/softmac/ieee80211softmac_wx.c')
-rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_wx.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index b559aa9b5507..27edb2b5581a 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c | |||
@@ -27,7 +27,8 @@ | |||
27 | #include "ieee80211softmac_priv.h" | 27 | #include "ieee80211softmac_priv.h" |
28 | 28 | ||
29 | #include <net/iw_handler.h> | 29 | #include <net/iw_handler.h> |
30 | 30 | /* for is_broadcast_ether_addr and is_zero_ether_addr */ | |
31 | #include <linux/etherdevice.h> | ||
31 | 32 | ||
32 | int | 33 | int |
33 | ieee80211softmac_wx_trigger_scan(struct net_device *net_dev, | 34 | ieee80211softmac_wx_trigger_scan(struct net_device *net_dev, |
@@ -41,13 +42,23 @@ ieee80211softmac_wx_trigger_scan(struct net_device *net_dev, | |||
41 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_trigger_scan); | 42 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_trigger_scan); |
42 | 43 | ||
43 | 44 | ||
45 | /* if we're still scanning, return -EAGAIN so that userspace tools | ||
46 | * can get the complete scan results, otherwise return 0. */ | ||
44 | int | 47 | int |
45 | ieee80211softmac_wx_get_scan_results(struct net_device *net_dev, | 48 | ieee80211softmac_wx_get_scan_results(struct net_device *net_dev, |
46 | struct iw_request_info *info, | 49 | struct iw_request_info *info, |
47 | union iwreq_data *data, | 50 | union iwreq_data *data, |
48 | char *extra) | 51 | char *extra) |
49 | { | 52 | { |
53 | unsigned long flags; | ||
50 | struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); | 54 | struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); |
55 | |||
56 | spin_lock_irqsave(&sm->lock, flags); | ||
57 | if (sm->scanning) { | ||
58 | spin_unlock_irqrestore(&sm->lock, flags); | ||
59 | return -EAGAIN; | ||
60 | } | ||
61 | spin_unlock_irqrestore(&sm->lock, flags); | ||
51 | return ieee80211_wx_get_scan(sm->ieee, info, data, extra); | 62 | return ieee80211_wx_get_scan(sm->ieee, info, data, extra); |
52 | } | 63 | } |
53 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_scan_results); | 64 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_scan_results); |
@@ -73,7 +84,6 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
73 | sm->associnfo.static_essid = 1; | 84 | sm->associnfo.static_essid = 1; |
74 | } | 85 | } |
75 | } | 86 | } |
76 | sm->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT; | ||
77 | 87 | ||
78 | /* set our requested ESSID length. | 88 | /* set our requested ESSID length. |
79 | * If applicable, we have already copied the data in */ | 89 | * If applicable, we have already copied the data in */ |
@@ -300,8 +310,6 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev, | |||
300 | char *extra) | 310 | char *extra) |
301 | { | 311 | { |
302 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); | 312 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); |
303 | static const unsigned char any[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; | ||
304 | static const unsigned char off[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
305 | unsigned long flags; | 313 | unsigned long flags; |
306 | 314 | ||
307 | /* sanity check */ | 315 | /* sanity check */ |
@@ -310,10 +318,17 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev, | |||
310 | } | 318 | } |
311 | 319 | ||
312 | spin_lock_irqsave(&mac->lock, flags); | 320 | spin_lock_irqsave(&mac->lock, flags); |
313 | if (!memcmp(any, data->ap_addr.sa_data, ETH_ALEN) || | 321 | if (is_broadcast_ether_addr(data->ap_addr.sa_data)) { |
314 | !memcmp(off, data->ap_addr.sa_data, ETH_ALEN)) { | 322 | /* the bssid we have is not to be fixed any longer, |
315 | schedule_work(&mac->associnfo.work); | 323 | * and we should reassociate to the best AP. */ |
316 | goto out; | 324 | mac->associnfo.bssfixed = 0; |
325 | /* force reassociation */ | ||
326 | mac->associnfo.bssvalid = 0; | ||
327 | if (mac->associated) | ||
328 | schedule_work(&mac->associnfo.work); | ||
329 | } else if (is_zero_ether_addr(data->ap_addr.sa_data)) { | ||
330 | /* the bssid we have is no longer fixed */ | ||
331 | mac->associnfo.bssfixed = 0; | ||
317 | } else { | 332 | } else { |
318 | if (!memcmp(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN)) { | 333 | if (!memcmp(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN)) { |
319 | if (mac->associnfo.associating || mac->associated) { | 334 | if (mac->associnfo.associating || mac->associated) { |
@@ -323,12 +338,14 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev, | |||
323 | } else { | 338 | } else { |
324 | /* copy new value in data->ap_addr.sa_data to bssid */ | 339 | /* copy new value in data->ap_addr.sa_data to bssid */ |
325 | memcpy(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN); | 340 | memcpy(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN); |
326 | } | 341 | } |
342 | /* tell the other code that this bssid should be used no matter what */ | ||
343 | mac->associnfo.bssfixed = 1; | ||
327 | /* queue associate if new bssid or (old one again and not associated) */ | 344 | /* queue associate if new bssid or (old one again and not associated) */ |
328 | schedule_work(&mac->associnfo.work); | 345 | schedule_work(&mac->associnfo.work); |
329 | } | 346 | } |
330 | 347 | ||
331 | out: | 348 | out: |
332 | spin_unlock_irqrestore(&mac->lock, flags); | 349 | spin_unlock_irqrestore(&mac->lock, flags); |
333 | return 0; | 350 | return 0; |
334 | } | 351 | } |