--- src/netdev.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/netdev.h | 4 ++++ 2 files changed, 62 insertions(+) diff --git a/src/netdev.c b/src/netdev.c index 1e54acec..6fb33847 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -3991,11 +3991,50 @@ done: return 0; } +static bool netdev_parse_bitrate(struct l_genl_attr *attr, uint32_t *rate_out, + uint8_t *mcs_out) +{ + uint16_t type, len; + const void *data; + uint32_t rate = 0; + uint8_t mcs = 0; + + while (l_genl_attr_next(attr, &type, &len, &data)) { + switch (type) { + case NL80211_RATE_INFO_BITRATE32: + if (len != 4) + return false; + + l_debug("parsing bitrate"); + rate = *(const uint32_t *) data; + + break; + + case NL80211_RATE_INFO_MCS: + if (len != 1) + return false; + + mcs = *(const uint8_t *) data; + + break; + } + } + + if (!rate || !mcs) + return false; + + *rate_out = rate; + *mcs_out = mcs; + + return true; +} + static bool netdev_parse_sta_info(struct l_genl_attr *attr, struct netdev_station_info *info) { uint16_t type, len; const void *data; + struct l_genl_attr nested; while (l_genl_attr_next(attr, &type, &len, &data)) { switch (type) { @@ -4005,6 +4044,25 @@ static bool netdev_parse_sta_info(struct l_genl_attr *attr, info->cur_rssi = *(const int8_t *) data; + break; + case NL80211_STA_INFO_RX_BITRATE: + if (!l_genl_attr_recurse(attr, &nested)) + return false; + + if (!netdev_parse_bitrate(&nested, &info->rx_bitrate, + &info->rx_mcs)) + return false; + + break; + + case NL80211_STA_INFO_TX_BITRATE: + if (!l_genl_attr_recurse(attr, &nested)) + return false; + + if (!netdev_parse_bitrate(&nested, &info->tx_bitrate, + &info->tx_mcs)) + return false; + break; } } diff --git a/src/netdev.h b/src/netdev.h index 5cf38076..c5d1ff53 100644 --- a/src/netdev.h +++ b/src/netdev.h @@ -116,6 +116,10 @@ typedef void (*netdev_station_watch_func_t)(struct netdev *netdev, struct netdev_station_info { int8_t cur_rssi; + uint32_t rx_bitrate; + uint8_t rx_mcs; + uint32_t tx_bitrate; + uint8_t tx_mcs; }; typedef void (*netdev_get_station_cb_t)(struct netdev *netdev, -- 2.26.2