mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-02-21 03:23:04 -05:00
AP: Store STA supported operating classes information
This makes hostapd track Supported Operating Classes information from the associated STAs. The stored information is available through the STA control interface command (supp_op_classes row) as a hexdump of the Supported Operating Classes element starting from the Length field. This information can be used as input to BSS transition management and channel switching decisions. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
077dcfb8c4
commit
adf0478e8e
@ -166,6 +166,15 @@ static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd,
|
|||||||
if (res >= 0)
|
if (res >= 0)
|
||||||
len += res;
|
len += res;
|
||||||
|
|
||||||
|
if (sta->supp_op_classes &&
|
||||||
|
buflen - len > (unsigned) (17 + 2 * sta->supp_op_classes[0])) {
|
||||||
|
len += os_snprintf(buf + len, buflen - len, "supp_op_classes=");
|
||||||
|
len += wpa_snprintf_hex(buf + len, buflen - len,
|
||||||
|
sta->supp_op_classes + 1,
|
||||||
|
sta->supp_op_classes[0]);
|
||||||
|
len += os_snprintf(buf + len, buflen - len, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +176,9 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
|
|||||||
|
|
||||||
mbo_ap_check_sta_assoc(hapd, sta, &elems);
|
mbo_ap_check_sta_assoc(hapd, sta, &elems);
|
||||||
|
|
||||||
|
ap_copy_sta_supp_op_classes(sta, elems.supp_op_classes,
|
||||||
|
elems.supp_op_classes_len);
|
||||||
|
|
||||||
if (hapd->conf->wpa) {
|
if (hapd->conf->wpa) {
|
||||||
if (ie == NULL || ielen == 0) {
|
if (ie == NULL || ielen == 0) {
|
||||||
#ifdef CONFIG_WPS
|
#ifdef CONFIG_WPS
|
||||||
|
@ -1726,6 +1726,9 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
|
ap_copy_sta_supp_op_classes(sta, elems.supp_op_classes,
|
||||||
|
elems.supp_op_classes_len);
|
||||||
|
|
||||||
return WLAN_STATUS_SUCCESS;
|
return WLAN_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,4 +130,8 @@ static inline u8 hostapd_mbo_ie_len(struct hostapd_data *hapd)
|
|||||||
|
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
|
void ap_copy_sta_supp_op_classes(struct sta_info *sta,
|
||||||
|
const u8 *supp_op_classes,
|
||||||
|
size_t supp_op_classes_len);
|
||||||
|
|
||||||
#endif /* IEEE802_11_H */
|
#endif /* IEEE802_11_H */
|
||||||
|
@ -558,3 +558,20 @@ u8 hostapd_mbo_ie_len(struct hostapd_data *hapd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
|
|
||||||
|
void ap_copy_sta_supp_op_classes(struct sta_info *sta,
|
||||||
|
const u8 *supp_op_classes,
|
||||||
|
size_t supp_op_classes_len)
|
||||||
|
{
|
||||||
|
if (!supp_op_classes)
|
||||||
|
return;
|
||||||
|
os_free(sta->supp_op_classes);
|
||||||
|
sta->supp_op_classes = os_malloc(1 + supp_op_classes_len);
|
||||||
|
if (!sta->supp_op_classes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sta->supp_op_classes[0] = supp_op_classes_len;
|
||||||
|
os_memcpy(sta->supp_op_classes + 1, supp_op_classes,
|
||||||
|
supp_op_classes_len);
|
||||||
|
}
|
||||||
|
@ -328,6 +328,7 @@ void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
|
|||||||
#endif /* CONFIG_SAE */
|
#endif /* CONFIG_SAE */
|
||||||
|
|
||||||
mbo_ap_sta_free(sta);
|
mbo_ap_sta_free(sta);
|
||||||
|
os_free(sta->supp_op_classes);
|
||||||
|
|
||||||
os_free(sta);
|
os_free(sta);
|
||||||
}
|
}
|
||||||
|
@ -190,6 +190,9 @@ struct sta_info {
|
|||||||
* enum mbo_cellular_capa values */
|
* enum mbo_cellular_capa values */
|
||||||
struct mbo_non_pref_chan_info *non_pref_chan;
|
struct mbo_non_pref_chan_info *non_pref_chan;
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
|
u8 *supp_op_classes; /* Supported Operating Classes element, if
|
||||||
|
* received, starting from the Length field */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -371,6 +371,10 @@ ParseRes ieee802_11_parse_elems(const u8 *start, size_t len,
|
|||||||
elems->mb_ies.ies[elems->mb_ies.nof_ies].ie_len = elen;
|
elems->mb_ies.ies[elems->mb_ies.nof_ies].ie_len = elen;
|
||||||
elems->mb_ies.nof_ies++;
|
elems->mb_ies.nof_ies++;
|
||||||
break;
|
break;
|
||||||
|
case WLAN_EID_SUPPORTED_OPERATING_CLASSES:
|
||||||
|
elems->supp_op_classes = pos;
|
||||||
|
elems->supp_op_classes_len = elen;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unknown++;
|
unknown++;
|
||||||
if (!show_errors)
|
if (!show_errors)
|
||||||
|
@ -62,6 +62,7 @@ struct ieee802_11_elems {
|
|||||||
const u8 *ampe;
|
const u8 *ampe;
|
||||||
const u8 *mic;
|
const u8 *mic;
|
||||||
const u8 *pref_freq_list;
|
const u8 *pref_freq_list;
|
||||||
|
const u8 *supp_op_classes;
|
||||||
|
|
||||||
u8 ssid_len;
|
u8 ssid_len;
|
||||||
u8 supp_rates_len;
|
u8 supp_rates_len;
|
||||||
@ -92,6 +93,8 @@ struct ieee802_11_elems {
|
|||||||
u8 ampe_len;
|
u8 ampe_len;
|
||||||
u8 mic_len;
|
u8 mic_len;
|
||||||
u8 pref_freq_list_len;
|
u8 pref_freq_list_len;
|
||||||
|
u8 supp_op_classes_len;
|
||||||
|
|
||||||
struct mb_ies_info mb_ies;
|
struct mb_ies_info mb_ies;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user