All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/9] introduce background radar detection support
@ 2021-12-20 15:48 Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git Lorenzo Bianconi
                   ` (9 more replies)
  0 siblings, 10 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Introduce background radar/CAC detection through a dedicated off-channel
chain available on some hw (e.g. mt7915).
Background radar/CAC detection allows to avoid the CAC downtime
switching on a different channel during CAC detection on the selected
radar channel.

Lorenzo Bianconi (9):
  Sync include/uapi/linux/nl80211.h with mac80211-next.git
  DFS: introduce dfs_set_valid_channel utility routine
  DFS: add capability select radar-only channels
  nl80211: report background radar/cac detection capability
  DFS: configure background radar/cac detection.
  DFS: introduce hostapd_dfs_request_channel_switch routine
  DFS: enable CSA for background radar detection
  DFS: switch to background radar channel if available
  DFS: introduce radar_background parameter to config file

 hostapd/config_file.c              |   2 +
 hostapd/hostapd.conf               |   7 +
 src/ap/ap_config.h                 |   1 +
 src/ap/ap_drv_ops.c                |   9 +-
 src/ap/ap_drv_ops.h                |   3 +-
 src/ap/dfs.c                       | 447 +++++++++++++++++++++--------
 src/ap/hostapd.h                   |  15 +
 src/drivers/driver.h               |   7 +
 src/drivers/driver_nl80211.c       |   5 +
 src/drivers/driver_nl80211_capa.c  |   4 +
 src/drivers/driver_nl80211_event.c |   7 +
 src/drivers/nl80211_copy.h         | 228 ++++++++++++++-
 12 files changed, 610 insertions(+), 125 deletions(-)

-- 
2.33.1


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2022-03-03 21:58   ` Jouni Malinen
  2021-12-20 15:48 ` [PATCH 2/9] DFS: introduce dfs_set_valid_channel utility routine Lorenzo Bianconi
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/drivers/driver_nl80211_event.c |   7 +
 src/drivers/nl80211_copy.h         | 228 +++++++++++++++++++++++++++--
 2 files changed, 225 insertions(+), 10 deletions(-)

diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 0f0a01d01..c920ea382 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -172,6 +172,13 @@ static const char * nl80211_command_to_string(enum nl80211_commands cmd)
 	C2S(NL80211_CMD_UNPROT_BEACON)
 	C2S(NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS)
 	C2S(NL80211_CMD_SET_SAR_SPECS)
+	C2S(NL80211_CMD_OBSS_COLOR_COLLISION)
+	C2S(NL80211_CMD_COLOR_CHANGE_REQUEST)
+	C2S(NL80211_CMD_COLOR_CHANGE_STARTED)
+	C2S(NL80211_CMD_COLOR_CHANGE_ABORTED)
+	C2S(NL80211_CMD_COLOR_CHANGE_COMPLETED)
+	C2S(NL80211_CMD_SET_FILS_AAD)
+	C2S(NL80211_CMD_ASSOC_COMEBACK)
 	C2S(__NL80211_CMD_AFTER_LAST)
 	}
 #undef C2S
diff --git a/src/drivers/nl80211_copy.h b/src/drivers/nl80211_copy.h
index f962c06e9..f1a9d6594 100644
--- a/src/drivers/nl80211_copy.h
+++ b/src/drivers/nl80211_copy.h
@@ -11,7 +11,7 @@
  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
  * Copyright 2008 Colin McCabe <colin@cozybit.com>
  * Copyright 2015-2017	Intel Deutschland GmbH
- * Copyright (C) 2018-2020 Intel Corporation
+ * Copyright (C) 2018-2021 Intel Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -300,6 +300,29 @@
  * the interface goes down.
  */
 
+/**
+ * DOC: FILS shared key crypto offload
+ *
+ * This feature is applicable to drivers running in AP mode.
+ *
+ * FILS shared key crypto offload can be advertised by drivers by setting
+ * @NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD flag. The drivers that support
+ * FILS shared key crypto offload should be able to encrypt and decrypt
+ * association frames for FILS shared key authentication as per IEEE 802.11ai.
+ * With this capability, for FILS key derivation, drivers depend on userspace.
+ *
+ * After FILS key derivation, userspace shares the FILS AAD details with the
+ * driver and the driver stores the same to use in decryption of association
+ * request and in encryption of association response. The below parameters
+ * should be given to the driver in %NL80211_CMD_SET_FILS_AAD.
+ *	%NL80211_ATTR_MAC - STA MAC address, used for storing FILS AAD per STA
+ *	%NL80211_ATTR_FILS_KEK - Used for encryption or decryption
+ *	%NL80211_ATTR_FILS_NONCES - Used for encryption or decryption
+ *			(STA Nonce 16 bytes followed by AP Nonce 16 bytes)
+ *
+ * Once the association is done, the driver cleans the FILS AAD data.
+ */
+
 /**
  * enum nl80211_commands - supported nl80211 commands
  *
@@ -337,7 +360,10 @@
  * @NL80211_CMD_DEL_INTERFACE: Virtual interface was deleted, has attributes
  *	%NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from
  *	userspace to request deletion of a virtual interface, then requires
- *	attribute %NL80211_ATTR_IFINDEX.
+ *	attribute %NL80211_ATTR_IFINDEX. If multiple BSSID advertisements are
+ *	enabled using %NL80211_ATTR_MBSSID_CONFIG, %NL80211_ATTR_MBSSID_ELEMS,
+ *	and if this command is used for the transmitting interface, then all
+ *	the non-transmitting interfaces are deleted as well.
  *
  * @NL80211_CMD_GET_KEY: Get sequence counter information for a key specified
  *	by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC.
@@ -1185,6 +1211,32 @@
  *	passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to
  *	specify the wiphy index to be applied to.
  *
+ * @NL80211_CMD_OBSS_COLOR_COLLISION: This notification is sent out whenever
+ *	mac80211/drv detects a bss color collision.
+ *
+ * @NL80211_CMD_COLOR_CHANGE_REQUEST: This command is used to indicate that
+ *	userspace wants to change the BSS color.
+ *
+ * @NL80211_CMD_COLOR_CHANGE_STARTED: Notify userland, that a color change has
+ *	started
+ *
+ * @NL80211_CMD_COLOR_CHANGE_ABORTED: Notify userland, that the color change has
+ *	been aborted
+ *
+ * @NL80211_CMD_COLOR_CHANGE_COMPLETED: Notify userland that the color change
+ *	has completed
+ *
+ * @NL80211_CMD_SET_FILS_AAD: Set FILS AAD data to the driver using -
+ *	&NL80211_ATTR_MAC - for STA MAC address
+ *	&NL80211_ATTR_FILS_KEK - for KEK
+ *	&NL80211_ATTR_FILS_NONCES - for FILS Nonces
+ *		(STA Nonce 16 bytes followed by AP Nonce 16 bytes)
+ *
+ * @NL80211_CMD_ASSOC_COMEBACK: notification about an association
+ *      temporal rejection with comeback. The event includes %NL80211_ATTR_MAC
+ *      to describe the BSSID address of the AP and %NL80211_ATTR_TIMEOUT to
+ *      specify the timeout value.
+ *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
  */
@@ -1417,6 +1469,18 @@ enum nl80211_commands {
 
 	NL80211_CMD_SET_SAR_SPECS,
 
+	NL80211_CMD_OBSS_COLOR_COLLISION,
+
+	NL80211_CMD_COLOR_CHANGE_REQUEST,
+
+	NL80211_CMD_COLOR_CHANGE_STARTED,
+	NL80211_CMD_COLOR_CHANGE_ABORTED,
+	NL80211_CMD_COLOR_CHANGE_COMPLETED,
+
+	NL80211_CMD_SET_FILS_AAD,
+
+	NL80211_CMD_ASSOC_COMEBACK,
+
 	/* add new commands above here */
 
 	/* used to define NL80211_CMD_MAX below */
@@ -2413,7 +2477,9 @@ enum nl80211_commands {
  *	space supports external authentication. This attribute shall be used
  *	with %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP request. The driver
  *	may offload authentication processing to user space if this capability
- *	is indicated in the respective requests from the user space.
+ *	is indicated in the respective requests from the user space. (This flag
+ *	attribute deprecated for %NL80211_CMD_START_AP, use
+ *	%NL80211_ATTR_AP_SETTINGS_FLAGS)
  *
  * @NL80211_ATTR_NSS: Station's New/updated  RX_NSS value notified using this
  *	u8 attribute. This is used with %NL80211_CMD_STA_OPMODE_CHANGED.
@@ -2560,6 +2626,39 @@ enum nl80211_commands {
  *	disassoc events to indicate that an immediate reconnect to the AP
  *	is desired.
  *
+ * @NL80211_ATTR_OBSS_COLOR_BITMAP: bitmap of the u64 BSS colors for the
+ *	%NL80211_CMD_OBSS_COLOR_COLLISION event.
+ *
+ * @NL80211_ATTR_COLOR_CHANGE_COUNT: u8 attribute specifying the number of TBTT's
+ *	until the color switch event.
+ * @NL80211_ATTR_COLOR_CHANGE_COLOR: u8 attribute specifying the color that we are
+ *	switching to
+ * @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE
+ *	information for the time while performing a color switch.
+ *
+ * @NL80211_ATTR_MBSSID_CONFIG: Nested attribute for multiple BSSID
+ *	advertisements (MBSSID) parameters in AP mode.
+ *	Kernel uses this attribute to indicate the driver's support for MBSSID
+ *	and enhanced multi-BSSID advertisements (EMA AP) to the userspace.
+ *	Userspace should use this attribute to configure per interface MBSSID
+ *	parameters.
+ *	See &enum nl80211_mbssid_config_attributes for details.
+ *
+ * @NL80211_ATTR_MBSSID_ELEMS: Nested parameter to pass multiple BSSID elements.
+ *	Mandatory parameter for the transmitting interface to enable MBSSID.
+ *	Optional for the non-transmitting interfaces.
+ *
+ * @NL80211_ATTR_RADAR_BACKGROUND: Configure dedicated offchannel chain
+ *	available for radar/CAC detection on some hw. This chain can't be used
+ *	to transmit or receive frames and it is bounded to a running wdev.
+ *	Background radar/CAC detection allows to avoid the CAC downtime
+ *	switching on a different channel during CAC detection on the selected
+ *	radar channel.
+ *
+ * @NL80211_ATTR_AP_SETTINGS_FLAGS: u32 attribute contains ap settings flags,
+ *	enumerated in &enum nl80211_ap_settings_flags. This attribute shall be
+ *	used with %NL80211_CMD_START_AP request.
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -3057,6 +3156,19 @@ enum nl80211_attrs {
 
 	NL80211_ATTR_DISABLE_HE,
 
+	NL80211_ATTR_OBSS_COLOR_BITMAP,
+
+	NL80211_ATTR_COLOR_CHANGE_COUNT,
+	NL80211_ATTR_COLOR_CHANGE_COLOR,
+	NL80211_ATTR_COLOR_CHANGE_ELEMS,
+
+	NL80211_ATTR_MBSSID_CONFIG,
+	NL80211_ATTR_MBSSID_ELEMS,
+
+	NL80211_ATTR_RADAR_BACKGROUND,
+
+	NL80211_ATTR_AP_SETTINGS_FLAGS,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -3650,11 +3762,12 @@ enum nl80211_mpath_info {
  *     capabilities IE
  * @NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE: HE PPE thresholds information as
  *     defined in HE capabilities IE
- * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
- *     defined
  * @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
  *	given for all 6 GHz band channels
+ * @NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS: vendor element capabilities that are
+ *	advertised on this band/for this iftype (binary)
  * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
+ * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band attribute currently defined
  */
 enum nl80211_band_iftype_attr {
 	__NL80211_BAND_IFTYPE_ATTR_INVALID,
@@ -3665,6 +3778,7 @@ enum nl80211_band_iftype_attr {
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
 	NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
+	NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS,
 
 	/* keep last */
 	__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
@@ -4887,6 +5001,7 @@ enum nl80211_txrate_gi {
  * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 69.12 GHz)
  * @NL80211_BAND_6GHZ: around 6 GHz band (5.9 - 7.2 GHz)
  * @NL80211_BAND_S1GHZ: around 900MHz, supported by S1G PHYs
+ * @NL80211_BAND_LC: light communication band (placeholder)
  * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
  *	since newer kernel versions may support more bands
  */
@@ -4896,6 +5011,7 @@ enum nl80211_band {
 	NL80211_BAND_60GHZ,
 	NL80211_BAND_6GHZ,
 	NL80211_BAND_S1GHZ,
+	NL80211_BAND_LC,
 
 	NUM_NL80211_BANDS,
 };
@@ -5462,7 +5578,7 @@ enum nl80211_iface_limit_attrs {
  *	=> allows 8 of AP/GO that can have BI gcd >= min gcd
  *
  *	numbers = [ #{STA} <= 2 ], channels = 2, max = 2
- *	=> allows two STAs on different channels
+ *	=> allows two STAs on the same or on different channels
  *
  *	numbers = [ #{STA} <= 1, #{P2P-client,P2P-GO} <= 3 ], max = 4
  *	=> allows a STA plus three P2P interfaces
@@ -5644,13 +5760,15 @@ enum nl80211_tdls_operation {
 	NL80211_TDLS_DISABLE_LINK,
 };
 
-/*
+/**
  * enum nl80211_ap_sme_features - device-integrated AP features
- * Reserved for future use, no bits are defined in
- * NL80211_ATTR_DEVICE_AP_SME yet.
+ * @NL80211_AP_SME_SA_QUERY_OFFLOAD: SA Query procedures offloaded to driver
+ *	when user space indicates support for SA Query procedures offload during
+ *	"start ap" with %NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT.
+ */
 enum nl80211_ap_sme_features {
+	NL80211_AP_SME_SA_QUERY_OFFLOAD		= 1 << 0,
 };
- */
 
 /**
  * enum nl80211_feature_flags - device/driver features
@@ -5950,6 +6068,17 @@ enum nl80211_feature_flags {
  *      frame protection for all management frames exchanged during the
  *      negotiation and range measurement procedure.
  *
+ * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision
+ *	detection and change announcemnts.
+ *
+ * @NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD: Driver running in AP mode supports
+ *	FILS encryption and decryption for (Re)Association Request and Response
+ *	frames. Userspace has to share FILS AAD details to the driver by using
+ *	@NL80211_CMD_SET_FILS_AAD.
+ *
+ * @NL80211_EXT_FEATURE_RADAR_BACKGROUND: Device supports background radar/CAC
+ *	detection.
+ *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
  */
@@ -6014,6 +6143,9 @@ enum nl80211_ext_feature_index {
 	NL80211_EXT_FEATURE_SECURE_LTF,
 	NL80211_EXT_FEATURE_SECURE_RTT,
 	NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
+	NL80211_EXT_FEATURE_BSS_COLOR,
+	NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD,
+	NL80211_EXT_FEATURE_RADAR_BACKGROUND,
 
 	/* add new features before the definition below */
 	NUM_NL80211_EXT_FEATURES,
@@ -6912,6 +7044,9 @@ enum nl80211_peer_measurement_ftm_capa {
  * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
  *	valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
  *	%NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
+ * @NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR: optional. The BSS color of the
+ *	responder. Only valid if %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED
+ *	or %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED is set.
  *
  * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
  * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
@@ -6931,6 +7066,7 @@ enum nl80211_peer_measurement_ftm_req {
 	NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
 	NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
 	NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
+	NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR,
 
 	/* keep last */
 	NUM_NL80211_PMSR_FTM_REQ_ATTR,
@@ -7299,4 +7435,76 @@ enum nl80211_sar_specs_attrs {
 	NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1,
 };
 
+/**
+ * enum nl80211_mbssid_config_attributes - multiple BSSID (MBSSID) and enhanced
+ * multi-BSSID advertisements (EMA) in AP mode.
+ * Kernel uses some of these attributes to advertise driver's support for
+ * MBSSID and EMA.
+ * Remaining attributes should be used by the userspace to configure the
+ * features.
+ *
+ * @__NL80211_MBSSID_CONFIG_ATTR_INVALID: Invalid
+ *
+ * @NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES: Used by the kernel to advertise
+ *	the maximum number of MBSSID interfaces supported by the driver.
+ *	Driver should indicate MBSSID support by setting
+ *	wiphy->mbssid_max_interfaces to a value more than or equal to 2.
+ *
+ * @NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY: Used by the kernel
+ *	to advertise the maximum profile periodicity supported by the driver
+ *	if EMA is enabled. Driver should indicate EMA support to the userspace
+ *	by setting wiphy->ema_max_profile_periodicity to
+ *	a non-zero value.
+ *
+ * @NL80211_MBSSID_CONFIG_ATTR_INDEX: Mandatory parameter to pass the index of
+ *	this BSS (u8) in the multiple BSSID set.
+ *	Value must be set to 0 for the transmitting interface and non-zero for
+ *	all non-transmitting interfaces. The userspace will be responsible
+ *	for using unique indices for the interfaces.
+ *	Range: 0 to wiphy->mbssid_max_interfaces-1.
+ *
+ * @NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX: Mandatory parameter for
+ *	a non-transmitted profile which provides the interface index (u32) of
+ *	the transmitted profile. The value must match one of the interface
+ *	indices advertised by the kernel. Optional if the interface being set up
+ *	is the transmitting one, however, if provided then the value must match
+ *	the interface index of the same.
+ *
+ * @NL80211_MBSSID_CONFIG_ATTR_EMA: Flag used to enable EMA AP feature.
+ *	Setting this flag is permitted only if the driver advertises EMA support
+ *	by setting wiphy->ema_max_profile_periodicity to non-zero.
+ *
+ * @__NL80211_MBSSID_CONFIG_ATTR_LAST: Internal
+ * @NL80211_MBSSID_CONFIG_ATTR_MAX: highest attribute
+ */
+enum nl80211_mbssid_config_attributes {
+	__NL80211_MBSSID_CONFIG_ATTR_INVALID,
+
+	NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES,
+	NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY,
+	NL80211_MBSSID_CONFIG_ATTR_INDEX,
+	NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX,
+	NL80211_MBSSID_CONFIG_ATTR_EMA,
+
+	/* keep last */
+	__NL80211_MBSSID_CONFIG_ATTR_LAST,
+	NL80211_MBSSID_CONFIG_ATTR_MAX = __NL80211_MBSSID_CONFIG_ATTR_LAST - 1,
+};
+
+/**
+ * enum nl80211_ap_settings_flags - AP settings flags
+ *
+ * @NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT: AP supports external
+ *	authentication.
+ * @NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT: Userspace supports SA Query
+ *	procedures offload to driver. If driver advertises
+ *	%NL80211_AP_SME_SA_QUERY_OFFLOAD in AP SME features, userspace shall
+ *	ignore SA Query procedures and validations when this flag is set by
+ *	userspace.
+ */
+enum nl80211_ap_settings_flags {
+	NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT	= 1 << 0,
+	NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT	= 1 << 1,
+};
+
 #endif /* __LINUX_NL80211_H */
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 2/9] DFS: introduce dfs_set_valid_channel utility routine
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 3/9] DFS: add capability select radar-only channels Lorenzo Bianconi
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

This is a preliminary patch to introduce radar/CAC background
detection support.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/dfs.c | 36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 5c99ecfd0..a97403756 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -567,6 +567,27 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
 	return chan;
 }
 
+static int dfs_set_valid_channel(struct hostapd_iface *iface, int skip_radar)
+{
+	struct hostapd_channel_data *channel;
+	u8 cf1 = 0, cf2 = 0;
+	int sec = 0;
+
+	channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2,
+					skip_radar);
+	if (!channel) {
+		wpa_printf(MSG_ERROR, "could not get valid channel");
+		return -1;
+	}
+
+	iface->freq = channel->freq;
+	iface->conf->channel = channel->chan;
+	iface->conf->secondary_channel = sec;
+	hostapd_set_oper_centr_freq_seg0_idx(iface->conf, cf1);
+	hostapd_set_oper_centr_freq_seg1_idx(iface->conf, cf2);
+
+	return 0;
+}
 
 static int set_dfs_state_freq(struct hostapd_iface *iface, int freq, u32 state)
 {
@@ -755,7 +776,6 @@ static unsigned int dfs_get_cac_time(struct hostapd_iface *iface,
  */
 int hostapd_handle_dfs(struct hostapd_iface *iface)
 {
-	struct hostapd_channel_data *channel;
 	int res, n_chans, n_chans1, start_chan_idx, start_chan_idx1;
 	int skip_radar = 0;
 
@@ -810,22 +830,10 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
 		wpa_printf(MSG_DEBUG, "DFS %d chans unavailable - choose other channel: %s",
 			   res, res ? "yes": "no");
 		if (res) {
-			int sec = 0;
-			u8 cf1 = 0, cf2 = 0;
-
-			channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2,
-							skip_radar);
-			if (!channel) {
-				wpa_printf(MSG_ERROR, "could not get valid channel");
+			if (dfs_set_valid_channel(iface, skip_radar) < 0) {
 				hostapd_set_state(iface, HAPD_IFACE_DFS);
 				return 0;
 			}
-
-			iface->freq = channel->freq;
-			iface->conf->channel = channel->chan;
-			iface->conf->secondary_channel = sec;
-			hostapd_set_oper_centr_freq_seg0_idx(iface->conf, cf1);
-			hostapd_set_oper_centr_freq_seg1_idx(iface->conf, cf2);
 		}
 	} while (res);
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 3/9] DFS: add capability select radar-only channels
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 2/9] DFS: introduce dfs_set_valid_channel utility routine Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 4/9] nl80211: report background radar/cac detection capability Lorenzo Bianconi
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Introduce flags parameter to dfs_get_valid_channel routine in order to
select radar-only channel where the CAC detection has not been performed
yet. This is a preliminary patch to enable background radar/CAC detection.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/dfs.c | 57 ++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 44 insertions(+), 13 deletions(-)

diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index a97403756..5ce5489b2 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -50,16 +50,32 @@ static int dfs_get_used_n_chans(struct hostapd_iface *iface, int *seg1)
 	return n_chans;
 }
 
-
+/* dfs_channel_available: select new channel according to flags parameter
+ *
+ * flags:
+ * - 0: any channel
+ * - 1: non-radar channel or radar available one
+ * - 2: radar-only channel not yet available
+ */
 static int dfs_channel_available(struct hostapd_channel_data *chan,
-				 int skip_radar)
+				 int flags)
 {
+	if (flags == 2) {
+		/* Select only radar channel where CAC has not been
+		 * performed yet
+		 */
+		if ((chan->flag & HOSTAPD_CHAN_RADAR) &&
+		    (chan->flag & HOSTAPD_CHAN_DFS_MASK) ==
+		     HOSTAPD_CHAN_DFS_USABLE)
+			return 1;
+		return 0;
+	}
 	/*
 	 * When radar detection happens, CSA is performed. However, there's no
 	 * time for CAC, so radar channels must be skipped when finding a new
 	 * channel for CSA, unless they are available for immediate use.
 	 */
-	if (skip_radar && (chan->flag & HOSTAPD_CHAN_RADAR) &&
+	if (flags && (chan->flag & HOSTAPD_CHAN_RADAR) &&
 	    ((chan->flag & HOSTAPD_CHAN_DFS_MASK) !=
 	     HOSTAPD_CHAN_DFS_AVAILABLE))
 		return 0;
@@ -135,10 +151,15 @@ dfs_get_chan_data(struct hostapd_hw_modes *mode, int freq, int first_chan_idx)
 	return NULL;
 }
 
-
+/*
+ * flags:
+ * - 0: any channel
+ * - 1: non-radar channel or radar available one
+ * - 2: radar-only channel not yet available
+ */
 static int dfs_chan_range_available(struct hostapd_hw_modes *mode,
 				    int first_chan_idx, int num_chans,
-				    int skip_radar)
+				    int flags)
 {
 	struct hostapd_channel_data *first_chan, *chan;
 	int i;
@@ -177,7 +198,7 @@ static int dfs_chan_range_available(struct hostapd_hw_modes *mode,
 			return 0;
 		}
 
-		if (!dfs_channel_available(chan, skip_radar)) {
+		if (!dfs_channel_available(chan, flags)) {
 			wpa_printf(MSG_DEBUG, "DFS: channel not available %d",
 				   first_chan->freq + i * 20);
 			return 0;
@@ -204,10 +225,15 @@ static int is_in_chanlist(struct hostapd_iface *iface,
  *  - hapd->secondary_channel
  *  - hapd->vht/he_oper_centr_freq_seg0_idx
  *  - hapd->vht/he_oper_centr_freq_seg1_idx
+ *
+ * flags:
+ * - 0: any channel
+ * - 1: non-radar channel or radar available one
+ * - 2: radar-only channel not yet available
  */
 static int dfs_find_channel(struct hostapd_iface *iface,
 			    struct hostapd_channel_data **ret_chan,
-			    int idx, int skip_radar)
+			    int idx, int flags)
 {
 	struct hostapd_hw_modes *mode;
 	struct hostapd_channel_data *chan;
@@ -232,7 +258,7 @@ static int dfs_find_channel(struct hostapd_iface *iface,
 		}
 
 		/* Skip incompatible chandefs */
-		if (!dfs_chan_range_available(mode, i, n_chans, skip_radar)) {
+		if (!dfs_chan_range_available(mode, i, n_chans, flags)) {
 			wpa_printf(MSG_DEBUG,
 				   "DFS: range not available for %d (%d)",
 				   chan->freq, chan->chan);
@@ -469,13 +495,18 @@ static int dfs_check_chans_unavailable(struct hostapd_iface *iface,
 	return res;
 }
 
-
+/*
+ * flags:
+ * - 0: any channel
+ * - 1: non-radar channel or radar available one
+ * - 2: radar-only channel not yet available
+ */
 static struct hostapd_channel_data *
 dfs_get_valid_channel(struct hostapd_iface *iface,
 		      int *secondary_channel,
 		      u8 *oper_centr_freq_seg0_idx,
 		      u8 *oper_centr_freq_seg1_idx,
-		      int skip_radar)
+		      int flags)
 {
 	struct hostapd_hw_modes *mode;
 	struct hostapd_channel_data *chan = NULL;
@@ -499,7 +530,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
 		return NULL;
 
 	/* Get the count first */
-	num_available_chandefs = dfs_find_channel(iface, NULL, 0, skip_radar);
+	num_available_chandefs = dfs_find_channel(iface, NULL, 0, flags);
 	wpa_printf(MSG_DEBUG, "DFS: num_available_chandefs=%d",
 		   num_available_chandefs);
 	if (num_available_chandefs == 0)
@@ -508,7 +539,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
 	if (os_get_random((u8 *) &_rand, sizeof(_rand)) < 0)
 		return NULL;
 	chan_idx = _rand % num_available_chandefs;
-	dfs_find_channel(iface, &chan, chan_idx, skip_radar);
+	dfs_find_channel(iface, &chan, chan_idx, flags);
 	if (!chan) {
 		wpa_printf(MSG_DEBUG, "DFS: no random channel found");
 		return NULL;
@@ -537,7 +568,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
 		for (i = 0; i < num_available_chandefs - 1; i++) {
 			/* start from chan_idx + 1, end when chan_idx - 1 */
 			chan_idx2 = (chan_idx + 1 + i) % num_available_chandefs;
-			dfs_find_channel(iface, &chan2, chan_idx2, skip_radar);
+			dfs_find_channel(iface, &chan2, chan_idx2, flags);
 			if (chan2 && abs(chan2->chan - chan->chan) > 12) {
 				/* two channels are not adjacent */
 				sec_chan_idx_80p80 = chan2->chan;
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 4/9] nl80211: report background radar/cac detection capability
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (2 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 3/9] DFS: add capability select radar-only channels Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 5/9] DFS: configure background radar/cac detection Lorenzo Bianconi
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Report background radar/cac detection capability if supported
by the underlying hw.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/drivers/driver.h              | 2 ++
 src/drivers/driver_nl80211_capa.c | 4 ++++
 2 files changed, 6 insertions(+)

diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index d3312a34d..fa28b03db 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2027,6 +2027,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS2_OCV			0x0000000000000080ULL
 /** Driver expects user space implementation of SME in AP mode */
 #define WPA_DRIVER_FLAGS2_AP_SME		0x0000000000000100ULL
+/** Driver supports background radar/CAC detection */
+#define WPA_DRIVER_RADAR_BACKGROUND		0x0000000000000200ULL
 	u64 flags2;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index 83868b78e..05703ec64 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -665,6 +665,10 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info,
 	if (ext_feature_isset(ext_features, len,
 			      NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION))
 		capa->flags2 |= WPA_DRIVER_FLAGS2_OCV;
+
+	if (ext_feature_isset(ext_features, len,
+			      NL80211_EXT_FEATURE_RADAR_BACKGROUND))
+		capa->flags2 |= WPA_DRIVER_RADAR_BACKGROUND;
 }
 
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 5/9] DFS: configure background radar/cac detection.
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (3 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 4/9] nl80211: report background radar/cac detection capability Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine Lorenzo Bianconi
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Introduce the capability to perfrom radar/CAC detection on a offchannel
radar chain available on some hw (e.g. mt7915). This feature allows
to avoid CAC downtime switching on a different channel during CAC
detection on the selected radar channel.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/ap_drv_ops.c          |   9 ++-
 src/ap/ap_drv_ops.h          |   3 +-
 src/ap/dfs.c                 | 129 ++++++++++++++++++++++++++++++++++-
 src/ap/hostapd.h             |  15 ++++
 src/drivers/driver.h         |   5 ++
 src/drivers/driver_nl80211.c |   5 ++
 6 files changed, 160 insertions(+), 6 deletions(-)

diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index e91773666..63791330b 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -812,7 +812,8 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
 			  int channel, int ht_enabled, int vht_enabled,
 			  int he_enabled,
 			  int sec_channel_offset, int oper_chwidth,
-			  int center_segment0, int center_segment1)
+			  int center_segment0, int center_segment1,
+			  int radar_background)
 {
 	struct hostapd_data *hapd = iface->bss[0];
 	struct hostapd_freq_params data;
@@ -838,10 +839,14 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
 		wpa_printf(MSG_ERROR, "Can't set freq params");
 		return -1;
 	}
+	data.radar_background = radar_background;
 
 	res = hapd->driver->start_dfs_cac(hapd->drv_priv, &data);
 	if (!res) {
-		iface->cac_started = 1;
+		if (radar_background)
+			iface->radar_background.cac_started = 1;
+		else
+			iface->cac_started = 1;
 		os_get_reltime(&iface->dfs_cac_start);
 	}
 
diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
index 61c8f64eb..92842a1dc 100644
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -130,7 +130,8 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
 			  int channel, int ht_enabled, int vht_enabled,
 			  int he_enabled,
 			  int sec_channel_offset, int oper_chwidth,
-			  int center_segment0, int center_segment1);
+			  int center_segment0, int center_segment1,
+			  int radar_offchan);
 int hostapd_drv_do_acs(struct hostapd_data *hapd);
 int hostapd_drv_update_dh_ie(struct hostapd_data *hapd, const u8 *peer,
 			     u16 reason_code, const u8 *ie, size_t ielen);
diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 5ce5489b2..94ef87d87 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -870,7 +870,9 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
 
 	/* Finally start CAC */
 	hostapd_set_state(iface, HAPD_IFACE_DFS);
-	wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz", iface->freq);
+	wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz background %d",
+		   iface->freq,
+		   !!(iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND));
 	wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
 		"freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds",
 		iface->freq,
@@ -887,13 +889,37 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
 		iface->conf->secondary_channel,
 		hostapd_get_oper_chwidth(iface->conf),
 		hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
-		hostapd_get_oper_centr_freq_seg1_idx(iface->conf));
+		hostapd_get_oper_centr_freq_seg1_idx(iface->conf),
+		!!(iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND));
 
 	if (res) {
 		wpa_printf(MSG_ERROR, "DFS start_dfs_cac() failed, %d", res);
 		return -1;
 	}
 
+	if (iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) {
+		/* Cache background radar parameters */
+		iface->radar_background.channel = iface->conf->channel;
+		iface->radar_background.secondary_channel =
+			iface->conf->secondary_channel;
+		iface->radar_background.freq = iface->freq;
+		iface->radar_background.centr_freq_seg0_idx =
+			hostapd_get_oper_centr_freq_seg0_idx(iface->conf);
+		iface->radar_background.centr_freq_seg1_idx =
+			hostapd_get_oper_centr_freq_seg1_idx(iface->conf);
+
+		/*
+		 * Let's select a random channel for the moment
+		 * and perform CAC on dedicated radar chain
+		 */
+		res = dfs_set_valid_channel(iface, 1);
+		if (res < 0)
+			return res;
+
+		iface->radar_background.temp_ch = 1;
+		return 1;
+	}
+
 	return 0;
 }
 
@@ -915,6 +941,78 @@ int hostapd_is_dfs_chan_available(struct hostapd_iface *iface)
 }
 
 
+static struct hostapd_channel_data *
+dfs_downgrade_bandwidth(struct hostapd_iface *iface, int *secondary_channel,
+			u8 *oper_centr_freq_seg0_idx,
+			u8 *oper_centr_freq_seg1_idx, int *skip_radar);
+
+static void
+hostpad_dfs_update_background_chain(struct hostapd_iface *iface)
+{
+	struct hostapd_channel_data *channel;
+	int sec = 0, flags = 2;
+	u8 cf1 = 0, cf2 = 0;
+
+	channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2, 2);
+	if (!channel || channel->chan == iface->conf->channel)
+		channel = dfs_downgrade_bandwidth(iface, &sec, &cf1, &cf2,
+						  &flags);
+	if (!channel ||
+	    hostapd_start_dfs_cac(iface, iface->conf->hw_mode,
+				  channel->freq, channel->chan,
+				  iface->conf->ieee80211n,
+				  iface->conf->ieee80211ac,
+				  iface->conf->ieee80211ax,
+				  sec, hostapd_get_oper_chwidth(iface->conf),
+				  cf1, cf2, 1)) {
+		/*
+		 * Toggle interface state to enter DFS state
+		 * until NOP is finished.
+		 */
+		wpa_printf(MSG_ERROR, "DFS failed start CAC offchannel");
+		return;
+	}
+
+	wpa_printf(MSG_DEBUG,
+		   "%s: setting background chain to chan %d (%d MHz)",
+		   __func__, channel->chan, channel->freq);
+
+	iface->radar_background.channel = channel->chan;
+	iface->radar_background.freq = channel->freq;
+	iface->radar_background.secondary_channel = sec;
+	iface->radar_background.centr_freq_seg0_idx = cf1;
+	iface->radar_background.centr_freq_seg1_idx = cf2;
+}
+
+/* XXX: check if all channel bandwith */
+static int
+hostapd_dfs_is_background_event(struct hostapd_iface *iface, int freq)
+{
+	if (iface->radar_background.freq != freq)
+		return 0;
+
+	return 1;
+}
+
+static int
+hostapd_dfs_start_channel_switch_background(struct hostapd_iface *iface)
+{
+	iface->conf->channel = iface->radar_background.channel;
+	iface->freq = iface->radar_background.freq;
+	iface->conf->secondary_channel =
+		iface->radar_background.secondary_channel;
+	hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
+			iface->radar_background.centr_freq_seg0_idx);
+	hostapd_set_oper_centr_freq_seg1_idx(iface->conf,
+			iface->radar_background.centr_freq_seg1_idx);
+
+	hostpad_dfs_update_background_chain(iface);
+	hostapd_disable_iface(iface);
+	hostapd_enable_iface(iface);
+
+	return 0;
+}
+
 int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
 			     int ht_enabled, int chan_offset, int chan_width,
 			     int cf1, int cf2)
@@ -935,6 +1033,23 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
 			set_dfs_state(iface, freq, ht_enabled, chan_offset,
 				      chan_width, cf1, cf2,
 				      HOSTAPD_CHAN_DFS_AVAILABLE);
+
+			/*
+			 * radar event from background chain for selected
+			 * channel. Perfrom CSA, move main chain to selected
+			 * channel and configure background chain to a new DFS
+			 * channel
+			 */
+			if ((iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) &&
+			    hostapd_dfs_is_background_event(iface, freq)) {
+				iface->radar_background.cac_started = 0;
+				if (!iface->radar_background.temp_ch)
+					return 0;
+
+				iface->radar_background.temp_ch = 0;
+				return hostapd_dfs_start_channel_switch_background(iface);
+			}
+
 			/*
 			 * Just mark the channel available when CAC completion
 			 * event is received in enabled state. CAC result could
@@ -951,6 +1066,10 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
 				iface->cac_started = 0;
 			}
 		}
+	} else if ((iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) &&
+		   hostapd_dfs_is_background_event(iface, freq)) {
+		iface->radar_background.cac_started = 0;
+		hostpad_dfs_update_background_chain(iface);
 	}
 
 	return 0;
@@ -1308,7 +1427,11 @@ int hostapd_dfs_start_cac(struct hostapd_iface *iface, int freq,
 		"seg1=%d cac_time=%ds",
 		freq, (freq - 5000) / 5, chan_offset, chan_width, cf1, cf2,
 		iface->dfs_cac_ms / 1000);
-	iface->cac_started = 1;
+
+	if (hostapd_dfs_is_background_event(iface, freq))
+		iface->radar_background.cac_started = 1;
+	else
+		iface->cac_started = 1;
 	os_get_reltime(&iface->dfs_cac_start);
 	return 0;
 }
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index f3ca7529a..72b6035d6 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -520,6 +520,21 @@ struct hostapd_iface {
 	int *basic_rates;
 	int freq;
 
+	/* Background radar configuration */
+	struct {
+		int channel;
+		int secondary_channel;
+		int freq;
+		int centr_freq_seg0_idx;
+		int centr_freq_seg1_idx;
+		/* Main chain is on temporary channel during
+		 * CAC detection on radar offchain.
+		 */
+		unsigned int temp_ch:1;
+		/* CAC started on radar offchain */
+		unsigned int cac_started:1;
+	} radar_background;
+
 	u16 hw_flags;
 
 	/* Number of associated Non-ERP stations (i.e., stations using 802.11b
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index fa28b03db..10dc84994 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -782,6 +782,11 @@ struct hostapd_freq_params {
 	 * for IEEE 802.11ay EDMG configuration.
 	 */
 	struct ieee80211_edmg_config edmg;
+
+	/**
+	 * radar_background - Whether radar/CAC background is requested
+	 */
+	int radar_background;
 };
 
 /**
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index aec179ac3..e8e06cf17 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -4896,6 +4896,8 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
 	wpa_printf(MSG_DEBUG, "  * he_enabled=%d", freq->he_enabled);
 	wpa_printf(MSG_DEBUG, "  * vht_enabled=%d", freq->vht_enabled);
 	wpa_printf(MSG_DEBUG, "  * ht_enabled=%d", freq->ht_enabled);
+	wpa_printf(MSG_DEBUG, "  * radar_background=%d",
+		   freq->radar_background);
 
 	hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
 	is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G ||
@@ -4973,6 +4975,9 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
 				NL80211_CHAN_NO_HT))
 			return -ENOBUFS;
 	}
+	if (freq->radar_background)
+		nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND);
+
 	return 0;
 }
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (4 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 5/9] DFS: configure background radar/cac detection Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2022-03-03 22:54   ` Jouni Malinen
  2021-12-20 15:48 ` [PATCH 7/9] DFS: enable CSA for background radar detection Lorenzo Bianconi
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

This is a preliminary patch to add Channel Switch Announcement for
background radar detection.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/dfs.c | 159 +++++++++++++++++++++++++++------------------------
 1 file changed, 84 insertions(+), 75 deletions(-)

diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 94ef87d87..bd8a2484d 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -940,6 +940,85 @@ int hostapd_is_dfs_chan_available(struct hostapd_iface *iface)
 	return dfs_check_chans_available(iface, start_chan_idx, n_chans);
 }
 
+static int hostapd_dfs_request_channel_switch(struct hostapd_iface *iface,
+					      int channel, int freq,
+					      int secondary_channel,
+					      u8 oper_centr_freq_seg0_idx,
+					      u8 oper_centr_freq_seg1_idx)
+{
+	struct hostapd_hw_modes *cmode = iface->current_mode;
+	int ieee80211_mode = IEEE80211_MODE_AP, err, i;
+	struct csa_settings csa_settings;
+	u8 new_vht_oper_chwidth;
+
+	wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d", channel);
+	wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
+		"freq=%d chan=%d sec_chan=%d", freq, channel,
+		secondary_channel);
+
+	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
+	hostapd_set_oper_chwidth(iface->conf,
+				 hostapd_get_oper_chwidth(iface->conf));
+
+	/* Setup CSA request */
+	os_memset(&csa_settings, 0, sizeof(csa_settings));
+	csa_settings.cs_count = 5;
+	csa_settings.block_tx = 1;
+#ifdef CONFIG_MESH
+	if (iface->mconf)
+		ieee80211_mode = IEEE80211_MODE_MESH;
+#endif /* CONFIG_MESH */
+	err = hostapd_set_freq_params(&csa_settings.freq_params,
+				      iface->conf->hw_mode,
+				      freq, channel,
+				      iface->conf->enable_edmg,
+				      iface->conf->edmg_channel,
+				      iface->conf->ieee80211n,
+				      iface->conf->ieee80211ac,
+				      iface->conf->ieee80211ax,
+				      secondary_channel,
+				      new_vht_oper_chwidth,
+				      oper_centr_freq_seg0_idx,
+				      oper_centr_freq_seg1_idx,
+				      cmode->vht_capab,
+				      &cmode->he_capab[ieee80211_mode]);
+
+	if (err) {
+		wpa_printf(MSG_ERROR, "DFS failed to calculate CSA freq params");
+		hostapd_disable_iface(iface);
+		return err;
+	}
+
+	for (i = 0; i < iface->num_bss; i++) {
+		err = hostapd_switch_channel(iface->bss[i], &csa_settings);
+		if (err)
+			break;
+	}
+
+	if (err) {
+		wpa_printf(MSG_WARNING, "DFS failed to schedule CSA (%d) - trying fallback",
+			   err);
+		iface->freq = freq;
+		iface->conf->channel = channel;
+		iface->conf->secondary_channel = secondary_channel;
+		hostapd_set_oper_chwidth(iface->conf, new_vht_oper_chwidth);
+		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);
+
+		return 0;
+	}
+
+	/* Channel configuration will be updated once CSA completes and
+	 * ch_switch_notify event is received */
+	wpa_printf(MSG_DEBUG, "DFS waiting channel switch event");
+
+	return 0;
+}
 
 static struct hostapd_channel_data *
 dfs_downgrade_bandwidth(struct hostapd_iface *iface, int *secondary_channel,
@@ -1179,21 +1258,13 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
 	return err;
 }
 
-
 static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
 {
 	struct hostapd_channel_data *channel;
 	int secondary_channel;
 	u8 oper_centr_freq_seg0_idx;
 	u8 oper_centr_freq_seg1_idx;
-	u8 new_vht_oper_chwidth;
 	int skip_radar = 1;
-	struct csa_settings csa_settings;
-	unsigned int i;
-	int err = 1;
-	struct hostapd_hw_modes *cmode = iface->current_mode;
-	u8 current_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
-	int ieee80211_mode = IEEE80211_MODE_AP;
 
 	wpa_printf(MSG_DEBUG, "%s called (CAC active: %s, CSA active: %s)",
 		   __func__, iface->cac_started ? "yes" : "no",
@@ -1256,73 +1327,11 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
 		}
 	}
 
-	wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d",
-		   channel->chan);
-	wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
-		"freq=%d chan=%d sec_chan=%d", channel->freq,
-		channel->chan, secondary_channel);
-
-	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
-	hostapd_set_oper_chwidth(iface->conf, current_vht_oper_chwidth);
-
-	/* Setup CSA request */
-	os_memset(&csa_settings, 0, sizeof(csa_settings));
-	csa_settings.cs_count = 5;
-	csa_settings.block_tx = 1;
-#ifdef CONFIG_MESH
-	if (iface->mconf)
-		ieee80211_mode = IEEE80211_MODE_MESH;
-#endif /* CONFIG_MESH */
-	err = hostapd_set_freq_params(&csa_settings.freq_params,
-				      iface->conf->hw_mode,
-				      channel->freq,
-				      channel->chan,
-				      iface->conf->enable_edmg,
-				      iface->conf->edmg_channel,
-				      iface->conf->ieee80211n,
-				      iface->conf->ieee80211ac,
-				      iface->conf->ieee80211ax,
-				      secondary_channel,
-				      new_vht_oper_chwidth,
-				      oper_centr_freq_seg0_idx,
-				      oper_centr_freq_seg1_idx,
-				      cmode->vht_capab,
-				      &cmode->he_capab[ieee80211_mode]);
-
-	if (err) {
-		wpa_printf(MSG_ERROR, "DFS failed to calculate CSA freq params");
-		hostapd_disable_iface(iface);
-		return err;
-	}
-
-	for (i = 0; i < iface->num_bss; i++) {
-		err = hostapd_switch_channel(iface->bss[i], &csa_settings);
-		if (err)
-			break;
-	}
-
-	if (err) {
-		wpa_printf(MSG_WARNING, "DFS failed to schedule CSA (%d) - trying fallback",
-			   err);
-		iface->freq = channel->freq;
-		iface->conf->channel = channel->chan;
-		iface->conf->secondary_channel = secondary_channel;
-		hostapd_set_oper_chwidth(iface->conf, new_vht_oper_chwidth);
-		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);
-		return 0;
-	}
-
-	/* Channel configuration will be updated once CSA completes and
-	 * ch_switch_notify event is received */
-
-	wpa_printf(MSG_DEBUG, "DFS waiting channel switch event");
-	return 0;
+	return hostapd_dfs_request_channel_switch(iface, channel->chan,
+						  channel->freq,
+						  secondary_channel,
+						  oper_centr_freq_seg0_idx,
+						  oper_centr_freq_seg1_idx);
 }
 
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 7/9] DFS: enable CSA for background radar detection
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (5 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2021-12-20 15:48 ` [PATCH 8/9] DFS: switch to background radar channel if available Lorenzo Bianconi
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Rely on hostapd_dfs_request_channel_switch in order to enable CSA for
background radar detection switching back to selected channel.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/dfs.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index bd8a2484d..30be7e349 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -1086,10 +1086,11 @@ hostapd_dfs_start_channel_switch_background(struct hostapd_iface *iface)
 			iface->radar_background.centr_freq_seg1_idx);
 
 	hostpad_dfs_update_background_chain(iface);
