From patchwork Mon Jul 6 17:09:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323797 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=qchv8jIb; 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 4B0sXB5GSyz9sSt for ; Tue, 7 Jul 2020 03:10:34 +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=tJVyfnyWcVkIKXzuvFIujrXchpQjPWjYh/UdkDNnJP4=; b=qchv8jIbL92OHm8jLwCrumPDh FQwInwZJnUAOWh7qAUwf6sLEI1Qt3WkfKaRmF7O/gJqB33H9PlO2TxtAE0+J5O0/HfEc5oCJZmxrg bSU8l4UO59WrvHTRmxctXJFnFPbY7ovJ9C9RzDBOIpXzXtiOLbvNLFBdBYSef94/ch7foKWFQEpGY E0UD5pKeMXT1tlLda1OB+KaixOVn21QiOFZZkUhD2vn5n4yBV2cjKHdzeFb2UraBYoS2uYtqu0XZl 5EiIyWxhwPuSKCRUM/+VNK8wWmTHxjBXW0+gTBjYSs6TPbI8FNZJ7XOiRbqxX7CYKIf0LEt0OnCcm 6oSSITblA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUcc-0007nl-11; Mon, 06 Jul 2020 17:09:38 +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 1jsUcV-0007k6-GI for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:33 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcT-00017f-IJ; Mon, 06 Jul 2020 19:09:29 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 1/7] HE: move some configs from iface -> bss Date: Mon, 6 Jul 2020 19:09:22 +0200 Message-Id: <20200706170928.1774626-2-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130931_828792_B3855FD5 X-CRM114-Status: GOOD ( 14.68 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 | 20 +++++------ src/ap/ap_config.h | 58 ++++++++++++++++--------------- src/ap/beacon.c | 12 +++---- src/ap/ieee802_11_he.c | 36 +++++++++---------- 5 files changed, 103 insertions(+), 101 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index 97ded78aa..7728aff55 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3439,110 +3439,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 1c6b4a00e..56a4ac388 100644 --- a/src/ap/ap_config.c +++ b/src/ap/ap_config.c @@ -164,6 +164,16 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss) #ifdef CONFIG_TESTING_OPTIONS bss->sae_commit_status = -1; #endif /* CONFIG_TESTING_OPTIONS */ + +#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 */ } @@ -260,16 +270,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 3a363bc4e..0f0394f11 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -267,6 +267,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 */ @@ -860,6 +885,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 }; /** @@ -871,31 +901,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 */ @@ -1024,9 +1029,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 03cca305a..fde637017 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -1501,16 +1501,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 85b714090..4e060a8fd 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 Mon Jul 6 17:09:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323799 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=NSLxcEl5; 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 4B0sXC1MhWz9sTH for ; Tue, 7 Jul 2020 03:10:34 +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=Tu5LSdFpsgAPo2BpU46dMOwMF6PJXPGwuFNtT7ClqHg=; b=NSLxcEl5iCSuvU/X/y4+wCJIO SXinZXASiJ02xObV9u7LtMVdi+xLWn54KVM88VknXj2CN9zt2sw0wRfPyTIbC3v9cSYVuRAYrL2BV /Cgx3YR4ygoxemdpQy9lgRwXp23zwIYjGDUHnbTb16ti1P8IeEEYgUY8F3tefZAUWSN9/6Kr0EQrG uDpx/p39jWB8Y5ADV2gfZttUeGiFSnYn8Y2MuB9pe0lFK5uSxt6oVymjXEr3bod89gg9WFfWANM2P gc2ak0fIk/hFpynaV8LnAQvW0vY03g44atRAWVTSy6YVcwIIg8xMyF9RNavN3gedmFjc2Pb1q4DxE OSLHJBipQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUcZ-0007mr-CZ; Mon, 06 Jul 2020 17:09:35 +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 1jsUcV-0007kK-Ob for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:33 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcT-00017f-RW; Mon, 06 Jul 2020 19:09:29 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 2/7] bss coloring: add support for handling collision events and triggering CCA Date: Mon, 6 Jul 2020 19:09:23 +0200 Message-Id: <20200706170928.1774626-3-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130931_959014_500996EB X-CRM114-Status: GOOD ( 20.18 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 CCA 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 7d1287763..f1fdc8796 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -2265,6 +2265,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 cfeb94781..487f2faee 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2308,6 +2308,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), @@ -3879,6 +3899,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 Mon Jul 6 17:09:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323796 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=yif6vUoX; 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 4B0sXC0TZkz9sSd for ; Tue, 7 Jul 2020 03:10:34 +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=aWBx1CQ+yWLYbI9+glSkjqszG6i5VQw9jAobFPkDJZ0=; b=yif6vUoXi6veW+2sEpwa2Axvk hbTEzxTIPX2kmS9Rr1kA0pOMP+NsJXObuTsr7OQJ48l0MTkH1mi7pTZmvQMeeOmYlm6cCeAZjt0+1 6GUhikZyxPtD2djUNW6NlNZNAV+wDYLJK6+MJR7qmYooM5wA9wmklb50b6BpNIyggwoVkubakwxVS Ba0jg14HI9LQAFEFxjry8uTTTF1bhcm3IOi9woJTbEcCccQ2XPpYbL7zDJAkMBJu3lpJWw43dBd/z /l5tvuVo88FtGhAQjNahlwI4nKULXfpJ+sfzWILKbzWsUH/6XtvFnft5WCw1NnuaR/Bzo17UvqzUE KwoUkOvQQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUch-0007qH-Fx; Mon, 06 Jul 2020 17:09:43 +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 1jsUcW-0007kO-8k for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:35 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcU-00017f-01; Mon, 06 Jul 2020 19:09:30 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 3/7] bss_coloring: add the code required to generate the CCA IE Date: Mon, 6 Jul 2020 19:09:24 +0200 Message-Id: <20200706170928.1774626-4-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130932_453979_C131E936 X-CRM114-Status: GOOD ( 13.29 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 fde637017..8c3e80dfb 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -576,11 +576,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 */ @@ -1304,12 +1310,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 466938f59..2c3dea0e9 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 4e060a8fd..d4b278786 100644 --- a/src/ap/ieee802_11_he.c +++ b/src/ap/ieee802_11_he.c @@ -483,3 +483,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 f1fdc8796..e8956eca1 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -475,6 +475,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 Mon Jul 6 17:09:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323795 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=zwcuAO6E; 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 4B0sXC18Hfz9sTF for ; Tue, 7 Jul 2020 03:10:34 +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=oAumLLh4nsMI0ywU0xZ9Xtjs4pknrMJhYmkiUCNoPi0=; b=zwcuAO6EStFfsUjDOBXxtwKuT PwHjpiq0/NAU8RFI8n88j7pmiYpWmCcYKpirtxE+RvUwL+/ZsJq+a4ipbdhleNblYAXRbKtYvX7n7 uXCfOqmZ8nGw17iWH0ubBxEBE8+SFV9sGgUyFDB4GJ+vdjgY06PPz/GGGqZn4FBfqLfOu3RINClDf 0J3gq+o8wWNwgGMm2o2mxLR/LJL74wUI95GNMUxdr4S0igy3IdnlxHF7VXFxvi+sUedDipsa7UgLz G/y7/PUnTuo+vBwrsUqBf0nTPSFTJofZoMgHs+YbRWkUS82iGVbTtVjh9A6QBHVby7/1yP2N6TnPF W+W9WynOQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUce-0007on-BE; Mon, 06 Jul 2020 17:09:40 +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 1jsUcW-0007kN-1u for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:34 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcU-00017f-4q; Mon, 06 Jul 2020 19:09:30 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 4/7] bss coloring: disable BSS color during CCA Date: Mon, 6 Jul 2020 19:09:25 +0200 Message-Id: <20200706170928.1774626-5-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130932_220816_B476443A X-CRM114-Status: GOOD ( 10.80 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 CCA 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 d4b278786..57a866534 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 Mon Jul 6 17:09:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323793 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=26btfOgW; 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 4B0sXB4wZmz9sSn for ; Tue, 7 Jul 2020 03:10:34 +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=j935rcnCewAIVGxrBxKjQm+iIDkLavWS8llI9siUMiU=; b=26btfOgWR6GsOuVIpRJLASc+L hykQLOjuZcObJ+gih3DnkxRv+7EL1GuxXjce3dGfAdPL8DS8oO7EAtwy4gznWXhKPlPAB5bTUV6WH GGAJwwZhVshlb0hgARi1AMDnEAahIDGhNCZ4f/T/As8puRFlYqwRvlaiJ0Sv+4RAhwOAt8Dwe88rB CfSycjLR/8RwAsOKVDOIeqpZvhhnPTQ576qHrmCEHx+tbake4VRQkxHQwSFMUWnUAOmk4G/PqIk0R ACOVAHwj9f+3YfrEh6nmhG8fdI7w92SCxCh1NPP+CJT9cDWZx6iGoesnMMSBd7X1N79OzawPxQlgv NF238nFUQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUcg-0007pk-7j; Mon, 06 Jul 2020 17:09:42 +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 1jsUcW-0007kn-Ji for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:35 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcU-00017f-Gm; Mon, 06 Jul 2020 19:09:30 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 5/7] bss coloring: add the switch_color handler to the nl80211 driver Date: Mon, 6 Jul 2020 19:09:26 +0200 Message-Id: <20200706170928.1774626-6-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130932_805339_9A764005 X-CRM114-Status: GOOD ( 14.18 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 CCA 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 188d4c625..0b3102600 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -9616,6 +9616,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, 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) { @@ -11734,6 +11810,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 Mon Jul 6 17:09:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323798 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=i9OeAKkW; 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 4B0sXC0pkjz9sTC for ; Tue, 7 Jul 2020 03:10:34 +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=c7Czhngaa6uKsQQaGIViyBC1g00u12FgHn3UPEUFzFI=; b=i9OeAKkWCxw0yHmx0fNKdZppg b1/aUEV68P/ZOJaq8aWxQ3r3sU2PG4K8kXUlWlTZ3+pYogy1wgaRL0SyU1oKG4WmmXZFVZzz6m3A1 E1OQj9E1sX5ORkPSMX/3jAGul4AcAJSZqlUDQPEdj4PkRX+XBUnW+3rmK8KQ+MyiyWPTr1e3abD2s 3hMILLYDITFPrWKGCsG+5dRKDRlgTdd10NelLouVxJohqlHulO8N2ObqoZObZpcwVMMm+39ueWJyV 9ZYpfSXhLSXHLPpkjB01fm+q9z90xQ+pl/cWP+ufBtSkow1Ah6ISH3HCSW6HsfX7p5WGAUZVa1loO xYolf/kaw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUci-0007qz-Nd; Mon, 06 Jul 2020 17:09:44 +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 1jsUcW-0007l3-SI for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:36 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcU-00017f-US; Mon, 06 Jul 2020 19:09:31 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 6/7] bss coloring: handle the collision and CCA events coming from the kernel Date: Mon, 6 Jul 2020 19:09:27 +0200 Message-Id: <20200706170928.1774626-7-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130933_069184_E7450FAB X-CRM114-Status: GOOD ( 13.99 ) 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 487f2faee..ea5037d1c 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -5054,6 +5054,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, }; @@ -5913,6 +5933,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..f763a8fbb 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_CCA_STARTED_NOTIFY) + C2S(NL80211_CMD_CCA_ABORTED_NOTIFY) + C2S(NL80211_CMD_CCA_NOTIFY) 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_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) @@ -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_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); From patchwork Mon Jul 6 17:09:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1323792 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=aAWFy41X; 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 4B0sXB5VLGz9sT6 for ; Tue, 7 Jul 2020 03:10:34 +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=xe3+R++jbyn2UxRc0fQcW5j6aDJ/aOKFqXR6Q4qAm48=; b=aAWFy41XqEE5IMxcyTNSV7Bw3 EoKeofVY1nRFZEkaI3F6p6g5sfU+72sE8dni1sqWuyISfd9yAQC1v7rR2IkX2DdmgNlc+JvmnIt4/ VFu27ZAj05Tc52dN3h4LcB97WZmsherBhicyZjIakD4+broieMDMxif7a8EoiJoyyFrxX0U5Hc7cH 55Mm7NtrZdfR8entT8vi7oez4UG9zrCyvKf4eh57O29zg7jYtmVzs6KHu1rEDA4x55P7ZDyxO0XA6 da6hRD3N96NjjLi0Z5SLnJkEy+wqOrirkpiHp6OvrVO4BigmtCLZWNs5jo9/5F6pRYD4wqa91TU/h lK1BIAIsg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsUcf-0007pJ-B0; Mon, 06 Jul 2020 17:09:41 +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 1jsUcW-0007lE-Ud for hostap@lists.infradead.org; Mon, 06 Jul 2020 17:09:35 +0000 Received: from [134.101.131.141] (helo=bertha9.lan) by ds12 with esmtpa (Exim 4.89) (envelope-from ) id 1jsUcV-00017f-9M; Mon, 06 Jul 2020 19:09:31 +0200 From: John Crispin To: hostap@lists.infradead.org Subject: [PATCH V2 7/7] bss_coloring: allow using a random starting color Date: Mon, 6 Jul 2020 19:09:28 +0200 Message-Id: <20200706170928.1774626-8-john@phrozen.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200706170928.1774626-1-john@phrozen.org> References: <20200706170928.1774626-1-john@phrozen.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200706_130933_181612_9B012B93 X-CRM114-Status: UNSURE ( 9.91 ) X-CRM114-Notice: Please train this message. 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_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an 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 Enhance the possible values for he_bss_color. Anything greater than 63 will make hostapd choose a random color. Signed-off-by: John Crispin --- hostapd/config_file.c | 7 +++++-- hostapd/hostapd.conf | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index 7728aff55..6abcf306e 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3439,8 +3439,11 @@ 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) { - bss->he_op.he_bss_color = atoi(pos) & 0x3f; - bss->he_op.he_bss_color_disabled = 0; + bss->he_op.he_bss_color = atoi(pos); + if (bss->he_op.he_bss_color > 63) + bss->he_op.he_bss_color = (os_random() % 63) + 1; + if (bss->he_op.he_bss_color) + bss->he_op.he_bss_color_disabled = 0; } else if (os_strcmp(buf, "he_bss_color_partial") == 0) { bss->he_op.he_bss_color_partial = atoi(pos); } else if (os_strcmp(buf, "he_default_pe_duration") == 0) { diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf index 91ac96785..5fc4d5f86 100644 --- a/hostapd/hostapd.conf +++ b/hostapd/hostapd.conf @@ -801,7 +801,10 @@ wmm_ac_vo_acm=0 # 1 = supported #he_mu_beamformer=1 -# he_bss_color: BSS color (1-63) +# he_bss_color: +# 0 = disable +# 1-63 = pre-defined color +# 64+ = random color #he_bss_color=1 # he_bss_color_partial: BSS color AID equation