summary refs log tree commit diff
path: root/src/libnm-platform
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2023-06-12 11:25:29 +0200
committerMichael Biebl <biebl@debian.org>2023-06-12 11:25:29 +0200
commit150fe9eef8dd22307ee16687509acde616663982 (patch)
tree200fa1178c9aeee2ff874bb63afe93623da4be0d /src/libnm-platform
parentdfaaf221cfee4ffcc507d793dae051d402646679 (diff)
New upstream version 1.42.6 upstream/1.42.6
Diffstat (limited to 'src/libnm-platform')
-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.c45
-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
8 files changed, 47 insertions, 27 deletions
diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c
index 30ad1275..049095b2 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 2e9e940c..dc643ed2 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 1cd9c6c6..ca6cdff8 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 c7ee0473..beddaf22 100644
--- a/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c
+++ b/src/libnm-platform/wifi/nm-wifi-utils-nl80211.c
@@ -42,9 +42,15 @@
     G_STMT_END
 
 typedef struct {
+    guint32 freq;
+    bool    disabled : 1;
+    bool    no_ir : 1;
+} Nl80211Freq;
+
+typedef struct {
     NMWifiUtils     parent;
     struct nl_sock *nl_sock;
-    guint32        *freqs;
+    Nl80211Freq    *freqs;
     int             num_freqs;
     int             phy;
     guint16         genl_family_id;
@@ -379,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;
@@ -389,7 +395,11 @@ wifi_nl80211_find_freq(NMWifiUtils *data, const guint32 *freqs)
      * that array might be sorted to contain preferred frequencies first. */
     for (j = 0; freqs[j] != 0; j++) {
         for (i = 0; i < self->num_freqs; i++) {
-            if (self->freqs[i] == freqs[j])
+            if (self->freqs[i].disabled)
+                continue;
+            if (ap && self->freqs[i].no_ir)
+                continue;
+            if (self->freqs[i].freq == freqs[j])
                 return freqs[j];
         }
     }
@@ -555,7 +565,7 @@ nla_put_failure:
 struct nl80211_device_info {
     NMWifiUtilsNl80211 *self;
     int                 phy;
-    guint32            *freqs;
+    Nl80211Freq        *freqs;
     int                 num_freqs;
     guint32             freq;
     guint32             caps;
@@ -657,40 +667,45 @@ nl80211_wiphy_info_handler(const struct nl_msg *msg, void *arg)
     /* Read supported frequencies */
     num_alloc       = 32;
     info->num_freqs = 0;
-    info->freqs     = g_new(guint32, num_alloc);
+    info->freqs     = g_new(Nl80211Freq, num_alloc);
 
     nla_for_each_nested (nl_band, tb[NL80211_ATTR_WIPHY_BANDS], rem_band) {
         if (nla_parse_nested_arr(tb_band, nl_band, NULL) < 0)
             return NL_SKIP;
 
         nla_for_each_nested (nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
+            Nl80211Freq *f;
+
             if (nla_parse_nested_arr(tb_freq, nl_freq, freq_policy) < 0)
                 continue;
 
             if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
                 continue;
 
-            if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
-                continue;
-
             if (info->num_freqs >= num_alloc) {
                 num_alloc *= 2;
-                info->freqs = g_renew(guint32, info->freqs, num_alloc);
+                info->freqs = g_renew(Nl80211Freq, info->freqs, num_alloc);
             }
 
-            info->freqs[info->num_freqs] = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
+            f  = &info->freqs[info->num_freqs];
+            *f = (Nl80211Freq){
+                .freq     = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]),
+                .disabled = !!tb_freq[NL80211_FREQUENCY_ATTR_DISABLED],
+                .no_ir    = !!tb_freq[NL80211_FREQUENCY_ATTR_NO_IR],
+            };
+
             info->caps |= _NM_WIFI_DEVICE_CAP_FREQ_VALID;
 
-            if (info->freqs[info->num_freqs] > 2400 && info->freqs[info->num_freqs] < 2500)
+            if (f->freq > 2400 && f->freq < 2500)
                 info->caps |= _NM_WIFI_DEVICE_CAP_FREQ_2GHZ;
-            if (info->freqs[info->num_freqs] > 4900 && info->freqs[info->num_freqs] < 6000)
+            if (f->freq > 4900 && f->freq < 6000)
                 info->caps |= _NM_WIFI_DEVICE_CAP_FREQ_5GHZ;
 
             info->num_freqs++;
         }
     }
 
-    info->freqs = g_renew(guint32, info->freqs, info->num_freqs);
+    info->freqs = g_renew(Nl80211Freq, info->freqs, info->num_freqs);
 
     /* Read security/encryption support */
     if (tb[NL80211_ATTR_CIPHER_SUITES]) {
@@ -769,7 +784,7 @@ wifi_nl80211_get_mesh_channel(NMWifiUtils *data)
     }
 
     for (i = 0; i < self->num_freqs; i++) {
-        if (device_info.freq == self->freqs[i])
+        if (device_info.freq == self->freqs[i].freq)
             return i + 1;
     }
     return 0;
@@ -786,7 +801,7 @@ wifi_nl80211_set_mesh_channel(NMWifiUtils *data, guint32 channel)
         return FALSE;
 
     msg = nl80211_alloc_msg(self, NL80211_CMD_SET_WIPHY, 0);
-    NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, self->freqs[channel - 1]);
+    NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, self->freqs[channel - 1].freq);
     err = nl80211_send_and_recv(self, msg, NULL, NULL);
     return err >= 0;
 
diff --git a/src/libnm-platform/wifi/nm-wifi-utils-private.h b/src/libnm-platform/wifi/nm-wifi-utils-private.h
index 7fe157f2..8fa593c0 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 eac3c929..0cc8b6a6 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 0238b74a..6f87e8c0 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 aa5a34cd..84d724a5 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