|
@@ -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 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_DISASSOC,
|
|
|
WLAN_FC_STYPE_DEAUTH,
|
|
|
- WLAN_FC_STYPE_ACTION,
|
|
|
WLAN_FC_STYPE_PROBE_REQ,
|
|
|
/* Beacon doesn't work as mac80211 doesn't currently allow
|
|
|
* 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))
|
|
|
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 "
|
|
|
"handle %p (device SME)", bss->nl_mgmt);
|
|
|
|
|
|
- if (nl80211_register_frame(bss, bss->nl_mgmt,
|
|
|
- (WLAN_FC_TYPE_MGMT << 2) |
|
|
|
- (WLAN_FC_STYPE_ACTION << 4),
|
|
|
- NULL, 0) < 0)
|
|
|
+ if (nl80211_action_subscribe_ap(bss))
|
|
|
goto out_err;
|
|
|
|
|
|
nl80211_mgmt_handle_register_eloop(bss);
|