Browse Source

WPS: Use BSS table instead of raw scan results

Jouni Malinen 15 years ago
parent
commit
59f2caa925
3 changed files with 20 additions and 47 deletions
  1. 2 3
      wpa_supplicant/bss.c
  2. 2 0
      wpa_supplicant/bss.h
  3. 16 44
      wpa_supplicant/wps_supplicant.c

+ 2 - 3
wpa_supplicant/bss.c

@@ -65,9 +65,8 @@ static void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
 }
 
 
-static struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s,
-				    const u8 *bssid, const u8 *ssid,
-				    size_t ssid_len)
+struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid,
+			     const u8 *ssid, size_t ssid_len)
 {
 	struct wpa_bss *bss;
 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {

+ 2 - 0
wpa_supplicant/bss.h

@@ -72,6 +72,8 @@ void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
 void wpa_bss_update_end(struct wpa_supplicant *wpa_s);
 int wpa_bss_init(struct wpa_supplicant *wpa_s);
 void wpa_bss_deinit(struct wpa_supplicant *wpa_s);
+struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid,
+			     const u8 *ssid, size_t ssid_len);
 struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
 				   const u8 *bssid);
 struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id);

+ 16 - 44
wpa_supplicant/wps_supplicant.c

@@ -30,6 +30,7 @@
 #include "driver_i.h"
 #include "notify.h"
 #include "blacklist.h"
+#include "bss.h"
 #include "wps_supplicant.h"
 
 
@@ -93,8 +94,7 @@ static void wpas_wps_security_workaround(struct wpa_supplicant *wpa_s,
 					 const struct wps_credential *cred)
 {
 	struct wpa_driver_capa capa;
-	size_t i;
-	struct wpa_scan_res *bss;
+	struct wpa_bss *bss;
 	const u8 *ie;
 	struct wpa_ie_data adv;
 	int wpa2 = 0, ccmp = 0;
@@ -110,38 +110,22 @@ static void wpas_wps_security_workaround(struct wpa_supplicant *wpa_s,
 	if (wpa_drv_get_capa(wpa_s, &capa))
 		return; /* Unknown what driver supports */
 
-	if (wpa_supplicant_get_scan_results(wpa_s) || wpa_s->scan_res == NULL)
-		return; /* Could not get scan results for checking advertised
-			 * parameters */
-
-	for (i = 0; i < wpa_s->scan_res->num; i++) {
-		bss = wpa_s->scan_res->res[i];
-		if (os_memcmp(bss->bssid, cred->mac_addr, ETH_ALEN) != 0)
-			continue;
-		ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
-		if (ie == NULL)
-			continue;
-		if (ie[1] != ssid->ssid_len || ssid->ssid == NULL ||
-		    os_memcmp(ie + 2, ssid->ssid, ssid->ssid_len) != 0)
-			continue;
-
-		wpa_printf(MSG_DEBUG, "WPS: AP found from scan results");
-		break;
-	}
-
-	if (i == wpa_s->scan_res->num) {
-		wpa_printf(MSG_DEBUG, "WPS: The AP was not found from scan "
-			   "results - use credential as-is");
+	bss = wpa_bss_get(wpa_s, cred->mac_addr, ssid->ssid, ssid->ssid_len);
+	if (bss == NULL) {
+		wpa_printf(MSG_DEBUG, "WPS: The AP was not found from BSS "
+			   "table - use credential as-is");
 		return;
 	}
 
-	ie = wpa_scan_get_ie(bss, WLAN_EID_RSN);
+	wpa_printf(MSG_DEBUG, "WPS: AP found from BSS table");
+
+	ie = wpa_bss_get_ie(bss, WLAN_EID_RSN);
 	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &adv) == 0) {
 		wpa2 = 1;
 		if (adv.pairwise_cipher & WPA_CIPHER_CCMP)
 			ccmp = 1;
 	} else {
-		ie = wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
+		ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
 		if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &adv) == 0 &&
 		    adv.pairwise_cipher & WPA_CIPHER_CCMP)
 			ccmp = 1;
@@ -588,34 +572,22 @@ static struct wpa_ssid * wpas_wps_add_network(struct wpa_supplicant *wpa_s,
 	}
 
 	if (bssid) {
-		size_t i;
+		struct wpa_bss *bss;
 		int count = 0;
 
 		os_memcpy(ssid->bssid, bssid, ETH_ALEN);
 		ssid->bssid_set = 1;
 
-		/* Try to get SSID from scan results */
-		if (wpa_s->scan_res == NULL &&
-		    wpa_supplicant_get_scan_results(wpa_s) < 0)
-			return ssid; /* Could not find any scan results */
-
-		for (i = 0; i < wpa_s->scan_res->num; i++) {
-			const u8 *ie;
-			struct wpa_scan_res *res;
-
-			res = wpa_s->scan_res->res[i];
-			if (os_memcmp(bssid, res->bssid, ETH_ALEN) != 0)
+		dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
+			if (os_memcmp(bssid, bss->bssid, ETH_ALEN) != 0)
 				continue;
 
-			ie = wpa_scan_get_ie(res, WLAN_EID_SSID);
-			if (ie == NULL)
-				break;
 			os_free(ssid->ssid);
-			ssid->ssid = os_malloc(ie[1]);
+			ssid->ssid = os_malloc(bss->ssid_len);
 			if (ssid->ssid == NULL)
 				break;
-			os_memcpy(ssid->ssid, ie + 2, ie[1]);
-			ssid->ssid_len = ie[1];
+			os_memcpy(ssid->ssid, bss->ssid, bss->ssid_len);
+			ssid->ssid_len = bss->ssid_len;
 			wpa_hexdump_ascii(MSG_DEBUG, "WPS: Picked SSID from "
 					  "scan results",
 					  ssid->ssid, ssid->ssid_len);