From patchwork Wed Jun 17 15:08:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311293 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=DPEfOAWY; 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 49n7kf6LKMz9sRk for ; Thu, 18 Jun 2020 01:08:57 +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: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:In-Reply-To:References: List-Owner; bh=mbek8+eYVjCOi5iHcl3cW12j1f8ipPp+U7l+5sIp1VQ=; b=DPEfOAWYgIzKsr wB5cIm3PsnLqz4O3fQjvTtg/lT947mKTCsSmaO8lH02cU0NFbnW0jceyg5rZx0phydjo1i6NPZWik aSZRmBwPu1O/e3/Ucnh/aYcKrtSVDSUFpLz+v+zpkPgmCa9ku9eoCfiUmHCA/4C5kqr/1bTcjAScG y6qw0JnyIzHO1iCCAx+HR3zkgFVyPyPhSfv/jCy+2pnAMjTu5rUz4hN2tT2uxXP0D+6480sx7Q5CO s7cuevUjCHALucbGjBFqDtMMLPr5CFIxVem907+yVTcDzR77kgVJP/UQ1W5O7OaAi5aUHajF26432 CULWM6HSMNg69CE53nAQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgG-0001KZ-Jr; Wed, 17 Jun 2020 15:08:48 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg8-0001EI-9h for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:42 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg5-0005Ej-Uz; Wed, 17 Jun 2020 17:08:38 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 1/6] HE: move some configs from iface -> bss Date: Wed, 17 Jun 2020 17:08:31 +0200 Message-Id: <20200617150836.4183882-1-john@phrozen.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080840_652914_B11A1586 X-CRM114-Status: GOOD ( 14.07 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 The following 3 structs are currently iface structs but should really be BSS specififc. - struct he_operation he_op; - struct ieee80211_he_mu_edca_parameter_set he_mu_edca; - struct spatial_reuse spr; Signed-off-by: John Crispin --- hostapd/config_file.c | 78 +++++++++++++++++++++--------------------- src/ap/ap_config.c | 21 ++++++------ src/ap/ap_config.h | 58 ++++++++++++++++--------------- src/ap/beacon.c | 12 +++---- src/ap/ieee802_11_he.c | 36 +++++++++---------- 5 files changed, 104 insertions(+), 101 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index e0f4f2fcb..03c6fd95b 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3537,110 +3537,110 @@ static int hostapd_config_fill(struct hostapd_config *conf, } else if (os_strcmp(buf, "he_mu_beamformer") == 0) { conf->he_phy_capab.he_mu_beamformer = atoi(pos); } else if (os_strcmp(buf, "he_bss_color") == 0) { - conf->he_op.he_bss_color = atoi(pos) & 0x3f; - conf->he_op.he_bss_color_disabled = 0; + bss->he_op.he_bss_color = atoi(pos) & 0x3f; + bss->he_op.he_bss_color_disabled = 0; } else if (os_strcmp(buf, "he_bss_color_partial") == 0) { - conf->he_op.he_bss_color_partial = atoi(pos); + bss->he_op.he_bss_color_partial = atoi(pos); } else if (os_strcmp(buf, "he_default_pe_duration") == 0) { - conf->he_op.he_default_pe_duration = atoi(pos); + bss->he_op.he_default_pe_duration = atoi(pos); } else if (os_strcmp(buf, "he_twt_required") == 0) { - conf->he_op.he_twt_required = atoi(pos); + bss->he_op.he_twt_required = atoi(pos); } else if (os_strcmp(buf, "he_rts_threshold") == 0) { - conf->he_op.he_rts_threshold = atoi(pos); + bss->he_op.he_rts_threshold = atoi(pos); } else if (os_strcmp(buf, "he_basic_mcs_nss_set") == 0) { - conf->he_op.he_basic_mcs_nss_set = atoi(pos); + bss->he_op.he_basic_mcs_nss_set = atoi(pos); } else if (os_strcmp(buf, "he_mu_edca_qos_info_param_count") == 0) { - conf->he_mu_edca.he_qos_info |= + bss->he_mu_edca.he_qos_info |= set_he_cap(atoi(pos), HE_QOS_INFO_EDCA_PARAM_SET_COUNT); } else if (os_strcmp(buf, "he_mu_edca_qos_info_q_ack") == 0) { - conf->he_mu_edca.he_qos_info |= + bss->he_mu_edca.he_qos_info |= set_he_cap(atoi(pos), HE_QOS_INFO_Q_ACK); } else if (os_strcmp(buf, "he_mu_edca_qos_info_queue_request") == 0) { - conf->he_mu_edca.he_qos_info |= + bss->he_mu_edca.he_qos_info |= set_he_cap(atoi(pos), HE_QOS_INFO_QUEUE_REQUEST); } else if (os_strcmp(buf, "he_mu_edca_qos_info_txop_request") == 0) { - conf->he_mu_edca.he_qos_info |= + bss->he_mu_edca.he_qos_info |= set_he_cap(atoi(pos), HE_QOS_INFO_TXOP_REQUEST); } else if (os_strcmp(buf, "he_mu_edca_ac_be_aifsn") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN); } else if (os_strcmp(buf, "he_mu_edca_ac_be_acm") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM); } else if (os_strcmp(buf, "he_mu_edca_ac_be_aci") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI); } else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmin") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN); } else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmax") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX); } else if (os_strcmp(buf, "he_mu_edca_ac_be_timer") == 0) { - conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_TIMER_IDX] = + bss->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_TIMER_IDX] = atoi(pos) & 0xff; } else if (os_strcmp(buf, "he_mu_edca_ac_bk_aifsn") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN); } else if (os_strcmp(buf, "he_mu_edca_ac_bk_acm") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM); } else if (os_strcmp(buf, "he_mu_edca_ac_bk_aci") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI); } else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmin") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN); } else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmax") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX); } else if (os_strcmp(buf, "he_mu_edca_ac_bk_timer") == 0) { - conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_TIMER_IDX] = + bss->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_TIMER_IDX] = atoi(pos) & 0xff; } else if (os_strcmp(buf, "he_mu_edca_ac_vi_aifsn") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN); } else if (os_strcmp(buf, "he_mu_edca_ac_vi_acm") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM); } else if (os_strcmp(buf, "he_mu_edca_ac_vi_aci") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI); } else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmin") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN); } else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmax") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX); } else if (os_strcmp(buf, "he_mu_edca_ac_vi_timer") == 0) { - conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_TIMER_IDX] = + bss->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_TIMER_IDX] = atoi(pos) & 0xff; } else if (os_strcmp(buf, "he_mu_edca_ac_vo_aifsn") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN); } else if (os_strcmp(buf, "he_mu_edca_ac_vo_acm") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM); } else if (os_strcmp(buf, "he_mu_edca_ac_vo_aci") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI); } else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmin") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN); } else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmax") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |= + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |= set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX); } else if (os_strcmp(buf, "he_mu_edca_ac_vo_timer") == 0) { - conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_TIMER_IDX] = + bss->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_TIMER_IDX] = atoi(pos) & 0xff; } else if (os_strcmp(buf, "he_spr_sr_control") == 0) { - conf->spr.sr_control = atoi(pos) & 0xff; + bss->spr.sr_control = atoi(pos) & 0xff; } else if (os_strcmp(buf, "he_spr_non_srg_obss_pd_max_offset") == 0) { - conf->spr.non_srg_obss_pd_max_offset = atoi(pos); + bss->spr.non_srg_obss_pd_max_offset = atoi(pos); } else if (os_strcmp(buf, "he_spr_srg_obss_pd_min_offset") == 0) { - conf->spr.srg_obss_pd_min_offset = atoi(pos); + bss->spr.srg_obss_pd_min_offset = atoi(pos); } else if (os_strcmp(buf, "he_spr_srg_obss_pd_max_offset") == 0) { - conf->spr.srg_obss_pd_max_offset = atoi(pos); + bss->spr.srg_obss_pd_max_offset = atoi(pos); } else if (os_strcmp(buf, "he_oper_chwidth") == 0) { conf->he_oper_chwidth = atoi(pos); } else if (os_strcmp(buf, "he_oper_centr_freq_seg0_idx") == 0) { diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c index a4e1bbb3d..0a19980eb 100644 --- a/src/ap/ap_config.c +++ b/src/ap/ap_config.c @@ -160,6 +160,17 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss) /* Default to strict CRL checking. */ bss->check_crl_strict = 1; + +#ifdef CONFIG_IEEE80211AX + bss->he_op.he_rts_threshold = HE_OPERATION_RTS_THRESHOLD_MASK >> + HE_OPERATION_RTS_THRESHOLD_OFFSET; + /* Set default basic MCS/NSS set to single stream MCS 0-7 */ + bss->he_op.he_basic_mcs_nss_set = 0xfffc; + bss->he_op.he_bss_color_disabled = 1; + bss->he_op.he_bss_color_partial = 0; + bss->he_op.he_bss_color = 1; +#endif /* CONFIG_IEEE80211AX */ + } @@ -256,16 +267,6 @@ struct hostapd_config * hostapd_config_defaults(void) conf->acs_num_scans = 5; #endif /* CONFIG_ACS */ -#ifdef CONFIG_IEEE80211AX - conf->he_op.he_rts_threshold = HE_OPERATION_RTS_THRESHOLD_MASK >> - HE_OPERATION_RTS_THRESHOLD_OFFSET; - /* Set default basic MCS/NSS set to single stream MCS 0-7 */ - conf->he_op.he_basic_mcs_nss_set = 0xfffc; - conf->he_op.he_bss_color_disabled = 1; - conf->he_op.he_bss_color_partial = 0; - conf->he_op.he_bss_color = 1; -#endif /* CONFIG_IEEE80211AX */ - /* The third octet of the country string uses an ASCII space character * by default to indicate that the regulations encompass all * environments for the current frequency band in the country. */ diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index 596e5a470..1172e4789 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -276,6 +276,31 @@ struct airtime_sta_weight { u8 addr[ETH_ALEN]; }; +/** + * struct he_operation - HE operation + */ +struct he_operation { + u8 he_bss_color; + u8 he_bss_color_disabled; + u8 he_bss_color_partial; + u8 he_default_pe_duration; + u8 he_twt_required; + u16 he_rts_threshold; + u16 he_basic_mcs_nss_set; +}; + +/** + * struct spatial_reuse - Spatial reuse + */ +struct spatial_reuse { + u8 sr_control; + u8 non_srg_obss_pd_max_offset; + u8 srg_obss_pd_min_offset; + u8 srg_obss_pd_max_offset; + u8 srg_obss_color_bitmap; + u8 srg_obss_color_partial_bitmap; +}; + /** * struct hostapd_bss_config - Per-BSS configuration */ @@ -867,6 +892,11 @@ struct hostapd_bss_config { */ u8 mka_psk_set; #endif /* CONFIG_MACSEC */ +#ifdef CONFIG_IEEE80211AX + struct he_operation he_op; + struct ieee80211_he_mu_edca_parameter_set he_mu_edca; + struct spatial_reuse spr; +#endif }; /** @@ -878,31 +908,6 @@ struct he_phy_capabilities_info { bool he_mu_beamformer; }; -/** - * struct he_operation - HE operation - */ -struct he_operation { - u8 he_bss_color; - u8 he_bss_color_disabled; - u8 he_bss_color_partial; - u8 he_default_pe_duration; - u8 he_twt_required; - u16 he_rts_threshold; - u16 he_basic_mcs_nss_set; -}; - -/** - * struct spatial_reuse - Spatial reuse - */ -struct spatial_reuse { - u8 sr_control; - u8 non_srg_obss_pd_max_offset; - u8 srg_obss_pd_min_offset; - u8 srg_obss_pd_max_offset; - u8 srg_obss_color_bitmap; - u8 srg_obss_color_partial_bitmap; -}; - /** * struct hostapd_config - Per-radio interface configuration */ @@ -1031,9 +1036,6 @@ struct hostapd_config { int ieee80211ax; #ifdef CONFIG_IEEE80211AX struct he_phy_capabilities_info he_phy_capab; - struct he_operation he_op; - struct ieee80211_he_mu_edca_parameter_set he_mu_edca; - struct spatial_reuse spr; u8 he_oper_chwidth; u8 he_oper_centr_freq_seg0_idx; u8 he_oper_centr_freq_seg1_idx; diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 48be9b7fe..f34205427 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -1493,16 +1493,16 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd) params.assocresp_ies = assocresp; params.reenable = hapd->reenable_beacon; #ifdef CONFIG_IEEE80211AX - params.he_spr = !!hapd->iface->conf->spr.sr_control; + params.he_spr = !!hapd->conf->spr.sr_control; params.he_spr_srg_obss_pd_min_offset = - hapd->iface->conf->spr.srg_obss_pd_min_offset; + hapd->conf->spr.srg_obss_pd_min_offset; params.he_spr_srg_obss_pd_max_offset = - hapd->iface->conf->spr.srg_obss_pd_max_offset; + hapd->conf->spr.srg_obss_pd_max_offset; params.he_bss_color_disabled = - hapd->iface->conf->he_op.he_bss_color_disabled; + hapd->conf->he_op.he_bss_color_disabled; params.he_bss_color_partial = - hapd->iface->conf->he_op.he_bss_color_partial; - params.he_bss_color = hapd->iface->conf->he_op.he_bss_color; + hapd->conf->he_op.he_bss_color_partial; + params.he_bss_color = hapd->conf->he_op.he_bss_color; params.twt_responder = hostapd_get_he_twt_responder(hapd, IEEE80211_MODE_AP); #endif /* CONFIG_IEEE80211AX */ diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c index f1f2442fc..57c56cbd3 100644 --- a/src/ap/ieee802_11_he.c +++ b/src/ap/ieee802_11_he.c @@ -181,27 +181,27 @@ u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid) oper = (struct ieee80211_he_operation *) pos; os_memset(oper, 0, sizeof(*oper)); - if (hapd->iface->conf->he_op.he_default_pe_duration) - params |= (hapd->iface->conf->he_op.he_default_pe_duration << + if (hapd->conf->he_op.he_default_pe_duration) + params |= (hapd->conf->he_op.he_default_pe_duration << HE_OPERATION_DFLT_PE_DURATION_OFFSET); - if (hapd->iface->conf->he_op.he_twt_required) + if (hapd->conf->he_op.he_twt_required) params |= HE_OPERATION_TWT_REQUIRED; - if (hapd->iface->conf->he_op.he_rts_threshold) - params |= (hapd->iface->conf->he_op.he_rts_threshold << + if (hapd->conf->he_op.he_rts_threshold) + params |= (hapd->conf->he_op.he_rts_threshold << HE_OPERATION_RTS_THRESHOLD_OFFSET); - if (hapd->iface->conf->he_op.he_bss_color_disabled) + if (hapd->conf->he_op.he_bss_color_disabled) params |= HE_OPERATION_BSS_COLOR_DISABLED; - if (hapd->iface->conf->he_op.he_bss_color_partial) + if (hapd->conf->he_op.he_bss_color_partial) params |= HE_OPERATION_BSS_COLOR_PARTIAL; - params |= hapd->iface->conf->he_op.he_bss_color << + params |= hapd->conf->he_op.he_bss_color << HE_OPERATION_BSS_COLOR_OFFSET; /* HE minimum required basic MCS and NSS for STAs */ oper->he_mcs_nss_set = - host_to_le16(hapd->iface->conf->he_op.he_basic_mcs_nss_set); + host_to_le16(hapd->conf->he_op.he_basic_mcs_nss_set); /* TODO: conditional MaxBSSID Indicator subfield */ @@ -244,7 +244,7 @@ u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid) u8 *pos; size_t i; - pos = (u8 *) &hapd->iface->conf->he_mu_edca; + pos = (u8 *) &hapd->conf->he_mu_edca; for (i = 0; i < sizeof(*edca); i++) { if (pos[i]) break; @@ -258,7 +258,7 @@ u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid) *pos++ = WLAN_EID_EXT_HE_MU_EDCA_PARAMS; edca = (struct ieee80211_he_mu_edca_parameter_set *) pos; - os_memcpy(edca, &hapd->iface->conf->he_mu_edca, sizeof(*edca)); + os_memcpy(edca, &hapd->conf->he_mu_edca, sizeof(*edca)); wpa_hexdump(MSG_DEBUG, "HE: MU EDCA Parameter Set element", pos, sizeof(*edca)); @@ -275,14 +275,14 @@ u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid) u8 *pos = eid, *spr_param; u8 sz = 1; - if (!hapd->iface->conf->spr.sr_control) + if (!hapd->conf->spr.sr_control) return eid; - if (hapd->iface->conf->spr.sr_control & + if (hapd->conf->spr.sr_control & SPATIAL_REUSE_NON_SRG_OFFSET_PRESENT) sz++; - if (hapd->iface->conf->spr.sr_control & + if (hapd->conf->spr.sr_control & SPATIAL_REUSE_SRG_INFORMATION_PRESENT) sz += 18; @@ -293,17 +293,17 @@ u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid) spr = (struct ieee80211_spatial_reuse *) pos; os_memset(spr, 0, sizeof(*spr)); - spr->sr_ctrl = hapd->iface->conf->spr.sr_control; + spr->sr_ctrl = hapd->conf->spr.sr_control; pos++; spr_param = spr->params; if (spr->sr_ctrl & SPATIAL_REUSE_NON_SRG_OFFSET_PRESENT) { *spr_param++ = - hapd->iface->conf->spr.non_srg_obss_pd_max_offset; + hapd->conf->spr.non_srg_obss_pd_max_offset; pos++; } if (spr->sr_ctrl & SPATIAL_REUSE_SRG_INFORMATION_PRESENT) { - *spr_param++ = hapd->iface->conf->spr.srg_obss_pd_min_offset; - *spr_param++ = hapd->iface->conf->spr.srg_obss_pd_max_offset; + *spr_param++ = hapd->conf->spr.srg_obss_pd_min_offset; + *spr_param++ = hapd->conf->spr.srg_obss_pd_max_offset; pos += 18; } From patchwork Wed Jun 17 15:08:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311294 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=fpNaBkNH; 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 49n7ks6T4rz9sRf for ; Thu, 18 Jun 2020 01:09:09 +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=r//wlI5bFY6TEAVZwtR16AOvEJNXQsAjaFLS/WBQcuE=; b=fpNaBkNHwOxJ0t Lfa6Wu57xaLGdMSECChR4Zanej1pXloWwHeE83gbJen2mI9mJehFSqyUhNUSwIjkkI4A/wKhAXAbW 7ECqusZoFz/XfEQubQ242oO6pdX1nk5qc7bDgKHd2pjwZiKTOd5oJ1uQNsGrw/JmlhAmwWMdzE393 yapADqBEjLgvPTSjEH1oWwqaumS2CjkIurUFalRj3q+9XMG8MKiD1NOG0vuMbcYrWRSBtoO79VC9M MZ1yGRo1R+vNCudBg7WcsWQBMij2tEperLzVlRONSRVsnAGi8jd9R9mJjEKbb63Qhbj1UflsP2GdP 72iMMvdPUxz/8lYtfLjw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgC-0001G4-Ov; Wed, 17 Jun 2020 15:08:44 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg8-0001EJ-9h for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:42 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg6-0005Ej-4V; Wed, 17 Jun 2020 17:08:38 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 2/6] bss coloring: add support for handling collision events and triggering cac Date: Wed, 17 Jun 2020 17:08:32 +0200 Message-Id: <20200617150836.4183882-2-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200617150836.4183882-1-john@phrozen.org> References: <20200617150836.4183882-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080840_496349_726DD6F0 X-CRM114-Status: GOOD ( 17.62 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 Add the core code for handling bss color collision events and triggering CAC inside the kernel. Signed-off-by: John Crispin --- src/ap/ap_drv_ops.h | 12 +++++ src/ap/hostapd.c | 89 ++++++++++++++++++++++++++++++++++++ src/ap/hostapd.h | 14 ++++++ src/common/ieee802_11_defs.h | 1 + src/drivers/driver.h | 31 +++++++++++++ 5 files changed, 147 insertions(+) diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h index 651b77e9a..44e010f1e 100644 --- a/src/ap/ap_drv_ops.h +++ b/src/ap/ap_drv_ops.h @@ -299,6 +299,18 @@ static inline int hostapd_drv_switch_channel(struct hostapd_data *hapd, return hapd->driver->switch_channel(hapd->drv_priv, settings); } +#ifdef CONFIG_IEEE80211AX +static inline int hostapd_drv_switch_color(struct hostapd_data *hapd, + struct cca_settings *settings) +{ + if (hapd->driver == NULL || hapd->driver->switch_color == NULL || + hapd->drv_priv == NULL) + return -1; + + return hapd->driver->switch_color(hapd->drv_priv, settings); +} +#endif + static inline int hostapd_drv_status(struct hostapd_data *hapd, char *buf, size_t buflen) { diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 26e62d991..f569ddede 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -3661,6 +3661,95 @@ hostapd_switch_channel_fallback(struct hostapd_iface *iface, hostapd_enable_iface(iface); } + +#ifdef CONFIG_IEEE80211AX +void hostapd_cleanup_cca_params(struct hostapd_data *hapd) +{ + hapd->cca_count = 0; + hapd->cca_color = 0; + hapd->cca_c_off_beacon = 0; + hapd->cca_c_off_proberesp = 0; + hapd->cca_in_progress = 0; +} + + +static int hostapd_fill_cca_settings(struct hostapd_data *hapd, + struct cca_settings *settings) +{ + struct hostapd_iface *iface = hapd->iface; + u8 old_color; + int ret; + + + if (!iface || hapd->conf->he_op.he_bss_color_disabled) + return -1; + + old_color = hapd->conf->he_op.he_bss_color; + hapd->conf->he_op.he_bss_color = hapd->cca_color; + ret = hostapd_build_beacon_data(hapd, &settings->beacon_after); + hapd->conf->he_op.he_bss_color = old_color; + + settings->cca_count = hapd->cca_count; + settings->cca_color = hapd->cca_color, + hapd->cca_in_progress = 1; + + ret = hostapd_build_beacon_data(hapd, &settings->beacon_cca); + if (ret) { + free_beacon_data(&settings->beacon_after); + return ret; + } + + settings->counter_offset_beacon = hapd->cca_c_off_beacon; + settings->counter_offset_presp = hapd->cca_c_off_proberesp; + + return 0; +} + + +void +hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap) +{ + struct cca_settings settings; + int i, r, ret; + + if (hapd->cca_in_progress) + return; + + r = os_random() % HE_OPERATION_BSS_COLOR_MAX; + for (i = 0; i < HE_OPERATION_BSS_COLOR_MAX; i++) { + if ((bitmap & (1 << r)) == 0) + break; + r = (r + 1) % HE_OPERATION_BSS_COLOR_MAX; + } + if (i == HE_OPERATION_BSS_COLOR_MAX) { + /* there are no free colors so turn bss coloring off */ + wpa_printf(MSG_INFO, "no free colors left, turning of BSS coloring"); + hapd->conf->he_op.he_bss_color_disabled = 1; + hapd->conf->he_op.he_bss_color = 1; + ieee802_11_set_beacon(hapd); + return; + } + + hostapd_cleanup_cca_params(hapd); + hapd->cca_color = r; + hapd->cca_count = 10; + + if (hostapd_fill_cca_settings(hapd, &settings)) { + hostapd_cleanup_cca_params(hapd); + return; + } + + ret = hostapd_drv_switch_color(hapd, &settings); + free_beacon_data(&settings.beacon_cca); + free_beacon_data(&settings.beacon_after); + + if (ret) { + hostapd_cleanup_cca_params(hapd); + return; + } +} +#endif + #endif /* NEED_AP_MLME */ diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 44d2c6068..ae16a30bf 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -292,6 +292,14 @@ struct hostapd_data { unsigned int cs_c_off_ecsa_beacon; unsigned int cs_c_off_ecsa_proberesp; +#ifdef CONFIG_IEEE80211AX + int cca_in_progress; + u8 cca_count; + u8 cca_color; + unsigned int cca_c_off_beacon; + unsigned int cca_c_off_proberesp; +#endif + #ifdef CONFIG_P2P struct p2p_data *p2p; struct p2p_group *p2p_group; @@ -636,6 +644,12 @@ void hostapd_periodic_iface(struct hostapd_iface *iface); int hostapd_owe_trans_get_info(struct hostapd_data *hapd); void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); + +#ifdef CONFIG_IEEE80211AX +void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap); +void hostapd_cleanup_cca_params(struct hostapd_data *hapd); +#endif + /* utils.c */ int hostapd_register_probereq_cb(struct hostapd_data *hapd, int (*cb)(void *ctx, const u8 *sa, diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index a7c846088..012c06d44 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -2256,6 +2256,7 @@ struct ieee80211_spatial_reuse { #define HE_OPERATION_BSS_COLOR_PARTIAL ((u32) BIT(30)) #define HE_OPERATION_BSS_COLOR_DISABLED ((u32) BIT(31)) #define HE_OPERATION_BSS_COLOR_OFFSET 24 +#define HE_OPERATION_BSS_COLOR_MAX 64 /* Spatial Reuse defines */ #define SPATIAL_REUSE_SRP_DISALLOWED BIT(0) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 408bec00a..b5a8a64c3 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2298,6 +2298,26 @@ struct csa_settings { u16 counter_offset_presp[2]; }; +/** + * struct cca_settings - Settings for color switch command + * @cca_count: Count in Beacon frames (TBTT) to perform the switch + * @cca_color: The new color that we are switching to + * @beacon_cca: Beacon/probe resp/asooc resp info for color switch period + * @beacon_after: Next beacon/probe resp/asooc resp info + * @counter_offset_beacon: Offset to the count field in beacon's tail + * @counter_offset_presp: Offset to the count field in probe resp. + */ +struct cca_settings { + u8 cca_count; + u8 cca_color; + + struct beacon_data beacon_cca; + struct beacon_data beacon_after; + + u16 counter_offset_beacon; + u16 counter_offset_presp; +}; + /* TDLS peer capabilities for send_tdls_mgmt() */ enum tdls_peer_capability { TDLS_PEER_HT = BIT(0), @@ -3869,6 +3889,17 @@ struct wpa_driver_ops { */ int (*switch_channel)(void *priv, struct csa_settings *settings); + /** + * switch_color - Announce color switch and migrate the BSS to the + * given color + * @priv: Private driver interface data + * @settings: Settings for CCA period and new color + * Returns: 0 on success, -1 on failure + * + * This function is used to move the BSS to its new color. + */ + int (*switch_color)(void *priv, struct cca_settings *settings); + /** * add_tx_ts - Add traffic stream * @priv: Private driver interface data From patchwork Wed Jun 17 15:08:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311296 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=AoJdBKQx; 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 49n7l52R6Pz9sRR for ; Thu, 18 Jun 2020 01:09:21 +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=HQnrBDdJvnWdDGxPzixGKjU4F/E0G9IjeZIBQAear0s=; b=AoJdBKQxxywEW5 AN94IaFAolq/beKFERohwSxgK1d+ND4XAzWPH9yPF5nSLR9UTttkv4C8pL74NSTe7nV3zfO/vQm/d 21z+tu8CVWkCtyzEY646Ml0WSUJgY94bj0gJ27eylIuu9jV6jzlyvfQjsS3Km/6ZYltJGod8bjuA0 QDmwVhQDe5A5wHoymo+bWPH4ecQRzC5U5NJ9duoTFkGFECS3DTk1aJEvrt01OsXT75cXHyFLoyV+m w46cuEy0szWJyZwOQoip6pG1VwtEoi3ag1LlL+tBdAtrippg3soysTGa/viIdsBt5xwiRx+fvS1Ec PGpdrAKzeYdl+G6FbUUg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgd-0001o1-OD; Wed, 17 Jun 2020 15:09:11 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg8-0001EK-Fk for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:43 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg6-0005Ej-9j; Wed, 17 Jun 2020 17:08:38 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 3/6] bss_coloring: add the code required to generate the CAC IE Date: Wed, 17 Jun 2020 17:08:33 +0200 Message-Id: <20200617150836.4183882-3-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200617150836.4183882-1-john@phrozen.org> References: <20200617150836.4183882-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080840_685788_3CAA0292 X-CRM114-Status: GOOD ( 12.88 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 IE is similar to the CSA one. It contains a counter and the target color. Once the counter expired, the change to the new color happens. Signed-off-by: John Crispin --- src/ap/beacon.c | 12 ++++++++++++ src/ap/ieee802_11.h | 1 + src/ap/ieee802_11_he.c | 14 ++++++++++++++ src/common/ieee802_11_defs.h | 1 + 4 files changed, 28 insertions(+) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index f34205427..2b02add61 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -572,11 +572,17 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { + u8 *cca_pos; + pos = hostapd_eid_he_capab(hapd, pos, IEEE80211_MODE_AP); pos = hostapd_eid_he_operation(hapd, pos); pos = hostapd_eid_spatial_reuse(hapd, pos); pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos); pos = hostapd_eid_he_6ghz_band_cap(hapd, pos); + cca_pos = hostapd_eid_cca(hapd, pos); + if (cca_pos != pos) + hapd->cca_c_off_proberesp = cca_pos - (u8 *) resp - 2; + pos = cca_pos; } #endif /* CONFIG_IEEE80211AX */ @@ -1296,12 +1302,18 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax) { + u8 *cca_pos; + tailpos = hostapd_eid_he_capab(hapd, tailpos, IEEE80211_MODE_AP); tailpos = hostapd_eid_he_operation(hapd, tailpos); tailpos = hostapd_eid_spatial_reuse(hapd, tailpos); tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos); tailpos = hostapd_eid_he_6ghz_band_cap(hapd, tailpos); + cca_pos = hostapd_eid_cca(hapd, tailpos); + if (cca_pos != tailpos) + hapd->cca_c_off_beacon = cca_pos - tail - 2; + tailpos = cca_pos; } #endif /* CONFIG_IEEE80211AX */ diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h index 16db30340..2ba790c9b 100644 --- a/src/ap/ieee802_11.h +++ b/src/ap/ieee802_11.h @@ -100,6 +100,7 @@ u16 copy_sta_he_6ghz_capab(struct hostapd_data *hapd, struct sta_info *sta, const u8 *he_6ghz_capab); int hostapd_get_he_twt_responder(struct hostapd_data *hapd, enum ieee80211_op_mode mode); +u8 * hostapd_eid_cca(struct hostapd_data *hapd, u8 *eid); 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 57c56cbd3..a7fc4164b 100644 --- a/src/ap/ieee802_11_he.c +++ b/src/ap/ieee802_11_he.c @@ -502,3 +502,17 @@ int hostapd_get_he_twt_responder(struct hostapd_data *hapd, return !!(mac_cap[HE_MAC_CAPAB_0] & HE_MACCAP_TWT_RESPONDER); } + + +u8 * hostapd_eid_cca(struct hostapd_data *hapd, u8 *eid) +{ + if (!hapd->cca_in_progress) + return eid; + *eid++ = WLAN_EID_EXTENSION; + *eid++ = 3; + *eid++ = WLAN_EID_EXT_COLOR_CHANGE_ANNOUNCEMENT; + *eid++ = hapd->cca_count; + *eid++ = hapd->cca_color; + + return eid; +} diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index 012c06d44..472ea980e 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -474,6 +474,7 @@ #define WLAN_EID_EXT_HE_OPERATION 36 #define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38 #define WLAN_EID_EXT_SPATIAL_REUSE 39 +#define WLAN_EID_EXT_COLOR_CHANGE_ANNOUNCEMENT 42 #define WLAN_EID_EXT_OCV_OCI 54 #define WLAN_EID_EXT_SHORT_SSID_LIST 58 #define WLAN_EID_EXT_HE_6GHZ_BAND_CAP 59 From patchwork Wed Jun 17 15:08:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311295 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=rLixpShE; 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 49n7kw5jL9z9sRR for ; Thu, 18 Jun 2020 01:09: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=mjNGxGG97YY1VOg8sITxFwXkWyqTcRN+piBPtRLqydA=; b=rLixpShEXiWSQa oEV0AuH/mNy55ZtRg4c4EmGdgoJJgakP1Jbq2IJg2+GUf8IsYsrNZvMGaBSjjSYMWpPOtAC5LMzhX QUDzMVL0pMeQgVir8NXqvOSlloP9feJH4xCKihsUDv0hESAQcX9m371izvtW4DBUPN1LUArBPPd7F SeUAI2BULXZVz5Q3T57vqxmGOFeVhoDn6dqy8nJmb1+ySd6gHlBDRP2Xt4me/zhaVunSk0FFe+yXZ CIo7KXF6s0tPxc29KiWuUd1QC8QNsxpb7kGZjNOx8tWHtTh4/s6Jg8e85NImRbiIgW3P31+Sl3w7b rluTUgeBDFOgare2Fz2w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgQ-0001Y2-R5; Wed, 17 Jun 2020 15:08:58 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg8-0001EM-N4 for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:43 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg6-0005Ej-H9; Wed, 17 Jun 2020 17:08:38 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 4/6] bss coloring: disable BSS color during CAC Date: Wed, 17 Jun 2020 17:08:34 +0200 Message-Id: <20200617150836.4183882-4-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200617150836.4183882-1-john@phrozen.org> References: <20200617150836.4183882-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080840_903084_9FF0EB30 X-CRM114-Status: GOOD ( 11.30 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 While we are doing CAC the bss color disable bit inside the he oper field needs to be set. Signed-off-by: John Crispin --- src/ap/ieee802_11_he.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c index a7fc4164b..269bcd833 100644 --- a/src/ap/ieee802_11_he.c +++ b/src/ap/ieee802_11_he.c @@ -192,7 +192,7 @@ u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid) params |= (hapd->conf->he_op.he_rts_threshold << HE_OPERATION_RTS_THRESHOLD_OFFSET); - if (hapd->conf->he_op.he_bss_color_disabled) + if (hapd->conf->he_op.he_bss_color_disabled || hapd->cca_in_progress) params |= HE_OPERATION_BSS_COLOR_DISABLED; if (hapd->conf->he_op.he_bss_color_partial) params |= HE_OPERATION_BSS_COLOR_PARTIAL; From patchwork Wed Jun 17 15:08:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311297 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=RMwan92B; 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 49n7lK0RCqz9sRk for ; Thu, 18 Jun 2020 01:09:33 +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=9T/IV+zqZDUNarsxRjWDE90UolKRYEwNzty0lIH/5qU=; b=RMwan92BEqHTb3 LFr+hMNC2WLTlaHzI2VJU9kKh6Cb6q5SLgR6mjfRj1kTetN6b6VXjYwkgoxJDM3v2DlAY95QJhJxx jeyOvcehllkwJ9tDD8UR9iNq+ZLTsQ2Ux73dxVoRkYHsa6MPWAAH2XaGROc6KsuNqSwycpJ9Kz8rl X8IrmAoEztGZsSJvtnE3KYSCoGrWFxO6ovQvBOi4ziMa5qY1q2v90TncWgK6G+zVaLy7g8V5RIce/ bfbgaxa3RQUO+zs0fPAUG7DbDxTRJhfLksGK5PbTzIMGvIECPgBohaeCU0Msh6DXch45RVGAdJQIX taUICweiVLEqkshabAQg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgo-0001zz-SD; Wed, 17 Jun 2020 15:09:22 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg8-0001EN-Q1 for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:43 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg6-0005Ej-TE; Wed, 17 Jun 2020 17:08:39 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 5/6] bss coloring: add the switch_color handler to the nl80211 driver Date: Wed, 17 Jun 2020 17:08:35 +0200 Message-Id: <20200617150836.4183882-5-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200617150836.4183882-1-john@phrozen.org> References: <20200617150836.4183882-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080840_994920_5FEC7EB8 X-CRM114-Status: GOOD ( 12.75 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 In order to start the CAC process we need to send NL80211_CMD_COLOR_CHANGE to the kernel. This patch adds the required code. Signed-off-by: John Crispin --- src/drivers/driver_nl80211.c | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index c01accfce..9953dde58 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -9521,6 +9521,82 @@ error: } +#ifdef CONFIG_IEEE80211AX +static int nl80211_switch_color(void *priv, struct cca_settings *settings) +{ + struct nl_msg *msg; + struct i802_bss *bss = priv; + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nlattr *beacon_cca; + int ret = -ENOBUFS; + + wpa_printf(MSG_DEBUG, "nl80211: Color change request (cca_count=%u color=%d)", + settings->cca_count, settings->cca_color); + + if (drv->nlmode != NL80211_IFTYPE_AP) + return -EOPNOTSUPP; + + if (!settings->beacon_cca.tail) + return -EINVAL; + + if ((settings->beacon_cca.tail_len <= settings->counter_offset_beacon) || + (settings->beacon_cca.tail[settings->counter_offset_beacon] != + settings->cca_count)) + return -EINVAL; + + if (settings->beacon_cca.probe_resp && + ((settings->beacon_cca.probe_resp_len <= + settings->counter_offset_presp) || + (settings->beacon_cca.probe_resp[settings->counter_offset_presp] != + settings->cca_count))) + return -EINVAL; + + if (!(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_COLOR_CHANGE)) || + nla_put_u8(msg, NL80211_ATTR_CCA_COUNT, + settings->cca_count) || + nla_put_u8(msg, NL80211_ATTR_CCA_COLOR, + settings->cca_color)) + goto error; + + /* beacon_after params */ + ret = set_beacon_data(msg, &settings->beacon_after); + if (ret) + goto error; + + /* beacon_csa params */ + beacon_cca = nla_nest_start(msg, NL80211_ATTR_CCA_IES); + if (!beacon_cca) + goto fail; + + ret = set_beacon_data(msg, &settings->beacon_cca); + if (ret) + goto error; + + if (nla_put_u16(msg, NL80211_ATTR_CCA_C_OFF_BEACON, + settings->counter_offset_beacon) || + (settings->beacon_cca.probe_resp && + nla_put_u16(msg, NL80211_ATTR_CCA_C_OFF_PRESP, + settings->counter_offset_presp))) + goto fail; + + nla_nest_end(msg, beacon_cca); + ret = send_and_recv_msgs(drv, msg, NULL, NULL); + if (ret) { + wpa_printf(MSG_DEBUG, "nl80211: switch_color failed err=%d (%s)", + ret, strerror(-ret)); + } + return ret; + +fail: + ret = -ENOBUFS; +error: + nlmsg_free(msg); + wpa_printf(MSG_DEBUG, "nl80211: Could not build color switch request"); + return ret; +} +#endif + + static int nl80211_add_ts(void *priv, u8 tsid, const u8 *addr, u8 user_priority, u16 admitted_time) { @@ -11635,6 +11711,9 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { .get_survey = wpa_driver_nl80211_get_survey, .status = wpa_driver_nl80211_status, .switch_channel = nl80211_switch_channel, +#ifdef CONFIG_IEEE80211AX + .switch_color = nl80211_switch_color, +#endif #ifdef ANDROID_P2P .set_noa = wpa_driver_set_p2p_noa, .get_noa = wpa_driver_get_p2p_noa, From patchwork Wed Jun 17 15:08:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1311299 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=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=none (p=none dis=none) header.from=phrozen.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=g/69hJnQ; 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 49n7lT3Zqyz9sRk for ; Thu, 18 Jun 2020 01:09:41 +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=GvbsQPAoI00xvVwkTsNgM9pZYSb/afwxvRHnRbCzA2s=; b=g/69hJnQVIhlJL MT8xGj1ou3omb0Ne0wckVsB7vWBQynCRuLjHc7Nl6uPkP3XC0WDg+Ty7AE9DHV3HEIFhGvWZqTur5 Xdg24B2+43ANAOGyMo84BRg4XAWlopThvznwRzgkiimEnWjhaw4ftn2bC0PD63tld/X3oRZmIcnHq n2fIEl1r8UVpOJNbtp6S1mhE2Gb6VIDkBZnLQtuvg5TqKxUdw6jg2Sj7A+/QIjmDLjPkRMIQzzW+j toPh8ZiRdN1HHTxUoNinVKapN49gzWr8DBCz4BFBbAtVHbMGZrWvqfYghoD6K0F6sKJtlGwmgZzSd muNW+DoQrX+VNVdf+9yw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZgz-0002BV-Al; Wed, 17 Jun 2020 15:09:33 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlZg9-0001EO-55 for hostap@lists.infradead.org; Wed, 17 Jun 2020 15:08:43 +0000 Received: from [134.101.215.41] (helo=localhost.localdomain) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jlZg7-0005Ej-5G; Wed, 17 Jun 2020 17:08:39 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH 6/6] bss coloring: handle the collision and CAC events coming from the kernel Date: Wed, 17 Jun 2020 17:08:36 +0200 Message-Id: <20200617150836.4183882-6-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200617150836.4183882-1-john@phrozen.org> References: <20200617150836.4183882-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_080841_351737_D1D76708 X-CRM114-Status: GOOD ( 14.11 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.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 CAC 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, 136 insertions(+), 1 deletion(-) diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 173549e7b..06cf8545d 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 b5a8a64c3..443286bd8 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -5044,6 +5044,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, }; @@ -5903,6 +5923,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 23a6a4293..3d7d1540d 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 6a2de1f3c..634d405cb 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -138,6 +138,10 @@ static const char * nl80211_command_to_string(enum nl80211_commands cmd) C2S(NL80211_CMD_CONTROL_PORT_FRAME) C2S(NL80211_CMD_UPDATE_OWE_INFO) C2S(NL80211_CMD_UNPROT_BEACON) + C2S(NL80211_CMD_OBSS_COLOR_COLLISION) + C2S(NL80211_CMD_CCA_STARTED_NOTIFY) + C2S(NL80211_CMD_CCA_ABORTED_NOTIFY) + C2S(NL80211_CMD_CCA_NOTIFY) default: return "NL80211_CMD_UNKNOWN"; } @@ -2557,6 +2561,52 @@ static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv, } +#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_cca_started_notify(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_cca_aborted_notify(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_cca_notify(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) { @@ -2775,6 +2825,20 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd, mlme_event_unprot_beacon(drv, nla_data(frame), nla_len(frame)); break; +#ifdef CONFIG_IEEE80211AX + case NL80211_CMD_OBSS_COLOR_COLLISION: + mlme_event_obss_color_collision(drv, tb); + break; + case NL80211_CMD_CCA_STARTED_NOTIFY: + mlme_event_cca_started_notify(drv); + break; + case NL80211_CMD_CCA_ABORTED_NOTIFY: + mlme_event_cca_aborted_notify(drv); + break; + case NL80211_CMD_CCA_NOTIFY: + mlme_event_cca_notify(drv); + break; +#endif default: wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event " "(cmd=%d)", cmd);