mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-23 05:32:48 +01:00
scan: Use wiphy_estimate_data_rate
This commit is contained in:
parent
74761fcdd3
commit
709b77794b
62
src/scan.c
62
src/scan.c
@ -999,18 +999,6 @@ static bool scan_parse_bss_information_elements(struct scan_bss *bss,
|
||||
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 @@ static bool scan_parse_bss_information_elements(struct scan_bss *bss,
|
||||
|
||||
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 bool scan_parse_bss_information_elements(struct scan_bss *bss,
|
||||
}
|
||||
|
||||
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 @@ static struct scan_bss *scan_parse_attr_bss(struct l_genl_attr *attr,
|
||||
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_freq_set *scan_parse_attr_scan_frequencies(
|
||||
}
|
||||
|
||||
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 @@ static struct scan_bss *scan_parse_result(struct l_genl_msg *msg,
|
||||
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 void scan_bss_compute_rank(struct scan_bss *bss)
|
||||
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 @@ struct scan_bss *scan_bss_new_from_probe_req(const struct mmpdu_header *mpdu,
|
||||
if (!scan_parse_bss_information_elements(bss, body, body_len))
|
||||
goto fail;
|
||||
|
||||
scan_bss_compute_rank(bss);
|
||||
return bss;
|
||||
|
||||
fail:
|
||||
@ -1377,7 +1350,6 @@ fail:
|
||||
|
||||
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 @@ static void get_scan_callback(struct l_genl_msg *msg, void *user_data)
|
||||
return;
|
||||
}
|
||||
|
||||
bss = scan_parse_result(msg, &seen_ms_ago);
|
||||
bss = scan_parse_result(msg, sc->wiphy, &seen_ms_ago);
|
||||
if (!bss)
|
||||
return;
|
||||
|
||||
|
@ -64,14 +64,11 @@ struct scan_bss {
|
||||
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 @@ struct scan_bss {
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user