Move throughput estimation into a helper function
This is a step towards allowing this functionality to update the scan result -based values with the values from a signal poll for the current BSS. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
ef1a45f28a
commit
ad06ac0b04
2 changed files with 35 additions and 18 deletions
|
@ -2248,20 +2248,13 @@ static unsigned int max_vht80_rate(int snr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_scan_res *res)
|
const u8 *ies, size_t ies_len, int rate,
|
||||||
|
int snr)
|
||||||
{
|
{
|
||||||
enum local_hw_capab capab = wpa_s->hw_capab;
|
enum local_hw_capab capab = wpa_s->hw_capab;
|
||||||
int rate; /* max legacy rate in 500 kb/s units */
|
|
||||||
const u8 *ie;
|
|
||||||
unsigned int est, tmp;
|
unsigned int est, tmp;
|
||||||
int snr = res->snr;
|
const u8 *ie;
|
||||||
|
|
||||||
if (res->est_throughput)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Get maximum legacy rate */
|
|
||||||
rate = wpa_scan_get_max_rate(res);
|
|
||||||
|
|
||||||
/* Limit based on estimated SNR */
|
/* Limit based on estimated SNR */
|
||||||
if (rate > 1 * 2 && snr < 1)
|
if (rate > 1 * 2 && snr < 1)
|
||||||
|
@ -2287,7 +2280,7 @@ void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
est = rate * 500;
|
est = rate * 500;
|
||||||
|
|
||||||
if (capab == CAPAB_HT || capab == CAPAB_HT40 || capab == CAPAB_VHT) {
|
if (capab == CAPAB_HT || capab == CAPAB_HT40 || capab == CAPAB_VHT) {
|
||||||
ie = wpa_scan_get_ie(res, WLAN_EID_HT_CAP);
|
ie = get_ie(ies, ies_len, WLAN_EID_HT_CAP);
|
||||||
if (ie) {
|
if (ie) {
|
||||||
tmp = max_ht20_rate(snr);
|
tmp = max_ht20_rate(snr);
|
||||||
if (tmp > est)
|
if (tmp > est)
|
||||||
|
@ -2296,7 +2289,7 @@ void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (capab == CAPAB_HT40 || capab == CAPAB_VHT) {
|
if (capab == CAPAB_HT40 || capab == CAPAB_VHT) {
|
||||||
ie = wpa_scan_get_ie(res, WLAN_EID_HT_OPERATION);
|
ie = get_ie(ies, ies_len, WLAN_EID_HT_OPERATION);
|
||||||
if (ie && ie[1] >= 2 &&
|
if (ie && ie[1] >= 2 &&
|
||||||
(ie[3] & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK)) {
|
(ie[3] & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK)) {
|
||||||
tmp = max_ht40_rate(snr);
|
tmp = max_ht40_rate(snr);
|
||||||
|
@ -2307,13 +2300,13 @@ void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
|
|
||||||
if (capab == CAPAB_VHT) {
|
if (capab == CAPAB_VHT) {
|
||||||
/* Use +1 to assume VHT is always faster than HT */
|
/* Use +1 to assume VHT is always faster than HT */
|
||||||
ie = wpa_scan_get_ie(res, WLAN_EID_VHT_CAP);
|
ie = get_ie(ies, ies_len, WLAN_EID_VHT_CAP);
|
||||||
if (ie) {
|
if (ie) {
|
||||||
tmp = max_ht20_rate(snr) + 1;
|
tmp = max_ht20_rate(snr) + 1;
|
||||||
if (tmp > est)
|
if (tmp > est)
|
||||||
est = tmp;
|
est = tmp;
|
||||||
|
|
||||||
ie = wpa_scan_get_ie(res, WLAN_EID_HT_OPERATION);
|
ie = get_ie(ies, ies_len, WLAN_EID_HT_OPERATION);
|
||||||
if (ie && ie[1] >= 2 &&
|
if (ie && ie[1] >= 2 &&
|
||||||
(ie[3] &
|
(ie[3] &
|
||||||
HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK)) {
|
HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK)) {
|
||||||
|
@ -2322,7 +2315,7 @@ void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
est = tmp;
|
est = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
ie = wpa_scan_get_ie(res, WLAN_EID_VHT_OPERATION);
|
ie = get_ie(ies, ies_len, WLAN_EID_VHT_OPERATION);
|
||||||
if (ie && ie[1] >= 1 &&
|
if (ie && ie[1] >= 1 &&
|
||||||
(ie[2] & VHT_OPMODE_CHANNEL_WIDTH_MASK)) {
|
(ie[2] & VHT_OPMODE_CHANNEL_WIDTH_MASK)) {
|
||||||
tmp = max_vht80_rate(snr) + 1;
|
tmp = max_vht80_rate(snr) + 1;
|
||||||
|
@ -2332,9 +2325,30 @@ void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: channel utilization and AP load (e.g., from AP Beacon) */
|
return est;
|
||||||
|
}
|
||||||
|
|
||||||
res->est_throughput = est;
|
|
||||||
|
void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
|
struct wpa_scan_res *res)
|
||||||
|
{
|
||||||
|
int rate; /* max legacy rate in 500 kb/s units */
|
||||||
|
int snr = res->snr;
|
||||||
|
const u8 *ies = (const void *) (res + 1);
|
||||||
|
size_t ie_len = res->ie_len;
|
||||||
|
|
||||||
|
if (res->est_throughput)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Get maximum legacy rate */
|
||||||
|
rate = wpa_scan_get_max_rate(res);
|
||||||
|
|
||||||
|
if (!ie_len)
|
||||||
|
ie_len = res->beacon_ie_len;
|
||||||
|
res->est_throughput =
|
||||||
|
wpas_get_est_tpt(wpa_s, ies, res->ie_len, rate, snr);
|
||||||
|
|
||||||
|
/* TODO: channel utilization and AP load (e.g., from AP Beacon) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,9 @@ void filter_scan_res(struct wpa_supplicant *wpa_s,
|
||||||
void scan_snr(struct wpa_scan_res *res);
|
void scan_snr(struct wpa_scan_res *res);
|
||||||
void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
void scan_est_throughput(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_scan_res *res);
|
struct wpa_scan_res *res);
|
||||||
|
unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
||||||
|
const u8 *ies, size_t ies_len, int rate,
|
||||||
|
int snr);
|
||||||
void wpa_supplicant_set_default_scan_ies(struct wpa_supplicant *wpa_s);
|
void wpa_supplicant_set_default_scan_ies(struct wpa_supplicant *wpa_s);
|
||||||
|
|
||||||
#endif /* SCAN_H */
|
#endif /* SCAN_H */
|
||||||
|
|
Loading…
Reference in a new issue