[PATCH 03/15] NAN: Process HE element from peer and report them in own frames

Andrei Otcheretianski andrei.otcheretianski at intel.com
Thu Oct 8 09:05:12 PDT 2026


From: Benjamin Berg <benjamin.berg at intel.com>

The only part left for NAN HE support is parsing peer capabilities when
adding the NAN peer station and including the own HE capabilities in the
relevant frames. Add both parts.

Signed-off-by: Benjamin Berg <benjamin.berg at intel.com>
---
 wpa_supplicant/nan_supplicant.c | 36 ++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index 173d2a0ced..bd7367d1b8 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -480,6 +480,10 @@ static int wpas_nan_configure_nmi_sta_capa(struct wpa_supplicant *wpa_s,
 	ie = get_ie(elems, elems_len, WLAN_EID_VHT_CAP);
 	sta_params.vht_capabilities = ie ? (const void *) (ie + 2) : NULL;
 
+	ie = get_ie_ext(elems, elems_len, WLAN_EID_EXT_HE_CAPABILITIES);
+	sta_params.he_capab = ie ? (const void *)(ie + 3) : NULL;
+	sta_params.he_capab_len = ie ? ie[1] - 1 : 0;
+
 	return wpa_drv_sta_add(wpa_s, &sta_params);
 }
 
@@ -2646,6 +2650,7 @@ static struct wpabuf * wpas_nan_build_ndp_elems(struct wpa_supplicant *wpa_s)
 {
 	struct ieee80211_ht_capabilities *ht_cap;
 	struct ieee80211_vht_capabilities *vht_cap;
+	u8 he_mcs_nss_size = 0, he_ppet_size = 0;
 	size_t len;
 	struct wpabuf *buf;
 
@@ -2654,6 +2659,19 @@ static struct wpabuf * wpas_nan_build_ndp_elems(struct wpa_supplicant *wpa_s)
 	if (wpa_s->nan_capa.vht_valid)
 		len += 2 + sizeof(struct ieee80211_vht_capabilities);
 
+	if (wpa_s->nan_capa.vht_valid && wpa_s->nan_capa.he_valid) {
+		he_mcs_nss_size =
+			ieee80211_he_mcs_set_size(
+				wpa_s->nan_capa.he_capab.phy_cap);
+		he_ppet_size =
+			ieee80211_he_ppet_size(
+				wpa_s->nan_capa.he_capab.ppet[0],
+				wpa_s->nan_capa.he_capab.phy_cap);
+
+		len += 3 + IEEE80211_HE_CAPAB_MIN_LEN + he_mcs_nss_size +
+		       he_ppet_size;
+	}
+
 	buf = wpabuf_alloc(len);
 	if (!buf)
 		return NULL;
@@ -2678,7 +2696,23 @@ static struct wpabuf * wpas_nan_build_ndp_elems(struct wpa_supplicant *wpa_s)
 		  wpa_s->nan_capa.vht_mcs_set,
 		  sizeof(vht_cap->vht_supported_mcs_set));
 
-	/* TODO: Add HE capabilities */
+	if (!wpa_s->nan_capa.he_valid)
+		return buf;
+
+	wpabuf_put_u8(buf, WLAN_EID_EXTENSION);
+	wpabuf_put_u8(buf,
+		      1 + IEEE80211_HE_CAPAB_MIN_LEN + he_mcs_nss_size +
+		      he_ppet_size);
+	wpabuf_put_u8(buf, WLAN_EID_EXT_HE_CAPABILITIES);
+	wpabuf_put_data(buf, wpa_s->nan_capa.he_capab.mac_cap,
+			sizeof(wpa_s->nan_capa.he_capab.mac_cap));
+	wpabuf_put_data(buf, wpa_s->nan_capa.he_capab.phy_cap,
+			sizeof(wpa_s->nan_capa.he_capab.phy_cap));
+	wpabuf_put_data(buf, &wpa_s->nan_capa.he_capab.mcs,
+			he_mcs_nss_size);
+	wpabuf_put_data(buf, &wpa_s->nan_capa.he_capab.ppet,
+			he_ppet_size);
+
 	return buf;
 }
 
-- 
2.53.0




More information about the Hostap mailing list