From patchwork Thu May 9 19:32:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Crispin X-Patchwork-Id: 1097655 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=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.b="sTc+KU6k"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 450Nn64HkFz9sBK for ; Fri, 10 May 2019 05:33:46 +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:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: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=MmxBv9FVKxCTJpinzIaxgDA3v10Ps+xDRverVYluRAI=; b=sTc+KU6klwWPb8TboiRbRkzePd SGgQtANJqxyr8gR4NQIjonkwpnBeCfA4j/dDxPAJMjIFab2hy72fjRr5J7Rmqu9+6ntiKTy29lqgu e4nCh+9nXVSvDZgE8u8IeodHU81XCebWbrGXoXJO8xjFIaguAGwnUs/N53lsmRXNo+4HE0cdmYE7R ynB8rvfoy0oOwCkNO4eB2vqgfT115Isk7wqUR1eM0YY3sIPgMqR3Q5Qxsrjjdvx62dK6IEe8SF4BF +aRoGBMI80ofcoRzknWdhdUb6Nzb5fPldZ8Z2iooIdD9n+0a2qOQtNfyF1vPjy42Rq6IB/Ez00Cls w+455tIA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hOonW-0006AG-MH; Thu, 09 May 2019 19:33:42 +0000 Received: from nbd.name ([2a01:4f8:221:3d45::2]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hOomf-00050O-4T for hostap@lists.infradead.org; Thu, 09 May 2019 19:33:01 +0000 Received: from p548c8dbd.dip0.t-ipconnect.de ([84.140.141.189] helo=bertha.fritz.box) by ds12 with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1hOomc-0003Hu-2v; Thu, 09 May 2019 21:32:46 +0200 From: John Crispin To: Jouni Malinen Subject: [PATCH V3 4/8] HE: add helpers for getting the channel width parameters Date: Thu, 9 May 2019 21:32:32 +0200 Message-Id: <20190509193236.702-5-john@phrozen.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190509193236.702-1-john@phrozen.org> References: <20190509193236.702-1-john@phrozen.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190509_123249_561056_BE089940 X-CRM114-Status: GOOD ( 17.79 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hostap@lists.infradead.org, Shashidhar Lakkavalli , John Crispin MIME-Version: 1.0 Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Signed-off-by: Shashidhar Lakkavalli Signed-off-by: John Crispin --- src/ap/acs.c | 19 +++--- src/ap/ap_drv_ops.c | 18 +++--- src/ap/ap_drv_ops.h | 58 ++++++++++++++++++- src/ap/beacon.c | 8 +-- src/ap/dfs.c | 124 +++++++++++++++++++--------------------- src/ap/drv_callbacks.c | 31 +++++----- src/ap/hostapd.c | 67 +++++++++++----------- src/ap/hw_features.c | 7 +-- src/ap/neighbor_db.c | 17 +++--- src/common/hw_features_common.c | 8 +-- src/common/hw_features_common.h | 2 +- 11 files changed, 203 insertions(+), 156 deletions(-) diff --git a/src/ap/acs.c b/src/ap/acs.c index 3682dcd94..4414ad6a3 100644 --- a/src/ap/acs.c +++ b/src/ap/acs.c @@ -595,7 +595,7 @@ acs_find_ideal_chan(struct hostapd_iface *iface) n_chans = 2; if (iface->conf->ieee80211ac) { - switch (iface->conf->vht_oper_chwidth) { + switch (hostapd_get_oper_chwidth(iface->conf)) { case CHANWIDTH_80MHZ: n_chans = 4; break; @@ -607,7 +607,7 @@ acs_find_ideal_chan(struct hostapd_iface *iface) bw = num_chan_to_bw(n_chans); - /* TODO: VHT80+80. Update acs_adjust_vht_center_freq() too. */ + /* TODO: VHT80+80. Update acs_adjust_center_freq() too. */ wpa_printf(MSG_DEBUG, "ACS: Survey analysis for selected bandwidth %d MHz", bw); @@ -648,7 +648,7 @@ acs_find_ideal_chan(struct hostapd_iface *iface) if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A && iface->conf->ieee80211ac) { - if (iface->conf->vht_oper_chwidth == + if (hostapd_get_oper_chwidth(iface->conf) == CHANWIDTH_80MHZ && !acs_usable_vht80_chan(chan)) { wpa_printf(MSG_DEBUG, @@ -657,7 +657,7 @@ acs_find_ideal_chan(struct hostapd_iface *iface) continue; } - if (iface->conf->vht_oper_chwidth == + if (hostapd_get_oper_chwidth(iface->conf) == CHANWIDTH_160MHZ && !acs_usable_vht160_chan(chan)) { wpa_printf(MSG_DEBUG, @@ -783,13 +783,13 @@ acs_find_ideal_chan(struct hostapd_iface *iface) } -static void acs_adjust_vht_center_freq(struct hostapd_iface *iface) +static void acs_adjust_center_freq(struct hostapd_iface *iface) { int offset; wpa_printf(MSG_DEBUG, "ACS: Adjusting VHT center frequency"); - switch (iface->conf->vht_oper_chwidth) { + switch (hostapd_get_oper_chwidth(iface->conf)) { case CHANWIDTH_USE_HT: offset = 2 * iface->conf->secondary_channel; break; @@ -807,8 +807,7 @@ static void acs_adjust_vht_center_freq(struct hostapd_iface *iface) return; } - iface->conf->vht_oper_centr_freq_seg0_idx = - iface->conf->channel + offset; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, iface->conf->channel + offset); } @@ -863,8 +862,8 @@ static void acs_study(struct hostapd_iface *iface) iface->conf->channel = ideal_chan->chan; - if (iface->conf->ieee80211ac) - acs_adjust_vht_center_freq(iface); + if (iface->conf->ieee80211ac || iface->conf->ieee80211ax) + acs_adjust_center_freq(iface); err = 0; fail: diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index c7f5be867..7a8d160d8 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -543,14 +543,14 @@ int hostapd_flush(struct hostapd_data *hapd) int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, - int sec_channel_offset, int vht_oper_chwidth, + int sec_channel_offset, int oper_chwidth, int center_segment0, int center_segment1) { struct hostapd_freq_params data; if (hostapd_set_freq_params(&data, mode, freq, channel, ht_enabled, vht_enabled, sec_channel_offset, - vht_oper_chwidth, + oper_chwidth, center_segment0, center_segment1, hapd->iface->current_mode ? hapd->iface->current_mode->vht_capab : 0)) @@ -781,7 +781,7 @@ int hostapd_drv_send_action_addr3_ap(struct hostapd_data *hapd, int hostapd_start_dfs_cac(struct hostapd_iface *iface, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, - int sec_channel_offset, int vht_oper_chwidth, + int sec_channel_offset, int oper_chwidth, int center_segment0, int center_segment1) { struct hostapd_data *hapd = iface->bss[0]; @@ -799,7 +799,7 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface, if (hostapd_set_freq_params(&data, mode, freq, channel, ht_enabled, vht_enabled, sec_channel_offset, - vht_oper_chwidth, center_segment0, + oper_chwidth, center_segment0, center_segment1, iface->current_mode->vht_capab)) { wpa_printf(MSG_ERROR, "Can't set freq params"); @@ -925,14 +925,16 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd) if (hapd->iface->conf->ieee80211n && params.ht40_enabled) params.ch_width = 40; - /* Note: VHT20 is defined by combination of ht_capab & vht_oper_chwidth + /* Note: VHT20 is defined by combination of ht_capab & oper_chwidth */ if (hapd->iface->conf->ieee80211ac && params.ht40_enabled) { - if (hapd->iface->conf->vht_oper_chwidth == CHANWIDTH_80MHZ) + u8 oper_chwidth = hostapd_get_oper_chwidth(hapd->iface->conf); + + if (oper_chwidth == CHANWIDTH_80MHZ) params.ch_width = 80; - else if (hapd->iface->conf->vht_oper_chwidth == + else if (oper_chwidth == CHANWIDTH_160MHZ || - hapd->iface->conf->vht_oper_chwidth == + oper_chwidth == CHANWIDTH_80P80MHZ) params.ch_width = 160; } diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h index db9653868..33cfbc721 100644 --- a/src/ap/ap_drv_ops.h +++ b/src/ap/ap_drv_ops.h @@ -65,7 +65,7 @@ int hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd, int hostapd_flush(struct hostapd_data *hapd); int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, - int sec_channel_offset, int vht_oper_chwidth, + int sec_channel_offset, int oper_chwidth, int center_segment0, int center_segment1); int hostapd_set_rts(struct hostapd_data *hapd, int rts); int hostapd_set_frag(struct hostapd_data *hapd, int frag); @@ -126,7 +126,7 @@ int hostapd_add_tspec(struct hostapd_data *hapd, const u8 *addr, int hostapd_start_dfs_cac(struct hostapd_iface *iface, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, - int sec_channel_offset, int vht_oper_chwidth, + int sec_channel_offset, int oper_chwidth, int center_segment0, int center_segment1); int hostapd_drv_do_acs(struct hostapd_data *hapd); @@ -378,4 +378,58 @@ hostapd_drv_send_external_auth_status(struct hostapd_data *hapd, return hapd->driver->send_external_auth_status(hapd->drv_priv, params); } +static inline u8 hostapd_get_oper_chwidth(struct hostapd_config *conf) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + return conf->he_oper_chwidth; +#endif + return conf->vht_oper_chwidth; +} + +static inline void hostapd_set_oper_chwidth(struct hostapd_config *conf, u8 oper_chwidth) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + conf->he_oper_chwidth = oper_chwidth; +#endif + conf->vht_oper_chwidth = oper_chwidth; +} + +static inline u8 hostapd_get_oper_centr_freq_seg0_idx(struct hostapd_config *conf) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + return conf->he_oper_centr_freq_seg0_idx; +#endif + return conf->vht_oper_centr_freq_seg0_idx; +} + +static inline void hostapd_set_oper_centr_freq_seg0_idx(struct hostapd_config *conf, u8 oper_centr_freq_seg0_idx) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + conf->he_oper_centr_freq_seg0_idx = oper_centr_freq_seg0_idx; +#endif + conf->vht_oper_centr_freq_seg0_idx = oper_centr_freq_seg0_idx; +} + +static inline u8 hostapd_get_oper_centr_freq_seg1_idx(struct hostapd_config *conf) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + return conf->he_oper_centr_freq_seg1_idx; +#endif + return conf->vht_oper_centr_freq_seg1_idx; +} + +static inline void hostapd_set_oper_centr_freq_seg1_idx(struct hostapd_config *conf, u8 oper_centr_freq_seg1_idx) +{ +#ifdef CONFIG_IEEE80211AX + if (conf->ieee80211ax) + conf->he_oper_centr_freq_seg1_idx = oper_centr_freq_seg1_idx; +#endif + conf->vht_oper_centr_freq_seg1_idx = oper_centr_freq_seg1_idx; +} + #endif /* AP_DRV_OPS */ diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 8433fc3a9..ef5bce36c 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -347,7 +347,7 @@ static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid) if (ieee80211_freq_to_channel_ext(hapd->iface->freq, hapd->iconf->secondary_channel, - hapd->iconf->vht_oper_chwidth, + hostapd_get_oper_chwidth(hapd->iconf), &op_class, &channel) == NUM_HOSTAPD_MODES) return eid; @@ -1426,9 +1426,9 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd) iconf->channel, iconf->ieee80211n, iconf->ieee80211ac, iconf->secondary_channel, - iconf->vht_oper_chwidth, - iconf->vht_oper_centr_freq_seg0_idx, - iconf->vht_oper_centr_freq_seg1_idx, + hostapd_get_oper_chwidth(iconf), + hostapd_get_oper_centr_freq_seg0_idx(iconf), + hostapd_get_oper_centr_freq_seg1_idx(iconf), iface->current_mode->vht_capab) == 0) params.freq = &freq; diff --git a/src/ap/dfs.c b/src/ap/dfs.c index 97c5acfed..5e1cbb980 100644 --- a/src/ap/dfs.c +++ b/src/ap/dfs.c @@ -29,7 +29,7 @@ static int dfs_get_used_n_chans(struct hostapd_iface *iface, int *seg1) n_chans = 2; if (iface->conf->ieee80211ac) { - switch (iface->conf->vht_oper_chwidth) { + switch (hostapd_get_oper_chwidth(iface->conf)) { case CHANWIDTH_USE_HT: break; case CHANWIDTH_80MHZ: @@ -188,8 +188,8 @@ static int is_in_chanlist(struct hostapd_iface *iface, * The function assumes HT40+ operation. * Make sure to adjust the following variables after calling this: * - hapd->secondary_channel - * - hapd->vht_oper_centr_freq_seg0_idx - * - hapd->vht_oper_centr_freq_seg1_idx + * - hapd->vht/he_oper_centr_freq_seg0_idx + * - hapd->vht/he_oper_centr_freq_seg1_idx */ static int dfs_find_channel(struct hostapd_iface *iface, struct hostapd_channel_data **ret_chan, @@ -232,11 +232,11 @@ static int dfs_find_channel(struct hostapd_iface *iface, } -static void dfs_adjust_vht_center_freq(struct hostapd_iface *iface, - struct hostapd_channel_data *chan, - int secondary_channel, - u8 *vht_oper_centr_freq_seg0_idx, - u8 *vht_oper_centr_freq_seg1_idx) +static void dfs_adjust_center_freq(struct hostapd_iface *iface, + struct hostapd_channel_data *chan, + int secondary_channel, + u8 *oper_centr_freq_seg0_idx, + u8 *oper_centr_freq_seg1_idx) { if (!iface->conf->ieee80211ac) return; @@ -244,32 +244,32 @@ static void dfs_adjust_vht_center_freq(struct hostapd_iface *iface, if (!chan) return; - *vht_oper_centr_freq_seg1_idx = 0; + *oper_centr_freq_seg1_idx = 0; - switch (iface->conf->vht_oper_chwidth) { + switch (hostapd_get_oper_chwidth(iface->conf)) { case CHANWIDTH_USE_HT: if (secondary_channel == 1) - *vht_oper_centr_freq_seg0_idx = chan->chan + 2; + *oper_centr_freq_seg0_idx = chan->chan + 2; else if (secondary_channel == -1) - *vht_oper_centr_freq_seg0_idx = chan->chan - 2; + *oper_centr_freq_seg0_idx = chan->chan - 2; else - *vht_oper_centr_freq_seg0_idx = chan->chan; + *oper_centr_freq_seg0_idx = chan->chan; break; case CHANWIDTH_80MHZ: - *vht_oper_centr_freq_seg0_idx = chan->chan + 6; + *oper_centr_freq_seg0_idx = chan->chan + 6; break; case CHANWIDTH_160MHZ: - *vht_oper_centr_freq_seg0_idx = chan->chan + 14; + *oper_centr_freq_seg0_idx = chan->chan + 14; break; default: wpa_printf(MSG_INFO, "DFS only VHT20/40/80/160 is supported now"); - *vht_oper_centr_freq_seg0_idx = 0; + *oper_centr_freq_seg0_idx = 0; break; } wpa_printf(MSG_DEBUG, "DFS adjusting VHT center frequency: %d, %d", - *vht_oper_centr_freq_seg0_idx, - *vht_oper_centr_freq_seg1_idx); + *oper_centr_freq_seg0_idx, + *oper_centr_freq_seg1_idx); } @@ -290,22 +290,22 @@ static int dfs_get_start_chan_idx(struct hostapd_iface *iface, int *seg1_start) /* VHT */ if (iface->conf->ieee80211ac) { - switch (iface->conf->vht_oper_chwidth) { + switch (hostapd_get_oper_chwidth(iface->conf)) { case CHANWIDTH_USE_HT: break; case CHANWIDTH_80MHZ: channel_no = - iface->conf->vht_oper_centr_freq_seg0_idx - 6; + hostapd_get_oper_centr_freq_seg0_idx(iface->conf) - 6; break; case CHANWIDTH_160MHZ: channel_no = - iface->conf->vht_oper_centr_freq_seg0_idx - 14; + hostapd_get_oper_centr_freq_seg0_idx(iface->conf) - 14; break; case CHANWIDTH_80P80MHZ: channel_no = - iface->conf->vht_oper_centr_freq_seg0_idx - 6; + hostapd_get_oper_centr_freq_seg0_idx(iface->conf) - 6; chan_seg1 = - iface->conf->vht_oper_centr_freq_seg1_idx - 6; + hostapd_get_oper_centr_freq_seg1_idx(iface->conf) - 6; break; default: wpa_printf(MSG_INFO, @@ -348,7 +348,7 @@ static int dfs_get_start_chan_idx(struct hostapd_iface *iface, int *seg1_start) mode->num_channels, channel_no, iface->conf->channel, iface->conf->ieee80211n, iface->conf->secondary_channel, - iface->conf->vht_oper_chwidth); + hostapd_get_oper_chwidth(iface->conf)); for (i = 0; i < mode->num_channels; i++) { wpa_printf(MSG_DEBUG, "Available channel: %d", @@ -435,8 +435,8 @@ static int dfs_check_chans_unavailable(struct hostapd_iface *iface, static struct hostapd_channel_data * dfs_get_valid_channel(struct hostapd_iface *iface, int *secondary_channel, - u8 *vht_oper_centr_freq_seg0_idx, - u8 *vht_oper_centr_freq_seg1_idx, + u8 *oper_centr_freq_seg0_idx, + u8 *oper_centr_freq_seg1_idx, int skip_radar) { struct hostapd_hw_modes *mode; @@ -447,8 +447,8 @@ dfs_get_valid_channel(struct hostapd_iface *iface, wpa_printf(MSG_DEBUG, "DFS: Selecting random channel"); *secondary_channel = 0; - *vht_oper_centr_freq_seg0_idx = 0; - *vht_oper_centr_freq_seg1_idx = 0; + *oper_centr_freq_seg0_idx = 0; + *oper_centr_freq_seg1_idx = 0; if (iface->current_mode == NULL) return NULL; @@ -473,10 +473,10 @@ dfs_get_valid_channel(struct hostapd_iface *iface, else *secondary_channel = 0; - dfs_adjust_vht_center_freq(iface, chan, - *secondary_channel, - vht_oper_centr_freq_seg0_idx, - vht_oper_centr_freq_seg1_idx); + dfs_adjust_center_freq(iface, chan, + *secondary_channel, + oper_centr_freq_seg0_idx, + oper_centr_freq_seg1_idx); return chan; } @@ -724,8 +724,8 @@ int hostapd_handle_dfs(struct hostapd_iface *iface) iface->freq = channel->freq; iface->conf->channel = channel->chan; iface->conf->secondary_channel = sec; - iface->conf->vht_oper_centr_freq_seg0_idx = cf1; - iface->conf->vht_oper_centr_freq_seg1_idx = cf2; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, cf1); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, cf2); } } while (res); @@ -736,9 +736,9 @@ int hostapd_handle_dfs(struct hostapd_iface *iface) "freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds", iface->freq, iface->conf->channel, iface->conf->secondary_channel, - iface->conf->vht_oper_chwidth, - iface->conf->vht_oper_centr_freq_seg0_idx, - iface->conf->vht_oper_centr_freq_seg1_idx, + hostapd_get_oper_chwidth(iface->conf), + hostapd_get_oper_centr_freq_seg0_idx(iface->conf), + hostapd_get_oper_centr_freq_seg1_idx(iface->conf), iface->dfs_cac_ms / 1000); res = hostapd_start_dfs_cac(iface, iface->conf->hw_mode, @@ -747,9 +747,9 @@ int hostapd_handle_dfs(struct hostapd_iface *iface) iface->conf->ieee80211n, iface->conf->ieee80211ac, iface->conf->secondary_channel, - iface->conf->vht_oper_chwidth, - iface->conf->vht_oper_centr_freq_seg0_idx, - iface->conf->vht_oper_centr_freq_seg1_idx); + hostapd_get_oper_chwidth(iface->conf), + hostapd_get_oper_centr_freq_seg0_idx(iface->conf), + hostapd_get_oper_centr_freq_seg1_idx(iface->conf)); if (res) { wpa_printf(MSG_ERROR, "DFS start_dfs_cac() failed, %d", res); @@ -842,16 +842,16 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface) { struct hostapd_channel_data *channel; int secondary_channel; - u8 vht_oper_centr_freq_seg0_idx = 0; - u8 vht_oper_centr_freq_seg1_idx = 0; + u8 oper_centr_freq_seg0_idx = 0; + u8 oper_centr_freq_seg1_idx = 0; int skip_radar = 0; int err = 1; /* Radar detected during active CAC */ iface->cac_started = 0; channel = dfs_get_valid_channel(iface, &secondary_channel, - &vht_oper_centr_freq_seg0_idx, - &vht_oper_centr_freq_seg1_idx, + &oper_centr_freq_seg0_idx, + &oper_centr_freq_seg1_idx, skip_radar); if (!channel) { @@ -868,10 +868,8 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface) iface->freq = channel->freq; iface->conf->channel = channel->chan; iface->conf->secondary_channel = secondary_channel; - iface->conf->vht_oper_centr_freq_seg0_idx = - vht_oper_centr_freq_seg0_idx; - iface->conf->vht_oper_centr_freq_seg1_idx = - vht_oper_centr_freq_seg1_idx; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, oper_centr_freq_seg0_idx); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, oper_centr_freq_seg1_idx); err = 0; hostapd_setup_interface_complete(iface, err); @@ -883,8 +881,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) { struct hostapd_channel_data *channel; int secondary_channel; - u8 vht_oper_centr_freq_seg0_idx; - u8 vht_oper_centr_freq_seg1_idx; + u8 oper_centr_freq_seg0_idx; + u8 oper_centr_freq_seg1_idx; int skip_radar = 1; struct csa_settings csa_settings; unsigned int i; @@ -911,8 +909,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) /* Perform channel switch/CSA */ channel = dfs_get_valid_channel(iface, &secondary_channel, - &vht_oper_centr_freq_seg0_idx, - &vht_oper_centr_freq_seg1_idx, + &oper_centr_freq_seg0_idx, + &oper_centr_freq_seg1_idx, skip_radar); if (!channel) { @@ -923,8 +921,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) */ skip_radar = 0; channel = dfs_get_valid_channel(iface, &secondary_channel, - &vht_oper_centr_freq_seg0_idx, - &vht_oper_centr_freq_seg1_idx, + &oper_centr_freq_seg0_idx, + &oper_centr_freq_seg1_idx, skip_radar); if (!channel) { wpa_printf(MSG_INFO, @@ -936,10 +934,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) iface->freq = channel->freq; iface->conf->channel = channel->chan; iface->conf->secondary_channel = secondary_channel; - iface->conf->vht_oper_centr_freq_seg0_idx = - vht_oper_centr_freq_seg0_idx; - iface->conf->vht_oper_centr_freq_seg1_idx = - vht_oper_centr_freq_seg1_idx; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, oper_centr_freq_seg0_idx); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, oper_centr_freq_seg1_idx); hostapd_disable_iface(iface); hostapd_enable_iface(iface); @@ -963,9 +959,9 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) iface->conf->ieee80211n, iface->conf->ieee80211ac, secondary_channel, - iface->conf->vht_oper_chwidth, - vht_oper_centr_freq_seg0_idx, - vht_oper_centr_freq_seg1_idx, + hostapd_get_oper_chwidth(iface->conf), + oper_centr_freq_seg0_idx, + oper_centr_freq_seg1_idx, iface->current_mode->vht_capab); if (err) { @@ -986,10 +982,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface) iface->freq = channel->freq; iface->conf->channel = channel->chan; iface->conf->secondary_channel = secondary_channel; - iface->conf->vht_oper_centr_freq_seg0_idx = - vht_oper_centr_freq_seg0_idx; - iface->conf->vht_oper_centr_freq_seg1_idx = - vht_oper_centr_freq_seg1_idx; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, oper_centr_freq_seg0_idx); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, oper_centr_freq_seg1_idx); hostapd_disable_iface(iface); hostapd_enable_iface(iface); diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 4ac80ab80..f53750a88 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -846,9 +846,9 @@ void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht, hapd->iconf->ch_switch_vht_config = 0; hapd->iconf->secondary_channel = offset; - hapd->iconf->vht_oper_chwidth = chwidth; - hapd->iconf->vht_oper_centr_freq_seg0_idx = seg0_idx; - hapd->iconf->vht_oper_centr_freq_seg1_idx = seg1_idx; + hostapd_set_oper_chwidth(hapd->iconf, chwidth); + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, seg0_idx); + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, seg1_idx); is_dfs = ieee80211_is_dfs(freq, hapd->iface->hw_features, hapd->iface->num_hw_features); @@ -955,26 +955,21 @@ void hostapd_acs_channel_selected(struct hostapd_data *hapd, if (hapd->iface->conf->ieee80211ac) { /* set defaults for backwards compatibility */ - hapd->iconf->vht_oper_centr_freq_seg1_idx = 0; - hapd->iconf->vht_oper_centr_freq_seg0_idx = 0; - hapd->iconf->vht_oper_chwidth = CHANWIDTH_USE_HT; + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, 0); + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, 0); + hostapd_set_oper_chwidth(hapd->iconf, CHANWIDTH_USE_HT); if (acs_res->ch_width == 80) { - hapd->iconf->vht_oper_centr_freq_seg0_idx = - acs_res->vht_seg0_center_ch; - hapd->iconf->vht_oper_chwidth = CHANWIDTH_80MHZ; + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, acs_res->vht_seg0_center_ch); + hostapd_set_oper_chwidth(hapd->iconf, CHANWIDTH_80MHZ); } else if (acs_res->ch_width == 160) { if (acs_res->vht_seg1_center_ch == 0) { - hapd->iconf->vht_oper_centr_freq_seg0_idx = - acs_res->vht_seg0_center_ch; - hapd->iconf->vht_oper_chwidth = + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, acs_res->vht_seg0_center_ch); + hostapd_set_oper_chwidth(hapd->iconf, CHANWIDTH_160MHZ); CHANWIDTH_160MHZ; } else { - hapd->iconf->vht_oper_centr_freq_seg0_idx = - acs_res->vht_seg0_center_ch; - hapd->iconf->vht_oper_centr_freq_seg1_idx = - acs_res->vht_seg1_center_ch; - hapd->iconf->vht_oper_chwidth = - CHANWIDTH_80P80MHZ; + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, acs_res->vht_seg0_center_ch); + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, acs_res->vht_seg1_center_ch); + hostapd_set_oper_chwidth(hapd->iconf, CHANWIDTH_80P80MHZ); } } } diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index af161cad2..1c21ca9ff 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -260,11 +260,9 @@ int hostapd_reload_config(struct hostapd_iface *iface) hapd->iconf->ieee80211ac = oldconf->ieee80211ac; hapd->iconf->ht_capab = oldconf->ht_capab; hapd->iconf->vht_capab = oldconf->vht_capab; - hapd->iconf->vht_oper_chwidth = oldconf->vht_oper_chwidth; - hapd->iconf->vht_oper_centr_freq_seg0_idx = - oldconf->vht_oper_centr_freq_seg0_idx; - hapd->iconf->vht_oper_centr_freq_seg1_idx = - oldconf->vht_oper_centr_freq_seg1_idx; + hostapd_set_oper_chwidth(hapd->iconf, hostapd_get_oper_chwidth(oldconf)); + hostapd_set_oper_centr_freq_seg0_idx(hapd->iconf, hostapd_get_oper_centr_freq_seg0_idx(oldconf)); + hostapd_set_oper_centr_freq_seg1_idx(hapd->iconf, hostapd_get_oper_centr_freq_seg1_idx(oldconf)); hapd->conf = newconf->bss[j]; hostapd_reload_bss(hapd); } @@ -1864,9 +1862,9 @@ static int hostapd_setup_interface_complete_sync(struct hostapd_iface *iface, hapd->iconf->ieee80211n, hapd->iconf->ieee80211ac, hapd->iconf->secondary_channel, - hapd->iconf->vht_oper_chwidth, - hapd->iconf->vht_oper_centr_freq_seg0_idx, - hapd->iconf->vht_oper_centr_freq_seg1_idx)) { + hostapd_get_oper_chwidth(hapd->iconf), + hostapd_get_oper_centr_freq_seg0_idx(hapd->iconf), + hostapd_get_oper_centr_freq_seg1_idx(hapd->iconf))) { wpa_printf(MSG_ERROR, "Could not set channel for " "kernel driver"); goto fail; @@ -3191,6 +3189,7 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd, struct hostapd_freq_params *old_params) { int channel; + u8 seg0, seg1; if (!params->channel) { /* check if the new channel is supported by hw */ @@ -3208,9 +3207,9 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd, conf->channel, conf->ieee80211n, conf->ieee80211ac, conf->secondary_channel, - conf->vht_oper_chwidth, - conf->vht_oper_centr_freq_seg0_idx, - conf->vht_oper_centr_freq_seg1_idx, + hostapd_get_oper_chwidth(conf), + hostapd_get_oper_centr_freq_seg0_idx(conf), + hostapd_get_oper_centr_freq_seg1_idx(conf), conf->vht_capab)) return -1; @@ -3218,16 +3217,16 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd, case 0: case 20: case 40: - conf->vht_oper_chwidth = CHANWIDTH_USE_HT; + hostapd_set_oper_chwidth(conf, CHANWIDTH_USE_HT); break; case 80: if (params->center_freq2) - conf->vht_oper_chwidth = CHANWIDTH_80P80MHZ; + hostapd_set_oper_chwidth(conf, CHANWIDTH_80P80MHZ); else - conf->vht_oper_chwidth = CHANWIDTH_80MHZ; + hostapd_set_oper_chwidth(conf, CHANWIDTH_80MHZ); break; case 160: - conf->vht_oper_chwidth = CHANWIDTH_160MHZ; + hostapd_set_oper_chwidth(conf, CHANWIDTH_160MHZ); break; default: return -1; @@ -3237,9 +3236,11 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd, conf->ieee80211n = params->ht_enabled; conf->secondary_channel = params->sec_channel_offset; ieee80211_freq_to_chan(params->center_freq1, - &conf->vht_oper_centr_freq_seg0_idx); + &seg0); ieee80211_freq_to_chan(params->center_freq2, - &conf->vht_oper_centr_freq_seg1_idx); + &seg1); + hostapd_set_oper_centr_freq_seg0_idx(conf, seg0); + hostapd_set_oper_centr_freq_seg1_idx(conf, seg1); /* TODO: maybe call here hostapd_config_check here? */ @@ -3253,7 +3254,7 @@ static int hostapd_fill_csa_settings(struct hostapd_data *hapd, struct hostapd_iface *iface = hapd->iface; struct hostapd_freq_params old_freq; int ret; - u8 chan, vht_bandwidth; + u8 chan, bandwidth; os_memset(&old_freq, 0, sizeof(old_freq)); if (!iface || !iface->freq || hapd->csa_in_progress) @@ -3262,22 +3263,22 @@ static int hostapd_fill_csa_settings(struct hostapd_data *hapd, switch (settings->freq_params.bandwidth) { case 80: if (settings->freq_params.center_freq2) - vht_bandwidth = CHANWIDTH_80P80MHZ; + bandwidth = CHANWIDTH_80P80MHZ; else - vht_bandwidth = CHANWIDTH_80MHZ; + bandwidth = CHANWIDTH_80MHZ; break; case 160: - vht_bandwidth = CHANWIDTH_160MHZ; + bandwidth = CHANWIDTH_160MHZ; break; default: - vht_bandwidth = CHANWIDTH_USE_HT; + bandwidth = CHANWIDTH_USE_HT; break; } if (ieee80211_freq_to_channel_ext( settings->freq_params.freq, settings->freq_params.sec_channel_offset, - vht_bandwidth, + bandwidth, &hapd->iface->cs_oper_class, &chan) == NUM_HOSTAPD_MODES) { wpa_printf(MSG_DEBUG, @@ -3384,29 +3385,29 @@ void hostapd_switch_channel_fallback(struct hostapd_iface *iface, const struct hostapd_freq_params *freq_params) { - int vht_seg0_idx = 0, vht_seg1_idx = 0, vht_bw = CHANWIDTH_USE_HT; + int seg0_idx = 0, seg1_idx = 0, bw = CHANWIDTH_USE_HT; wpa_printf(MSG_DEBUG, "Restarting all CSA-related BSSes"); if (freq_params->center_freq1) - vht_seg0_idx = 36 + (freq_params->center_freq1 - 5180) / 5; + seg0_idx = 36 + (freq_params->center_freq1 - 5180) / 5; if (freq_params->center_freq2) - vht_seg1_idx = 36 + (freq_params->center_freq2 - 5180) / 5; + seg1_idx = 36 + (freq_params->center_freq2 - 5180) / 5; switch (freq_params->bandwidth) { case 0: case 20: case 40: - vht_bw = CHANWIDTH_USE_HT; + bw = CHANWIDTH_USE_HT; break; case 80: if (freq_params->center_freq2) - vht_bw = CHANWIDTH_80P80MHZ; + bw = CHANWIDTH_80P80MHZ; else - vht_bw = CHANWIDTH_80MHZ; + bw = CHANWIDTH_80MHZ; break; case 160: - vht_bw = CHANWIDTH_160MHZ; + bw = CHANWIDTH_160MHZ; break; default: wpa_printf(MSG_WARNING, "Unknown CSA bandwidth: %d", @@ -3417,9 +3418,9 @@ hostapd_switch_channel_fallback(struct hostapd_iface *iface, iface->freq = freq_params->freq; iface->conf->channel = freq_params->channel; iface->conf->secondary_channel = freq_params->sec_channel_offset; - iface->conf->vht_oper_centr_freq_seg0_idx = vht_seg0_idx; - iface->conf->vht_oper_centr_freq_seg1_idx = vht_seg1_idx; - iface->conf->vht_oper_chwidth = vht_bw; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, seg0_idx); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, seg1_idx); + hostapd_set_oper_chwidth(iface->conf, bw); iface->conf->ieee80211n = freq_params->ht_enabled; iface->conf->ieee80211ac = freq_params->vht_enabled; diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index e1734627c..015f29808 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -328,10 +328,9 @@ static void ieee80211n_check_scan(struct hostapd_iface *iface) res = ieee80211n_allowed_ht40_channel_pair(iface); if (!res) { - iface->conf->secondary_channel = 0; - iface->conf->vht_oper_centr_freq_seg0_idx = 0; - iface->conf->vht_oper_centr_freq_seg1_idx = 0; - iface->conf->vht_oper_chwidth = CHANWIDTH_USE_HT; + hostapd_set_oper_centr_freq_seg0_idx(iface->conf, 0); + hostapd_set_oper_centr_freq_seg1_idx(iface->conf, 0); + hostapd_set_oper_chwidth(iface->conf, CHANWIDTH_USE_HT); res = 1; wpa_printf(MSG_INFO, "Fallback to 20 MHz"); } diff --git a/src/ap/neighbor_db.c b/src/ap/neighbor_db.c index 37ec78322..82aa99e87 100644 --- a/src/ap/neighbor_db.c +++ b/src/ap/neighbor_db.c @@ -13,6 +13,7 @@ #include "hostapd.h" #include "ieee802_11.h" #include "neighbor_db.h" +#include "ap_drv_ops.h" struct hostapd_neighbor_entry * @@ -141,17 +142,19 @@ void hostapd_free_neighbor_db(struct hostapd_data *hapd) static enum nr_chan_width hostapd_get_nr_chan_width(struct hostapd_data *hapd, int ht, int vht) { + u8 oper_chwidth = hostapd_get_oper_chwidth(hapd->iconf); + if (!ht && !vht) return NR_CHAN_WIDTH_20; if (!hapd->iconf->secondary_channel) return NR_CHAN_WIDTH_20; - if (!vht || hapd->iconf->vht_oper_chwidth == CHANWIDTH_USE_HT) + if (!vht || oper_chwidth == CHANWIDTH_USE_HT) return NR_CHAN_WIDTH_40; - if (hapd->iconf->vht_oper_chwidth == CHANWIDTH_80MHZ) + if (oper_chwidth == CHANWIDTH_80MHZ) return NR_CHAN_WIDTH_80; - if (hapd->iconf->vht_oper_chwidth == CHANWIDTH_160MHZ) + if (oper_chwidth == CHANWIDTH_160MHZ) return NR_CHAN_WIDTH_160; - if (hapd->iconf->vht_oper_chwidth == CHANWIDTH_80P80MHZ) + if (oper_chwidth == CHANWIDTH_80P80MHZ) return NR_CHAN_WIDTH_80P80; return NR_CHAN_WIDTH_20; } @@ -205,16 +208,16 @@ void hostapd_neighbor_set_own_report(struct hostapd_data *hapd) if (ieee80211_freq_to_channel_ext(hapd->iface->freq, hapd->iconf->secondary_channel, - hapd->iconf->vht_oper_chwidth, + hostapd_get_oper_chwidth(hapd->iconf), &op_class, &channel) == NUM_HOSTAPD_MODES) return; width = hostapd_get_nr_chan_width(hapd, ht, vht); if (vht) { - center_freq1_idx = hapd->iconf->vht_oper_centr_freq_seg0_idx; + center_freq1_idx = hostapd_get_oper_centr_freq_seg0_idx(hapd->iconf); if (width == NR_CHAN_WIDTH_80P80) center_freq2_idx = - hapd->iconf->vht_oper_centr_freq_seg1_idx; + hostapd_get_oper_centr_freq_seg1_idx(hapd->iconf); } else if (ht) { ieee80211_freq_to_chan(hapd->iface->freq + 10 * hapd->iconf->secondary_channel, diff --git a/src/common/hw_features_common.c b/src/common/hw_features_common.c index 1df62962b..aa430f2e2 100644 --- a/src/common/hw_features_common.c +++ b/src/common/hw_features_common.c @@ -362,7 +362,7 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, int sec_channel_offset, - int vht_oper_chwidth, int center_segment0, + int oper_chwidth, int center_segment0, int center_segment1, u32 vht_caps) { os_memset(data, 0, sizeof(*data)); @@ -376,7 +376,7 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data, data->center_freq2 = 0; data->bandwidth = sec_channel_offset ? 40 : 20; - if (data->vht_enabled) switch (vht_oper_chwidth) { + if (data->vht_enabled) switch (oper_chwidth) { case CHANWIDTH_USE_HT: if (center_segment1 || (center_segment0 != 0 && @@ -397,9 +397,9 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data, /* fall through */ case CHANWIDTH_80MHZ: data->bandwidth = 80; - if ((vht_oper_chwidth == CHANWIDTH_80MHZ && + if ((oper_chwidth == CHANWIDTH_80MHZ && center_segment1) || - (vht_oper_chwidth == CHANWIDTH_80P80MHZ && + (oper_chwidth == CHANWIDTH_80P80MHZ && !center_segment1) || !sec_channel_offset) return -1; diff --git a/src/common/hw_features_common.h b/src/common/hw_features_common.h index eb1f1c57f..d3efe77f2 100644 --- a/src/common/hw_features_common.h +++ b/src/common/hw_features_common.h @@ -33,7 +33,7 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data, enum hostapd_hw_mode mode, int freq, int channel, int ht_enabled, int vht_enabled, int sec_channel_offset, - int vht_oper_chwidth, int center_segment0, + int oper_chwidth, int center_segment0, int center_segment1, u32 vht_caps); void set_disable_ht40(struct ieee80211_ht_capabilities *htcaps, int disabled);