-	hostapd_disable_iface(iface);
-	hostapd_enable_iface(iface);
 
-	return 0;
+	return hostapd_dfs_request_channel_switch(iface, iface->conf->channel,
+						  iface->freq, iface->conf->secondary_channel,
+						  hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
+						  hostapd_get_oper_centr_freq_seg1_idx(iface->conf));
 }
 
 int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 8/9] DFS: switch to background radar channel if available
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (6 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 7/9] DFS: enable CSA for background radar detection Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2022-03-03 22:20   ` Jouni Malinen
  2021-12-20 15:48 ` [PATCH 9/9] DFS: introduce radar_background parameter to config file Lorenzo Bianconi
  2022-03-03 23:19 ` [PATCH 0/9] introduce background radar detection support Jouni Malinen
  9 siblings, 1 reply; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On radar detection on the main chain switch to the channel monitored
by the background chain if we have already performed the CAC there.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 src/ap/dfs.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 53 insertions(+), 7 deletions(-)

diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 30be7e349..35d26e725 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -1259,6 +1259,48 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
 	return err;
 }
 
+static int
+hostapd_dfs_background_start_channel_switch(struct hostapd_iface *iface,
+					    int freq)
+{
+	if (!(iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND))
+		return -1; /* Background radar chain not supported */
+
+	wpa_printf(MSG_DEBUG,
+		   "%s called (background CAC active: %s, CSA active: %s)",
+		   __func__, iface->radar_background.cac_started ? "yes" : "no",
+		   hostapd_csa_in_progress(iface) ? "yes" : "no");
+
+	/* Check if CSA in progress */
+	if (hostapd_csa_in_progress(iface))
+		return 0;
+
+	/*
+	 * If background radar detection is supported and radar channel
+	 * monitored by background chain is available switch to it without
+	 * waiting for the CAC otherwise let's keep a random channel.
+	 * If radar pattern is reported on the background chain, just switch
+	 * monitoring another radar channel.
+	 */
+	if (hostapd_dfs_is_background_event(iface, freq)) {
+		hostpad_dfs_update_background_chain(iface);
+		return 0;
+	}
+
+	/* Background channel not available yet. Perform CAC on the
+	 * main chain.
+	 */
+	if (iface->radar_background.cac_started) {
+		/* We want to switch to monitored channel as soon as
+		 * CAC is completed.
+		 */
+		iface->radar_background.temp_ch = 1;
+		return -1;
+	}
+
+	return hostapd_dfs_start_channel_switch_background(iface);
+}
+
 static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
 {
 	struct hostapd_channel_data *channel;
@@ -1359,15 +1401,19 @@ int hostapd_dfs_radar_detected(struct hostapd_iface *iface, int freq,
 	if (!res)
 		return 0;
 
-	/* Skip if reported radar event not overlapped our channels */
-	res = dfs_are_channels_overlapped(iface, freq, chan_width, cf1, cf2);
-	if (!res)
-		return 0;
+	if (!hostapd_dfs_is_background_event(iface, freq)) {
+		/* Skip if reported radar event not overlapped our channels */
+		res = dfs_are_channels_overlapped(iface, freq, chan_width,
+						  cf1, cf2);
+		if (!res)
+			return 0;
+	}
 
-	/* radar detected while operating, switch the channel. */
-	res = hostapd_dfs_start_channel_switch(iface);
+	if (hostapd_dfs_background_start_channel_switch(iface, freq))
+		/* radar detected while operating, switch the channel. */
+		return hostapd_dfs_start_channel_switch(iface);
 
-	return res;
+	return 0;
 }
 
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 9/9] DFS: introduce radar_background parameter to config file
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (7 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 8/9] DFS: switch to background radar channel if available Lorenzo Bianconi
@ 2021-12-20 15:48 ` Lorenzo Bianconi
  2022-03-03 21:56   ` Jouni Malinen
  2022-03-03 23:19 ` [PATCH 0/9] introduce background radar detection support Jouni Malinen
  9 siblings, 1 reply; 19+ messages in thread
