From patchwork Wed Aug 12 16:54:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1343812 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=WEdpE17M; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (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 4BRbS60cPkz9sTF for ; Thu, 13 Aug 2020 02:55:50 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.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=8R1HFj38M41vtH0kxVqwCiBFar4IgSBH5TxpMbwUuag=; b=WEdpE17M8n3kIUrE4C5wutMnN xEm32Syi6uqwEap4E7fTJSo3DFjWP+CHStJhjd62cEjLBCBYX0eqyQgZTJjKvE9DBndmrzTJb1+Ln 9XQbEwqXEOxMVvnWpgnL5l2jvyleVff1XwuLfs9BQWqvTplnfLfWwKRUqbQm10fYwg59GwpnBlKZr u0cbEk1RSINhEVEcvgV0JRIDYX6ee4vDYkp01i/SigOQJ0xo5sIYXbquw3oYmeslVohBIozrDwaiV 1fNRBaV17jeXusj8KQ181UDn0RngMgW8FTxAaR8v/tZhN5LX0hEvpPLtxYrDIjc+2QCFZJDaavNmE n7SegSz5w==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5u20-0004Cm-Ua; Wed, 12 Aug 2020 16:55:17 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5u1f-0003xw-RQ for hostap@lists.infradead.org; Wed, 12 Aug 2020 16:54:59 +0000 Received: from [149.224.82.90] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1k5u1e-0000yO-05; Wed, 12 Aug 2020 18:54:54 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V3 6/7] bss coloring: handle the collision and CCA events coming from the kernel Date: Wed, 12 Aug 2020 18:54:50 +0200 Message-Id: <20200812165451.2698941-7-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200812165451.2698941-1-john@phrozen.org> References: <20200812165451.2698941-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200812_125456_087953_63E5BC45 X-CRM114-Status: GOOD ( 16.46 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record 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: John Crispin Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This patch activates the functionality of the previous patches by handling the actual events that will trigger the CCA process. Signed-off-by: John Crispin --- src/ap/drv_callbacks.c | 42 +++++++++++++++++++- src/drivers/driver.h | 27 +++++++++++++ src/drivers/driver_common.c | 4 ++ src/drivers/driver_nl80211_event.c | 64 +++++++++++++++++++++++++++++- 4 files changed, 135 insertions(+), 2 deletions(-) diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 36678e7a3..ece5dd2ad 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -43,7 +43,6 @@ #include "fils_hlp.h" #include "neighbor_db.h" - #ifdef CONFIG_FILS void hostapd_notify_assoc_fils_finish(struct hostapd_data *hapd, struct sta_info *sta) @@ -1722,6 +1721,36 @@ static void hostapd_event_wds_sta_interface_status(struct hostapd_data *hapd, } +#ifdef CONFIG_IEEE80211AX +static void hostapd_event_bss_color_collision(struct hostapd_data *hapd, + u64 bitmap) +{ + wpa_printf(MSG_DEBUG, "BSS color collision on %s", hapd->conf->iface); + hostapd_switch_color(hapd, bitmap); +} + +static void hostapd_event_cca(struct hostapd_data *hapd, enum wpa_event_type event) +{ + switch (event) { + case EVENT_CCA_STARTED_NOTIFY: + wpa_printf(MSG_DEBUG, "CCA started on on %s", hapd->conf->iface); + break; + case EVENT_CCA_NOTIFY: + wpa_printf(MSG_DEBUG, "CCA finished on on %s", hapd->conf->iface); + hapd->conf->he_op.he_bss_color = hapd->cca_color; + hostapd_cleanup_cca_params(hapd); + break; + case EVENT_CCA_ABORTED_NOTIFY: + wpa_printf(MSG_DEBUG, "CCA aborted on on %s", hapd->conf->iface); + hostapd_cleanup_cca_params(hapd); + break; + default: + break; + } +} +#endif + + #ifdef CONFIG_OWE static int hostapd_notif_update_dh_ie(struct hostapd_data *hapd, const u8 *peer, const u8 *ie, @@ -2028,6 +2057,17 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, data->wds_sta_interface.ifname, data->wds_sta_interface.sta_addr); break; +#ifdef CONFIG_IEEE80211AX + case EVENT_BSS_COLOR_COLLISION: + hostapd_event_bss_color_collision(hapd, + data->bss_color_collision.bitmap); + break; + case EVENT_CCA_STARTED_NOTIFY: + case EVENT_CCA_ABORTED_NOTIFY: + case EVENT_CCA_NOTIFY: + hostapd_event_cca(hapd, event); + break; +#endif default: wpa_printf(MSG_DEBUG, "Unknown event %d", event); break; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 3223dc781..07ff33efd 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -5084,6 +5084,26 @@ enum wpa_event_type { * is required to provide more details of the frame. */ EVENT_UNPROT_BEACON, + + /** + * EVENT_BSS_COLOR_COLLISION - Notification of a BSS color collision + */ + EVENT_BSS_COLOR_COLLISION, + + /** + * EVENT_CCA_STARTED_NOTIFY - Notification that CCA has started + */ + EVENT_CCA_STARTED_NOTIFY, + + /** + * EVENT_CCA_ABORTED_NOTIFY - Notification that CCA has aborted + */ + EVENT_CCA_ABORTED_NOTIFY, + + /** + * EVENT_CCA_NOTIFY - Notification that CCA has completed + */ + EVENT_CCA_NOTIFY, }; @@ -5943,6 +5963,13 @@ union wpa_event_data { struct unprot_beacon { const u8 *sa; } unprot_beacon; + + /** + * struct bss_color_collision - Data for EVENT_BSS_COLOR_COLLISION + */ + struct bss_color_collision { + u64 bitmap; + } bss_color_collision; }; /** diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c index a7ebe9566..0c0a23f09 100644 --- a/src/drivers/driver_common.c +++ b/src/drivers/driver_common.c @@ -90,6 +90,10 @@ const char * event_to_string(enum wpa_event_type event) E2S(WDS_STA_INTERFACE_STATUS); E2S(UPDATE_DH); E2S(UNPROT_BEACON); + E2S(BSS_COLOR_COLLISION); + E2S(CCA_STARTED_NOTIFY); + E2S(CCA_ABORTED_NOTIFY); + E2S(CCA_NOTIFY); } return "UNKNOWN"; diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c index ce95e9cd3..00a39a4ba 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -145,7 +145,10 @@ static const char * nl80211_command_to_string(enum nl80211_commands cmd) C2S(NL80211_CMD_UPDATE_OWE_INFO) C2S(NL80211_CMD_UNPROT_BEACON) C2S(NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS) - + C2S(NL80211_CMD_OBSS_COLOR_COLLISION) + C2S(NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_STARTED) + C2S(NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_ABORTED) + C2S(NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_COMPLETED) default: return "NL80211_CMD_UNKNOWN"; } @@ -2597,6 +2600,51 @@ nl80211_control_port_frame_tx_status(struct wpa_driver_nl80211_data *drv, wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event); } +#ifdef CONFIG_IEEE80211AX +static void mlme_event_obss_color_collision(struct wpa_driver_nl80211_data *drv, + struct nlattr *tb[]) +{ + union wpa_event_data data; + + if (!tb[NL80211_ATTR_OBSS_COLOR_BITMAP]) + return; + + os_memset(&data, 0, sizeof(data)); + data.bss_color_collision.bitmap = nla_get_u64(tb[NL80211_ATTR_OBSS_COLOR_BITMAP]); + + wpa_printf(MSG_DEBUG, "nl80211: BSS color collision - bitmap %08lx", + data.bss_color_collision.bitmap); + + wpa_supplicant_event(drv->ctx, EVENT_BSS_COLOR_COLLISION, &data); +} + +static void mlme_event_color_change_announcement_started(struct wpa_driver_nl80211_data *drv) +{ + union wpa_event_data data = {}; + + wpa_printf(MSG_DEBUG, "nl80211: CCA started"); + + wpa_supplicant_event(drv->ctx, EVENT_CCA_STARTED_NOTIFY, &data); +} + +static void mlme_event_color_change_announcement_aborted(struct wpa_driver_nl80211_data *drv) +{ + union wpa_event_data data = {}; + + wpa_printf(MSG_DEBUG, "nl80211: CCA aborted"); + + wpa_supplicant_event(drv->ctx, EVENT_CCA_ABORTED_NOTIFY, &data); +} + +static void mlme_event_color_change_announcement_completed(struct wpa_driver_nl80211_data *drv) +{ + union wpa_event_data data = {}; + + wpa_printf(MSG_DEBUG, "nl80211: CCA completed"); + + wpa_supplicant_event(drv->ctx, EVENT_CCA_NOTIFY, &data); +} +#endif static void do_process_drv_event(struct i802_bss *bss, int cmd, struct nlattr **tb) @@ -2825,6 +2873,20 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd, tb[NL80211_ATTR_ACK], tb[NL80211_ATTR_COOKIE]); break; +#ifdef CONFIG_IEEE80211AX + case NL80211_CMD_OBSS_COLOR_COLLISION: + mlme_event_obss_color_collision(drv, tb); + break; + case NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_STARTED: + mlme_event_color_change_announcement_started(drv); + break; + case NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_ABORTED: + mlme_event_color_change_announcement_aborted(drv); + break; + case NL80211_CMD_COLOR_CHANGE_ANNOUNCEMENT_COMPLETED: + mlme_event_color_change_announcement_completed(drv); + break; +#endif default: wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event " "(cmd=%d)", cmd);