Revert "[wpa_supplicant] cumilative patch from commit 3a5d1a7e6"
Revert submission 26533062-Supplicant_merge_June24
Reason for revert: https://b.corp.google.com/issues/349780869
Reverted changes: /q/submissionid:26533062-Supplicant_merge_June24
Change-Id: I4a7a5b8ccb6b4822353bacc29649587cd5a3cb80
diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c
index 22b694c..c1be660 100644
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -13,12 +13,10 @@
#include "common/ieee802_11_defs.h"
#include "drivers/driver.h"
#include "eap_peer/eap.h"
-#include "rsn_supp/wpa.h"
#include "wpa_supplicant_i.h"
#include "config.h"
#include "notify.h"
#include "scan.h"
-#include "bssid_ignore.h"
#include "bss.h"
static void wpa_bss_set_hessid(struct wpa_bss *bss)
@@ -265,7 +263,7 @@
if (bssid && !wpa_supplicant_filter_bssid_match(wpa_s, bssid))
return NULL;
dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
- if ((!bssid || ether_addr_equal(bss->bssid, bssid)) &&
+ if ((!bssid || os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0) &&
bss->ssid_len == ssid_len &&
os_memcmp(bss->ssid, ssid, ssid_len) == 0)
return bss;
@@ -360,11 +358,12 @@
#ifdef CONFIG_P2P
u8 addr[ETH_ALEN];
- if (ether_addr_equal(bss->bssid, wpa_s->pending_join_iface_addr))
+ if (os_memcmp(bss->bssid, wpa_s->pending_join_iface_addr,
+ ETH_ALEN) == 0)
return true;
if (!is_zero_ether_addr(wpa_s->pending_join_dev_addr) &&
p2p_parse_dev_addr(wpa_bss_ie_ptr(bss), bss->ie_len, addr) == 0 &&
- ether_addr_equal(addr, wpa_s->pending_join_dev_addr))
+ os_memcmp(addr, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0)
return true;
#endif /* CONFIG_P2P */
return false;
@@ -407,8 +406,8 @@
return 0; /* SSID has changed */
if (!is_zero_ether_addr(bss->bssid) &&
- (ether_addr_equal(bss->bssid, wpa_s->bssid) ||
- ether_addr_equal(bss->bssid, wpa_s->pending_bssid)))
+ (os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 ||
+ os_memcmp(bss->bssid, wpa_s->pending_bssid, ETH_ALEN) == 0))
return 1;
if (!wpa_s->valid_links)
@@ -418,7 +417,7 @@
if (!(wpa_s->valid_links & BIT(i)))
continue;
- if (ether_addr_equal(bss->bssid, wpa_s->links[i].bssid))
+ if (os_memcmp(bss->bssid, wpa_s->links[i].bssid, ETH_ALEN) == 0)
return 1;
}
@@ -718,8 +717,7 @@
dl_list_del(&bss->list);
#ifdef CONFIG_P2P
if (wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE) &&
- !wpa_scan_get_vendor_ie(res, P2P_IE_VENDOR_TYPE) &&
- !(changes & WPA_BSS_FREQ_CHANGED_FLAG)) {
+ !wpa_scan_get_vendor_ie(res, P2P_IE_VENDOR_TYPE)) {
/*
* This can happen when non-P2P station interface runs a scan
* without P2P IE in the Probe Request frame. P2P GO would reply
@@ -1103,7 +1101,7 @@
if (!wpa_supplicant_filter_bssid_match(wpa_s, bssid))
return NULL;
dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
- if (ether_addr_equal(bss->bssid, bssid))
+ if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
return bss;
}
return NULL;
@@ -1128,7 +1126,7 @@
if (!wpa_supplicant_filter_bssid_match(wpa_s, bssid))
return NULL;
dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
- if (!ether_addr_equal(bss->bssid, bssid))
+ if (os_memcmp(bss->bssid, bssid, ETH_ALEN) != 0)
continue;
if (found == NULL ||
os_reltime_before(&found->last_update, &bss->last_update))
@@ -1157,7 +1155,7 @@
u8 addr[ETH_ALEN];
if (p2p_parse_dev_addr(wpa_bss_ie_ptr(bss), bss->ie_len,
addr) != 0 ||
- !ether_addr_equal(addr, dev_addr))
+ os_memcmp(addr, dev_addr, ETH_ALEN) != 0)
continue;
if (!found ||
os_reltime_before(&found->last_update, &bss->last_update))
@@ -1224,6 +1222,22 @@
/**
+ * wpa_bss_get_ie_nth - Fetch a specified information element from a BSS entry
+ * @bss: BSS table entry
+ * @ie: Information element identitifier (WLAN_EID_*)
+ * @nth: Return the nth element of the requested type (2 returns the second)
+ * Returns: Pointer to the information element (id field) or %NULL if not found
+ *
+ * This function returns the nth matching information element in the BSS
+ * entry.
+ */
+const u8 * wpa_bss_get_ie_nth(const struct wpa_bss *bss, u8 ie, int nth)
+{
+ return get_ie_nth(wpa_bss_ie_ptr(bss), bss->ie_len, ie, nth);
+}
+
+
+/**
* wpa_bss_get_ie_ext - Fetch a specified extended IE from a BSS entry
* @bss: BSS table entry
* @ext: Information element extension identifier (WLAN_EID_EXT_*)
@@ -1482,12 +1496,29 @@
}
+/**
+ * wpa_bss_defrag_mle - Get a buffer holding a de-fragmented ML element
+ * @bss: BSS table entry
+ * @type: ML control type
+ */
+struct wpabuf * wpa_bss_defrag_mle(const struct wpa_bss *bss, u8 type)
+{
+ struct ieee802_11_elems elems;
+ const u8 *pos = wpa_bss_ie_ptr(bss);
+ size_t len = bss->ie_len;
+
+ if (ieee802_11_parse_elems(pos, len, &elems, 1) == ParseFailed)
+ return NULL;
+
+ return ieee802_11_defrag_mle(&elems, type);
+}
+
+
static void
wpa_bss_parse_ml_rnr_ap_info(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss, u8 mbssid_idx,
const struct ieee80211_neighbor_ap_info *ap_info,
- size_t len, u16 *seen, u16 *missing,
- struct wpa_ssid *ssid)
+ size_t len, u16 *seen, u16 *missing)
{
const u8 *pos, *end;
const u8 *mld_params;
@@ -1511,15 +1542,12 @@
pos += sizeof(*ap_info);
for (i = 0; i < count; i++) {
- u8 bss_params;
-
if (bss->n_mld_links >= MAX_NUM_MLD_LINKS)
return;
if (end - pos < ap_info->tbtt_info_len)
break;
- bss_params = pos[1 + ETH_ALEN + 4];
mld_params = pos + mld_params_offset;
link_id = *(mld_params + 1) & EHT_ML_LINK_ID_MSK;
@@ -1529,30 +1557,23 @@
"MLD: Reported link not part of MLD");
} else if (!(BIT(link_id) & *seen)) {
struct wpa_bss *neigh_bss =
- wpa_bss_get_bssid(wpa_s, pos + 1);
+ wpa_bss_get_bssid(wpa_s, ap_info->data + 1);
*seen |= BIT(link_id);
wpa_printf(MSG_DEBUG, "MLD: mld ID=%u, link ID=%u",
*mld_params, link_id);
- if (!neigh_bss) {
- *missing |= BIT(link_id);
- } else if ((!ssid ||
- (bss_params & (RNR_BSS_PARAM_SAME_SSID |
- RNR_BSS_PARAM_CO_LOCATED)) ||
- wpa_scan_res_match(wpa_s, 0, neigh_bss,
- ssid, 1, 0)) &&
- !wpa_bssid_ignore_is_listed(
- wpa_s, neigh_bss->bssid)) {
+ if (neigh_bss) {
struct mld_link *l;
l = &bss->mld_links[bss->n_mld_links];
l->link_id = link_id;
- os_memcpy(l->bssid, pos + 1, ETH_ALEN);
+ os_memcpy(l->bssid, ap_info->data + 1,
+ ETH_ALEN);
l->freq = neigh_bss->freq;
- l->disabled = mld_params[2] &
- RNR_TBTT_INFO_MLD_PARAM2_LINK_DISABLED;
bss->n_mld_links++;
+ } else {
+ *missing |= BIT(link_id);
}
}
@@ -1569,8 +1590,6 @@
* @link_info: Array to store link information (or %NULL),
* should be initialized and #MAX_NUM_MLD_LINKS elements long
* @missing_links: Result bitmask of links that were not discovered (or %NULL)
- * @ssid: Target SSID (or %NULL)
- * @ap_mld_id: On return would hold the corresponding AP MLD ID (or %NULL)
* Returns: 0 on success or -1 for non-MLD or parsing failures
*
* Parses the Basic Multi-Link element of the BSS into @link_info using the scan
@@ -1581,15 +1600,13 @@
int wpa_bss_parse_basic_ml_element(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss,
u8 *ap_mld_addr,
- u16 *missing_links,
- struct wpa_ssid *ssid,
- u8 *ap_mld_id)
+ u16 *missing_links)
{
struct ieee802_11_elems elems;
struct wpabuf *mlbuf;
const struct element *elem;
u8 mbssid_idx = 0;
- size_t ml_ie_len;
+ u8 ml_ie_len;
const struct ieee80211_eht_ml *eht_ml;
const struct eht_ml_basic_common_info *ml_basic_common_info;
u8 i, link_id;
@@ -1616,7 +1633,7 @@
return ret;
}
- mlbuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
+ mlbuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_BASIC);
if (!mlbuf) {
wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No Multi-Link element");
return ret;
@@ -1624,32 +1641,6 @@
ml_ie_len = wpabuf_len(mlbuf);
- if (ssid) {
- struct wpa_ie_data ie;
-
- if (!elems.rsn_ie ||
- wpa_parse_wpa_ie(elems.rsn_ie - 2, 2 + elems.rsn_ie_len,
- &ie)) {
- wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No RSN element");
- goto out;
- }
-
- if (!(ie.capabilities & WPA_CAPABILITY_MFPC) ||
- wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION) {
- wpa_dbg(wpa_s, MSG_DEBUG,
- "MLD: No management frame protection");
- goto out;
- }
-
- ie.key_mgmt &= ~(WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK |
- WPA_KEY_MGMT_PSK_SHA256);
- if (!(ie.key_mgmt & ssid->key_mgmt)) {
- wpa_dbg(wpa_s, MSG_DEBUG,
- "MLD: No valid key management");
- goto out;
- }
- }
-
/*
* for ext ID + 2 control + common info len + MLD address +
* link info
@@ -1729,7 +1720,7 @@
wpa_bss_parse_ml_rnr_ap_info(wpa_s, bss, mbssid_idx,
ap_info, len, &seen,
- &missing, ssid);
+ &missing);
pos += ap_info_len;
len -= ap_info_len;
@@ -1748,9 +1739,6 @@
if (missing_links)
*missing_links = missing;
- if (ap_mld_id)
- *ap_mld_id = mbssid_idx;
-
ret = 0;
out:
wpabuf_free(mlbuf);
@@ -1781,7 +1769,7 @@
if (!elems.reconf_mle || !elems.reconf_mle_len)
return 0;
- mlbuf = ieee802_11_defrag(elems.reconf_mle, elems.reconf_mle_len, true);
+ mlbuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_RECONF);
if (!mlbuf)
return 0;