[PATCH 8/9] DFS: switch to background radar channel if available
Lorenzo Bianconi
lorenzo at kernel.org
Mon Dec 20 07:48:23 PST 2021
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 at mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo at 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
More information about the Hostap
mailing list