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