scan: Use wiphy_estimate_data_rate
diff --git a/src/scan.c b/src/scan.c
index 55c802a..a011c2b 100644
--- a/src/scan.c
+++ b/src/scan.c
@@ -999,18 +999,6 @@
 			bss->ssid_len = iter.len;
 			have_ssid = true;
 			break;
-		case IE_TYPE_SUPPORTED_RATES:
-			if (iter.len > 8)
-				return false;
-
-			bss->has_sup_rates =  true;
-			memcpy(bss->supp_rates_ie, iter.data - 2, iter.len + 2);
-
-			break;
-		case IE_TYPE_EXTENDED_SUPPORTED_RATES:
-			bss->ext_supp_rates_ie = l_memdup(iter.data - 2,
-								iter.len + 2);
-			break;
 		case IE_TYPE_RSN:
 			if (!bss->rsne)
 				bss->rsne = l_memdup(iter.data - 2,
@@ -1056,20 +1044,10 @@
 
 			break;
 		case IE_TYPE_HT_CAPABILITIES:
-			if (iter.len != 26)
-				return false;
-
 			bss->ht_capable = true;
-			memcpy(bss->ht_ie, iter.data - 2, iter.len + 2);
-
 			break;
 		case IE_TYPE_VHT_CAPABILITIES:
-			if (iter.len != 12)
-				return false;
-
 			bss->vht_capable = true;
-			memcpy(bss->vht_ie, iter.data - 2, iter.len + 2);
-
 			break;
 		case IE_TYPE_ADVERTISEMENT_PROTOCOL:
 			if (iter.len < 2)
@@ -1164,6 +1142,7 @@
 }
 
 static struct scan_bss *scan_parse_attr_bss(struct l_genl_attr *attr,
+						struct wiphy *wiphy,
 						uint32_t *out_seen_ms_ago)
 {
 	uint16_t type, len;
@@ -1247,8 +1226,16 @@
 				memcmp(ies, beacon_ies, ies_len)))
 		bss->source_frame = SCAN_BSS_PROBE_RESP;
 
-	if (ies && !scan_parse_bss_information_elements(bss, ies, ies_len))
-		goto fail;
+	/* Set data rate to something low, just in case estimation fails */
+	bss->data_rate = 2000000;
+
+	if (ies) {
+		if (!scan_parse_bss_information_elements(bss, ies, ies_len))
+			goto fail;
+
+		L_WARN_ON(wiphy_estimate_data_rate(wiphy, ies, ies_len, bss,
+						&bss->data_rate) < 0);
+	}
 
 	return bss;
 
@@ -1280,6 +1267,7 @@
 }
 
 static struct scan_bss *scan_parse_result(struct l_genl_msg *msg,
+						struct wiphy *wiphy,
 						uint32_t *out_seen_ms_ago)
 {
 	struct l_genl_attr attr, nested;
@@ -1295,7 +1283,8 @@
 			if (!l_genl_attr_recurse(&attr, &nested))
 				return NULL;
 
-			bss = scan_parse_attr_bss(&nested, out_seen_ms_ago);
+			bss = scan_parse_attr_bss(&nested, wiphy,
+							out_seen_ms_ago);
 			break;
 		}
 	}
@@ -1309,27 +1298,12 @@
 	static const double RANK_LOW_UTILIZATION_FACTOR = 1.2;
 	double rank;
 	uint32_t irank;
-	uint64_t data_rate;
 	/*
 	 * Maximum rate is 2340Mbps (VHT)
 	 */
-	uint64_t max_rate = 2340000000U;
+	double max_rate = 2340000000;
 
-	/*
-	 * If parsing fails choose a very low data rate as its unknown what
-	 * this AP supports or why its IEs did not parse. Likely not an AP
-	 * we should prefer to connect to.
-	 */
-	if (ie_parse_data_rates(bss->has_sup_rates ?
-				bss->supp_rates_ie : NULL,
-				bss->ext_supp_rates_ie,
-				bss->ht_capable ? bss->ht_ie : NULL,
-				bss->vht_capable ? bss->vht_ie : NULL,
-				bss->signal_strength / 100,
-				&data_rate) != 0)
-		data_rate = 2000000;
-
-	rank = (double)data_rate / (double)max_rate * USHRT_MAX;
+	rank = (double)bss->data_rate / max_rate * USHRT_MAX;
 
 	/* Prefer 5G networks over 2.4G */
 	if (bss->frequency > 4000)
@@ -1367,7 +1341,6 @@
 	if (!scan_parse_bss_information_elements(bss, body, body_len))
 		goto fail;
 
-	scan_bss_compute_rank(bss);
 	return bss;
 
 fail:
@@ -1377,7 +1350,6 @@
 
 void scan_bss_free(struct scan_bss *bss)
 {
-	l_free(bss->ext_supp_rates_ie);
 	l_free(bss->rsne);
 	l_free(bss->wpa);
 	l_free(bss->wsc);
@@ -1474,7 +1446,7 @@
 		return;
 	}
 
-	bss = scan_parse_result(msg, &seen_ms_ago);
+	bss = scan_parse_result(msg, sc->wiphy, &seen_ms_ago);
 	if (!bss)
 		return;
 
diff --git a/src/scan.h b/src/scan.h
index 498e8b2..7b62452 100644
--- a/src/scan.h
+++ b/src/scan.h
@@ -64,14 +64,11 @@
 	uint8_t mde[3];
 	uint8_t ssid[32];
 	uint8_t ssid_len;
-	uint8_t supp_rates_ie[10];
-	uint8_t *ext_supp_rates_ie;
 	uint8_t utilization;
 	uint8_t cc[3];
 	uint16_t rank;
-	uint8_t ht_ie[28];
-	uint8_t vht_ie[14];
 	uint64_t time_stamp;
+	uint64_t data_rate;
 	uint8_t hessid[6];
 	uint8_t *rc_ie;		/* Roaming consortium IE */
 	uint8_t hs20_version;
@@ -81,7 +78,6 @@
 	bool mde_present : 1;
 	bool cc_present : 1;
 	bool cap_rm_neighbor_report : 1;
-	bool has_sup_rates : 1;
 	bool ht_capable : 1;
 	bool vht_capable : 1;
 	bool anqp_capable : 1;