nl80211: add VHT rateinfo support

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
This commit is contained in:
Jo-Philipp Wich 2016-01-25 15:01:49 +01:00
parent e3bd6c3653
commit bc8682aa5e
2 changed files with 48 additions and 28 deletions

View file

@ -89,6 +89,10 @@ struct iwinfo_rate_entry {
int8_t mcs; int8_t mcs;
uint8_t is_40mhz:1; uint8_t is_40mhz:1;
uint8_t is_short_gi:1; uint8_t is_short_gi:1;
uint8_t is_ht:1;
uint8_t is_vht:1;
uint8_t mhz;
uint8_t nss;
}; };
struct iwinfo_assoclist_entry { struct iwinfo_assoclist_entry {

View file

@ -1625,6 +1625,48 @@ static int nl80211_get_phyname(const char *ifname, char *buf)
} }
static void nl80211_parse_rateinfo(struct nlattr **ri,
struct iwinfo_rate_entry *re)
{
if (ri[NL80211_RATE_INFO_BITRATE32])
re->rate = nla_get_u32(ri[NL80211_RATE_INFO_BITRATE32]) * 100;
else if (ri[NL80211_RATE_INFO_BITRATE])
re->rate = nla_get_u16(ri[NL80211_RATE_INFO_BITRATE]) * 100;
if (ri[NL80211_RATE_INFO_VHT_MCS])
{
re->is_vht = 1;
re->mcs = nla_get_u8(ri[NL80211_RATE_INFO_VHT_MCS]);
if (ri[NL80211_RATE_INFO_VHT_NSS])
re->nss = nla_get_u8(ri[NL80211_RATE_INFO_VHT_NSS]);
}
else if (ri[NL80211_RATE_INFO_MCS])
{
re->is_ht = 1;
re->mcs = nla_get_u8(ri[NL80211_RATE_INFO_MCS]);
}
if (ri[NL80211_RATE_INFO_5_MHZ_WIDTH])
re->mhz = 5;
else if (ri[NL80211_RATE_INFO_10_MHZ_WIDTH])
re->mhz = 10;
else if (ri[NL80211_RATE_INFO_40_MHZ_WIDTH])
re->mhz = 40;
else if (ri[NL80211_RATE_INFO_80_MHZ_WIDTH])
re->mhz = 80;
else if (ri[NL80211_RATE_INFO_80P80_MHZ_WIDTH] ||
ri[NL80211_RATE_INFO_160_MHZ_WIDTH])
re->mhz = 160;
else
re->mhz = 20;
if (ri[NL80211_RATE_INFO_SHORT_GI])
re->is_short_gi = 1;
re->is_40mhz = (re->mhz == 40);
}
static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg) static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
{ {
struct nl80211_array_buf *arr = arg; struct nl80211_array_buf *arr = arg;
@ -1683,38 +1725,12 @@ static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
if (sinfo[NL80211_STA_INFO_RX_BITRATE] && if (sinfo[NL80211_STA_INFO_RX_BITRATE] &&
!nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, !nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX,
sinfo[NL80211_STA_INFO_RX_BITRATE], rate_policy)) sinfo[NL80211_STA_INFO_RX_BITRATE], rate_policy))
{ nl80211_parse_rateinfo(rinfo, &e->rx_rate);
if (rinfo[NL80211_RATE_INFO_BITRATE])
e->rx_rate.rate =
nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]) * 100;
if (rinfo[NL80211_RATE_INFO_MCS])
e->rx_rate.mcs = nla_get_u8(rinfo[NL80211_RATE_INFO_MCS]);
if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH])
e->rx_rate.is_40mhz = 1;
if (rinfo[NL80211_RATE_INFO_SHORT_GI])
e->rx_rate.is_short_gi = 1;
}
if (sinfo[NL80211_STA_INFO_TX_BITRATE] && if (sinfo[NL80211_STA_INFO_TX_BITRATE] &&
!nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, !nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX,
sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy)) sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy))
{ nl80211_parse_rateinfo(rinfo, &e->tx_rate);
if (rinfo[NL80211_RATE_INFO_BITRATE])
e->tx_rate.rate =
nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]) * 100;
if (rinfo[NL80211_RATE_INFO_MCS])
e->tx_rate.mcs = nla_get_u8(rinfo[NL80211_RATE_INFO_MCS]);
if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH])
e->tx_rate.is_40mhz = 1;
if (rinfo[NL80211_RATE_INFO_SHORT_GI])
e->tx_rate.is_short_gi = 1;
}
if (sinfo[NL80211_STA_INFO_RX_BYTES]) if (sinfo[NL80211_STA_INFO_RX_BYTES])
e->rx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_RX_BYTES]); e->rx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_RX_BYTES]);