From: Lorenzo Bianconi @ 2021-12-20 15:48 UTC (permalink / raw)
  To: j; +Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

Introduce radar_background parameter to configuration file
in order to enable/disable background radar/CAC detection.

Tested-by: Owen Peng <owen.peng@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 hostapd/config_file.c |  2 ++
 hostapd/hostapd.conf  |  7 +++++++
 src/ap/ap_config.h    |  1 +
 src/ap/dfs.c          | 21 +++++++++++++--------
 4 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index b14728d1b..3cba0b2c2 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -2475,6 +2475,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
 		conf->ieee80211d = atoi(pos);
 	} else if (os_strcmp(buf, "ieee80211h") == 0) {
 		conf->ieee80211h = atoi(pos);
+	} else if (os_strcmp(buf, "radar_background") == 0) {
+		conf->radar_background = atoi(pos);
 	} else if (os_strcmp(buf, "ieee8021x") == 0) {
 		bss->ieee802_1x = atoi(pos);
 	} else if (os_strcmp(buf, "eapol_version") == 0) {
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index 3c2019f73..373f44afb 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -143,6 +143,13 @@ ssid=test
 # ieee80211d=1 and local_pwr_constraint configured.
 #spectrum_mgmt_required=1
 
+# Enable radar/CAC detection through a dedicated background chain available on
+# some hw. The chain can't be used to transmits or receives frames.
+# This feature allows to avoid CAC downtime switching on a different channel
+# during CAC detection on the selected radar channel.
+# (default: 0 = disabled, 1 = enabled)
+#radar_background=0
+
 # Operation mode (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz),
 # g = IEEE 802.11g (2.4 GHz), ad = IEEE 802.11ad (60 GHz); a/g options are used
 # with IEEE 802.11n (HT), too, to specify band). For IEEE 802.11ac (VHT), this
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index 49cd3168a..f846437f5 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -990,6 +990,7 @@ struct hostapd_config {
 	int ieee80211d;
 
 	int ieee80211h; /* DFS */
+	int radar_background;
 
 	/*
 	 * Local power constraint is an octet encoded as an unsigned integer in
diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 35d26e725..ba4c83b5f 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -798,6 +798,11 @@ static unsigned int dfs_get_cac_time(struct hostapd_iface *iface,
 	return cac_time_ms;
 }
 
+static int hostapd_is_radar_background_enabled(struct hostapd_iface *iface)
+{
+	return (iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) &&
+	       iface->conf->radar_background;
+}
 
 /*
  * Main DFS handler
@@ -808,7 +813,7 @@ static unsigned int dfs_get_cac_time(struct hostapd_iface *iface,
 int hostapd_handle_dfs(struct hostapd_iface *iface)
 {
 	int res, n_chans, n_chans1, start_chan_idx, start_chan_idx1;
-	int skip_radar = 0;
+	int skip_radar = 0, radar_background;
 
 	if (is_6ghz_freq(iface->freq))
 		return 1;
@@ -870,9 +875,9 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
 
 	/* Finally start CAC */
 	hostapd_set_state(iface, HAPD_IFACE_DFS);
+	radar_background = hostapd_is_radar_background_enabled(iface);
 	wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz background %d",
-		   iface->freq,
-		   !!(iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND));
+		   iface->freq, radar_background);
 	wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
 		"freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds",
 		iface->freq,
