Add support to estimate throughput for VHT 160/80+80 MHz supporting APs
Add support to calculate estimated throughputs for APs which support the 160 MHz (including 80+80 MHz) mode in VHT. The minimum SNR values for VHT 160 MHz mode are derived from minimum SNR values used for VHT 80 MHz mode + 3 dBm. The min-SNR values are derived relatively based on the information that the minimum sensitivity levels defined in Table 21-25 (Receiver minimum input level sensitivity) in IEEE Std 802.11-2020 for the 160 MHz mode are higher by 3 dBm compared to the values of the 80 MHz mode for each rate. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
1d2118b509
commit
658b6a0b08
1 changed files with 53 additions and 2 deletions
|
@ -2276,6 +2276,22 @@ static const struct minsnr_bitrate_entry vht80_table[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const struct minsnr_bitrate_entry vht160_table[] = {
|
||||||
|
{ 0, 0 },
|
||||||
|
{ 11, 58500 }, /* VHT160 MCS0 */
|
||||||
|
{ 14, 117000 }, /* VHT160 MCS1 */
|
||||||
|
{ 18, 175500 }, /* VHT160 MCS2 */
|
||||||
|
{ 20, 234000 }, /* VHT160 MCS3 */
|
||||||
|
{ 24, 351000 }, /* VHT160 MCS4 */
|
||||||
|
{ 27, 468000 }, /* VHT160 MCS5 */
|
||||||
|
{ 29, 526500 }, /* VHT160 MCS6 */
|
||||||
|
{ 34, 585000 }, /* VHT160 MCS7 */
|
||||||
|
{ 38, 702000 }, /* VHT160 MCS8 */
|
||||||
|
{ 40, 780000 }, /* VHT160 MCS9 */
|
||||||
|
{ -1, 780000 } /* SNR > 37 */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static unsigned int interpolate_rate(int snr, int snr0, int snr1,
|
static unsigned int interpolate_rate(int snr, int snr0, int snr1,
|
||||||
int rate0, int rate1)
|
int rate0, int rate1)
|
||||||
{
|
{
|
||||||
|
@ -2320,6 +2336,12 @@ static unsigned int max_vht80_rate(int snr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned int max_vht160_rate(int snr)
|
||||||
|
{
|
||||||
|
return max_rate(vht160_table, snr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
||||||
const u8 *ies, size_t ies_len, int rate,
|
const u8 *ies, size_t ies_len, int rate,
|
||||||
int snr, int freq)
|
int snr, int freq)
|
||||||
|
@ -2396,6 +2418,8 @@ unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
||||||
/* Use +1 to assume VHT is always faster than HT */
|
/* Use +1 to assume VHT is always faster than HT */
|
||||||
ie = get_ie(ies, ies_len, WLAN_EID_VHT_CAP);
|
ie = get_ie(ies, ies_len, WLAN_EID_VHT_CAP);
|
||||||
if (ie) {
|
if (ie) {
|
||||||
|
bool vht80 = false, vht160 = false;
|
||||||
|
|
||||||
tmp = max_ht20_rate(snr, true) + 1;
|
tmp = max_ht20_rate(snr, true) + 1;
|
||||||
if (tmp > est)
|
if (tmp > est)
|
||||||
est = tmp;
|
est = tmp;
|
||||||
|
@ -2409,13 +2433,40 @@ unsigned int wpas_get_est_tpt(const struct wpa_supplicant *wpa_s,
|
||||||
est = tmp;
|
est = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determine VHT BSS bandwidth based on IEEE Std
|
||||||
|
* 802.11-2020, Table 11-23 (VHT BSs bandwidth) */
|
||||||
ie = get_ie(ies, ies_len, WLAN_EID_VHT_OPERATION);
|
ie = get_ie(ies, ies_len, WLAN_EID_VHT_OPERATION);
|
||||||
if (ie && ie[1] >= 1 &&
|
if (ie && ie[1] >= 3) {
|
||||||
(ie[2] & VHT_OPMODE_CHANNEL_WIDTH_MASK)) {
|
u8 cw = ie[2] & VHT_OPMODE_CHANNEL_WIDTH_MASK;
|
||||||
|
u8 seg0 = ie[3];
|
||||||
|
u8 seg1 = ie[4];
|
||||||
|
|
||||||
|
if (cw)
|
||||||
|
vht80 = true;
|
||||||
|
if (cw == 2 ||
|
||||||
|
(cw == 3 &&
|
||||||
|
(seg1 > 0 && abs(seg1 - seg0) == 16)))
|
||||||
|
vht160 = true;
|
||||||
|
if (cw == 1 &&
|
||||||
|
((seg1 > 0 && abs(seg1 - seg0) == 8) ||
|
||||||
|
(seg1 > 0 && abs(seg1 - seg0) == 16)))
|
||||||
|
vht160 = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vht80) {
|
||||||
tmp = max_vht80_rate(snr) + 1;
|
tmp = max_vht80_rate(snr) + 1;
|
||||||
if (tmp > est)
|
if (tmp > est)
|
||||||
est = tmp;
|
est = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vht160 &&
|
||||||
|
(hw_mode->vht_capab &
|
||||||
|
(VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
|
||||||
|
VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))) {
|
||||||
|
tmp = max_vht160_rate(snr) + 1;
|
||||||
|
if (tmp > est)
|
||||||
|
est = tmp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue