From 7982a3d2ebf3399dc122e77f0907f46ccb50c9e9 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 21 Mar 2023 18:05:03 +0100 Subject: [PATCH] wifi: skip no-ir channels when determining AP channel If the automatically selected channel for an AP is set as NO-IR in the current regulatory domain, the hotspot connection will fail to start. NO-IR means that any mechanisms that initiate radiation are not permitted on this channel, this includes sending probe requests or modes of operation that require beaconing such as AP. Skip channels with the NO-IR flag. (cherry picked from commit 1399aa925d1c0575886b71ec5b80561d35242e9a) --- src/core/devices/wifi/nm-device-wifi.c | 3 ++- src/core/platform/nm-fake-platform.c | 2 +- src/libnm-platform/nm-linux-platform.c | 4 ++-- src/libnm-platform/nm-platform.c | 4 ++-- src/libnm-platform/nm-platform.h | 8 ++++++-- src/libnm-platform/wifi/nm-wifi-utils-nl80211.c | 4 +++- src/libnm-platform/wifi/nm-wifi-utils-private.h | 5 +++-- src/libnm-platform/wifi/nm-wifi-utils-wext.c | 2 +- src/libnm-platform/wifi/nm-wifi-utils.c | 4 ++-- src/libnm-platform/wifi/nm-wifi-utils.h | 2 +- 10 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c index 171743d075..7b632f2792 100644 --- a/src/core/devices/wifi/nm-device-wifi.c +++ b/src/core/devices/wifi/nm-device-wifi.c @@ -3227,7 +3227,8 @@ ensure_hotspot_frequency(NMDeviceWifi *self, NMSettingWireless *s_wifi, NMWifiAP freq = nm_platform_wifi_find_frequency(nm_device_get_platform(device), nm_device_get_ifindex(device), - rnd_freqs); + rnd_freqs, + TRUE); if (freq == 0) freq = rnd_freqs[0]; diff --git a/src/core/platform/nm-fake-platform.c b/src/core/platform/nm-fake-platform.c index c92d9aef56..86d6bc5fcf 100644 --- a/src/core/platform/nm-fake-platform.c +++ b/src/core/platform/nm-fake-platform.c @@ -835,7 +835,7 @@ wifi_set_mode(NMPlatform *platform, int ifindex, _NM80211Mode mode) } static guint32 -wifi_find_frequency(NMPlatform *platform, int ifindex, const guint32 *freqs) +wifi_find_frequency(NMPlatform *platform, int ifindex, const guint32 *freqs, gboolean ap) { return freqs[0]; } diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index 30ad1275d8..049095b271 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -9291,11 +9291,11 @@ wifi_set_powersave(NMPlatform *platform, int ifindex, guint32 powersave) } static guint32 -wifi_find_frequency(NMPlatform *platform, int ifindex, const guint32 *freqs) +wifi_find_frequency(NMPlatform *platform, int ifindex, const guint32 *freqs, gboolean ap) { WIFI_GET_WIFI_DATA_NETNS(wifi_data, platform, ifindex, 0); - return nm_wifi_utils_find_freq(wifi_data, freqs); + return nm_wifi_utils_find_freq(wifi_data, freqs, ap); } static void diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index 2e9e940c2f..dc643ed213 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -3192,14 +3192,14 @@ nm_platform_wifi_set_powersave(NMPlatform *self, int ifindex, guint32 powersave) } guint32 -nm_platform_wifi_find_frequency(NMPlatform *self, int ifindex, const guint32 *freqs) +nm_platform_wifi_find_frequency(NMPlatform *self, int ifindex, const guint32 *freqs, gboolean ap) { _CHECK_SELF(self, klass, 0); g_return_val_if_fail(ifindex > 0, 0); g_return_val_if_fail(freqs != NULL, 0); - return klass->wifi_find_frequency(self, ifindex, freqs); + return klass->wifi_find_frequency(self, ifindex, freqs, ap); } void diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index 1cd9c6c6f9..ca6cdff8cb 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -1183,7 +1183,10 @@ typedef struct { _NM80211Mode (*wifi_get_mode)(NMPlatform *self, int ifindex); void (*wifi_set_mode)(NMPlatform *self, int ifindex, _NM80211Mode mode); void (*wifi_set_powersave)(NMPlatform *self, int ifindex, guint32 powersave); - guint32 (*wifi_find_frequency)(NMPlatform *self, int ifindex, const guint32 *freqs); + guint32 (*wifi_find_frequency)(NMPlatform *self, + int ifindex, + const guint32 *freqs, + gboolean ap); void (*wifi_indicate_addressing_running)(NMPlatform *self, int ifindex, gboolean running); _NMSettingWirelessWakeOnWLan (*wifi_get_wake_on_wlan)(NMPlatform *self, int ifindex); gboolean (*wifi_set_wake_on_wlan)(NMPlatform *self, @@ -2063,7 +2066,8 @@ gboolean nm_platform_wifi_get_station(NMPlatform *self, _NM80211Mode nm_platform_wifi_get_mode(NMPlatform *self, int ifindex); void nm_platform_wifi_set_mode(NMPlatform *self, int ifindex, _NM80211Mode mode); void nm_platform_wifi_set_powersave(NMPlatform *self, int ifindex, guint32 powersave); -guint32 nm_platform_wifi_find_frequency(NMPlatform *self, int ifindex, const guint32 *freqs); +guint32 +nm_platform_wifi_find_frequency(NMPlatform *self, int ifindex, const guint32 *freqs, gboolean ap); void nm_platform_wifi_indicate_addressing_running(NMPlatform *self, int ifindex, gboolean running); _NMSettingWirelessWakeOnWLan nm_platform_wifi_get_wake_on_wlan(NMPlatform *self, int ifindex); gboolean diff --git a/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c b/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c index d9b1c58b69..beddaf2273 100644 --- a/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c +++ b/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c @@ -385,7 +385,7 @@ wifi_nl80211_get_freq(NMWifiUtils *data) } static guint32 -wifi_nl80211_find_freq(NMWifiUtils *data, const guint32 *freqs) +wifi_nl80211_find_freq(NMWifiUtils *data, const guint32 *freqs, gboolean ap) { NMWifiUtilsNl80211 *self = (NMWifiUtilsNl80211 *) data; int i; @@ -397,6 +397,8 @@ wifi_nl80211_find_freq(NMWifiUtils *data, const guint32 *freqs) for (i = 0; i < self->num_freqs; i++) { if (self->freqs[i].disabled) continue; + if (ap && self->freqs[i].no_ir) + continue; if (self->freqs[i].freq == freqs[j]) return freqs[j]; } diff --git a/src/libnm-platform/wifi/nm-wifi-utils-private.h b/src/libnm-platform/wifi/nm-wifi-utils-private.h index 7fe157f206..8fa593c0ee 100644 --- a/src/libnm-platform/wifi/nm-wifi-utils-private.h +++ b/src/libnm-platform/wifi/nm-wifi-utils-private.h @@ -28,8 +28,9 @@ typedef struct { /* Return current frequency in MHz (really associated BSS frequency) */ guint32 (*get_freq)(NMWifiUtils *data); - /* Return first supported frequency in the zero-terminated list */ - guint32 (*find_freq)(NMWifiUtils *data, const guint32 *freqs); + /* Return first supported frequency in the zero-terminated list. @ap + * indicates that the frequency must be suited for AP mode. */ + guint32 (*find_freq)(NMWifiUtils *data, const guint32 *freqs, gboolean ap); /* * @out_bssid: must be NULL or an ETH_ALEN-byte buffer diff --git a/src/libnm-platform/wifi/nm-wifi-utils-wext.c b/src/libnm-platform/wifi/nm-wifi-utils-wext.c index eac3c929bc..0cc8b6a6fa 100644 --- a/src/libnm-platform/wifi/nm-wifi-utils-wext.c +++ b/src/libnm-platform/wifi/nm-wifi-utils-wext.c @@ -249,7 +249,7 @@ wifi_wext_get_freq(NMWifiUtils *data) } static guint32 -wifi_wext_find_freq(NMWifiUtils *data, const guint32 *freqs) +wifi_wext_find_freq(NMWifiUtils *data, const guint32 *freqs, gboolean ap) { NMWifiUtilsWext *wext = (NMWifiUtilsWext *) data; guint i; diff --git a/src/libnm-platform/wifi/nm-wifi-utils.c b/src/libnm-platform/wifi/nm-wifi-utils.c index 0238b74aa9..6f87e8c072 100644 --- a/src/libnm-platform/wifi/nm-wifi-utils.c +++ b/src/libnm-platform/wifi/nm-wifi-utils.c @@ -124,12 +124,12 @@ nm_wifi_utils_get_freq(NMWifiUtils *data) } guint32 -nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs) +nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs, gboolean ap) { g_return_val_if_fail(data != NULL, 0); g_return_val_if_fail(freqs != NULL, 0); - return NM_WIFI_UTILS_GET_CLASS(data)->find_freq(data, freqs); + return NM_WIFI_UTILS_GET_CLASS(data)->find_freq(data, freqs, ap); } gboolean diff --git a/src/libnm-platform/wifi/nm-wifi-utils.h b/src/libnm-platform/wifi/nm-wifi-utils.h index aa5a34cd06..84d724a57b 100644 --- a/src/libnm-platform/wifi/nm-wifi-utils.h +++ b/src/libnm-platform/wifi/nm-wifi-utils.h @@ -39,7 +39,7 @@ guint32 nm_wifi_utils_get_freq(NMWifiUtils *data); /* Return the first supported frequency in the zero-terminated list. * Frequencies are specified in MHz. */ -guint32 nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs); +guint32 nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs, gboolean ap); /* * @out_bssid: must be NULL or an ETH_ALEN-byte buffer