summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2023-03-21 18:05:03 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2023-03-28 09:46:11 +0200
commit1399aa925d1c0575886b71ec5b80561d35242e9a (patch)
tree7358dba34240e429f52c8283a390932e671f78a3
parentdf285b154e5b3f399c5ab8e3613adfcee2142150 (diff)
downloadNetworkManager-1399aa925d1c0575886b71ec5b80561d35242e9a.tar.gz
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.
-rw-r--r--src/core/devices/wifi/nm-device-wifi.c3
-rw-r--r--src/core/platform/nm-fake-platform.c2
-rw-r--r--src/libnm-platform/nm-linux-platform.c4
-rw-r--r--src/libnm-platform/nm-platform.c4
-rw-r--r--src/libnm-platform/nm-platform.h8
-rw-r--r--src/libnm-platform/wifi/nm-wifi-utils-nl80211.c4
-rw-r--r--src/libnm-platform/wifi/nm-wifi-utils-private.h5
-rw-r--r--src/libnm-platform/wifi/nm-wifi-utils-wext.c2
-rw-r--r--src/libnm-platform/wifi/nm-wifi-utils.c4
-rw-r--r--src/libnm-platform/wifi/nm-wifi-utils.h2
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 aad512ca9e..91e0554499 100644
--- a/src/core/devices/wifi/nm-device-wifi.c
+++ b/src/core/devices/wifi/nm-device-wifi.c
@@ -3234,7 +3234,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 0b9f62f638..5a16148514 100644
--- a/src/core/platform/nm-fake-platform.c
+++ b/src/core/platform/nm-fake-platform.c
@@ -897,7 +897,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 91b6f8841a..e4b558bca5 100644
--- a/src/libnm-platform/nm-linux-platform.c
+++ b/src/libnm-platform/nm-linux-platform.c
@@ -9406,11 +9406,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 d837f37411..779c5fba51 100644
--- a/src/libnm-platform/nm-platform.c
+++ b/src/libnm-platform/nm-platform.c
@@ -3252,14 +3252,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 86e01d63de..1fe0b3cbe7 100644
--- a/src/libnm-platform/nm-platform.h
+++ b/src/libnm-platform/nm-platform.h
@@ -1213,7 +1213,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,
@@ -2109,7 +2112,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