diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index d18f85599..b200ca010 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -22,6 +22,7 @@ #include "ap/ap_drv_ops.h" #include "ap/wps_hostapd.h" #include "ap/p2p_hostapd.h" +#include "ap/dfs.h" #include "eapol_supp/eapol_supp_sm.h" #include "rsn_supp/wpa.h" #include "wpa_supplicant_i.h" @@ -5927,11 +5928,22 @@ static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq, else ret = p2p_supported_freq_cli(wpa_s->global->p2p, freq); if (!ret) { - wpa_printf(MSG_DEBUG, "P2P: The forced channel " - "(%u MHz) is not supported for P2P uses", - freq); - res = -3; - goto exit_free; + if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && + ieee80211_is_dfs(freq)) { + /* + * If freq is a DFS channel and DFS is offloaded + * to the driver, allow P2P GO to use it. + */ + wpa_printf(MSG_DEBUG, + "P2P: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to the driver", + freq); + } else { + wpa_printf(MSG_DEBUG, + "P2P: The forced channel (%u MHz) is not supported for P2P uses", + freq); + res = -3; + goto exit_free; + } } for (i = 0; i < num; i++) { @@ -6302,6 +6314,17 @@ static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq) } if (freq > 0 && !p2p_supported_freq_go(wpa_s->global->p2p, freq)) { + if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && + ieee80211_is_dfs(freq)) { + /* + * If freq is a DFS channel and DFS is offloaded to the + * driver, allow P2P GO to use it. + */ + wpa_printf(MSG_DEBUG, "P2P: " + "%s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded", + __func__, freq); + return freq; + } wpa_printf(MSG_DEBUG, "P2P: The forced channel for GO " "(%u MHz) is not supported for P2P uses", freq); @@ -6583,10 +6606,21 @@ int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group, return -1; if (params.freq && !p2p_supported_freq_go(wpa_s->global->p2p, params.freq)) { - wpa_printf(MSG_DEBUG, "P2P: The selected channel for GO " - "(%u MHz) is not supported for P2P uses", - params.freq); - return -1; + if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && + ieee80211_is_dfs(params.freq)) { + /* + * If freq is a DFS channel and DFS is offloaded to the + * driver, allow P2P GO to use it. + */ + wpa_printf(MSG_DEBUG, + "P2P: %s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to driver", + __func__, params.freq); + } else { + wpa_printf(MSG_DEBUG, + "P2P: The selected channel for GO (%u MHz) is not supported for P2P uses", + params.freq); + return -1; + } } p2p_go_params(wpa_s->global->p2p, ¶ms); params.persistent_group = persistent_group;