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/src/ap/sta_info.c b/src/ap/sta_info.c
index 2178d65..a00f896 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -92,7 +92,7 @@
if (p2p_dev_addr == NULL)
continue;
- if (ether_addr_equal(p2p_dev_addr, addr))
+ if (os_memcmp(p2p_dev_addr, addr, ETH_ALEN) == 0)
return sta;
}
@@ -140,7 +140,7 @@
}
while (s->hnext != NULL &&
- !ether_addr_equal(s->hnext->addr, sta->addr))
+ os_memcmp(s->hnext->addr, sta->addr, ETH_ALEN) != 0)
s = s->hnext;
if (s->hnext != NULL)
s->hnext = s->hnext->hnext;
@@ -303,7 +303,7 @@
ieee802_1x_free_station(hapd, sta);
#ifdef CONFIG_IEEE80211BE
- if (!ap_sta_is_mld(hapd, sta) ||
+ if (!hapd->conf->mld_ap || !sta->mld_info.mld_sta ||
hapd->mld_link_id == sta->mld_assoc_link_id)
wpa_auth_sta_deinit(sta->wpa_sm);
#else
@@ -350,7 +350,6 @@
#ifdef CONFIG_INTERWORKING
if (sta->gas_dialog) {
int i;
-
for (i = 0; i < GAS_DIALOG_MAX; i++)
gas_serv_dialog_clear(&sta->gas_dialog[i]);
os_free(sta->gas_dialog);
@@ -421,10 +420,6 @@
os_free(sta->ifname_wds);
-#ifdef CONFIG_IEEE80211BE
- ap_sta_free_sta_profile(&sta->mld_info);
-#endif /* CONFIG_IEEE80211BE */
-
#ifdef CONFIG_TESTING_OPTIONS
os_free(sta->sae_postponed_commit);
forced_memzero(sta->last_tk, WPA_TK_MAX_LEN);
@@ -851,20 +846,32 @@
}
-static void ap_sta_disconnect_common(struct hostapd_data *hapd,
- struct sta_info *sta, unsigned int timeout)
+void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
+ u16 reason)
{
+ wpa_printf(MSG_DEBUG, "%s: disassociate STA " MACSTR,
+ hapd->conf->iface, MAC2STR(sta->addr));
sta->last_seq_ctrl = WLAN_INVALID_MGMT_SEQ;
-
+ if (hapd->iface->current_mode &&
+ hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211AD) {
+ /* Skip deauthentication in DMG/IEEE 802.11ad */
+ sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC |
+ WLAN_STA_ASSOC_REQ_OK);
+ sta->timeout_next = STA_REMOVE;
+ } else {
+ sta->flags &= ~(WLAN_STA_ASSOC | WLAN_STA_ASSOC_REQ_OK);
+ sta->timeout_next = STA_DEAUTH;
+ }
ap_sta_set_authorized(hapd, sta, 0);
hostapd_set_sta_flags(hapd, sta);
-
- wpa_printf(MSG_DEBUG,
- "reschedule ap_handle_timer timeout (%u sec) for " MACSTR,
- MAC2STR(sta->addr), timeout);
-
+ wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout "
+ "for " MACSTR " (%d seconds - "
+ "AP_MAX_INACTIVITY_AFTER_DISASSOC)",
+ __func__, MAC2STR(sta->addr),
+ AP_MAX_INACTIVITY_AFTER_DISASSOC);
eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_register_timeout(timeout, 0, ap_handle_timer, hapd, sta);
+ eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DISASSOC, 0,
+ ap_handle_timer, hapd, sta);
accounting_sta_stop(hapd, sta);
ieee802_1x_free_station(hapd, sta);
#ifdef CONFIG_IEEE80211BE
@@ -876,27 +883,6 @@
#endif /* CONFIG_IEEE80211BE */
sta->wpa_sm = NULL;
-}
-
-
-static void ap_sta_handle_disassociate(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason)
-{
- wpa_printf(MSG_DEBUG, "%s: disassociate STA " MACSTR,
- hapd->conf->iface, MAC2STR(sta->addr));
-
- if (hapd->iface->current_mode &&
- hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211AD) {
- /* Skip deauthentication in DMG/IEEE 802.11ad */
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC |
- WLAN_STA_ASSOC_REQ_OK);
- sta->timeout_next = STA_REMOVE;
- } else {
- sta->flags &= ~(WLAN_STA_ASSOC | WLAN_STA_ASSOC_REQ_OK);
- sta->timeout_next = STA_DEAUTH;
- }
-
- ap_sta_disconnect_common(hapd, sta, AP_MAX_INACTIVITY_AFTER_DISASSOC);
sta->disassoc_reason = reason;
sta->flags |= WLAN_STA_PENDING_DISASSOC_CB;
@@ -919,8 +905,8 @@
}
-static void ap_sta_handle_deauthenticate(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason)
+void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
+ u16 reason)
{
if (hapd->iface->current_mode &&
hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211AD) {
@@ -932,11 +918,21 @@
wpa_printf(MSG_DEBUG, "%s: deauthenticate STA " MACSTR,
hapd->conf->iface, MAC2STR(sta->addr));
-
+ sta->last_seq_ctrl = WLAN_INVALID_MGMT_SEQ;
sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_REQ_OK);
-
+ ap_sta_set_authorized(hapd, sta, 0);
+ hostapd_set_sta_flags(hapd, sta);
sta->timeout_next = STA_REMOVE;
- ap_sta_disconnect_common(hapd, sta, AP_MAX_INACTIVITY_AFTER_DEAUTH);
+ wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout "
+ "for " MACSTR " (%d seconds - "
+ "AP_MAX_INACTIVITY_AFTER_DEAUTH)",
+ __func__, MAC2STR(sta->addr),
+ AP_MAX_INACTIVITY_AFTER_DEAUTH);
+ eloop_cancel_timeout(ap_handle_timer, hapd, sta);
+ eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DEAUTH, 0,
+ ap_handle_timer, hapd, sta);
+ accounting_sta_stop(hapd, sta);
+ ieee802_1x_free_station(hapd, sta);
sta->deauth_reason = reason;
sta->flags |= WLAN_STA_PENDING_DEAUTH_CB;
@@ -947,105 +943,6 @@
}
-static bool ap_sta_ml_disconnect(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason,
- bool disassoc)
-{
-#ifdef CONFIG_IEEE80211BE
- struct hostapd_data *assoc_hapd, *tmp_hapd;
- struct sta_info *assoc_sta;
- unsigned int i, link_id;
- struct hapd_interfaces *interfaces;
-
- if (!hostapd_is_mld_ap(hapd))
- return false;
-
- /*
- * Get the station on which the association was performed, as it holds
- * the information about all the other links.
- */
- assoc_sta = hostapd_ml_get_assoc_sta(hapd, sta, &assoc_hapd);
- if (!assoc_sta)
- return false;
- interfaces = assoc_hapd->iface->interfaces;
-
- for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
- for (i = 0; i < interfaces->count; i++) {
- struct sta_info *tmp_sta;
-
- if (!assoc_sta->mld_info.links[link_id].valid)
- continue;
-
- tmp_hapd = interfaces->iface[i]->bss[0];
-
- if (!tmp_hapd->conf->mld_ap ||
- assoc_hapd->conf->mld_id != tmp_hapd->conf->mld_id)
- continue;
-
- for (tmp_sta = tmp_hapd->sta_list; tmp_sta;
- tmp_sta = tmp_sta->next) {
- /*
- * Handle the station on which the association
- * was done only after all other link station
- * are removed. Since there is a only a single
- * station per hapd with the same association
- * link simply break;
- */
- if (tmp_sta == assoc_sta)
- break;
-
- if (tmp_sta->mld_assoc_link_id !=
- assoc_sta->mld_assoc_link_id ||
- tmp_sta->aid != assoc_sta->aid)
- continue;
-
- if (disassoc)
- ap_sta_handle_disassociate(tmp_hapd,
- tmp_sta,
- reason);
- else
- ap_sta_handle_deauthenticate(tmp_hapd,
- tmp_sta,
- reason);
-
- break;
- }
- }
- }
-
- /* Disconnect the station on which the association was performed. */
- if (disassoc)
- ap_sta_handle_disassociate(assoc_hapd, assoc_sta, reason);
- else
- ap_sta_handle_deauthenticate(assoc_hapd, assoc_sta, reason);
-
- return true;
-#else /* CONFIG_IEEE80211BE */
- return false;
-#endif /* CONFIG_IEEE80211BE */
-}
-
-
-void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason)
-{
- if (ap_sta_ml_disconnect(hapd, sta, reason, true))
- return;
-
- ap_sta_handle_disassociate(hapd, sta, reason);
-}
-
-
-void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason)
-{
- if (ap_sta_ml_disconnect(hapd, sta, reason, false))
- return;
-
- ap_sta_handle_deauthenticate(hapd, sta, reason);
-}
-
-
#ifdef CONFIG_WPS
int ap_sta_wps_cancel(struct hostapd_data *hapd,
struct sta_info *sta, void *ctx)
@@ -1395,17 +1292,25 @@
}
-bool ap_sta_set_authorized_flag(struct hostapd_data *hapd, struct sta_info *sta,
- int authorized)
+void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
+ int authorized)
{
+ const u8 *dev_addr = NULL;
+ char buf[100];
+#ifdef CONFIG_P2P
+ u8 addr[ETH_ALEN];
+ u8 ip_addr_buf[4];
+#endif /* CONFIG_P2P */
+ u8 *ip_ptr = NULL;
+
if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED))
- return false;
+ return;
if (authorized) {
int mld_assoc_link_id = -1;
#ifdef CONFIG_IEEE80211BE
- if (ap_sta_is_mld(hapd, sta)) {
+ if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
if (sta->mld_assoc_link_id == hapd->mld_link_id)
mld_assoc_link_id = sta->mld_assoc_link_id;
else
@@ -1420,21 +1325,6 @@
sta->flags &= ~WLAN_STA_AUTHORIZED;
}
- return true;
-}
-
-
-void ap_sta_set_authorized_event(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized)
-{
- const u8 *dev_addr = NULL;
- char buf[100];
-#ifdef CONFIG_P2P
- u8 addr[ETH_ALEN];
- u8 ip_addr_buf[4];
-#endif /* CONFIG_P2P */
- u8 *ip_ptr = NULL;
-
#ifdef CONFIG_P2P
if (hapd->p2p_group == NULL) {
if (sta->p2p_ie != NULL &&
@@ -1523,15 +1413,6 @@
}
-void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
- int authorized)
-{
- if (!ap_sta_set_authorized_flag(hapd, sta, authorized))
- return;
- ap_sta_set_authorized_event(hapd, sta, authorized);
-}
-
-
void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
const u8 *addr, u16 reason)
{
@@ -1723,34 +1604,6 @@
}
-#ifdef CONFIG_IEEE80211BE
-static void ap_sta_remove_link_sta(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- struct hostapd_data *tmp_hapd;
- unsigned int i, j;
-
- for_each_mld_link(tmp_hapd, i, j, hapd->iface->interfaces,
- hapd->conf->mld_id) {
- struct sta_info *tmp_sta;
-
- if (hapd == tmp_hapd)
- continue;
-
- for (tmp_sta = tmp_hapd->sta_list; tmp_sta;
- tmp_sta = tmp_sta->next) {
- if (tmp_sta == sta ||
- !ether_addr_equal(tmp_sta->addr, sta->addr))
- continue;
-
- ap_free_sta(tmp_hapd, tmp_sta);
- break;
- }
- }
-}
-#endif /* CONFIG_IEEE80211BE */
-
-
int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta)
{
const u8 *mld_link_addr = NULL;
@@ -1765,17 +1618,11 @@
*/
#ifdef CONFIG_IEEE80211BE
- if (ap_sta_is_mld(hapd, sta)) {
+ if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
u8 mld_link_id = hapd->mld_link_id;
mld_link_sta = sta->mld_assoc_link_id != mld_link_id;
mld_link_addr = sta->mld_info.links[mld_link_id].peer_addr;
-
- /*
- * In case the AP is affiliated with an AP MLD, we need to
- * remove the station from all relevant links/APs.
- */
- ap_sta_remove_link_sta(hapd, sta);
}
#endif /* CONFIG_IEEE80211BE */
@@ -1799,19 +1646,3 @@
sta->added_unassoc = 1;
return 0;
}
-
-
-#ifdef CONFIG_IEEE80211BE
-void ap_sta_free_sta_profile(struct mld_info *info)
-{
- int i;
-
- if (!info)
- return;
-
- for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
- os_free(info->links[i].resp_sta_profile);
- info->links[i].resp_sta_profile = NULL;
- }
-}
-#endif /* CONFIG_IEEE80211BE */