diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c
index c679688108..0367413a61 100644
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -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;
 	}
 
