mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-19 10:23:03 +00:00
95 lines
3.1 KiB
Diff
95 lines
3.1 KiB
Diff
From fe0a0d3556de5caa1498b8a406cd1c6496c5ad1e Mon Sep 17 00:00:00 2001
|
|
From: Aloka Dixit <quic_alokad@quicinc.com>
|
|
Date: Tue, 29 Jun 2021 17:03:50 -0700
|
|
Subject: [PATCH 10/23] nl80211: parse EHT capabilities passed by kernel
|
|
|
|
Add nl80211 support to parse the EHT capabilities passed by the
|
|
kernel using new attributes added in NL80211_BAND_ATTR_IFTYPE_DATA.
|
|
|
|
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
|
|
---
|
|
src/drivers/driver_nl80211_capa.c | 48 +++++++++++++++++++++++++++++--
|
|
1 file changed, 46 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
|
|
index 200c545c2b70..b37167cc2075 100644
|
|
--- a/src/drivers/driver_nl80211_capa.c
|
|
+++ b/src/drivers/driver_nl80211_capa.c
|
|
@@ -1774,12 +1774,14 @@ static int phy_info_rates(struct hostapd_hw_modes *mode, struct nlattr *tb)
|
|
}
|
|
|
|
|
|
-static void phy_info_iftype_copy(struct he_capabilities *he_capab,
|
|
+static void phy_info_iftype_copy(struct hostapd_hw_modes *mode,
|
|
enum ieee80211_op_mode opmode,
|
|
struct nlattr **tb, struct nlattr **tb_flags)
|
|
{
|
|
enum nl80211_iftype iftype;
|
|
size_t len;
|
|
+ struct he_capabilities *he_capab = &mode->he_capab[opmode];
|
|
+ struct eht_capabilities *eht_capab = &mode->eht_capab[opmode];
|
|
|
|
switch (opmode) {
|
|
case IEEE80211_MODE_INFRA:
|
|
@@ -1849,6 +1851,48 @@ static void phy_info_iftype_copy(struct he_capabilities *he_capab,
|
|
capa = nla_get_u16(tb[NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA]);
|
|
he_capab->he_6ghz_capa = le_to_host16(capa);
|
|
}
|
|
+
|
|
+ if (!tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC] ||
|
|
+ !tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY])
|
|
+ return;
|
|
+
|
|
+ eht_capab->eht_supported = 1;
|
|
+
|
|
+ if (tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC]) {
|
|
+ len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC]);
|
|
+ if (len > sizeof(eht_capab->mac_cap))
|
|
+ len = sizeof(eht_capab->mac_cap);
|
|
+ os_memcpy(eht_capab->mac_cap,
|
|
+ nla_data(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC]),
|
|
+ len);
|
|
+ }
|
|
+
|
|
+ if (tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY]) {
|
|
+ len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY]);
|
|
+ if (len > sizeof(eht_capab->phy_cap))
|
|
+ len = sizeof(eht_capab->phy_cap);
|
|
+ os_memcpy(eht_capab->phy_cap,
|
|
+ nla_data(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY]),
|
|
+ len);
|
|
+ }
|
|
+
|
|
+ if (tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET]) {
|
|
+ len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET]);
|
|
+ if (len > sizeof(eht_capab->mcs))
|
|
+ len = sizeof(eht_capab->mcs);
|
|
+ os_memcpy(eht_capab->mcs,
|
|
+ nla_data(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET]),
|
|
+ len);
|
|
+ }
|
|
+
|
|
+ if (tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE]) {
|
|
+ len = nla_len(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE]);
|
|
+ if (len > sizeof(eht_capab->ppet))
|
|
+ len = sizeof(eht_capab->ppet);
|
|
+ os_memcpy(&eht_capab->ppet,
|
|
+ nla_data(tb[NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE]),
|
|
+ len);
|
|
+ }
|
|
}
|
|
|
|
|
|
@@ -1870,7 +1914,7 @@ static int phy_info_iftype(struct hostapd_hw_modes *mode,
|
|
return NL_STOP;
|
|
|
|
for (i = 0; i < IEEE80211_MODE_NUM; i++)
|
|
- phy_info_iftype_copy(&mode->he_capab[i], i, tb, tb_flags);
|
|
+ phy_info_iftype_copy(mode, i, tb, tb_flags);
|
|
|
|
return NL_OK;
|
|
}
|
|
--
|
|
2.31.1
|
|
|