@@ -1727,37 +1727,28 @@ static bool
wpa_bss_validate_rsne_ml(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
struct wpa_bss *bss, int *key_mgmt, int *rsne_type_p)
{
- struct ieee802_11_elems elems;
struct wpa_ie_data wpa_ie;
const u8 *rsne;
- size_t rsne_len;
int rsne_type;
- const u8 *ies_pos = wpa_bss_ie_ptr(bss);
- size_t ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
- if (ieee802_11_parse_elems(ies_pos, ies_len, &elems, 0) ==
- ParseFailed) {
- wpa_dbg(wpa_s, MSG_DEBUG, "MLD: Failed to parse elements");
+ rsne = wpa_bss_get_rsne(wpa_s, bss, ssid, true);
+ if (!rsne ||
+ wpa_parse_wpa_ie(rsne, 2 + rsne[1], &wpa_ie)) {
+ wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No RSN element");
return false;
}
- if (elems.rsne_override_2 && wpas_rsn_overriding(wpa_s, ssid)) {
- rsne = elems.rsne_override_2;
- rsne_len = elems.rsne_override_2_len;
- rsne_type = 2;
- } else if (elems.rsne_override && wpas_rsn_overriding(wpa_s, ssid)) {
- rsne = elems.rsne_override;
- rsne_len = elems.rsne_override_len;
+ if (rsne[0] == WLAN_EID_RSN) {
+ rsne_type = 0;
+ } else if (rsne[0] == WLAN_EID_VENDOR_SPECIFIC &&
+ WPA_GET_BE32(&rsne[2]) == RSNE_OVERRIDE_IE_VENDOR_TYPE) {
rsne_type = 1;
+ } else if (rsne[0] == WLAN_EID_VENDOR_SPECIFIC &&
+ WPA_GET_BE32(&rsne[2]) == RSNE_OVERRIDE_2_IE_VENDOR_TYPE) {
+ rsne_type = 2;
} else {
- rsne = elems.rsn_ie;
- rsne_len = elems.rsn_ie_len;
- rsne_type = 0;
- }
-
- if (!rsne ||
- wpa_parse_wpa_ie(rsne - 2, 2 + rsne_len, &wpa_ie)) {
- wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No RSN element");
+ wpa_dbg(wpa_s, MSG_ERROR,
+ "MLD: Unexpected RSN element type");
return false;
}