aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/scan.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-02-10 15:25:59 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-13 13:45:56 -0500
commit79420f09e76e8e1dd1149d6ce9c20e06cbb5802a (patch)
tree42adcb9fa34682629050778fa1c2b4d3382b6469 /net/wireless/scan.c
parentd491af19db3adcc1eb1653e60a427fb4df36f361 (diff)
cfg80211: add more flexible BSS lookup
Add a more flexible BSS lookup function so that mac80211 or other drivers can actually use this for getting the BSS to connect to. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless/scan.c')
-rw-r--r--net/wireless/scan.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index aacccc9ab6ca..b1893c863b97 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -116,9 +116,12 @@ static bool is_bss(struct cfg80211_bss *a,
116{ 116{
117 const u8 *ssidie; 117 const u8 *ssidie;
118 118
119 if (compare_ether_addr(a->bssid, bssid)) 119 if (bssid && compare_ether_addr(a->bssid, bssid))
120 return false; 120 return false;
121 121
122 if (!ssid)
123 return true;
124
122 ssidie = find_ie(WLAN_EID_SSID, 125 ssidie = find_ie(WLAN_EID_SSID,
123 a->information_elements, 126 a->information_elements,
124 a->len_information_elements); 127 a->len_information_elements);
@@ -199,7 +202,8 @@ static int cmp_bss(struct cfg80211_bss *a,
199struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy, 202struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
200 struct ieee80211_channel *channel, 203 struct ieee80211_channel *channel,
201 const u8 *bssid, 204 const u8 *bssid,
202 const u8 *ssid, size_t ssid_len) 205 const u8 *ssid, size_t ssid_len,
206 u16 capa_mask, u16 capa_val)
203{ 207{
204 struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy); 208 struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy);
205 struct cfg80211_internal_bss *bss, *res = NULL; 209 struct cfg80211_internal_bss *bss, *res = NULL;
@@ -207,6 +211,8 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
207 spin_lock_bh(&dev->bss_lock); 211 spin_lock_bh(&dev->bss_lock);
208 212
209 list_for_each_entry(bss, &dev->bss_list, list) { 213 list_for_each_entry(bss, &dev->bss_list, list) {
214 if ((bss->pub.capability & capa_mask) != capa_val)
215 continue;
210 if (channel && bss->pub.channel != channel) 216 if (channel && bss->pub.channel != channel)
211 continue; 217 continue;
212 if (is_bss(&bss->pub, bssid, ssid, ssid_len)) { 218 if (is_bss(&bss->pub, bssid, ssid, ssid_len)) {