[PATCH] supplicant: skip NOP channels

Janusz Dziedzic janusz.dziedzic at gmail.com
Sun Feb 22 01:36:50 PST 2026


In case we have AP run:
 - on same phy that supplicant
 - on different phy in current system
respect unavailable (NOP) channels and
don't try to assoc using this channel,
after AP will detect RADAR on such channel.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic at gmail.com>
---
 wpa_supplicant/events.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 4372e24a8..9e5496d92 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1207,8 +1207,13 @@ int disabled_freq(struct wpa_supplicant *wpa_s, int freq)
 		for (i = 0; i < mode->num_channels; i++) {
 			struct hostapd_channel_data *chan = &mode->channels[i];
 
-			if (chan->freq == freq)
-				return !!(chan->flag & HOSTAPD_CHAN_DISABLED);
+			if (chan->freq == freq) {
+				if (chan->flag & HOSTAPD_CHAN_DISABLED)
+					return 1;
+				if ((chan->flag & HOSTAPD_CHAN_DFS_MASK) == HOSTAPD_CHAN_DFS_UNAVAILABLE)
+					return 2;
+				return 0;
+			}
 		}
 	}
 
@@ -1628,6 +1633,7 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
 	const u8 *match_ssid;
 	size_t match_ssid_len;
 	int bssid_ignore_count;
+	int ret;
 
 	ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
 	wpa_ie_len = ie ? ie[1] : 0;
@@ -1695,9 +1701,9 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
 		return NULL;
 	}
 
-	if (disabled_freq(wpa_s, bss->freq)) {
+	if ((ret = disabled_freq(wpa_s, bss->freq))) {
 		if (debug_print)
-			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - channel disabled");
+			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - channel %s", ret == 2 ? "unavailable (NOP)" : "disabled");
 		return NULL;
 	}
 
@@ -6941,20 +6947,26 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 		wpas_p2p_update_channel_list(wpa_s, WPAS_P2P_CHANNEL_UPDATE_CS);
 		wnm_clear_coloc_intf_reporting(wpa_s);
 		break;
+	case EVENT_DFS_RADAR_DETECTED:
 #ifdef CONFIG_AP
 #ifdef NEED_AP_MLME
-	case EVENT_DFS_RADAR_DETECTED:
 		if (data)
 			wpas_ap_event_dfs_radar_detected(wpa_s,
 							 &data->dfs_event);
+#endif /* NEED_AP_MLME */
+#endif /* CONFIG_AP */
+		wpa_supplicant_update_channel_list(wpa_s, NULL);
 		break;
 	case EVENT_DFS_NOP_FINISHED:
+#ifdef CONFIG_AP
+#ifdef NEED_AP_MLME
 		if (data)
 			wpas_ap_event_dfs_cac_nop_finished(wpa_s,
 							   &data->dfs_event);
-		break;
 #endif /* NEED_AP_MLME */
 #endif /* CONFIG_AP */
+		wpa_supplicant_update_channel_list(wpa_s, NULL);
+		break;
 	case EVENT_DFS_CAC_STARTED:
 		if (data)
 			wpas_event_dfs_cac_started(wpa_s, &data->dfs_event);
-- 
2.43.0




More information about the Hostap mailing list