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:
Kanchanapally, Vidyullatha 2016-05-20 20:11:55 +05:30 committed by Jouni Malinen
parent a68a749322
commit 4d916ed6c5

View file

@ -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);