From patchwork Fri Jun 14 14:49:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 1116052 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=narfation.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="HACi+DGG"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=narfation.org header.i=@narfation.org header.b="jo7vxC6e"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45QNmz3L1yz9s9G for ; Sat, 15 Jun 2019 00:49:55 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rtRjC4ovlLUMCuRFwyIQQeemB3r9kOOulGkW/Mt0MDE=; b=HACi+DGG5o98Qa kcipcIYloDq6foVVILk6o9QliRaK+HtLoOVtHGjKtSR273xPm2KBo5OHjuFz/VSXf4bW0HXwCv3yK woVE7wOYmvJQDhga5sVI93iMg9q+q8kcCY4IeYh4eh5HoGzCK+w1v5k1u+IHmPxxABgPEJHi1oxZd ib++HqV0rdIAFg+/7jA5hpSBg5C3mf5oqRUoPW80bG/hLzqAwktyLv1yFsQAWRg4kMFhPXpVg9gWQ RTZ4ja4RugSMTiOyr+teJ6dXKJ5gz7Lu5l9YCey+RTF1/SDxcdMw5Z1NeUNHZzZLqnez4MPwhn5W0 VntGS059ruz8yatiJfQA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hbnWY-00036G-Ea; Fri, 14 Jun 2019 14:49:50 +0000 Received: from durin.narfation.org ([2001:4d88:2000:7::2]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hbnWG-0002l1-8V for hostap@lists.infradead.org; Fri, 14 Jun 2019 14:49:34 +0000 Received: from sven-desktop.home.narfation.org (p200300C59711D1FA000000000000070D.dip0.t-ipconnect.de [IPv6:2003:c5:9711:d1fa::70d]) by durin.narfation.org (Postfix) with ESMTPSA id DECED1100E0; Fri, 14 Jun 2019 16:49:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fxt5/04DJTZzFWTxDnWxqMsbUEZ9YE5rFM1sxt67npw=; b=jo7vxC6e6gblgrVqDFa7ah21v7ojbE7sS9okW+w6u9gu1/dUDyzQQxKeoNM7KnxZKHIoxH WGJSHS2kOzYxXriR1yVT81fMaQln/EnS5kblJ/32WmGKfq3qTsa4EeyecgPvs9nliESIv9 +ENVwG3HyU8m53AyxqI9T8IsRN2jT+4= From: Sven Eckelmann To: hostap@lists.infradead.org Subject: [PATCH 1/3] wpa_supplicant: Fix type for ssid->mode comparisons Date: Fri, 14 Jun 2019 16:49:19 +0200 Message-Id: <20190614144921.13069-2-sven@narfation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190614144921.13069-1-sven@narfation.org> References: <20190614144921.13069-1-sven@narfation.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fxt5/04DJTZzFWTxDnWxqMsbUEZ9YE5rFM1sxt67npw=; b=wc2TB+AZ+PndOPbR8t0i7m9euu+Ip4NMTrdFpXOH1HVTYpR/G/XWoyUTG1hMk//o3u2/uJ 8vyOEq9a8TzUg5gVW1n3zN69ibYzGZY+KHrbVtcMTnG4ji/YKwB/8UKqv0CHQcCS55kGYb C7l/nbMg/nwz7tALGrEyscUfL8f8hTM= ARC-Seal: i=1; s=20121; d=narfation.org; t=1560523771; a=rsa-sha256; cv=none; b=WzXPd1NomA2krqjr9OjPnnlZ87pCdmRCP4sAxUj44Jwd0ZzOuVjXXRae9dxSzYFJys2nGU +WN83SrnuXzuRUkAy+koNhmtDkajNrgpkDT2iyGn06MMpVLmERSELmS1PSaTm3qetp4LDb rGR1cVgizkFyKe0yvrhTHnr0j4lq1l0= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=sven smtp.mailfrom=sven@narfation.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190614_074932_621970_C283010C X-CRM114-Status: GOOD ( 10.36 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jouni Malinen , Sven Eckelmann Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sven Eckelmann The ssid->mode is from type enum wpas_mode and all its constants start with WPAS_MODE_*. Still some of the code sections used the IEEE80211_MODE_* defines instead of WPAS_MODE_*. This should have no impact on the actual code because the constants for INFRA, IBSS, AP and MESH had the same values. Signed-off-by: Sven Eckelmann --- wpa_supplicant/events.c | 12 ++++++------ wpa_supplicant/sme.c | 2 +- wpa_supplicant/wpa_supplicant.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index ae2fc6324..255562173 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -1222,7 +1222,7 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s, continue; } - if (ssid->mode != IEEE80211_MODE_MESH && !bss_is_ess(bss) && + if (ssid->mode != WPAS_MODE_MESH && !bss_is_ess(bss) && !bss_is_pbss(bss)) { if (debug_print) wpa_dbg(wpa_s, MSG_DEBUG, @@ -1246,7 +1246,7 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s, } #ifdef CONFIG_MESH - if (ssid->mode == IEEE80211_MODE_MESH && ssid->frequency > 0 && + if (ssid->mode == WPAS_MODE_MESH && ssid->frequency > 0 && ssid->frequency != bss->freq) { if (debug_print) wpa_dbg(wpa_s, MSG_DEBUG, @@ -1615,9 +1615,9 @@ wpa_supplicant_pick_new_network(struct wpa_supplicant *wpa_s) continue; } #endif /* !CONFIG_IBSS_RSN */ - if (ssid->mode == IEEE80211_MODE_IBSS || - ssid->mode == IEEE80211_MODE_AP || - ssid->mode == IEEE80211_MODE_MESH) + if (ssid->mode == WPAS_MODE_IBSS || + ssid->mode == WPAS_MODE_AP || + ssid->mode == WPAS_MODE_MESH) return ssid; } } @@ -2839,7 +2839,7 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE || wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE || (wpa_s->current_ssid && - wpa_s->current_ssid->mode == IEEE80211_MODE_IBSS)) { + wpa_s->current_ssid->mode == WPAS_MODE_IBSS)) { if (wpa_s->current_ssid && wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE && (wpa_s->drv_flags & diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index ded40874b..dd5020179 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -2246,7 +2246,7 @@ void sme_sched_obss_scan(struct wpa_supplicant *wpa_s, int enable) */ if (!((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) || (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OBSS_SCAN)) || - ssid == NULL || ssid->mode != IEEE80211_MODE_INFRA) + ssid == NULL || ssid->mode != WPAS_MODE_INFRA) return; if (!wpa_s->hw.modes) diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index f82d18fe2..97ea7a721 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -2065,7 +2065,7 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, #endif /* CONFIG_TDLS */ if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && - ssid->mode == IEEE80211_MODE_INFRA) { + ssid->mode == WPAS_MODE_INFRA) { sme_authenticate(wpa_s, bss, ssid); return; } @@ -4231,7 +4231,7 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) || wpa_s->wpa_state != WPA_COMPLETED) && (wpa_s->current_ssid == NULL || - wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) { + wpa_s->current_ssid->mode != WPAS_MODE_IBSS)) { /* Timeout for completing IEEE 802.1X and WPA authentication */ int timeout = 10; From patchwork Fri Jun 14 14:49:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 1116054 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=narfation.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="nj9kSF8g"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=narfation.org header.i=@narfation.org header.b="xfldFcFq"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45QNnX1n0jz9sBp for ; Sat, 15 Jun 2019 00:50:24 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Gbpn+awLyzYo9dTX8K8uTh5rUlfOGRYuS8YRQ2R5G4g=; b=nj9kSF8gZlHcrh ifW5OpbF62BqBF9dIBCUPOpBkcW2NnbrjyYKhYQlTecxw0pQ9c8zm/genI30I8vH7Kg6F6RBfQmIT mgZmDe4yssZi6QdTx1p/GrEtx6W3C3EvLapVYS9RXCS+uBbN4E8Zo4zWnFEE7yhHtXnds6K4CO8b8 QHiiFU5FwHl8BGGIR+JIFyiA2r8C9yl2x7evJCDRpK1FhpQVhBNvf2nS//oKw7oWERe31iAAumS7u PnJ97hsc1koQAuLPkMgX5hw4fNdwSbU8Y6fu/o9vwUuf61bMZkqp3QDFhiX782a1Ri/HDbwEMYlzE kNi12pszA+JWo2bHjW+g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hbnX1-0004ho-F7; Fri, 14 Jun 2019 14:50:19 +0000 Received: from durin.narfation.org ([79.140.41.39]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hbnWJ-0002nL-84 for hostap@lists.infradead.org; Fri, 14 Jun 2019 14:49:37 +0000 Received: from sven-desktop.home.narfation.org (p200300C59711D1FA000000000000070D.dip0.t-ipconnect.de [IPv6:2003:c5:9711:d1fa::70d]) by durin.narfation.org (Postfix) with ESMTPSA id 2D4201100D8; Fri, 14 Jun 2019 16:49:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+nozRxBxQVqMjIbk024GyqnkjTjnCa0/pAdaXIuewVY=; b=xfldFcFqXEDqmfZVQ0dKuMAeXtD9fvdkrODtG1WcwKZc4HjVZwN4kGaossXPNpPrRwypqu bx2i/m4ldk5PxdSA03CGo4Vbz7hqBCqgXVxMNO8iU1MgNYl9PukXJvIJ/v9m6G2x5ygSzE kjnOggmYN+6OHo/Sg9gJBMQVrT3VhfE= From: Sven Eckelmann To: hostap@lists.infradead.org Subject: [PATCH 2/3] nl80211: Add driver multi iftype HE capability parsing Date: Fri, 14 Jun 2019 16:49:20 +0200 Message-Id: <20190614144921.13069-3-sven@narfation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190614144921.13069-1-sven@narfation.org> References: <20190614144921.13069-1-sven@narfation.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+nozRxBxQVqMjIbk024GyqnkjTjnCa0/pAdaXIuewVY=; b=jrjZX5sFUwjmkkEzxeNOUpe/Fsm0jS7w59uJlyFkGudM/jIWsXHTyCFlEy9b0Gij/L2259 69P+uNytJCNem5cdHN9w9mJfCOXjm7f8Ydd/J8AH2VKKpCohLB3wO9tZkzblxhtbHjbtbb 6g3ldDWgtXINME6HHZWVe6Lb+vEuc/M= ARC-Seal: i=1; s=20121; d=narfation.org; t=1560523773; a=rsa-sha256; cv=none; b=H64eiW6Pko0OAWTFZGffBubV2piDnejulhhxk8+POhhpAo9KwFTm5nUEPUJrM2/Q9RDM1B 3ovU6fIwvRbp5xAQcWuLmSk/e+Rc2/NA2RMYZ6A8GyB47KlbgE6z5hcAa2x4FD3uiBY/n9 XXR99Ixue8IS/FLwUQTin+aEJx7NP9w= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=sven smtp.mailfrom=sven@narfation.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190614_074935_808971_00EB652D X-CRM114-Status: GOOD ( 14.44 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [79.140.41.39 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jouni Malinen , Sven Eckelmann Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sven Eckelmann The HE capabilities are no longer per PHY but per iftype on this specific PHY. It is therefore no longer enough to just parse the AP capabilities. The he_capabilities are now duplicated to store all information for IEEE80211_MODE_* which hostap cares about. The nl80211 driver fills in this information when the iftype supports HE. The rest of the code still only uses the IEEE80211_HE_AP portion but can be extended later to also use other HE capabilities. Signed-off-by: Sven Eckelmann --- src/ap/ap_drv_ops.c | 4 +-- src/ap/beacon.c | 8 +++-- src/ap/dfs.c | 2 +- src/ap/hostapd.c | 2 +- src/ap/ieee802_11.c | 5 +-- src/ap/ieee802_11.h | 7 ++-- src/ap/ieee802_11_he.c | 27 +++++++------- src/drivers/driver.h | 18 ++++++---- src/drivers/driver_nl80211_capa.c | 60 ++++++++++++++++++++++--------- 9 files changed, 88 insertions(+), 45 deletions(-) diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index dced3371d..f0859505e 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -553,7 +553,7 @@ int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode, center_segment0, center_segment1, hapd->iface->current_mode ? hapd->iface->current_mode->vht_capab : 0, - &hapd->iface->current_mode->he_capab)) + &hapd->iface->current_mode->he_capab[IEEE80211_MODE_AP])) return -1; if (hapd->driver == NULL) @@ -813,7 +813,7 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface, oper_chwidth, center_segment0, center_segment1, iface->current_mode->vht_capab, - &iface->current_mode->he_capab)) { + &iface->current_mode->he_capab[IEEE80211_MODE_AP])) { wpa_printf(MSG_ERROR, "Can't set freq params"); return -1; } diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 1838c1c84..832b2755e 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -510,7 +510,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { - pos = hostapd_eid_he_capab(hapd, pos); + pos = hostapd_eid_he_capab(hapd, pos, + IEEE80211_MODE_AP); pos = hostapd_eid_he_operation(hapd, pos); pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos); pos = hostapd_eid_spatial_reuse(hapd, pos); @@ -1226,7 +1227,8 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { - tailpos = hostapd_eid_he_capab(hapd, tailpos); + tailpos = hostapd_eid_he_capab(hapd, tailpos, + IEEE80211_MODE_AP); tailpos = hostapd_eid_he_operation(hapd, tailpos); tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos); tailpos = hostapd_eid_spatial_reuse(hapd, tailpos); @@ -1430,7 +1432,7 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd) hostapd_get_oper_centr_freq_seg0_idx(iconf), hostapd_get_oper_centr_freq_seg1_idx(iconf), iface->current_mode->vht_capab, - &iface->current_mode->he_capab) == 0) + &iface->current_mode->he_capab[IEEE80211_MODE_AP]) == 0) params.freq = &freq; res = hostapd_drv_set_ap(hapd, ¶ms); diff --git a/src/ap/dfs.c b/src/ap/dfs.c index a3c9aa26f..cf0e1020b 100644 --- a/src/ap/dfs.c +++ b/src/ap/dfs.c @@ -967,7 +967,7 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) oper_centr_freq_seg0_idx, oper_centr_freq_seg1_idx, iface->current_mode->vht_capab, - &iface->current_mode->he_capab); + &iface->current_mode->he_capab[IEEE80211_MODE_AP]); if (err) { wpa_printf(MSG_ERROR, "DFS failed to calculate CSA freq params"); diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index c83fb2a46..f77ca488c 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -3241,7 +3241,7 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd, hostapd_get_oper_centr_freq_seg0_idx(conf), hostapd_get_oper_centr_freq_seg1_idx(conf), conf->vht_capab, - mode ? &mode->he_capab : NULL)) + mode ? &mode->he_capab[IEEE80211_MODE_AP] : NULL)) return -1; switch (params->bandwidth) { diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 02f56701e..c54149c39 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -2872,7 +2872,8 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, #endif /* CONFIG_IEEE80211AC */ #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { - resp = copy_sta_he_capab(hapd, sta, elems.he_capabilities, + resp = copy_sta_he_capab(hapd, sta, IEEE80211_MODE_AP, + elems.he_capabilities, elems.he_capabilities_len); if (resp != WLAN_STATUS_SUCCESS) return resp; @@ -3465,7 +3466,7 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { - p = hostapd_eid_he_capab(hapd, p); + p = hostapd_eid_he_capab(hapd, p, IEEE80211_MODE_AP); p = hostapd_eid_he_operation(hapd, p); p = hostapd_eid_spatial_reuse(hapd, p); p = hostapd_eid_he_mu_edca_parameter_set(hapd, p); diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h index 914cd1f19..ba26ac384 100644 --- a/src/ap/ieee802_11.h +++ b/src/ap/ieee802_11.h @@ -18,6 +18,7 @@ struct ieee80211_vht_capabilities; struct ieee80211_mgmt; struct vlan_description; struct hostapd_sta_wpa_psk_short; +enum ieee8021_opmode; int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, struct hostapd_frame_info *fi); @@ -57,7 +58,8 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid); u8 * hostapd_eid_vendor_vht(struct hostapd_data *hapd, u8 *eid); u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid); u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid); -u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid); +u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid, + enum ieee8021_opmode opmode); u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid); u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid); u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid); @@ -91,7 +93,8 @@ u16 copy_sta_vht_oper(struct hostapd_data *hapd, struct sta_info *sta, u16 set_sta_vht_opmode(struct hostapd_data *hapd, struct sta_info *sta, const u8 *vht_opmode); u16 copy_sta_he_capab(struct hostapd_data *hapd, struct sta_info *sta, - const u8 *he_capab, size_t he_capab_len); + enum ieee8021_opmode opmode, const u8 *he_capab, + size_t he_capab_len); void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr, const u8 *buf, size_t len, int ack); void hostapd_eapol_tx_status(struct hostapd_data *hapd, const u8 *dst, diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c index fb02fa013..02dc3f9c8 100644 --- a/src/ap/ieee802_11_he.c +++ b/src/ap/ieee802_11_he.c @@ -77,7 +77,8 @@ static inline int ieee80211_check_he_cap_size(const u8 *buf, int len) return (len != cap_len); } -u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid) +u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid, + enum ieee8021_opmode opmode) { struct ieee80211_he_capabilities *cap; struct hostapd_hw_modes *mode = hapd->iface->current_mode; @@ -89,8 +90,8 @@ u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid) return eid; ie_size = sizeof(struct ieee80211_he_capabilities); - ppet_size = ieee80211_he_ppet_size(mode->he_capab.ppet[0], - mode->he_capab.phy_cap); + ppet_size = ieee80211_he_ppet_size(mode->he_capab[opmode].ppet[0], + mode->he_capab[opmode].phy_cap); switch (hapd->iface->conf->he_oper_chwidth) { case CHANWIDTH_80P80MHZ: @@ -119,14 +120,14 @@ u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid) cap = (struct ieee80211_he_capabilities *) pos; os_memset(cap, 0, sizeof(*cap)); - os_memcpy(cap->he_mac_capab_info, mode->he_capab.mac_cap, + os_memcpy(cap->he_mac_capab_info, mode->he_capab[opmode].mac_cap, HE_MAX_MAC_CAPAB_SIZE); - os_memcpy(cap->he_phy_capab_info, mode->he_capab.phy_cap, + os_memcpy(cap->he_phy_capab_info, mode->he_capab[opmode].phy_cap, HE_MAX_PHY_CAPAB_SIZE); - os_memcpy(cap->optional, mode->he_capab.mcs, mcs_nss_size); + os_memcpy(cap->optional, mode->he_capab[opmode].mcs, mcs_nss_size); if (ppet_size) - os_memcpy(&cap->optional[mcs_nss_size], mode->he_capab.ppet, - ppet_size); + os_memcpy(&cap->optional[mcs_nss_size], + mode->he_capab[opmode].ppet, ppet_size); if (hapd->iface->conf->he_phy_capab.he_su_beamformer) cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX] |= @@ -293,7 +294,8 @@ void hostapd_get_he_capab(struct hostapd_data *hapd, } -static int check_valid_he_mcs(struct hostapd_data *hapd, const u8 *sta_he_capab) +static int check_valid_he_mcs(struct hostapd_data *hapd, const u8 *sta_he_capab, + enum ieee8021_opmode opmode) { u16 sta_rx_mcs_set, ap_tx_mcs_set; u8 mcs_count = 0; @@ -302,7 +304,7 @@ static int check_valid_he_mcs(struct hostapd_data *hapd, const u8 *sta_he_capab) if (!hapd->iface->current_mode) return 1; - ap_mcs_set = (u16 *) hapd->iface->current_mode->he_capab.mcs; + ap_mcs_set = (u16 *) hapd->iface->current_mode->he_capab[opmode].mcs; sta_mcs_set = (u16 *) ((const struct ieee80211_he_capabilities *) sta_he_capab)->optional; @@ -351,10 +353,11 @@ static int check_valid_he_mcs(struct hostapd_data *hapd, const u8 *sta_he_capab) u16 copy_sta_he_capab(struct hostapd_data *hapd, struct sta_info *sta, - const u8 *he_capab, size_t he_capab_len) + enum ieee8021_opmode opmode, const u8 *he_capab, + size_t he_capab_len) { if (!he_capab || !hapd->iconf->ieee80211ax || - !check_valid_he_mcs(hapd, he_capab) || + !check_valid_he_mcs(hapd, he_capab, opmode) || ieee80211_check_he_cap_size(he_capab, he_capab_len)) { sta->flags &= ~WLAN_STA_HE; os_free(sta->he_capab); diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 5f870a1f2..6a9dfefc9 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -200,6 +200,17 @@ struct he_capabilities { #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0) #define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1) + +enum ieee8021_opmode { + IEEE80211_MODE_INFRA = 0, + IEEE80211_MODE_IBSS = 1, + IEEE80211_MODE_AP = 2, + IEEE80211_MODE_MESH = 5, + + /* only add new entries before IEEE80211_MODE_NUM */ + IEEE80211_MODE_NUM, +}; + /** * struct hostapd_hw_modes - Supported hardware mode information */ @@ -259,15 +270,10 @@ struct hostapd_hw_modes { /** * he_capab - HE (IEEE 802.11ax) capabilities */ - struct he_capabilities he_capab; + struct he_capabilities he_capab[IEEE80211_MODE_NUM]; }; -#define IEEE80211_MODE_INFRA 0 -#define IEEE80211_MODE_IBSS 1 -#define IEEE80211_MODE_AP 2 -#define IEEE80211_MODE_MESH 5 - #define IEEE80211_CAP_ESS 0x0001 #define IEEE80211_CAP_IBSS 0x0002 #define IEEE80211_CAP_PRIVACY 0x0010 diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index ab9b19f39..871ba827b 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -1551,26 +1551,32 @@ static int phy_info_rates(struct hostapd_hw_modes *mode, struct nlattr *tb) } -static int phy_info_iftype(struct hostapd_hw_modes *mode, - struct nlattr *nl_iftype) +static void phy_info_iftype_copy(struct he_capabilities *he_capab, + enum ieee8021_opmode opmode, + struct nlattr **tb, struct nlattr **tb_flags) { - struct nlattr *tb[NL80211_BAND_IFTYPE_ATTR_MAX + 1]; - struct he_capabilities *he_capab = &mode->he_capab; - struct nlattr *tb_flags[NL80211_IFTYPE_MAX + 1]; + enum nl80211_iftype iftype; size_t len; - nla_parse(tb, NL80211_BAND_IFTYPE_ATTR_MAX, - nla_data(nl_iftype), nla_len(nl_iftype), NULL); - - if (!tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES]) - return NL_STOP; - - if (nla_parse_nested(tb_flags, NL80211_IFTYPE_MAX, - tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES], NULL)) - return NL_STOP; + switch (opmode) { + case IEEE80211_MODE_INFRA: + iftype = NL80211_IFTYPE_STATION; + break; + case IEEE80211_MODE_IBSS: + iftype = NL80211_IFTYPE_ADHOC; + break; + case IEEE80211_MODE_AP: + iftype = NL80211_IFTYPE_AP; + break; + case IEEE80211_MODE_MESH: + iftype = NL80211_IFTYPE_MESH_POINT; + break; + default: + return; + } - if (!nla_get_flag(tb_flags[NL80211_IFTYPE_AP])) - return NL_OK; + if (!nla_get_flag(tb_flags[iftype])) + return; he_capab->he_supported = 1; @@ -1613,6 +1619,28 @@ static int phy_info_iftype(struct hostapd_hw_modes *mode, nla_data(tb[NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE]), len); } +} + + +static int phy_info_iftype(struct hostapd_hw_modes *mode, + struct nlattr *nl_iftype) +{ + struct nlattr *tb[NL80211_BAND_IFTYPE_ATTR_MAX + 1]; + struct nlattr *tb_flags[NL80211_IFTYPE_MAX + 1]; + unsigned int i; + + nla_parse(tb, NL80211_BAND_IFTYPE_ATTR_MAX, + nla_data(nl_iftype), nla_len(nl_iftype), NULL); + + if (!tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES]) + return NL_STOP; + + if (nla_parse_nested(tb_flags, NL80211_IFTYPE_MAX, + tb[NL80211_BAND_IFTYPE_ATTR_IFTYPES], NULL)) + return NL_STOP; + + for (i = 0; i < IEEE80211_MODE_NUM; i++) + phy_info_iftype_copy(&mode->he_capab[i], i, tb, tb_flags); return NL_OK; } From patchwork Fri Jun 14 14:49:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 1116053 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=narfation.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="VSO9humd"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=narfation.org header.i=@narfation.org header.b="esLfT0Vm"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45QNnJ0KNRz9s9G for ; Sat, 15 Jun 2019 00:50:12 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rfLYcAbG2JWtav1SpfJHYXSHfTLndAK8LYHbKPiU57U=; b=VSO9humddvZApC XU+hFzYQibrD16E3Nnf7tiFhQOFVyG9lkMxBjJbrRT+TcrLLTrNGY8hboBszg5gVo1Y1FESSHFwu2 wNWIodL7U/j9m+ouZly71FetUd9x5EsdfrGPRbXmc2cuotQfCGZw+zI1bW21HSjHjnaeYywDQx6gi RNDXqPaCTNo9hWVhzNTlqf/1MPZ3jmflJwMqaJ88OOVowERUKfFsfsEbmEa8g/sdZm75dcXWQQfWN CnpP1D6qgbEATUL3r2IiR2WXuKulyXfm4wfHfifxVbCDjNPVprraHiSS3wHw6hZ+w8AtV42DssbzX 2Q/icZhBto6BnqqN6QOg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hbnWo-0003aM-Aq; Fri, 14 Jun 2019 14:50:06 +0000 Received: from durin.narfation.org ([79.140.41.39]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hbnWK-0002pz-VY for hostap@lists.infradead.org; Fri, 14 Jun 2019 14:49:39 +0000 Received: from sven-desktop.home.narfation.org (p200300C59711D1FA000000000000070D.dip0.t-ipconnect.de [IPv6:2003:c5:9711:d1fa::70d]) by durin.narfation.org (Postfix) with ESMTPSA id 816321100E0; Fri, 14 Jun 2019 16:49:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523775; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XfD8TOGF0NS7uvmyrqNRWolyF1FHBxdXpw7yQu78T78=; b=esLfT0VmnWQtwuZ0hwybKuSkBZnzWiQ/LrB7GDCZx8nHMhOBx/1SgvAqEmb4DtW/KfKQkr 1Mr+rPS8epJ5+9NyS7CrpsjXTjifMbcPuoLlct9C4xPoanaJR5/HWfFOwJ6YUefZX/zu6f Y6N2c5hqRl85CRYr5XlTv5EEk6lgohY= From: Sven Eckelmann To: hostap@lists.infradead.org Subject: [PATCH 3/3] mesh: add support for HE mode Date: Fri, 14 Jun 2019 16:49:21 +0200 Message-Id: <20190614144921.13069-4-sven@narfation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190614144921.13069-1-sven@narfation.org> References: <20190614144921.13069-1-sven@narfation.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1560523775; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XfD8TOGF0NS7uvmyrqNRWolyF1FHBxdXpw7yQu78T78=; b=zwNjLiLHkvnzCPHbcj5Nt9IaNJZR/3e5SrqPa5QHJfKEBv/8V5uqOvhy6n0gDHnleTWrn5 8YEdPZoxEdHF5KbJOxd/GxIP6C/S76BeqBWkdxjuleO+hpj7FZlJW8dJaPmy3XGBjKbBIH 5H5Pk3T0YAwUgZtACwNwlohG3fZgB8c= ARC-Seal: i=1; s=20121; d=narfation.org; t=1560523775; a=rsa-sha256; cv=none; b=PFVyRMOk6C6VZtrOrPrWdysXGzTrKialIh5m32SoDDnHHmQ5Z5Dv4j7x6lgy0Ls4u0Men2 2FHnJgcm/82VYMq3d0BhkyY3xgIBRLtDDcZhu5jV+I2lHB0p4qmDo2UTCQpBdd0srwfzY5 FjRj6iiwaXkwGKxt+FdXwf+pqRg5u5w= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=sven smtp.mailfrom=sven@narfation.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190614_074937_328373_CE65931C X-CRM114-Status: GOOD ( 14.84 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [79.140.41.39 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jouni Malinen , Sven Eckelmann Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sven Eckelmann Mesh points can partially support HE features (when requiring no controlling STA/AP) as long as hardware supports it. The kernel just requires support for HE mesh and wpa_supplicant can forward the peer capabilities to the kernel for further processing. Signed-off-by: Sven Eckelmann --- src/drivers/driver.h | 3 ++- wpa_supplicant/ap.c | 6 ++++++ wpa_supplicant/mesh.c | 3 +++ wpa_supplicant/mesh_mpm.c | 32 +++++++++++++++++++++++++++++++ wpa_supplicant/wpa_supplicant.c | 9 +++++++-- wpa_supplicant/wpa_supplicant_i.h | 20 +++++++++++++++++++ 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 6a9dfefc9..ce5da5863 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -185,6 +185,7 @@ struct hostapd_channel_data { #define HE_MAX_MAC_CAPAB_SIZE 6 #define HE_MAX_PHY_CAPAB_SIZE 11 #define HE_MAX_MCS_CAPAB_SIZE 12 +#define HE_MAX_PPET_CAPAB_SIZE 25 /** * struct he_capabilities - IEEE 802.11ax HE capabilities @@ -194,7 +195,7 @@ struct he_capabilities { u8 phy_cap[HE_MAX_PHY_CAPAB_SIZE]; u8 mac_cap[HE_MAX_MAC_CAPAB_SIZE]; u8 mcs[HE_MAX_MCS_CAPAB_SIZE]; - u8 ppet[25]; + u8 ppet[HE_MAX_PPET_CAPAB_SIZE]; }; #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0) diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index eea5b4e59..f58176a46 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -137,6 +137,8 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, struct hostapd_config *conf) { + int ieee80211_mode = wpas_mode_to_iee80211_mode(ssid->mode); + conf->hw_mode = ieee80211_freq_to_chan(ssid->frequency, &conf->channel); @@ -239,6 +241,10 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, conf->vht_capab |= mode->vht_capab; wpas_conf_ap_vht(wpa_s, ssid, conf, mode); } + + if (mode->he_capab[ieee80211_mode].he_supported && + ssid->he) + conf->ieee80211ax = 1; } } diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c index 1068a5598..7354c1b79 100644 --- a/wpa_supplicant/mesh.c +++ b/wpa_supplicant/mesh.c @@ -456,6 +456,7 @@ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s, ibss_mesh_setup_freq(wpa_s, ssid, ¶ms->freq); wpa_s->mesh_ht_enabled = !!params->freq.ht_enabled; wpa_s->mesh_vht_enabled = !!params->freq.vht_enabled; + wpa_s->mesh_he_enabled = !!params->freq.he_enabled; if (params->freq.ht_enabled && params->freq.sec_channel_offset) ssid->ht40 = params->freq.sec_channel_offset; @@ -480,6 +481,8 @@ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s, break; } } + if (wpa_s->mesh_he_enabled) + ssid->he = 1; if (ssid->beacon_int > 0) params->beacon_int = ssid->beacon_int; else if (wpa_s->conf->beacon_int > 0) diff --git a/wpa_supplicant/mesh_mpm.c b/wpa_supplicant/mesh_mpm.c index 9d6ab8da1..4a163b6eb 100644 --- a/wpa_supplicant/mesh_mpm.c +++ b/wpa_supplicant/mesh_mpm.c @@ -245,6 +245,16 @@ static void mesh_mpm_send_plink_action(struct wpa_supplicant *wpa_s, 2 + 5; /* VHT Operation */ } #endif /* CONFIG_IEEE80211AC */ +#ifdef CONFIG_IEEE80211AX + if (type != PLINK_CLOSE && wpa_s->mesh_he_enabled) { + buf_len += 3 + + HE_MAX_MAC_CAPAB_SIZE + + HE_MAX_PHY_CAPAB_SIZE + + HE_MAX_MCS_CAPAB_SIZE + + HE_MAX_PPET_CAPAB_SIZE; + buf_len += 3 + sizeof(struct ieee80211_he_operation); + } +#endif /* CONFIG_IEEE80211AX */ if (type != PLINK_CLOSE) buf_len += conf->rsn_ie_len; /* RSN IE */ #ifdef CONFIG_OCV @@ -362,6 +372,21 @@ static void mesh_mpm_send_plink_action(struct wpa_supplicant *wpa_s, wpabuf_put_data(buf, vht_capa_oper, pos - vht_capa_oper); } #endif /* CONFIG_IEEE80211AC */ +#ifdef CONFIG_IEEE80211AX + if (type != PLINK_CLOSE && wpa_s->mesh_he_enabled) { + u8 he_capa_oper[3 + + HE_MAX_MAC_CAPAB_SIZE + + HE_MAX_PHY_CAPAB_SIZE + + HE_MAX_MCS_CAPAB_SIZE + + HE_MAX_PPET_CAPAB_SIZE + + 3 + sizeof(struct ieee80211_he_operation)]; + + pos = hostapd_eid_he_capab(bss, he_capa_oper, + IEEE80211_MODE_MESH); + pos = hostapd_eid_he_operation(bss, pos); + wpabuf_put_data(buf, he_capa_oper, pos - he_capa_oper); + } +#endif /* CONFIG_IEEE80211AX */ #ifdef CONFIG_OCV if (type != PLINK_CLOSE && conf->ocv) { @@ -725,6 +750,11 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s, set_sta_vht_opmode(data, sta, elems->vht_opmode_notif); #endif /* CONFIG_IEEE80211AC */ +#ifdef CONFIG_IEEE80211AX + copy_sta_he_capab(data, sta, IEEE80211_MODE_MESH, + elems->he_capabilities, elems->he_capabilities_len); +#endif /* CONFIG_IEEE80211AX */ + if (hostapd_get_aid(data, sta) < 0) { wpa_msg(wpa_s, MSG_ERROR, "No AIDs available"); ap_free_sta(data, sta); @@ -742,6 +772,8 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s, params.listen_interval = 100; params.ht_capabilities = sta->ht_capabilities; params.vht_capabilities = sta->vht_capabilities; + params.he_capab = sta->he_capab; + params.he_capab_len = sta->he_capab_len; params.flags |= WPA_STA_WMM; params.flags_mask |= WPA_STA_AUTHENTICATED; if (conf->security == MESH_CONF_SEC_NONE) { diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 97ea7a721..de71764f6 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -2139,6 +2139,7 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s, const struct wpa_ssid *ssid, struct hostapd_freq_params *freq) { + int ieee80211_mode = wpas_mode_to_iee80211_mode(ssid->mode); enum hostapd_hw_mode hw_mode; struct hostapd_hw_modes *mode = NULL; int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157, @@ -2202,6 +2203,9 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s, if (!mode) return; + /* HE can work without HT + VHT */ + freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported; + #ifdef CONFIG_HT_OVERRIDES if (ssid->disable_ht) { freq->ht_enabled = 0; @@ -2408,9 +2412,10 @@ skip_ht40: if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq, freq->channel, freq->ht_enabled, - vht_freq.vht_enabled, 0, + vht_freq.vht_enabled, freq->he_enabled, freq->sec_channel_offset, - chwidth, seg0, seg1, vht_caps, NULL) != 0) + chwidth, seg0, seg1, vht_caps, + &mode->he_capab[ieee80211_mode]) != 0) return; *freq = vht_freq; diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index b51390ba3..5a5739234 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -823,6 +823,7 @@ struct wpa_supplicant { unsigned int mesh_if_created:1; unsigned int mesh_ht_enabled:1; unsigned int mesh_vht_enabled:1; + unsigned int mesh_he_enabled:1; struct wpa_driver_mesh_join_params *mesh_params; #ifdef CONFIG_PMKSA_CACHE_EXTERNAL /* struct external_pmksa_cache::list */ @@ -1464,6 +1465,25 @@ static inline int network_is_persistent_group(struct wpa_ssid *ssid) return ssid->disabled == 2 && ssid->p2p_persistent_group; } + +static inline int wpas_mode_to_iee80211_mode(enum wpas_mode mode) +{ + switch (mode) { + default: + case WPAS_MODE_INFRA: + return IEEE80211_MODE_INFRA; + case WPAS_MODE_IBSS: + return IEEE80211_MODE_IBSS; + case WPAS_MODE_AP: + case WPAS_MODE_P2P_GO: + case WPAS_MODE_P2P_GROUP_FORMATION: + return IEEE80211_MODE_AP; + case WPAS_MODE_MESH: + return IEEE80211_MODE_MESH; + } +} + + int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid);