[PATCH 1/4] MLD: Add support for disabled APs

Andrei Otcheretianski andrei.otcheretianski at intel.com
Thu Dec 21 03:08:20 PST 2023


From: Ilan Peer <ilan.peer at intel.com>

An AP part of an MLD AP can temporarily be disabled. Others AP,
which are part of the MLD AP, indicate so in the Reduced Neighbor
Report (RNR) elements added to their beacons and probe responses.

When an AP is disabled, it should be included in the association
exchange, but can be activated only after it is enabled.

Add support identifying disabled APs and propagate the information
to the driver within the associate() callback.

Signed-off-by: Ilan Peer <ilan.peer at intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
 src/common/ieee802_11_defs.h      | 3 +++
 src/drivers/driver.h              | 1 +
 wpa_supplicant/bss.c              | 2 ++
 wpa_supplicant/bss.h              | 3 +++
 wpa_supplicant/sme.c              | 7 ++++++-
 wpa_supplicant/wpa_supplicant_i.h | 1 +
 6 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index 9bf98518e3..4b5b99544a 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -2970,6 +2970,9 @@ enum dscp_policy_request_type {
 #define WFA_CAPA_QM_UNSOLIC_DSCP BIT(1)
 #define WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC BIT(2)
 
+#define RNR_TBTT_INFO_MLD_PARAM2_ALL_UPDATE_INC 0x10
+#define RNR_TBTT_INFO_MLD_PARAM2_LINK_DISABLED  0x20
+
 struct ieee80211_neighbor_ap_info {
 	u8 tbtt_info_hdr;
 	u8 tbtt_info_len;
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 5c0e4b15cf..477b7786ee 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -950,6 +950,7 @@ struct wpa_driver_mld_params {
 		const u8 *ies;
 		size_t ies_len;
 		int error;
+		u8 disabled;
 	} mld_links[MAX_NUM_MLD_LINKS];
 };
 
diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c
index e07061abb5..eed22bb4f1 100644
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -1553,6 +1553,8 @@ wpa_bss_parse_ml_rnr_ap_info(struct wpa_supplicant *wpa_s,
 				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++;
 			}
 		}
diff --git a/wpa_supplicant/bss.h b/wpa_supplicant/bss.h
index 7b13ef96b8..3e018c5835 100644
--- a/wpa_supplicant/bss.h
+++ b/wpa_supplicant/bss.h
@@ -133,6 +133,9 @@ struct wpa_bss {
 		u8 link_id;
 		u8 bssid[ETH_ALEN];
 		int freq;
+
+		/* The link is valid but currently disabled */
+		u8 disabled;
 	} mld_links[MAX_NUM_MLD_LINKS];
 
 	/* followed by ie_len octets of IEs */
diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c
index 648d08549d..ccc8d18b80 100644
--- a/wpa_supplicant/sme.c
+++ b/wpa_supplicant/sme.c
@@ -536,6 +536,7 @@ static void wpas_sme_set_mlo_links(struct wpa_supplicant *wpa_s,
 		os_memcpy(wpa_s->links[link_id].bssid, bssid, ETH_ALEN);
 		wpa_s->links[link_id].freq = bss->mld_links[i].freq;
 		wpa_s->links[link_id].bss = wpa_bss_get_bssid(wpa_s, bssid);
+		wpa_s->links[link_id].disabled = bss->mld_links[i].disabled;
 	}
 }
 
@@ -2591,9 +2592,13 @@ mscs_fail:
 				wpa_s->links[i].bssid;
 			params.mld_params.mld_links[i].freq =
 				wpa_s->links[i].freq;
+			params.mld_params.mld_links[i].disabled =
+				wpa_s->links[i].disabled;
 
-			wpa_printf(MSG_DEBUG, "MLD: id=%u, freq=%d, " MACSTR,
+			wpa_printf(MSG_DEBUG,
+				   "MLD: id=%u, freq=%d, dis=%u, " MACSTR,
 				   i, wpa_s->links[i].freq,
+				   wpa_s->links[i].disabled,
 				   MAC2STR(wpa_s->links[i].bssid));
 		}
 	}
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index b3f1cd1b4e..f746ada348 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -735,6 +735,7 @@ struct wpa_supplicant {
 		u8 bssid[ETH_ALEN];
 		unsigned int freq;
 		struct wpa_bss *bss;
+		u8 disabled;
 	} links[MAX_NUM_MLD_LINKS];
 	u8 *last_con_fail_realm;
 	size_t last_con_fail_realm_len;
-- 
2.43.0




More information about the Hostap mailing list