aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/drivers/driver_nl80211.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index acb8f33..6ca3f81 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -5293,7 +5293,8 @@ static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
}
-static int i802_set_bss(void *priv, int cts, int preamble, int slot)
+static int i802_set_bss(void *priv, int cts, int preamble, int slot,
+ int ht_opmode)
{
struct i802_bss *bss = priv;
struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -5312,7 +5313,8 @@ static int i802_set_bss(void *priv, int cts, int preamble, int slot)
NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
if (slot >= 0)
NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
-
+ if (ht_opmode >= 0)
+ NLA_PUT_U16(msg, NL80211_ATTR_BSS_HT_OPMODE, ht_opmode);
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
return send_and_recv_msgs(drv, msg, NULL, NULL);
@@ -5323,19 +5325,19 @@ static int i802_set_bss(void *priv, int cts, int preamble, int slot)
static int i802_set_cts_protect(void *priv, int value)
{
- return i802_set_bss(priv, value, -1, -1);
+ return i802_set_bss(priv, value, -1, -1, -1);
}
static int i802_set_preamble(void *priv, int value)
{
- return i802_set_bss(priv, -1, value, -1);
+ return i802_set_bss(priv, -1, value, -1, -1);
}
static int i802_set_short_slot_time(void *priv, int value)
{
- return i802_set_bss(priv, -1, -1, value);
+ return i802_set_bss(priv, -1, -1, value, -1);
}
@@ -5403,6 +5405,19 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
}
+static int i802_set_ht_params(void *priv, const u8 *ht_capab,
+ size_t ht_capab_len, const u8 *ht_oper,
+ size_t ht_oper_len)
+{
+ if (ht_oper_len >= 6) {
+ /* ht opmode uses 16bit in octet 5 & 6 */
+ u16 ht_opmode = le_to_host16(((u16 *) ht_oper)[2]);
+ return i802_set_bss(priv, -1, -1, -1, ht_opmode);
+ } else
+ return -1;
+}
+
+
static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
{
struct wpa_driver_nl80211_data *drv = eloop_ctx;
@@ -6407,6 +6422,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.set_tx_queue_params = i802_set_tx_queue_params,
.set_sta_vlan = i802_set_sta_vlan,
.set_wds_sta = i802_set_wds_sta,
+ .set_ht_params = i802_set_ht_params,
#endif /* HOSTAPD */
.set_freq = i802_set_freq,
.send_action = wpa_driver_nl80211_send_action,