nl80211: Register for only for specific Action frames in AP mode
This makes changes such that hostapd (and wpa_supplicant AP mode) registers to kernel for specific Action frames instead of generically registering for all Action frames. This makes it easier for other programs to register for some Action frames that hostapd does not handle today without having to somehow coordinate directly with hostapd. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
a68a749322
commit
4d916ed6c5
1 changed files with 47 additions and 5 deletions
|
@ -2054,6 +2054,49 @@ static int nl80211_register_spurious_class3(struct i802_bss *bss)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int nl80211_action_subscribe_ap(struct i802_bss *bss)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* Public Action frames */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x04", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
/* RRM Measurement Report */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x05\x01", 2) < 0)
|
||||||
|
ret = -1;
|
||||||
|
/* RRM Neighbor Report Request */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x05\x04", 2) < 0)
|
||||||
|
ret = -1;
|
||||||
|
/* FT Action frames */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x06", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
#ifdef CONFIG_IEEE80211W
|
||||||
|
/* SA Query */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x08", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
#endif /* CONFIG_IEEE80211W */
|
||||||
|
/* Protected Dual of Public Action */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x09", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
/* WNM */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x0a", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
/* WMM */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x11", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
#ifdef CONFIG_FST
|
||||||
|
/* FST Action frames */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x12", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
#endif /* CONFIG_FST */
|
||||||
|
/* Vendor-specific */
|
||||||
|
if (nl80211_register_action_frame(bss, (u8 *) "\x7f", 1) < 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss)
|
static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss)
|
||||||
{
|
{
|
||||||
static const int stypes[] = {
|
static const int stypes[] = {
|
||||||
|
@ -2062,7 +2105,6 @@ static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss)
|
||||||
WLAN_FC_STYPE_REASSOC_REQ,
|
WLAN_FC_STYPE_REASSOC_REQ,
|
||||||
WLAN_FC_STYPE_DISASSOC,
|
WLAN_FC_STYPE_DISASSOC,
|
||||||
WLAN_FC_STYPE_DEAUTH,
|
WLAN_FC_STYPE_DEAUTH,
|
||||||
WLAN_FC_STYPE_ACTION,
|
|
||||||
WLAN_FC_STYPE_PROBE_REQ,
|
WLAN_FC_STYPE_PROBE_REQ,
|
||||||
/* Beacon doesn't work as mac80211 doesn't currently allow
|
/* Beacon doesn't work as mac80211 doesn't currently allow
|
||||||
* it, but it wouldn't really be the right thing anyway as
|
* it, but it wouldn't really be the right thing anyway as
|
||||||
|
@ -2087,6 +2129,9 @@ static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nl80211_action_subscribe_ap(bss))
|
||||||
|
goto out_err;
|
||||||
|
|
||||||
if (nl80211_register_spurious_class3(bss))
|
if (nl80211_register_spurious_class3(bss))
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
@ -2109,10 +2154,7 @@ static int nl80211_mgmt_subscribe_ap_dev_sme(struct i802_bss *bss)
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with AP "
|
wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with AP "
|
||||||
"handle %p (device SME)", bss->nl_mgmt);
|
"handle %p (device SME)", bss->nl_mgmt);
|
||||||
|
|
||||||
if (nl80211_register_frame(bss, bss->nl_mgmt,
|
if (nl80211_action_subscribe_ap(bss))
|
||||||
(WLAN_FC_TYPE_MGMT << 2) |
|
|
||||||
(WLAN_FC_STYPE_ACTION << 4),
|
|
||||||
NULL, 0) < 0)
|
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
nl80211_mgmt_handle_register_eloop(bss);
|
nl80211_mgmt_handle_register_eloop(bss);
|
||||||
|
|
Loading…
Reference in a new issue