@@ -890,14 +895,14 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
 		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->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND));
+		radar_background);
 
 	if (res) {
 		wpa_printf(MSG_ERROR, "DFS start_dfs_cac() failed, %d", res);
 		return -1;
 	}
 
-	if (iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) {
+	if (radar_background) {
 		/* Cache background radar parameters */
 		iface->radar_background.channel = iface->conf->channel;
 		iface->radar_background.secondary_channel =
@@ -1120,7 +1125,7 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
 			 * channel and configure background chain to a new DFS
 			 * channel
 			 */
-			if ((iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) &&
+			if (hostapd_is_radar_background_enabled(iface) &&
 			    hostapd_dfs_is_background_event(iface, freq)) {
 				iface->radar_background.cac_started = 0;
 				if (!iface->radar_background.temp_ch)
@@ -1146,7 +1151,7 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
 				iface->cac_started = 0;
 			}
 		}
-	} else if ((iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND) &&
+	} else if (hostapd_is_radar_background_enabled(iface) &&
 		   hostapd_dfs_is_background_event(iface, freq)) {
 		iface->radar_background.cac_started = 0;
 		hostpad_dfs_update_background_chain(iface);
@@ -1263,7 +1268,7 @@ static int
 hostapd_dfs_background_start_channel_switch(struct hostapd_iface *iface,
 					    int freq)
 {
-	if (!(iface->drv_flags2 & WPA_DRIVER_RADAR_BACKGROUND))
+	if (!hostapd_is_radar_background_enabled(iface))
 		return -1; /* Background radar chain not supported */
 
 	wpa_printf(MSG_DEBUG,
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 9/9] DFS: introduce radar_background parameter to config file
  2021-12-20 15:48 ` [PATCH 9/9] DFS: introduce radar_background parameter to config file Lorenzo Bianconi
@ 2022-03-03 21:56   ` Jouni Malinen
  2022-03-04 11:08     ` Lorenzo Bianconi
  0 siblings, 1 reply; 19+ messages in thread
From: Jouni Malinen @ 2022-03-03 21:56 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On Mon, Dec 20, 2021 at 04:48:24PM +0100, Lorenzo Bianconi wrote:
> Introduce radar_background parameter to configuration file
> in order to enable/disable background radar/CAC detection.

What's the use case for this new parameter and the configuration having
to explicitly enable this functionality? Is there a reason for not doing
this in cases where the driver supports this capability? It looks like
patches 1..8 were enabling this functionality automatically and it is
only this final patch that makes it depend on a configuration parameter
(which is default by default).

> diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
> @@ -143,6 +143,13 @@ ssid=test
> +# Enable radar/CAC detection through a dedicated background chain available on
> +# some hw. The chain can't be used to transmits or receives frames.
> +# This feature allows to avoid CAC downtime switching on a different channel
> +# during CAC detection on the selected radar channel.
> +# (default: 0 = disabled, 1 = enabled)
> +#radar_background=0

How would someone writing hostapd configuration know when to enable
this? Or maybe more importantly, when one should not enable this? Would
use of that dedicated background chain result in some other capabilities
getting reduced?

This is also a bit unclear on what happens if the driver does not
support this capability and radar_background=1 is explicitly set in the
configuration.

-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git
  2021-12-20 15:48 ` [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git Lorenzo Bianconi
@ 2022-03-03 21:58   ` Jouni Malinen
  0 siblings, 0 replies; 19+ messages in thread
From: Jouni Malinen @ 2022-03-03 21:58 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On Mon, Dec 20, 2021 at 04:48:16PM +0100, Lorenzo Bianconi wrote:
>  src/drivers/driver_nl80211_event.c |   7 +
>  src/drivers/nl80211_copy.h         | 228 +++++++++++++++++++++++++++--
>  2 files changed, 225 insertions(+), 10 deletions(-)

I copy the nl80211_copy.h updates automatically from the kernel
repository whenever patches require new definitions, so this type of
patches are not actually needed in general.

-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 8/9] DFS: switch to background radar channel if available
  2021-12-20 15:48 ` [PATCH 8/9] DFS: switch to background radar channel if available Lorenzo Bianconi
@ 2022-03-03 22:20   ` Jouni Malinen
  2022-03-04 13:46     ` Lorenzo Bianconi
  0 siblings, 1 reply; 19+ messages in thread
From: Jouni Malinen @ 2022-03-03 22:20 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On Mon, Dec 20, 2021 at 04:48:23PM +0100, Lorenzo Bianconi wrote:
> On radar detection on the main chain switch to the channel monitored
> by the background chain if we have already performed the CAC there.

Is it clear that the channel on the background chain, if one is
available with CAC performed, comply with the ETSI uniform spreading
requirements? The comment below feels a bit misleading, but the way
patch 5/9 picks the channel for background CAC might be sufficient for
this. If so, it would be good to note that in the comment here:

> diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> +hostapd_dfs_background_start_channel_switch(struct hostapd_iface *iface,

> +	/*
> +	 * If background radar detection is supported and radar channel
> +	 * monitored by background chain is available switch to it without
> +	 * waiting for the CAC otherwise let's keep a random channel.

That first part leaves it a bit open whether the random channel part from
the end of the sentence applies in practice for the new operating
channel. It is important to make this clearly describe the functionality
needed to meet uniform spreading requirement.

-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine
  2021-12-20 15:48 ` [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine Lorenzo Bianconi
@ 2022-03-03 22:54   ` Jouni Malinen
  2022-03-04 11:52     ` Lorenzo Bianconi
  0 siblings, 1 reply; 19+ messages in thread
From: Jouni Malinen @ 2022-03-03 22:54 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On Mon, Dec 20, 2021 at 04:48:21PM +0100, Lorenzo Bianconi wrote:
> This is a preliminary patch to add Channel Switch Announcement for
> background radar detection.

> diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> @@ -940,6 +940,85 @@ int hostapd_is_dfs_chan_available(struct hostapd_iface *iface)
>  
> +static int hostapd_dfs_request_channel_switch(struct hostapd_iface *iface,

> +	struct hostapd_hw_modes *cmode = iface->current_mode;
> +	int ieee80211_mode = IEEE80211_MODE_AP, err, i;

That i needs to be unsigned int (like it was in the function from which
it was moved to here) to avoid a compiler warning.

> +	u8 new_vht_oper_chwidth;

> +	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> +	hostapd_set_oper_chwidth(iface->conf,
> +				 hostapd_get_oper_chwidth(iface->conf));

This looks quite strange.. hostapd_dfs_start_channel_switch() used
current_vht_oper_chwidth to store the current value from beginning of
the function and restored it at this location. The new version in this
helper function seems to something strange, or well, nothing. That does
not feel correct.

>  static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
>  {
> -	unsigned int i;

That's where i was unsigned..

> -	u8 current_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);

And that's where the current value is picked at the beginning of
hostapd_dfs_start_channel_switch().

> -	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> -	hostapd_set_oper_chwidth(iface->conf, current_vht_oper_chwidth);

And this looks quite different compared to what was in the new helper
function.

-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 0/9] introduce background radar detection support
  2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
                   ` (8 preceding siblings ...)
  2021-12-20 15:48 ` [PATCH 9/9] DFS: introduce radar_background parameter to config file Lorenzo Bianconi
@ 2022-03-03 23:19 ` Jouni Malinen
  2022-03-04  9:48   ` Lorenzo Bianconi
  9 siblings, 1 reply; 19+ messages in thread
From: Jouni Malinen @ 2022-03-03 23:19 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai, lorenzo.bianconi

On Mon, Dec 20, 2021 at 04:48:15PM +0100, Lorenzo Bianconi wrote:
> Introduce background radar/CAC detection through a dedicated off-channel
> chain available on some hw (e.g. mt7915).
> Background radar/CAC detection allows to avoid the CAC downtime
> switching on a different channel during CAC detection on the selected
> radar channel.
> 
> Lorenzo Bianconi (9):
>   Sync include/uapi/linux/nl80211.h with mac80211-next.git
>   DFS: introduce dfs_set_valid_channel utility routine
>   DFS: add capability select radar-only channels
>   nl80211: report background radar/cac detection capability

Thanks, applied patches 2-4 with some cleanup (mainly, replaced the
int flags parameter in 3/9 with an enum to make the code more readable.
Patch 1 changes are covered by another commit.

>   DFS: configure background radar/cac detection.
>   DFS: introduce hostapd_dfs_request_channel_switch routine
>   DFS: enable CSA for background radar detection
>   DFS: switch to background radar channel if available
>   DFS: introduce radar_background parameter to config file

These have open questions or dependencies on patches with open
questions.
 
-- 
Jouni Malinen                                            PGP id EFC895FA

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 0/9] introduce background radar detection support
  2022-03-03 23:19 ` [PATCH 0/9] introduce background radar detection support Jouni Malinen
@ 2022-03-04  9:48   ` Lorenzo Bianconi
  0 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2022-03-04  9:48 UTC (permalink / raw)
  To: Jouni Malinen
  Cc: Lorenzo Bianconi, hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai

[-- Attachment #1: Type: text/plain, Size: 1418 bytes --]

> On Mon, Dec 20, 2021 at 04:48:15PM +0100, Lorenzo Bianconi wrote:
> > Introduce background radar/CAC detection through a dedicated off-channel
> > chain available on some hw (e.g. mt7915).
> > Background radar/CAC detection allows to avoid the CAC downtime
> > switching on a different channel during CAC detection on the selected
> > radar channel.
> > 
> > Lorenzo Bianconi (9):
> >   Sync include/uapi/linux/nl80211.h with mac80211-next.git
> >   DFS: introduce dfs_set_valid_channel utility routine
> >   DFS: add capability select radar-only channels
> >   nl80211: report background radar/cac detection capability
> 
> Thanks, applied patches 2-4 with some cleanup (mainly, replaced the
> int flags parameter in 3/9 with an enum to make the code more readable.
> Patch 1 changes are covered by another commit.
> 
> >   DFS: configure background radar/cac detection.
> >   DFS: introduce hostapd_dfs_request_channel_switch routine
> >   DFS: enable CSA for background radar detection
> >   DFS: switch to background radar channel if available
> >   DFS: introduce radar_background parameter to config file
> 
> These have open questions or dependencies on patches with open
> questions.

Hi Jouni,

Thx for the review, I will address comments in the pending patches.

Regards,
Lorenzo

>  
> -- 
> Jouni Malinen                                            PGP id EFC895FA
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 9/9] DFS: introduce radar_background parameter to config file
  2022-03-03 21:56   ` Jouni Malinen
@ 2022-03-04 11:08     ` Lorenzo Bianconi
  0 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2022-03-04 11:08 UTC (permalink / raw)
  To: Jouni Malinen
  Cc: Lorenzo Bianconi, hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai

[-- Attachment #1: Type: text/plain, Size: 2073 bytes --]

On Mar 03, Jouni Malinen wrote:
> On Mon, Dec 20, 2021 at 04:48:24PM +0100, Lorenzo Bianconi wrote:
> > Introduce radar_background parameter to configuration file
> > in order to enable/disable background radar/CAC detection.
> 
> What's the use case for this new parameter and the configuration having
> to explicitly enable this functionality? Is there a reason for not doing
> this in cases where the driver supports this capability? It looks like
> patches 1..8 were enabling this functionality automatically and it is
> only this final patch that makes it depend on a configuration parameter
> (which is default by default).

I added this parameter just to add the capability to disable radar_background
even if the hw supports it (e.g. for testing/debugging). 

> 
> > diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
> > @@ -143,6 +143,13 @@ ssid=test
> > +# Enable radar/CAC detection through a dedicated background chain available on
> > +# some hw. The chain can't be used to transmits or receives frames.
> > +# This feature allows to avoid CAC downtime switching on a different channel
> > +# during CAC detection on the selected radar channel.
> > +# (default: 0 = disabled, 1 = enabled)
> > +#radar_background=0
> 
> How would someone writing hostapd configuration know when to enable
> this? Or maybe more importantly, when one should not enable this? Would
> use of that dedicated background chain result in some other capabilities
> getting reduced?

nope, the radar_chain is completely independent from the "data" ones.

> 
> This is also a bit unclear on what happens if the driver does not
> support this capability and radar_background=1 is explicitly set in the
> configuration.

it will not be enabled since we always check WPA_DRIVER_RADAR_BACKGROUND
capability.
Since it is not mandatory, I will drop this patch in the series and always
enable RADAR_BACKGROUND if supported by the hw.

Regards,
Lorenzo

> 
> -- 
> Jouni Malinen                                            PGP id EFC895FA
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine
  2022-03-03 22:54   ` Jouni Malinen
@ 2022-03-04 11:52     ` Lorenzo Bianconi
  0 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2022-03-04 11:52 UTC (permalink / raw)
  To: Jouni Malinen
  Cc: Lorenzo Bianconi, hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai

[-- Attachment #1: Type: text/plain, Size: 1914 bytes --]

> On Mon, Dec 20, 2021 at 04:48:21PM +0100, Lorenzo Bianconi wrote:
> > This is a preliminary patch to add Channel Switch Announcement for
> > background radar detection.
> 
> > diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> > @@ -940,6 +940,85 @@ int hostapd_is_dfs_chan_available(struct hostapd_iface *iface)
> >  
> > +static int hostapd_dfs_request_channel_switch(struct hostapd_iface *iface,
> 
> > +	struct hostapd_hw_modes *cmode = iface->current_mode;
> > +	int ieee80211_mode = IEEE80211_MODE_AP, err, i;
> 
> That i needs to be unsigned int (like it was in the function from which
> it was moved to here) to avoid a compiler warning.

ack, I will fix it

> 
> > +	u8 new_vht_oper_chwidth;
> 
> > +	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> > +	hostapd_set_oper_chwidth(iface->conf,
> > +				 hostapd_get_oper_chwidth(iface->conf));
> 
> This looks quite strange.. hostapd_dfs_start_channel_switch() used
> current_vht_oper_chwidth to store the current value from beginning of
> the function and restored it at this location. The new version in this
> helper function seems to something strange, or well, nothing. That does
> not feel correct.
> 
> >  static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
> >  {
> > -	unsigned int i;
> 
> That's where i was unsigned..
> 
> > -	u8 current_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> 
> And that's where the current value is picked at the beginning of
> hostapd_dfs_start_channel_switch().
> 
> > -	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> > -	hostapd_set_oper_chwidth(iface->conf, current_vht_oper_chwidth);
> 
> And this looks quite different compared to what was in the new helper
> function.

ack, I will fix it.

Regards,
Lorenzo

> 
> -- 
> Jouni Malinen                                            PGP id EFC895FA
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 8/9] DFS: switch to background radar channel if available
  2022-03-03 22:20   ` Jouni Malinen
@ 2022-03-04 13:46     ` Lorenzo Bianconi
  0 siblings, 0 replies; 19+ messages in thread
From: Lorenzo Bianconi @ 2022-03-04 13:46 UTC (permalink / raw)
  To: Jouni Malinen
  Cc: Lorenzo Bianconi, hostap, linux-wireless, nbd, ryder.lee, evelyn.tsai

[-- Attachment #1: Type: text/plain, Size: 1524 bytes --]

> On Mon, Dec 20, 2021 at 04:48:23PM +0100, Lorenzo Bianconi wrote:
> > On radar detection on the main chain switch to the channel monitored
> > by the background chain if we have already performed the CAC there.
> 
> Is it clear that the channel on the background chain, if one is
> available with CAC performed, comply with the ETSI uniform spreading
> requirements? The comment below feels a bit misleading, but the way
> patch 5/9 picks the channel for background CAC might be sufficient for
> this. If so, it would be good to note that in the comment here:

ack, got your point here. We should force channel_type to DFS_ANY_CHANNEL
for ETSI regdmain in hostpad_dfs_update_background_chain() and not just
DFS_NO_CAC_YET. I will fix it in next revision. Thanks.

Regards,
Lorenzo

> 
> > diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> > +hostapd_dfs_background_start_channel_switch(struct hostapd_iface *iface,
> 
> > +	/*
> > +	 * If background radar detection is supported and radar channel
> > +	 * monitored by background chain is available switch to it without
> > +	 * waiting for the CAC otherwise let's keep a random channel.
> 
> That first part leaves it a bit open whether the random channel part from
> the end of the sentence applies in practice for the new operating
> channel. It is important to make this clearly describe the functionality
> needed to meet uniform spreading requirement.
> 
> -- 
> Jouni Malinen                                            PGP id EFC895FA
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2022-03-04 13:46 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-20 15:48 [PATCH 0/9] introduce background radar detection support Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 1/9] Sync include/uapi/linux/nl80211.h with mac80211-next.git Lorenzo Bianconi
2022-03-03 21:58   ` Jouni Malinen
2021-12-20 15:48 ` [PATCH 2/9] DFS: introduce dfs_set_valid_channel utility routine Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 3/9] DFS: add capability select radar-only channels Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 4/9] nl80211: report background radar/cac detection capability Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 5/9] DFS: configure background radar/cac detection Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 6/9] DFS: introduce hostapd_dfs_request_channel_switch routine Lorenzo Bianconi
2022-03-03 22:54   ` Jouni Malinen
2022-03-04 11:52     ` Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 7/9] DFS: enable CSA for background radar detection Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 8/9] DFS: switch to background radar channel if available Lorenzo Bianconi
2022-03-03 22:20   ` Jouni Malinen
2022-03-04 13:46     ` Lorenzo Bianconi
2021-12-20 15:48 ` [PATCH 9/9] DFS: introduce radar_background parameter to config file Lorenzo Bianconi
2022-03-03 21:56   ` Jouni Malinen
2022-03-04 11:08     ` Lorenzo Bianconi
2022-03-03 23:19 ` [PATCH 0/9] introduce background radar detection support Jouni Malinen
2022-03-04  9:48   ` Lorenzo Bianconi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.