@@ -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) {
@@ -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
@@ -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
@@ -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,