Revert "Revert "[wpa_supplicant] cumilative patch from commit 3a..."
Revert submission 28102966-revert-26533062-Supplicant_merge_June24-CUATTSRBBR
Reason for revert: Fixed the regression issue (ag/28389573)
Reverted changes: /q/submissionid:28102966-revert-26533062-Supplicant_merge_June24-CUATTSRBBR
Bug: 329004037
Test: Turn ON/OFF SoftAp multiple times
Change-Id: Ibfff2a847be5678f1a6d77e28506a05936812a91
diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 98794c2..533cc54 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -42,6 +42,7 @@
#include "dpp_hostapd.h"
#include "fils_hlp.h"
#include "neighbor_db.h"
+#include "nan_usd_ap.h"
#ifdef CONFIG_FILS
@@ -52,6 +53,7 @@
struct ieee802_11_elems elems;
u8 buf[IEEE80211_MAX_MMPDU_SIZE], *p = buf;
int new_assoc;
+ bool updated;
wpa_printf(MSG_DEBUG, "%s FILS: Finish association with " MACSTR,
__func__, MAC2STR(sta->addr));
@@ -76,11 +78,13 @@
sta->fils_pending_assoc_is_reassoc,
WLAN_STATUS_SUCCESS,
buf, p - buf);
- ap_sta_set_authorized(hapd, sta, 1);
+ updated = ap_sta_set_authorized_flag(hapd, sta, 1);
new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
sta->flags &= ~WLAN_STA_WNM_SLEEP_MODE;
hostapd_set_sta_flags(hapd, sta);
+ if (updated)
+ ap_sta_set_authorized_event(hapd, sta, 1);
wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC_FILS);
ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
hostapd_new_assoc_sta(hapd, sta, !new_assoc);
@@ -158,7 +162,7 @@
return -1;
}
- mlebuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlebuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
if (!mlebuf) {
wpa_printf(MSG_ERROR,
"MLO: Basic Multi-Link element not found in (Re)Association Response frame");
@@ -263,6 +267,7 @@
#ifdef CONFIG_OWE
struct hostapd_iface *iface = hapd->iface;
#endif /* CONFIG_OWE */
+ bool updated = false;
if (addr == NULL) {
/*
@@ -279,7 +284,7 @@
if (is_multicast_ether_addr(addr) ||
is_zero_ether_addr(addr) ||
- os_memcmp(addr, hapd->own_addr, ETH_ALEN) == 0) {
+ ether_addr_equal(addr, hapd->own_addr)) {
/* Do not process any frames with unexpected/invalid SA so that
* we do not add any state for unexpected STA addresses or end
* up sending out frames to unexpected destination. */
@@ -358,7 +363,7 @@
int i, num_valid_links = 0;
u8 link_id = hapd->mld_link_id;
- info->mld_sta = true;
+ ap_sta_set_mld(sta, true);
sta->mld_assoc_link_id = link_id;
os_memcpy(info->common_info.mld_addr, addr, ETH_ALEN);
info->links[link_id].valid = true;
@@ -509,7 +514,7 @@
return -1;
}
#ifdef CONFIG_IEEE80211BE
- if (sta->mld_info.mld_sta) {
+ if (ap_sta_is_mld(hapd, sta)) {
wpa_printf(MSG_DEBUG,
"MLD: Set ML info in RSN Authenticator");
wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld_addr,
@@ -845,18 +850,30 @@
sta->auth_alg == WLAN_AUTH_FILS_SK ||
sta->auth_alg == WLAN_AUTH_FILS_SK_PFS ||
sta->auth_alg == WLAN_AUTH_FILS_PK)
- ap_sta_set_authorized(hapd, sta, 1);
+ updated = ap_sta_set_authorized_flag(hapd, sta, 1);
#else /* CONFIG_IEEE80211R_AP || CONFIG_FILS */
/* Keep compiler silent about unused variables */
if (status) {
}
#endif /* CONFIG_IEEE80211R_AP || CONFIG_FILS */
+#ifdef CONFIG_IEEE80211BE
+ if (hostapd_process_assoc_ml_info(hapd, sta, req_ies, req_ies_len,
+ !!reassoc, WLAN_STATUS_SUCCESS,
+ true)) {
+ status = WLAN_STATUS_UNSPECIFIED_FAILURE;
+ reason = WLAN_REASON_UNSPECIFIED;
+ goto fail;
+ }
+#endif /* CONFIG_IEEE80211BE */
+
new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
sta->flags &= ~WLAN_STA_WNM_SLEEP_MODE;
hostapd_set_sta_flags(hapd, sta);
+ if (updated)
+ ap_sta_set_authorized_event(hapd, sta, 1);
if (reassoc && (sta->auth_alg == WLAN_AUTH_FT))
wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC_FT);
@@ -1164,6 +1181,8 @@
hostapd_set_oper_chwidth(hapd->iconf, chwidth);
hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, seg0_idx);
hostapd_set_oper_centr_freq_seg1_idx(hapd->iconf, seg1_idx);
+ /* Auto-detect new bw320_offset */
+ hostapd_set_and_check_bw320_offset(hapd->iconf, 0);
#ifdef CONFIG_IEEE80211BE
hapd->iconf->punct_bitmap = punct_bitmap;
#endif /* CONFIG_IEEE80211BE */
@@ -1270,6 +1289,18 @@
int err = 0;
struct hostapd_channel_data *pri_chan;
+#ifdef CONFIG_IEEE80211BE
+ if (acs_res->link_id != -1) {
+ hapd = hostapd_mld_get_link_bss(hapd, acs_res->link_id);
+ if (!hapd) {
+ wpa_printf(MSG_ERROR,
+ "MLD: Failed to get link BSS for EVENT_ACS_CHANNEL_SELECTED link_id=%d",
+ acs_res->link_id);
+ return;
+ }
+ }
+#endif /* CONFIG_IEEE80211BE */
+
if (hapd->iconf->channel) {
wpa_printf(MSG_INFO, "ACS: Channel was already set to %d",
hapd->iconf->channel);
@@ -1576,6 +1607,7 @@
#endif /* CONFIG_FST */
#ifdef CONFIG_DPP
if (plen >= 2 + 4 &&
+ mgmt->u.action.category == WLAN_ACTION_PUBLIC &&
mgmt->u.action.u.vs_public_action.action ==
WLAN_PA_VENDOR_SPECIFIC &&
WPA_GET_BE24(mgmt->u.action.u.vs_public_action.oui) ==
@@ -1591,6 +1623,23 @@
return;
}
#endif /* CONFIG_DPP */
+#ifdef CONFIG_NAN_USD
+ if (mgmt->u.action.category == WLAN_ACTION_PUBLIC && plen >= 5 &&
+ mgmt->u.action.u.vs_public_action.action ==
+ WLAN_PA_VENDOR_SPECIFIC &&
+ WPA_GET_BE24(mgmt->u.action.u.vs_public_action.oui) ==
+ OUI_WFA &&
+ mgmt->u.action.u.vs_public_action.variable[0] == NAN_OUI_TYPE) {
+ const u8 *pos, *end;
+
+ pos = mgmt->u.action.u.vs_public_action.variable;
+ end = drv_mgmt->frame + drv_mgmt->frame_len;
+ pos++;
+ hostapd_nan_usd_rx_sdf(hapd, mgmt->sa, drv_mgmt->freq,
+ pos, end - pos);
+ return;
+ }
+#endif /* CONFIG_NAN_USD */
}
#endif /* NEED_AP_MLME */
@@ -1628,7 +1677,7 @@
return HAPD_BROADCAST;
for (i = 0; i < iface->num_bss; i++) {
- if (os_memcmp(bssid, iface->bss[i]->own_addr, ETH_ALEN) == 0)
+ if (ether_addr_equal(bssid, iface->bss[i]->own_addr))
return iface->bss[i];
}
@@ -1682,7 +1731,7 @@
#ifdef CONFIG_IEEE80211BE
if (hapd->conf->mld_ap &&
- os_memcmp(hapd->mld_addr, bssid, ETH_ALEN) == 0)
+ ether_addr_equal(hapd->mld_addr, bssid))
is_mld = true;
#endif /* CONFIG_IEEE80211BE */
@@ -1754,8 +1803,7 @@
hapd = tmp_hapd;
#ifdef CONFIG_IEEE80211BE
} else if (hapd->conf->mld_ap &&
- os_memcmp(hapd->mld_addr, get_hdr_bssid(hdr, len),
- ETH_ALEN) == 0) {
+ ether_addr_equal(hapd->mld_addr, get_hdr_bssid(hdr, len))) {
/* AP MLD address match - use hapd pointer as-is */
#endif /* CONFIG_IEEE80211BE */
} else {
@@ -1803,14 +1851,15 @@
static struct hostapd_data * hostapd_find_by_sta(struct hostapd_iface *iface,
- const u8 *src)
+ const u8 *src, bool rsn)
{
struct sta_info *sta;
unsigned int j;
for (j = 0; j < iface->num_bss; j++) {
sta = ap_get_sta(iface->bss[j], src);
- if (sta && sta->flags & WLAN_STA_ASSOC)
+ if (sta && (sta->flags & WLAN_STA_ASSOC) &&
+ (!rsn || sta->wpa_sm))
return iface->bss[j];
}
@@ -1818,6 +1867,40 @@
}
+#ifdef CONFIG_IEEE80211BE
+static bool search_mld_sta(struct hostapd_data **p_hapd, const u8 *src)
+{
+ struct hostapd_data *hapd = *p_hapd;
+ unsigned int i;
+
+ /* Search for STA on other MLO BSSs */
+ for (i = 0; i < hapd->iface->interfaces->count; i++) {
+ struct hostapd_iface *h =
+ hapd->iface->interfaces->iface[i];
+ struct hostapd_data *h_hapd = h->bss[0];
+ struct hostapd_bss_config *hconf = h_hapd->conf;
+
+ if (!hconf->mld_ap ||
+ hconf->mld_id != hapd->conf->mld_id)
+ continue;
+
+ h_hapd = hostapd_find_by_sta(h, src, false);
+ if (h_hapd) {
+ struct sta_info *sta = ap_get_sta(h_hapd, src);
+
+ if (sta && sta->mld_info.mld_sta &&
+ sta->mld_assoc_link_id != h_hapd->mld_link_id)
+ continue;
+ *p_hapd = h_hapd;
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif /* CONFIG_IEEE80211BE */
+
+
static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8 *src,
const u8 *data, size_t data_len,
enum frame_encryption encrypted,
@@ -1830,36 +1913,24 @@
struct hostapd_data *h_hapd;
hapd = switch_link_hapd(hapd, link_id);
- h_hapd = hostapd_find_by_sta(hapd->iface, src);
+ h_hapd = hostapd_find_by_sta(hapd->iface, src, true);
if (!h_hapd)
- h_hapd = hostapd_find_by_sta(orig_hapd->iface, src);
+ h_hapd = hostapd_find_by_sta(orig_hapd->iface, src,
+ true);
+ if (!h_hapd)
+ h_hapd = hostapd_find_by_sta(hapd->iface, src, false);
+ if (!h_hapd)
+ h_hapd = hostapd_find_by_sta(orig_hapd->iface, src,
+ false);
if (h_hapd)
hapd = h_hapd;
} else if (hapd->conf->mld_ap) {
- unsigned int i;
-
- /* Search for STA on other MLO BSSs */
- for (i = 0; i < hapd->iface->interfaces->count; i++) {
- struct hostapd_iface *h =
- hapd->iface->interfaces->iface[i];
- struct hostapd_data *h_hapd = h->bss[0];
- struct hostapd_bss_config *hconf = h_hapd->conf;
-
- if (!hconf->mld_ap ||
- hconf->mld_id != hapd->conf->mld_id)
- continue;
-
- h_hapd = hostapd_find_by_sta(h, src);
- if (h_hapd) {
- hapd = h_hapd;
- break;
- }
- }
+ search_mld_sta(&hapd, src);
} else {
- hapd = hostapd_find_by_sta(hapd->iface, src);
+ hapd = hostapd_find_by_sta(hapd->iface, src, false);
}
#else /* CONFIG_IEEE80211BE */
- hapd = hostapd_find_by_sta(hapd->iface, src);
+ hapd = hostapd_find_by_sta(hapd->iface, src, false);
#endif /* CONFIG_IEEE80211BE */
if (!hapd) {
@@ -2164,8 +2235,8 @@
struct mld_info *info = &sta->mld_info;
u8 link_id = hapd->mld_link_id;
- info->mld_sta = true;
- sta->mld_assoc_link_id = link_id;;
+ ap_sta_set_mld(sta, true);
+ sta->mld_assoc_link_id = link_id;
os_memcpy(info->common_info.mld_addr, peer, ETH_ALEN);
info->links[link_id].valid = true;
os_memcpy(info->links[link_id].local_addr, hapd->own_addr,
@@ -2364,6 +2435,18 @@
case EVENT_CH_SWITCH:
if (!data)
break;
+#ifdef CONFIG_IEEE80211BE
+ if (data->ch_switch.link_id != -1) {
+ hapd = hostapd_mld_get_link_bss(
+ hapd, data->ch_switch.link_id);
+ if (!hapd) {
+ wpa_printf(MSG_ERROR,
+ "MLD: Failed to get link (ID %d) BSS for EVENT_CH_SWITCH/EVENT_CH_SWITCH_STARTED",
+ data->ch_switch.link_id);
+ break;
+ }
+ }
+#endif /* CONFIG_IEEE80211BE */
hostapd_event_ch_switch(hapd, data->ch_switch.freq,
data->ch_switch.ht_enabled,
data->ch_switch.ch_offset,
@@ -2390,26 +2473,31 @@
case EVENT_DFS_RADAR_DETECTED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_radar_detected(hapd, &data->dfs_event);
break;
case EVENT_DFS_PRE_CAC_EXPIRED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_pre_cac_expired(hapd, &data->dfs_event);
break;
case EVENT_DFS_CAC_FINISHED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_cac_finished(hapd, &data->dfs_event);
break;
case EVENT_DFS_CAC_ABORTED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_cac_aborted(hapd, &data->dfs_event);
break;
case EVENT_DFS_NOP_FINISHED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_nop_finished(hapd, &data->dfs_event);
break;
case EVENT_CHANNEL_LIST_CHANGED:
@@ -2423,6 +2511,7 @@
case EVENT_DFS_CAC_STARTED:
if (!data)
break;
+ hapd = switch_link_hapd(hapd, data->dfs_event.link_id);
hostapd_event_dfs_cac_started(hapd, &data->dfs_event);
break;
#endif /* NEED_AP_MLME */