diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2023-03-28 10:02:23 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2023-03-28 10:02:23 +0200 |
commit | afd1a7b9a6284c61073881e6a0a9fbaa6b409b1f (patch) | |
tree | 2468ffc52b058c307771ecdb0d8d470e14481fdc | |
parent | 0a02995175e06e62924705393121a1c5efc3822d (diff) | |
parent | 231128d28d818da2273b99071c1212922222ca82 (diff) |
merge: branch 'bg/hotspot-fixes'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1578
-rw-r--r-- | src/core/devices/wifi/nm-device-wifi.c | 3 | ||||
-rw-r--r-- | src/core/platform/nm-fake-platform.c | 2 | ||||
-rw-r--r-- | src/libnm-platform/nm-linux-platform.c | 4 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.c | 4 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.h | 8 | ||||
-rw-r--r-- | src/libnm-platform/wifi/nm-wifi-utils-nl80211.c | 45 | ||||
-rw-r--r-- | src/libnm-platform/wifi/nm-wifi-utils-private.h | 5 | ||||
-rw-r--r-- | src/libnm-platform/wifi/nm-wifi-utils-wext.c | 2 | ||||
-rw-r--r-- | src/libnm-platform/wifi/nm-wifi-utils.c | 4 | ||||
-rw-r--r-- | src/libnm-platform/wifi/nm-wifi-utils.h | 2 | ||||
-rw-r--r-- | src/nmcli/devices.c | 23 |
11 files changed, 60 insertions, 42 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 c7ee0473de..beddaf2273 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 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 diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c index 6e7affdf18..7b9eeb56ff 100644 --- a/src/nmcli/devices.c +++ b/src/nmcli/devices.c @@ -4095,7 +4095,7 @@ generate_ssid_for_hotspot(void) return ssid_bytes; } -#define WPA_PASSKEY_SIZE 8 +#define WPA_PASSKEY_SIZE 12 static void generate_wpa_key(char *key, size_t len) { @@ -4104,14 +4104,14 @@ generate_wpa_key(char *key, size_t len) g_return_if_fail(key); g_return_if_fail(len > WPA_PASSKEY_SIZE); - /* generate a 8-chars ASCII WPA key */ for (i = 0; i < WPA_PASSKEY_SIZE; i++) { int c; do { - c = nm_random_u64_range_full(33, 126, TRUE); - /* too many non alphanumeric characters are hard to remember for humans */ - } while (g_ascii_isalnum(c)); + c = nm_random_u64_range_full(48, 122, TRUE); + /* skip characters that look similar */ + } while (NM_IN_SET(c, '1', 'l', 'I', '0', 'O', 'Q', '8', 'B', '5', 'S') + || !g_ascii_isalnum(c)); key[i] = (char) c; } @@ -4145,7 +4145,7 @@ set_wireless_security_for_hotspot(NMSettingWirelessSecurity *s_wsec, gboolean show_password, GError **error) { - char generated_key[11]; + char generated_key[20]; const char *key; const char *key_mgmt; @@ -4271,6 +4271,8 @@ create_hotspot_conn(const GPtrArray *connections, NMSettingIPConfig *s_ip4, *s_ip6; NMSettingProxy *s_proxy; + nm_assert(channel_int == -1 || band); + connection = nm_simple_connection_new(); s_con = (NMSettingConnection *) nm_setting_connection_new(); nm_connection_add_setting(connection, NM_SETTING(s_con)); @@ -4301,6 +4303,8 @@ create_hotspot_conn(const GPtrArray *connections, NM_SETTING_WIRELESS_BAND, band, NULL); + } else if (band) { + g_object_set(s_wifi, NM_SETTING_WIRELESS_BAND, band, NULL); } s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new(); @@ -4446,13 +4450,6 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char * if (nmc->complete) return; - /* Verify band and channel parameters */ - if (!channel) { - if (g_strcmp0(band, "bg") == 0) - channel = "1"; - if (g_strcmp0(band, "a") == 0) - channel = "7"; - } if (channel) { unsigned long int value; |