From patchwork Wed Feb 22 00:46:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wang X-Patchwork-Id: 1746035 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=USix/o8C; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=eq1za31a; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PLyDh5dv8z23yr for ; Wed, 22 Feb 2023 11:47:48 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=NqNBp5rkRQKieacfgAtzdbvhGzfeuWrR3QhysF81QUQ=; b=USix/o8C/mGwHP zbHVgqJO8Z6fuKtW/erZEz2LkJ5wpAjrJVZTP2WEn2Wu8I5OWh7d2TBSL4asfvcZGw1zT/DjEJp+p lL259sJNKm14dbzE7YQJ7qH++eCxQ1VjWX9nzoMCTk3G7MkaswTp+0PmCjNHCQWttuWEd7oV8OQQG me/NisWoF/rFrWVyunqnJNmgvF/NoqRTfqImtl2LO2b3vWaw7dCJ26kMtu+5Ha36CyU+tuCVrzU4S tENXoLBWLc0n79cNieWCaOlIKvJMWCGLuDVyZJP0UMpo0mb2z6A5L5IJbwCZfEIB1tIzjOMVRO3nw c5qMFNkOHSOekHXCCEqQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pUdHS-00AG71-Uz; Wed, 22 Feb 2023 00:46:47 +0000 Received: from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pUdHP-00AG6R-Qf for hostap@lists.infradead.org; Wed, 22 Feb 2023 00:46:45 +0000 Received: by mail-pj1-x102d.google.com with SMTP id pt11so7679043pjb.1 for ; Tue, 21 Feb 2023 16:46:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=e5H8eWSj2PG1Yz/xu0XnzjfQ4hIZthXnsDKpOrLh/z0=; b=eq1za31aduN3CzrTT4Nmqr8OYlZEVraCG/+PhlvYLyBUZMF9rydpdwXQOF+g9ped1Y /xhDzbJ0P+xJO1pNEBzbR/9N93WbRSXQqAaHZb2iWuzkFeD+1+mlNTkX7VAyQxRGGm0g sWYpO8q73nRNegqDmzBh83Ww/3HdzO/BgRZ/E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=e5H8eWSj2PG1Yz/xu0XnzjfQ4hIZthXnsDKpOrLh/z0=; b=VI5I/p7D4/fnqAqlZDNTBMiQZSoaSsfQztqy+hNgbWl5hllytv/YLb4CN9PzRRiIdq 6SPBAbav5TPUT0Muee9bDqpExcPitdJ1Ux8f3mlZdF2zn02VTd2ERAUpaJCo04xbjxqU dgaU5i81kPnQ7rwKgdILQMAM83OTGumxDKb1oY2EXeDmtO5QCM0gFXdvmNl+IrwQHSZv Nt1m0odR4QoxTu+PPxFDH9xUCeWM3sKxXCBxkVB2uonoWYcFNgpyv9G+QTWYt0jGxT/J qXJyQdn9byEzB9ZH1D6Z6Ur9U93ieQUN19y/uWNA8TZF4oHEwcZ1vD6A0RllJP8x/Pe/ no3g== X-Gm-Message-State: AO0yUKXBYXgj+mvdM4ZL7LCpliwEKuEaLz+/f0Amo9YuaEAPCRi2S3tq ipT4B5NhZof/Zra9k73jZp1W7w== X-Google-Smtp-Source: AK7set/r8R9kCx1H3S+P7gLPQdUv6fLZ6+pKVXcQ4zyNsd9uTzPvyPz+FQ+idvWFYEi04ba8vZ87PQ== X-Received: by 2002:a17:90b:4b83:b0:236:7270:ddbf with SMTP id lr3-20020a17090b4b8300b002367270ddbfmr7079022pjb.21.1677026800723; Tue, 21 Feb 2023 16:46:40 -0800 (PST) Received: from matthewmwang2.mtv.corp.google.com ([2620:15c:9d:4:cd9:81ac:30db:d375]) by smtp.gmail.com with ESMTPSA id rj4-20020a17090b3e8400b002311dbb2bc5sm3287735pjb.45.2023.02.21.16.46.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Feb 2023 16:46:40 -0800 (PST) From: Matthew Wang To: j@w1.fi Cc: hostap@lists.infradead.org, matthewmwang@chromium.org Subject: [PATCH v5 2/3] P2P: optimize join scan freq Date: Tue, 21 Feb 2023 16:46:16 -0800 Message-Id: <20230222004615.3724734-1-matthewmwang@chromium.org> X-Mailer: git-send-email 2.39.2.637.g21b0678d19-goog MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230221_164643_916061_393D158D X-CRM114-Status: GOOD ( 24.22 ) X-Spam-Score: -0.4 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Allow clients to specify the BSSID of an auto GO. If the auto GO has been discovered on another interface, optimize scan frequency by performing a single channel scan first. Android and ChromeOS use t [...] Content analysis details: (-0.4 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:102d 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_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.2 DKIMWL_WL_HIGH DKIMwl.org - High trust sender X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Allow clients to specify the BSSID of an auto GO. If the auto GO has been discovered on another interface, optimize scan frequency by performing a single channel scan first. Android and ChromeOS use this to streamline auto GO discovery. Signed-off-by: Matthew Wang --- wpa_supplicant/bss.c | 7 +++--- wpa_supplicant/ctrl_iface.c | 2 +- wpa_supplicant/dbus/dbus_new_handlers_p2p.c | 12 ++++++--- wpa_supplicant/events.c | 2 +- wpa_supplicant/p2p_supplicant.c | 23 ++++++++++++------ wpa_supplicant/p2p_supplicant.h | 2 +- wpa_supplicant/scan.c | 27 ++++++++++++++++++++- wpa_supplicant/wpa_supplicant_i.h | 1 + 8 files changed, 59 insertions(+), 17 deletions(-) diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c index 043ec35807e..2cf2ea1e1fa 100644 --- a/wpa_supplicant/bss.c +++ b/wpa_supplicant/bss.c @@ -240,7 +240,7 @@ void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, /** * wpa_bss_get - Fetch a BSS table entry based on BSSID and SSID * @wpa_s: Pointer to wpa_supplicant data - * @bssid: BSSID + * @bssid: BSSID, or %NULL to match any BSSID * @ssid: SSID * @ssid_len: Length of @ssid * Returns: Pointer to the BSS entry or %NULL if not found @@ -249,10 +249,11 @@ struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid, const u8 *ssid, size_t ssid_len) { struct wpa_bss *bss; - if (!wpa_supplicant_filter_bssid_match(wpa_s, bssid)) + if (bssid && !wpa_supplicant_filter_bssid_match(wpa_s, bssid)) return NULL; dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { - if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0 && + if ((!bssid || + os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0) && bss->ssid_len == ssid_len && os_memcmp(bss->ssid, ssid, ssid_len) == 0) return bss; diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 6588fd47b4a..68a62da72fd 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -7128,7 +7128,7 @@ static int p2p_ctrl_group_add_persistent(struct wpa_supplicant *wpa_s, return wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, vht_center_freq2, 0, ht40, vht, vht_chwidth, he, edmg, - NULL, 0, 0, allow_6ghz, 0); + NULL, 0, 0, allow_6ghz, 0, NULL); } diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c index 370aee278cf..80e2c89ba2c 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c +++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c @@ -359,6 +359,7 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message, char *iface = NULL; unsigned int group_id = 0; struct wpa_ssid *ssid; + u8 go_bssid[ETH_ALEN] = {0}; dbus_message_iter_init(message, &iter); @@ -384,9 +385,13 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message, goto inv_args_clear; } else if (os_strcmp(entry.key, "persistent_group_object") == 0 && - entry.type == DBUS_TYPE_OBJECT_PATH) + entry.type == DBUS_TYPE_OBJECT_PATH) { pg_object_path = os_strdup(entry.str_value); - else + } else if (os_strcmp(entry.key, "go_bssid") == 0 && + entry.type == DBUS_TYPE_STRING) { + if (hwaddr_aton(entry.str_value, go_bssid)) + goto inv_args_clear; + } else goto inv_args_clear; wpa_dbus_dict_entry_clear(&entry); @@ -432,7 +437,8 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message, if (wpas_p2p_group_add_persistent(wpa_s, ssid, 0, freq, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, - false, retry_limit)) { + false, retry_limit, + go_bssid)) { reply = wpas_dbus_error_unknown_error( message, "Failed to reinvoke a persistent group"); diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index e58a3da8356..a9ff491330b 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -1163,7 +1163,7 @@ static void owe_trans_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, } -static int disabled_freq(struct wpa_supplicant *wpa_s, int freq) +int disabled_freq(struct wpa_supplicant *wpa_s, int freq) { int i, j; diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index b906c7736f9..527343a424c 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -3373,7 +3373,8 @@ static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid, wpa_s->conf->p2p_go_he, wpa_s->conf->p2p_go_edmg, NULL, go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, - 1, is_p2p_allow_6ghz(wpa_s->global->p2p), 0); + 1, is_p2p_allow_6ghz(wpa_s->global->p2p), 0, + NULL); } else if (bssid) { wpa_s->user_initiated_pd = 0; wpa_msg_global(wpa_s, MSG_INFO, @@ -3603,7 +3604,8 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid, ssid->mode == WPAS_MODE_P2P_GO ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 1, - is_p2p_allow_6ghz(wpa_s->global->p2p), 0); + is_p2p_allow_6ghz(wpa_s->global->p2p), 0, + NULL); } @@ -4689,7 +4691,7 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev, persistent_go->mode == WPAS_MODE_P2P_GO ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : - 0, 0, false, 0); + 0, 0, false, 0, NULL); } else if (response_done) { wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0, false); @@ -4812,7 +4814,7 @@ static int wpas_prov_disc_resp_cb(void *ctx) NULL, persistent_go->mode == WPAS_MODE_P2P_GO ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 0, - is_p2p_allow_6ghz(wpa_s->global->p2p), 0); + is_p2p_allow_6ghz(wpa_s->global->p2p), 0, NULL); } else { wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0, 0, 0, is_p2p_allow_6ghz(wpa_s->global->p2p)); @@ -6946,7 +6948,8 @@ int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group, static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s, struct wpa_ssid *params, int addr_allocated, - int freq, int force_scan, int retry_limit) + int freq, int force_scan, int retry_limit, + const u8 *go_bssid) { struct wpa_ssid *ssid; int other_iface_found = 0; @@ -6999,6 +7002,11 @@ static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s, if (params->passphrase) ssid->passphrase = os_strdup(params->passphrase); + if (go_bssid && !is_zero_ether_addr(go_bssid)) { + ssid->bssid_set = 1; + os_memcpy(ssid->bssid, go_bssid, ETH_ALEN); + } + wpa_s->show_group_started = 1; wpa_s->p2p_in_invitation = 1; wpa_s->p2p_retry_limit = retry_limit; @@ -7045,7 +7053,8 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s, int edmg, const struct p2p_channels *channels, int connection_timeout, int force_scan, - bool allow_6ghz, int retry_limit) + bool allow_6ghz, int retry_limit, + const u8 *go_bssid) { struct p2p_go_neg_results params; int go = 0, freq; @@ -7113,7 +7122,7 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s, } return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq, - force_scan, retry_limit); + force_scan, retry_limit, go_bssid); } else { return -1; } diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index 907ac8ccad7..5043b61ee38 100644 --- a/wpa_supplicant/p2p_supplicant.h +++ b/wpa_supplicant/p2p_supplicant.h @@ -52,7 +52,7 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s, int max_oper_chwidth, int he, int edmg, const struct p2p_channels *channels, int connection_timeout, int force_scan, - bool allow_6ghz, int retry_limit); + const u8 *go_bssid); struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); enum wpas_p2p_prov_disc_use { diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c index cc9faf2a807..88d7e6e65e9 100644 --- a/wpa_supplicant/scan.c +++ b/wpa_supplicant/scan.c @@ -445,11 +445,36 @@ static void wpa_supplicant_optimize_freqs( } if (params->freqs == NULL && wpa_s->p2p_in_invitation) { + /* + * Perform a single-channel scan if the GO has already been + * discovered on another non-P2P interface. Note that a scan + * initiated by a P2P interface (e.g. the device interface) + * should already have sufficient IEs and scan results will be + * fetched on interface creation in that case. + */ + if (wpa_s->p2p_in_invitation == 1 && wpa_s->current_ssid) { + struct wpa_supplicant *ifs; + struct wpa_bss *bss = NULL; + struct wpa_ssid *ssid = wpa_s->current_ssid; + u8 *bssid = ssid->bssid_set ? ssid->bssid : NULL; + dl_list_for_each(ifs, &wpa_s->radio->ifaces, + struct wpa_supplicant, radio_list) { + bss = wpa_bss_get(ifs, bssid, ssid->ssid, + ssid->ssid_len); + if (bss) + break; + } + if (bss && !disabled_freq(wpa_s, bss->freq)) { + params->freqs = os_calloc(2, sizeof(int)); + if (params->freqs) + params->freqs[0] = bss->freq; + } + } /* * Optimize scan based on GO information during persistent * group reinvocation */ - if (wpa_s->p2p_in_invitation < 5 && + if (params->freqs == NULL && wpa_s->p2p_in_invitation < 5 && wpa_s->p2p_invite_go_freq > 0) { if (wpa_s->p2p_invite_go_freq == 2 || wpa_s->p2p_invite_go_freq == 5) { diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index cb7d5f5a198..61d274a056b 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1826,6 +1826,7 @@ int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s, int get_shared_radio_freqs(struct wpa_supplicant *wpa_s, int *freq_array, unsigned int len, bool exclude_current); +int disabled_freq(struct wpa_supplicant *wpa_s, int freq); void wpas_network_reenabled(void *eloop_ctx, void *timeout_ctx);