--- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2175,6 +2175,10 @@ struct hostap_sta_driver_data { u8 tx_mcs; u8 rx_vht_nss; u8 tx_vht_nss; + u8 rx_hemcs; + u8 tx_hemcs; + u8 rx_he_nss; + u8 tx_he_nss; }; struct hostapd_sta_add_params { --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -7010,6 +7010,8 @@ static int get_sta_handler(struct nl_msg [NL80211_RATE_INFO_VHT_MCS] = { .type = NLA_U8 }, [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, [NL80211_RATE_INFO_VHT_NSS] = { .type = NLA_U8 }, + [NL80211_RATE_INFO_HE_NSS] = { .type = NLA_U8 }, + [NL80211_RATE_INFO_HE_MCS] = { .type = NLA_U8 }, }; nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), @@ -7102,6 +7104,10 @@ static int get_sta_handler(struct nl_msg nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); data->flags |= STA_DRV_DATA_TX_VHT_NSS; } + if (rate[NL80211_RATE_INFO_HE_MCS]) + data->tx_hemcs = nla_get_u8(rate[NL80211_RATE_INFO_HE_MCS]); + if (rate[NL80211_RATE_INFO_HE_NSS]) + data->tx_he_nss = nla_get_u8(rate[NL80211_RATE_INFO_HE_NSS]); } if (stats[NL80211_STA_INFO_RX_BITRATE] && @@ -7132,11 +7138,16 @@ static int get_sta_handler(struct nl_msg nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); data->flags |= STA_DRV_DATA_RX_VHT_NSS; } + if (rate[NL80211_RATE_INFO_HE_MCS]) + data->rx_hemcs = nla_get_u8(rate[NL80211_RATE_INFO_HE_MCS]); + if (rate[NL80211_RATE_INFO_HE_NSS]) + data->rx_he_nss = nla_get_u8(rate[NL80211_RATE_INFO_HE_NSS]); } if (stats[NL80211_STA_INFO_TID_STATS]) get_sta_tid_stats(data, stats[NL80211_STA_INFO_TID_STATS]); + return NL_SKIP; }