mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 23:09:34 +01:00
netdev: parse rates in netdev_get_station
This commit is contained in:
parent
67cb8de2ef
commit
0ba73ec139
94
src/netdev.c
94
src/netdev.c
@ -368,11 +368,74 @@ int netdev_set_powered(struct netdev *netdev, bool powered,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool netdev_parse_bitrate(struct l_genl_attr *attr,
|
||||||
|
enum netdev_mcs_type *type_out,
|
||||||
|
uint32_t *rate_out,
|
||||||
|
uint8_t *mcs_out)
|
||||||
|
{
|
||||||
|
uint16_t type, len;
|
||||||
|
const void *data;
|
||||||
|
uint32_t rate = 0;
|
||||||
|
uint8_t mcs = 0;
|
||||||
|
enum netdev_mcs_type mcs_type = NETDEV_MCS_TYPE_NONE;
|
||||||
|
|
||||||
|
while (l_genl_attr_next(attr, &type, &len, &data)) {
|
||||||
|
switch (type) {
|
||||||
|
case NL80211_RATE_INFO_BITRATE32:
|
||||||
|
if (len != 4)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
rate = l_get_u32(data);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NL80211_RATE_INFO_MCS:
|
||||||
|
if (len != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mcs = l_get_u8(data);
|
||||||
|
mcs_type = NETDEV_MCS_TYPE_HT;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NL80211_RATE_INFO_VHT_MCS:
|
||||||
|
if (len != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mcs = l_get_u8(data);
|
||||||
|
mcs_type = NETDEV_MCS_TYPE_VHT;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NL80211_RATE_INFO_HE_MCS:
|
||||||
|
if (len != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mcs = l_get_u8(data);
|
||||||
|
mcs_type = NETDEV_MCS_TYPE_HE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rate)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*type_out = mcs_type;
|
||||||
|
*rate_out = rate;
|
||||||
|
|
||||||
|
if (mcs_type != NETDEV_MCS_TYPE_NONE)
|
||||||
|
*mcs_out = mcs;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool netdev_parse_sta_info(struct l_genl_attr *attr,
|
static bool netdev_parse_sta_info(struct l_genl_attr *attr,
|
||||||
struct netdev_station_info *info)
|
struct netdev_station_info *info)
|
||||||
{
|
{
|
||||||
uint16_t type, len;
|
uint16_t type, len;
|
||||||
const void *data;
|
const void *data;
|
||||||
|
struct l_genl_attr nested;
|
||||||
|
|
||||||
while (l_genl_attr_next(attr, &type, &len, &data)) {
|
while (l_genl_attr_next(attr, &type, &len, &data)) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -383,6 +446,37 @@ static bool netdev_parse_sta_info(struct l_genl_attr *attr,
|
|||||||
info->cur_rssi = *(const int8_t *) data;
|
info->cur_rssi = *(const int8_t *) data;
|
||||||
info->have_cur_rssi = true;
|
info->have_cur_rssi = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NL80211_STA_INFO_RX_BITRATE:
|
||||||
|
if (!l_genl_attr_recurse(attr, &nested))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!netdev_parse_bitrate(&nested, &info->rx_mcs_type,
|
||||||
|
&info->rx_bitrate,
|
||||||
|
&info->rx_mcs))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
info->have_rx_bitrate = true;
|
||||||
|
|
||||||
|
if (info->rx_mcs_type != NETDEV_MCS_TYPE_NONE)
|
||||||
|
info->have_rx_mcs = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NL80211_STA_INFO_TX_BITRATE:
|
||||||
|
if (!l_genl_attr_recurse(attr, &nested))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!netdev_parse_bitrate(&nested, &info->tx_mcs_type,
|
||||||
|
&info->tx_bitrate,
|
||||||
|
&info->tx_mcs))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
info->have_tx_bitrate = true;
|
||||||
|
|
||||||
|
if (info->tx_mcs_type != NETDEV_MCS_TYPE_NONE)
|
||||||
|
info->have_tx_mcs = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
18
src/netdev.h
18
src/netdev.h
@ -114,11 +114,29 @@ typedef void (*netdev_station_watch_func_t)(struct netdev *netdev,
|
|||||||
const uint8_t *mac, bool added,
|
const uint8_t *mac, bool added,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
|
|
||||||
|
enum netdev_mcs_type {
|
||||||
|
NETDEV_MCS_TYPE_NONE,
|
||||||
|
NETDEV_MCS_TYPE_HT,
|
||||||
|
NETDEV_MCS_TYPE_VHT,
|
||||||
|
NETDEV_MCS_TYPE_HE,
|
||||||
|
};
|
||||||
|
|
||||||
struct netdev_station_info {
|
struct netdev_station_info {
|
||||||
uint8_t addr[6];
|
uint8_t addr[6];
|
||||||
int8_t cur_rssi;
|
int8_t cur_rssi;
|
||||||
|
|
||||||
|
enum netdev_mcs_type rx_mcs_type;
|
||||||
|
uint32_t rx_bitrate;
|
||||||
|
uint8_t rx_mcs;
|
||||||
|
enum netdev_mcs_type tx_mcs_type;
|
||||||
|
uint32_t tx_bitrate;
|
||||||
|
uint8_t tx_mcs;
|
||||||
|
|
||||||
bool have_cur_rssi : 1;
|
bool have_cur_rssi : 1;
|
||||||
|
bool have_rx_mcs : 1;
|
||||||
|
bool have_tx_mcs : 1;
|
||||||
|
bool have_rx_bitrate : 1;
|
||||||
|
bool have_tx_bitrate : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*netdev_get_station_cb_t)(const struct netdev_station_info *info,
|
typedef void (*netdev_get_station_cb_t)(const struct netdev_station_info *info,
|
||||||
|
Loading…
Reference in New Issue
Block a user