diff --git a/man/nmcli.xml b/man/nmcli.xml
index 7bce0de737..5c6d6d3e78 100644
--- a/man/nmcli.xml
+++ b/man/nmcli.xml
@@ -1718,6 +1718,7 @@
a
bg
+ 6GHz
channel
diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c
index 9ca4cdd3af..ef909ebb4e 100644
--- a/src/core/devices/wifi/nm-device-wifi.c
+++ b/src/core/devices/wifi/nm-device-wifi.c
@@ -3257,8 +3257,10 @@ act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
static void
ensure_hotspot_frequency(NMDeviceWifi *self, NMSettingWireless *s_wifi, NMWifiAP *ap)
{
- guint32 a_freqs[] = {5180, 5200, 5220, 5745, 5765, 5785, 5805, 0};
- guint32 bg_freqs[] = {2412, 2437, 2462, 2472, 0};
+ guint32 freqs_a[] = {5180, 5200, 5220, 5745, 5765, 5785, 5805, 0};
+ guint32 freqs_bg[] = {2412, 2437, 2462, 2472, 0};
+ guint32 freqs_6ghz[] =
+ {5955, 5975, 5995, 6015, 6035, 6055, 6075, 6095, 6755, 6775, 6795, 6815, 0};
guint32 *rnd_freqs;
guint rnd_freqs_len;
NMDevice *device = NM_DEVICE(self);
@@ -3269,7 +3271,7 @@ ensure_hotspot_frequency(NMDeviceWifi *self, NMSettingWireless *s_wifi, NMWifiAP
guint l;
nm_assert(ap);
- nm_assert(NM_IN_STRSET(band, NULL, "a", "bg"));
+ nm_assert(NM_IN_STRSET(band, NULL, "a", "bg", "6GHz"));
if (nm_wifi_ap_get_freq(ap))
return;
@@ -3303,11 +3305,14 @@ ensure_hotspot_frequency(NMDeviceWifi *self, NMSettingWireless *s_wifi, NMWifiAP
}
if (nm_streq0(band, "a")) {
- rnd_freqs = a_freqs;
- rnd_freqs_len = G_N_ELEMENTS(a_freqs) - 1;
+ rnd_freqs = freqs_a;
+ rnd_freqs_len = G_N_ELEMENTS(freqs_a) - 1;
+ } else if (nm_streq0(band, "6GHz")) {
+ rnd_freqs = freqs_6ghz;
+ rnd_freqs_len = G_N_ELEMENTS(freqs_6ghz) - 1;
} else {
- rnd_freqs = bg_freqs;
- rnd_freqs_len = G_N_ELEMENTS(bg_freqs) - 1;
+ rnd_freqs = freqs_bg;
+ rnd_freqs_len = G_N_ELEMENTS(freqs_bg) - 1;
}
/* shuffle the frequencies (inplace). The idea is to choose
diff --git a/src/core/devices/wifi/nm-wifi-ap.c b/src/core/devices/wifi/nm-wifi-ap.c
index ceb954b797..e22795acc7 100644
--- a/src/core/devices/wifi/nm-wifi-ap.c
+++ b/src/core/devices/wifi/nm-wifi-ap.c
@@ -574,16 +574,6 @@ nm_wifi_ap_to_string(const NMWifiAP *self, char *str_buf, gulong buf_len, gint64
return str_buf;
}
-static guint
-freq_to_band(guint32 freq)
-{
- if (freq >= 4915 && freq <= 5825)
- return 5;
- else if (freq >= 2412 && freq <= 2484)
- return 2;
- return 0;
-}
-
gboolean
nm_wifi_ap_check_compatible(NMWifiAP *self, NMConnection *connection)
{
@@ -631,12 +621,12 @@ nm_wifi_ap_check_compatible(NMWifiAP *self, NMConnection *connection)
band = nm_setting_wireless_get_band(s_wireless);
if (band) {
- guint ap_band = freq_to_band(priv->freq);
+ const char *ap_band = nm_utils_wifi_freq_to_band(priv->freq);
- if (!strcmp(band, "a") && ap_band != 5)
- return FALSE;
- else if (!strcmp(band, "bg") && ap_band != 2)
+ if (!nm_streq(band, ap_band))
return FALSE;
+
+ return TRUE;
}
channel = nm_setting_wireless_get_channel(s_wireless);
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index 728dccac99..6312154ccc 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -4401,7 +4401,7 @@ make_wireless_setting(shvarFile *ifcfg, GError **error)
NMSettingWireless *s_wireless;
const char *cvalue;
char *value = NULL;
- gint64 chan = 0;
+ guint64 chan = 0;
NMSettingMacRandomization mac_randomization;
NMSettingWirelessPowersave powersave = NM_SETTING_WIRELESS_POWERSAVE_DEFAULT;
NMTernary ternary;
@@ -4502,7 +4502,7 @@ make_wireless_setting(shvarFile *ifcfg, GError **error)
value = svGetValueStr_cp(ifcfg, "CHANNEL");
if (value) {
- chan = _nm_utils_ascii_str_to_int64(value, 10, 1, 196, 0);
+ chan = _nm_utils_ascii_str_to_int64(value, 10, 1, _NM_WIFI_CHANNEL_MAX, 0);
if (chan == 0) {
g_set_error(error,
NM_SETTINGS_ERROR,
@@ -4518,44 +4518,47 @@ make_wireless_setting(shvarFile *ifcfg, GError **error)
value = svGetValueStr_cp(ifcfg, "BAND");
if (value) {
- if (!strcmp(value, "a")) {
- if (chan && chan <= 14) {
- g_set_error(error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "Band '%s' invalid for channel %u",
- value,
- (guint32) chan);
- g_free(value);
- goto error;
- }
- } else if (!strcmp(value, "bg")) {
- if (chan && chan > 14) {
- g_set_error(error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "Band '%s' invalid for channel %u",
- value,
- (guint32) chan);
- g_free(value);
- goto error;
- }
- } else {
+ if (!NM_IN_STRSET(value, "a", "bg", "6GHz")) {
g_set_error(error,
NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "Invalid wireless band '%s'",
+ "Band '%s' invalid",
value);
g_free(value);
goto error;
}
+
+ if (chan) {
+ if (!nm_utils_wifi_is_channel_valid(chan, value)) {
+ g_set_error(error,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "Band '%s' invalid for channel %u",
+ value,
+ (guint32) chan);
+ g_free(value);
+ goto error;
+ }
+ }
+
g_object_set(s_wireless, NM_SETTING_WIRELESS_BAND, value, NULL);
g_free(value);
} else if (chan > 0) {
- if (chan > 14)
+ if (chan > _NM_WIFI_CHANNEL_MAX_5GHZ) {
+ g_set_error(error,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "Setting channel without band is ambiguous and deprecated. Not supported "
+ "for 6GHz.");
+ g_free(value);
+ goto error;
+ } else if (chan > _NM_WIFI_CHANNEL_MAX_2GHZ) {
+ PARSE_WARNING(
+ "Setting channel without band is ambiguous and deprecated. Assuming band 'a'.");
g_object_set(s_wireless, NM_SETTING_WIRELESS_BAND, "a", NULL);
- else
+ } else {
g_object_set(s_wireless, NM_SETTING_WIRELESS_BAND, "bg", NULL);
+ }
}
value = svGetValueStr_cp(ifcfg, "MTU");
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index 21908090f7..b71c6faeda 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -849,7 +849,7 @@ write_wireless_setting(NMConnection *connection,
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
- const char *mode, *bssid;
+ const char *mode, *bssid, *band;
const char *device_mac, *cloned_mac;
guint32 mtu, chan, i;
gboolean adhoc = FALSE, hex_ssid = FALSE;
@@ -968,9 +968,11 @@ write_wireless_setting(NMConnection *connection,
chan = nm_setting_wireless_get_channel(s_wireless);
if (chan) {
svSetValueInt64(ifcfg, "CHANNEL", chan);
- } else {
- /* Band only set if channel is not, since channel implies band */
- svSetValueStr(ifcfg, "BAND", nm_setting_wireless_get_band(s_wireless));
+ }
+
+ band = nm_setting_wireless_get_band(s_wireless);
+ if (band) {
+ svSetValueStr(ifcfg, "BAND", band);
}
bssid = nm_setting_wireless_get_bssid(s_wireless);
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
index caeaaff81a..8199a9b497 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
@@ -1,6 +1,7 @@
ESSID=MySSID
MODE=Ap
-CHANNEL=196
+CHANNEL=52
+BAND=a
MAC_ADDRESS_RANDOMIZATION=default
AP_ISOLATION=yes
TYPE=Wireless
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_6ghz.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_6ghz.cexpected
new file mode 100644
index 0000000000..d8ffe48e07
--- /dev/null
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_6ghz.cexpected
@@ -0,0 +1,18 @@
+ESSID="Test SSID"
+MODE=Managed
+BAND=6GHz
+MAC_ADDRESS_RANDOMIZATION=default
+TYPE=Wireless
+PROXY_METHOD=none
+BROWSER_ONLY=no
+BOOTPROTO=dhcp
+DEFROUTE=yes
+IPV4_FAILURE_FATAL=no
+IPV6INIT=yes
+IPV6_AUTOCONF=yes
+IPV6_DEFROUTE=yes
+IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=default
+NAME="Test Write Wi-Fi Band 6GHz"
+UUID=${UUID}
+ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_a.cexpected
similarity index 88%
rename from src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected
rename to src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_a.cexpected
index 7e3d4f020d..90570ea33f 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_a.cexpected
@@ -13,6 +13,6 @@ IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=default
-NAME="Test Write Wi-Fi Band A"
+NAME="Test Write Wi-Fi Band A - 5GHz"
UUID=${UUID}
ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz
new file mode 100644
index 0000000000..803ca19b99
--- /dev/null
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz
@@ -0,0 +1,13 @@
+TYPE=Wireless
+DEVICE=eth2
+HWADDR=00:16:41:11:22:33
+NM_CONTROLLED=yes
+BOOTPROTO=dhcp
+ESSID=blahblah
+BAND=6GHz
+MODE=Managed
+RATE=auto
+ONBOOT=yes
+USERCTL=yes
+PEERDNS=yes
+IPV6INIT=no
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz-channel-mismatch b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz-channel-mismatch
new file mode 100644
index 0000000000..26fc29fe98
--- /dev/null
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-6ghz-channel-mismatch
@@ -0,0 +1,9 @@
+TYPE=Wireless
+DEVICE=eth2
+HWADDR=00:16:41:11:22:33
+BOOTPROTO=dhcp
+ESSID=blahblah
+CHANNEL=14
+BAND=6GHz
+MODE=Managed
+
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
index 2f3035ef7a..f5f80ed8c3 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
+++ b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
@@ -3991,7 +3991,7 @@ test_write_wifi_band_a(void)
s_con = _nm_connection_new_setting(connection, NM_TYPE_SETTING_CONNECTION);
g_object_set(s_con,
NM_SETTING_CONNECTION_ID,
- "Test Write Wi-Fi Band A",
+ "Test Write Wi-Fi Band A - 5GHz",
NM_SETTING_CONNECTION_UUID,
nm_uuid_generate_random_str_a(),
NM_SETTING_CONNECTION_TYPE,
@@ -4012,7 +4012,7 @@ test_write_wifi_band_a(void)
_writer_new_connec_exp(connection,
TEST_SCRATCH_DIR,
- TEST_IFCFG_DIR "/ifcfg-Test_Write_WiFi_Band_A.cexpected",
+ TEST_IFCFG_DIR "/ifcfg-Test_Write_WiFi_Band_a.cexpected",
&testfile);
f = _svOpenFile(testfile);
@@ -4024,6 +4024,77 @@ test_write_wifi_band_a(void)
nmtst_assert_connection_equals(connection, TRUE, reread, FALSE);
}
+static void
+test_read_wifi_band_6ghz(void)
+{
+ gs_unref_object NMConnection *connection = NULL;
+ NMSettingConnection *s_con;
+ NMSettingWireless *s_wifi;
+
+ connection = _connection_from_file(TEST_IFCFG_DIR "/ifcfg-test-wifi-band-6ghz",
+ NULL,
+ TYPE_WIRELESS,
+ NULL);
+
+ s_con = nmtst_connection_assert_setting(connection, NM_TYPE_SETTING_CONNECTION);
+ g_assert_cmpstr(nm_setting_connection_get_connection_type(s_con),
+ ==,
+ NM_SETTING_WIRELESS_SETTING_NAME);
+
+ s_wifi = nmtst_connection_assert_setting(connection, NM_TYPE_SETTING_WIRELESS);
+ g_assert_cmpstr(nm_setting_wireless_get_band(s_wifi), ==, "6GHz");
+}
+
+static void
+test_write_wifi_band_6ghz(void)
+{
+ nmtst_auto_unlinkfile char *testfile = NULL;
+ gs_unref_object NMConnection *connection = NULL;
+ gs_unref_object NMConnection *reread = NULL;
+ NMSettingConnection *s_con;
+ NMSettingWireless *s_wifi;
+ shvarFile *f;
+ gs_unref_bytes GBytes *ssid =
+ nmtst_gbytes_from_arr(0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x53, 0x49, 0x44);
+
+ connection = nm_simple_connection_new();
+
+ s_con = _nm_connection_new_setting(connection, NM_TYPE_SETTING_CONNECTION);
+ g_object_set(s_con,
+ NM_SETTING_CONNECTION_ID,
+ "Test Write Wi-Fi Band 6GHz",
+ NM_SETTING_CONNECTION_UUID,
+ nm_uuid_generate_random_str_a(),
+ NM_SETTING_CONNECTION_TYPE,
+ NM_SETTING_WIRELESS_SETTING_NAME,
+ NULL);
+
+ s_wifi = _nm_connection_new_setting(connection, NM_TYPE_SETTING_WIRELESS);
+ g_object_set(s_wifi,
+ NM_SETTING_WIRELESS_SSID,
+ ssid,
+ NM_SETTING_WIRELESS_MODE,
+ "infrastructure",
+ NM_SETTING_WIRELESS_BAND,
+ "6GHz",
+ NULL);
+
+ nmtst_assert_connection_verifies(connection);
+
+ _writer_new_connec_exp(connection,
+ TEST_SCRATCH_DIR,
+ TEST_IFCFG_DIR "/ifcfg-Test_Write_WiFi_Band_6ghz.cexpected",
+ &testfile);
+
+ f = _svOpenFile(testfile);
+ _svGetValue_check(f, "BAND", "6GHz");
+ svCloseFile(f);
+
+ reread = _connection_from_file(testfile, NULL, TYPE_WIRELESS, NULL);
+
+ nmtst_assert_connection_equals(connection, TRUE, reread, FALSE);
+}
+
static void
test_write_wifi_ap_mode(void)
{
@@ -4055,7 +4126,7 @@ test_write_wifi_ap_mode(void)
NM_SETTING_WIRELESS_BAND,
"a",
NM_SETTING_WIRELESS_CHANNEL,
- (guint) 196,
+ (guint) 52,
NM_SETTING_WIRELESS_AP_ISOLATION,
NM_TERNARY_TRUE,
NULL);
@@ -4072,6 +4143,18 @@ test_write_wifi_ap_mode(void)
nmtst_assert_connection_equals(connection, TRUE, reread, FALSE);
}
+static void
+test_read_wifi_band_6ghz_channel_mismatch(void)
+{
+ gs_free_error GError *error = NULL;
+
+ _connection_from_file_fail(TEST_IFCFG_DIR "/ifcfg-test-wifi-band-6ghz-channel-mismatch",
+ NULL,
+ TYPE_WIRELESS,
+ &error);
+ g_assert_error(error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION);
+}
+
static void
test_read_wifi_band_a_channel_mismatch(void)
{
@@ -10680,6 +10763,9 @@ main(int argc, char **argv)
test_read_wifi_band_a_channel_mismatch);
g_test_add_func(TPATH "wifi/read-band-bg-channel-mismatch",
test_read_wifi_band_bg_channel_mismatch);
+ g_test_add_func(TPATH "wifi/read-band-6ghz", test_read_wifi_band_6ghz);
+ g_test_add_func(TPATH "wifi/read-band-6ghz-channel-mismatch",
+ test_read_wifi_band_6ghz_channel_mismatch);
g_test_add_func(TPATH "wifi/read-hidden", test_read_wifi_hidden);
nmtst_add_test_func(TPATH "wifi/read-mac-random-always",
@@ -10852,6 +10938,7 @@ main(int argc, char **argv)
test_write_wifi_wpa_then_wep_with_perms);
g_test_add_func(TPATH "wifi/write-hidden", test_write_wifi_hidden);
g_test_add_func(TPATH "wifi/write-band-a", test_write_wifi_band_a);
+ g_test_add_func(TPATH "wifi/write-band-6ghz", test_write_wifi_band_6ghz);
g_test_add_func(TPATH "wifi/write-ap-mode", test_write_wifi_ap_mode);
g_test_add_func(TPATH "s390/read-qeth-static", test_read_wired_qeth_static);
diff --git a/src/core/supplicant/nm-supplicant-config.c b/src/core/supplicant/nm-supplicant-config.c
index aad85dad6c..93ab0e8034 100644
--- a/src/core/supplicant/nm-supplicant-config.c
+++ b/src/core/supplicant/nm-supplicant-config.c
@@ -363,14 +363,24 @@ nm_supplicant_config_get_blobs(NMSupplicantConfig *self)
}
static const char *
-wifi_freqs_to_string(gboolean bg_band)
+wifi_freqs_to_string(const char *band)
{
static const char *str_2ghz = NULL;
static const char *str_5ghz = NULL;
+ static const char *str_6ghz = NULL;
const char **f_p;
const char *f;
- f_p = bg_band ? &str_2ghz : &str_5ghz;
+ if (nm_streq0(band, "a"))
+ f_p = &str_5ghz;
+ else if (nm_streq0(band, "bg"))
+ f_p = &str_2ghz;
+ else if (nm_streq0(band, "6GHz"))
+ f_p = &str_6ghz;
+ else {
+ nm_assert_not_reached();
+ return NULL;
+ }
again:
f = g_atomic_pointer_get(f_p);
@@ -380,7 +390,13 @@ again:
const guint *freqs;
int i;
- freqs = bg_band ? nm_utils_wifi_2ghz_freqs() : nm_utils_wifi_5ghz_freqs();
+ if (f_p == &str_2ghz)
+ freqs = nm_utils_wifi_2ghz_freqs();
+ else if (f_p == &str_5ghz)
+ freqs = nm_utils_wifi_5ghz_freqs();
+ else
+ freqs = nm_utils_wifi_6ghz_freqs();
+
for (i = 0; freqs[i]; i++) {
if (i > 0)
nm_str_buf_append_c(&strbuf, ' ');
@@ -523,38 +539,47 @@ get_ap_params(guint freq,
guint channel;
guint center_channel = 0;
- if (freq < 5000) {
- /* the setting is not valid */
- nm_assert_not_reached();
- return;
- }
-
/* Determine the center channel according to the table at
* https://en.wikipedia.org/wiki/List_of_WLAN_channels */
- channel = (freq - 5000) / 5;
+ if (freq > 5950) {
+ /* 6 GHz */
+ channel = (freq - 5950) / 5;
+ channel = ((channel - 1) / 16) * 16 + 7;
- if (channel >= 36 && channel <= 48)
- center_channel = 42;
- else if (channel >= 52 && channel <= 64)
- center_channel = 58;
- else if (channel >= 100 && channel <= 112)
- center_channel = 106;
- else if (channel >= 116 && channel <= 128)
- center_channel = 122;
- else if (channel >= 132 && channel <= 144)
- center_channel = 138;
- else if (channel >= 149 && channel <= 161)
- center_channel = 155;
- else if (channel >= 165 && channel <= 177)
- center_channel = 171;
-
- if (center_channel) {
*out_ht40 = 1;
*out_max_oper_chwidth = 1;
- *out_center_freq = 5000 + 5 * center_channel;
- }
+ *out_center_freq = 5950 + 5 * channel;
+ } else {
+ /* 5 GHz */
+ if (freq < 5000) {
+ /* the setting is not valid */
+ nm_assert_not_reached();
+ return;
+ }
+ channel = (freq - 5000) / 5;
+ if (channel >= 36 && channel <= 48)
+ center_channel = 42;
+ else if (channel >= 52 && channel <= 64)
+ center_channel = 58;
+ else if (channel >= 100 && channel <= 112)
+ center_channel = 106;
+ else if (channel >= 116 && channel <= 128)
+ center_channel = 122;
+ else if (channel >= 132 && channel <= 144)
+ center_channel = 138;
+ else if (channel >= 149 && channel <= 161)
+ center_channel = 155;
+ else if (channel >= 165 && channel <= 177)
+ center_channel = 171;
+
+ if (center_channel) {
+ *out_ht40 = 1;
+ *out_max_oper_chwidth = 1;
+ *out_center_freq = 5000 + 5 * center_channel;
+ }
+ }
return;
}
@@ -701,10 +726,7 @@ nm_supplicant_config_add_setting_wireless(NMSupplicantConfig *self,
} else {
const char *freqs = NULL;
- if (nm_streq(band, "a"))
- freqs = wifi_freqs_to_string(FALSE);
- else if (nm_streq(band, "bg"))
- freqs = wifi_freqs_to_string(TRUE);
+ freqs = wifi_freqs_to_string(band);
if (freqs
&& !nm_supplicant_config_add_option(self,
diff --git a/src/core/supplicant/nm-supplicant-settings-verify.c b/src/core/supplicant/nm-supplicant-settings-verify.c
index cca53d820f..a1f888ec54 100644
--- a/src/core/supplicant/nm-supplicant-settings-verify.c
+++ b/src/core/supplicant/nm-supplicant-settings-verify.c
@@ -6,6 +6,7 @@
#include "src/core/nm-default-daemon.h"
#include "nm-supplicant-settings-verify.h"
+#include "libnm-core-aux-intern/nm-libnm-core-utils.h"
#include
#include
@@ -71,7 +72,7 @@ static const struct Opt opt_table[] = {
OPT_BYTES("engine_id", 0),
OPT_INT("fragment_size", 1, 2000),
OPT_KEYWORD("freq_list", NULL),
- OPT_INT("frequency", 2412, 5825),
+ OPT_INT("frequency", _NM_WIFI_FREQ_MIN, _NM_WIFI_FREQ_MAX),
OPT_KEYWORD("group", NM_MAKE_STRV("CCMP", "TKIP", "WEP104", "WEP40", "GCMP-256", )),
OPT_INT("ht40", 0, 1),
OPT_BYTES("identity", 0),
diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver
index ed5901d79f..0f68d5f6d0 100644
--- a/src/libnm-client-impl/libnm.ver
+++ b/src/libnm-client-impl/libnm.ver
@@ -2093,3 +2093,8 @@ global:
nm_utils_copy_cert_as_user;
nm_vpn_plugin_info_supports_safe_private_file_access;
} libnm_1_54_0;
+
+libnm_1_58_0 {
+global:
+ nm_utils_wifi_6ghz_freqs;
+} libnm_1_56_0;
\ No newline at end of file
diff --git a/src/libnm-client-impl/nm-access-point.c b/src/libnm-client-impl/nm-access-point.c
index a06bee4846..994c7a0f1a 100644
--- a/src/libnm-client-impl/nm-access-point.c
+++ b/src/libnm-client-impl/nm-access-point.c
@@ -18,6 +18,7 @@
#include "nm-dbus-interface.h"
#include "nm-object-private.h"
+#include "libnm-core-aux-intern/nm-libnm-core-utils.h"
/*****************************************************************************/
@@ -338,11 +339,14 @@ nm_access_point_connection_valid(NMAccessPoint *ap, NMConnection *connection)
ap_freq = nm_access_point_get_frequency(ap);
if (ap_freq) {
setting_band = nm_setting_wireless_get_band(s_wifi);
- if (g_strcmp0(setting_band, "a") == 0) {
- if (ap_freq < 4915 || ap_freq > 5825)
+ if (nm_streq0(setting_band, "a")) {
+ if (ap_freq < _NM_WIFI_FREQ_MIN_5GHZ || ap_freq > _NM_WIFI_FREQ_MAX_5GHZ)
return FALSE;
- } else if (g_strcmp0(setting_band, "bg") == 0) {
- if (ap_freq < 2412 || ap_freq > 2484)
+ } else if (nm_streq0(setting_band, "bg")) {
+ if (ap_freq < _NM_WIFI_FREQ_MIN_2GHZ || ap_freq > _NM_WIFI_FREQ_MAX_2GHZ)
+ return FALSE;
+ } else if (nm_streq0(setting_band, "6Ghz")) {
+ if (ap_freq < _NM_WIFI_FREQ_MIN_6GHZ || ap_freq > _NM_WIFI_FREQ_MAX_6GHZ)
return FALSE;
}
diff --git a/src/libnm-core-aux-intern/nm-libnm-core-utils.h b/src/libnm-core-aux-intern/nm-libnm-core-utils.h
index 0e75982ecc..c6bdb676f8 100644
--- a/src/libnm-core-aux-intern/nm-libnm-core-utils.h
+++ b/src/libnm-core-aux-intern/nm-libnm-core-utils.h
@@ -342,4 +342,23 @@ const char *nm_dns_uri_normalize(int addr_family, const char *str, char **out_fr
gboolean nm_setting_ovs_other_config_check_key(const char *key, GError **error);
gboolean nm_setting_ovs_other_config_check_val(const char *val, GError **error);
+/*****************************************************************************/
+
+/* Wi-Fi frequencies range for each band */
+#define _NM_WIFI_FREQ_MIN_2GHZ 2412
+#define _NM_WIFI_FREQ_MAX_2GHZ 2484
+#define _NM_WIFI_FREQ_MIN_5GHZ 4915
+#define _NM_WIFI_FREQ_MAX_5GHZ 5885
+#define _NM_WIFI_FREQ_MIN_6GHZ 5955
+#define _NM_WIFI_FREQ_MAX_6GHZ 7115
+
+#define _NM_WIFI_FREQ_MIN _NM_WIFI_FREQ_MIN_2GHZ
+#define _NM_WIFI_FREQ_MAX _NM_WIFI_FREQ_MAX_6GHZ
+
+/* Max Wi-Fi channel for each band */
+#define _NM_WIFI_CHANNEL_MAX_2GHZ 14
+#define _NM_WIFI_CHANNEL_MAX_5GHZ 177
+#define _NM_WIFI_CHANNEL_MAX_6GHZ 233
+#define _NM_WIFI_CHANNEL_MAX _NM_WIFI_CHANNEL_MAX_6GHZ
+
#endif /* __NM_LIBNM_SHARED_UTILS_H__ */
diff --git a/src/libnm-core-impl/nm-setting-wireless.c b/src/libnm-core-impl/nm-setting-wireless.c
index 1c5486bfb3..1522ea8512 100644
--- a/src/libnm-core-impl/nm-setting-wireless.c
+++ b/src/libnm-core-impl/nm-setting-wireless.c
@@ -1086,7 +1086,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
NM_SETTING_WIRELESS_MODE_AP,
NM_SETTING_WIRELESS_MODE_MESH,
NULL};
- const char *valid_bands[] = {"a", "bg", NULL};
+ const char *valid_bands[] = {"a", "bg", "6GHz", NULL};
guint i;
gsize length;
GError *local = NULL;
@@ -1363,11 +1363,11 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
}
if (priv->channel_width == NM_SETTING_WIRELESS_CHANNEL_WIDTH_80MHZ
- && !nm_streq0(priv->band, "a")) {
+ && !NM_IN_STRSET(priv->band, "a", "6GHz")) {
g_set_error_literal(error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("80MHz channels are only supported in the 5GHz band"));
+ _("80MHz channels are only supported in the 'a' and '6GHz' bands"));
g_prefix_error(error,
"%s.%s: ",
NM_SETTING_WIRELESS_SETTING_NAME,
@@ -1636,17 +1636,18 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
/**
* NMSettingWireless:band:
*
- * 802.11 frequency band of the network. One of "a" for 5GHz 802.11a or
- * "bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network
- * to the specific band, i.e. if "a" is specified, the device will not
- * associate with the same network in the 2.4GHz band even if the network's
- * settings are compatible. This setting depends on specific driver
- * capability and may not work with all drivers.
+ * 802.11 frequency band of the network. One of "a" for 5GHz,
+ * "bg" for 2.4GHz or "6GHz". This will lock associations to the
+ * Wi-Fi network to the specific band, i.e. if "a" is specified,
+ * the device will not associate with the same network in the
+ * 2.4GHz (bg) or 6GHz bands even if the network's settings are
+ * compatible. This setting depends on specific driver capability
+ * and may not work with all drivers.
**/
/* ---ifcfg-rh---
* property: band
* variable: BAND(+)
- * values: a, bg
+ * values: a, bg, 6GHz
* description: BAND alone is honored, but CHANNEL overrides BAND since it
* implies a band.
* example: BAND=bg
@@ -1673,8 +1674,6 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
* property: channel
* variable: CHANNEL
* description: Channel used for the Wi-Fi communication.
- * Channels greater than 14 mean "a" band, otherwise the
- * band is "bg".
* example: CHANNEL=6
* ---end---
*/
diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c
index 1bf00831f9..1b454cdea2 100644
--- a/src/libnm-core-impl/nm-utils.c
+++ b/src/libnm-core-impl/nm-utils.c
@@ -25,6 +25,7 @@
#include "libnm-glib-aux/nm-time-utils.h"
#include "libnm-glib-aux/nm-secret-utils.h"
#include "libnm-core-aux-intern/nm-common-macros.h"
+#include "libnm-core-aux-intern/nm-libnm-core-utils.h"
#include "nm-utils-private.h"
#include "nm-setting-private.h"
#include "nm-setting-bond.h"
@@ -3697,25 +3698,8 @@ struct cf_pair {
guint32 freq;
};
-static const struct cf_pair a_table[] = {
- /* A band */
- {7, 5035}, {8, 5040}, {9, 5045}, {11, 5055}, {12, 5060}, {16, 5080}, {34, 5170},
- {36, 5180}, {38, 5190}, {40, 5200}, {42, 5210}, {44, 5220}, {46, 5230}, {48, 5240},
- {50, 5250}, {52, 5260}, {56, 5280}, {58, 5290}, {60, 5300}, {64, 5320}, {100, 5500},
- {104, 5520}, {108, 5540}, {112, 5560}, {116, 5580}, {120, 5600}, {124, 5620}, {128, 5640},
- {132, 5660}, {136, 5680}, {140, 5700}, {149, 5745}, {152, 5760}, {153, 5765}, {157, 5785},
- {160, 5800}, {161, 5805}, {165, 5825}, {183, 4915}, {184, 4920}, {185, 4925}, {187, 4935},
- {188, 4945}, {192, 4960}, {196, 4980}, {0, 0}};
-
-static const guint a_table_freqs[G_N_ELEMENTS(a_table)] = {
- /* A band */
- 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240, 5250, 5260,
- 5280, 5290, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680, 5700, 5745,
- 5760, 5765, 5785, 5800, 5805, 5825, 4915, 4920, 4925, 4935, 4945, 4960, 4980, 0,
-};
-
-static const struct cf_pair bg_table[] = {
- /* B/G band */
+static const struct cf_pair table_2ghz[] = {
+ /* 2.4GHz band */
{1, 2412},
{2, 2417},
{3, 2422},
@@ -3732,8 +3716,8 @@ static const struct cf_pair bg_table[] = {
{14, 2484},
{0, 0}};
-static const guint bg_table_freqs[G_N_ELEMENTS(bg_table)] = {
- /* B/G band */
+static const guint table_2ghz_freqs[G_N_ELEMENTS(table_2ghz)] = {
+ /* 2.4GHz band */
2412,
2417,
2422,
@@ -3751,6 +3735,44 @@ static const guint bg_table_freqs[G_N_ELEMENTS(bg_table)] = {
0,
};
+static const struct cf_pair table_5ghz[] = {
+ /* 5GHz band */
+ /* NOTE: 5030-5090 MHz have been reallocated and can no longer be used */
+ {34, 5170}, {36, 5180}, {38, 5190}, {40, 5200}, {42, 5210}, {44, 5220}, {46, 5230},
+ {48, 5240}, {50, 5250}, {52, 5260}, {56, 5280}, {58, 5290}, {60, 5300}, {64, 5320},
+ {100, 5500}, {104, 5520}, {108, 5540}, {112, 5560}, {116, 5580}, {120, 5600}, {124, 5620},
+ {128, 5640}, {132, 5660}, {136, 5680}, {140, 5700}, {149, 5745}, {152, 5760}, {153, 5765},
+ {157, 5785}, {160, 5800}, {161, 5805}, {165, 5825}, {169, 5845}, {173, 5865}, {177, 5885},
+ {183, 4915}, {184, 4920}, {185, 4925}, {187, 4935}, {188, 4940}, {189, 4945}, {192, 4960},
+ {196, 4980}, {0, 0}};
+
+static const guint table_5ghz_freqs[G_N_ELEMENTS(table_5ghz)] = {
+ /* 5GHz band */
+ 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240, 5250, 5260, 5280, 5290, 5300, 5320, 5500,
+ 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680, 5700, 5745, 5760, 5765, 5785, 5800,
+ 5805, 5825, 5845, 5865, 5885, 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980, 0,
+};
+
+static const struct cf_pair table_6ghz[] = {
+ /* 6GHz band */
+ {1, 5955}, {5, 5975}, {9, 5995}, {13, 6015}, {17, 6035}, {21, 6055}, {25, 6075},
+ {29, 6095}, {33, 6115}, {37, 6135}, {41, 6155}, {45, 6175}, {49, 6195}, {53, 6215},
+ {57, 6235}, {61, 6255}, {65, 6275}, {69, 6295}, {73, 6315}, {77, 6335}, {81, 6355},
+ {85, 6375}, {89, 6395}, {93, 6415}, {97, 6435}, {101, 6455}, {105, 6475}, {109, 6495},
+ {113, 6515}, {117, 6535}, {121, 6555}, {125, 6575}, {129, 6595}, {133, 6615}, {137, 6635},
+ {141, 6655}, {145, 6675}, {149, 6695}, {153, 6715}, {157, 6735}, {161, 6755}, {169, 6775},
+ {173, 6815}, {177, 6835}, {181, 6855}, {185, 6875}, {189, 6895}, {193, 6915}, {197, 6935},
+ {201, 6955}, {205, 6975}, {209, 6995}, {213, 7015}, {217, 7035}, {221, 7055}, {225, 7075},
+ {229, 7095}, {233, 7115}, {0, 0}};
+
+static const guint table_6ghz_freqs[G_N_ELEMENTS(table_6ghz)] = {
+ /* 6GHz band */
+ 5955, 5975, 5995, 6015, 6035, 6055, 6075, 6095, 6115, 6135, 6155, 6175, 6195, 6215, 6235,
+ 6255, 6275, 6295, 6315, 6335, 6355, 6375, 6395, 6415, 6435, 6455, 6475, 6495, 6515, 6535,
+ 6555, 6575, 6595, 6615, 6635, 6655, 6675, 6695, 6715, 6735, 6755, 6775, 6815, 6835, 6855,
+ 6875, 6895, 6915, 6935, 6955, 6975, 6995, 7015, 7035, 7055, 7075, 7095, 7115, 0,
+};
+
/**
* nm_utils_wifi_freq_to_channel:
* @freq: frequency
@@ -3764,15 +3786,21 @@ nm_utils_wifi_freq_to_channel(guint32 freq)
{
int i = 0;
- if (freq > 4900) {
- while (a_table[i].freq && (a_table[i].freq != freq))
+ if (freq >= _NM_WIFI_FREQ_MIN_6GHZ) {
+ while (table_6ghz[i].freq && (table_6ghz[i].freq != freq))
i++;
- return a_table[i].chan;
+ return table_6ghz[i].chan;
}
- while (bg_table[i].freq && (bg_table[i].freq != freq))
+ if (freq >= _NM_WIFI_FREQ_MIN_5GHZ) {
+ while (table_5ghz[i].freq && (table_5ghz[i].freq != freq))
+ i++;
+ return table_5ghz[i].chan;
+ }
+
+ while (table_2ghz[i].freq && (table_2ghz[i].freq != freq))
i++;
- return bg_table[i].chan;
+ return table_2ghz[i].chan;
}
/**
@@ -3786,10 +3814,12 @@ nm_utils_wifi_freq_to_channel(guint32 freq)
const char *
nm_utils_wifi_freq_to_band(guint32 freq)
{
- if (freq >= 4915 && freq <= 5825)
- return "a";
- else if (freq >= 2412 && freq <= 2484)
+ if (freq >= _NM_WIFI_FREQ_MIN_2GHZ && freq <= _NM_WIFI_FREQ_MAX_2GHZ)
return "bg";
+ else if (freq >= _NM_WIFI_FREQ_MIN_5GHZ && freq <= _NM_WIFI_FREQ_MAX_5GHZ)
+ return "a";
+ else if (freq >= _NM_WIFI_FREQ_MIN_6GHZ && freq <= _NM_WIFI_FREQ_MAX_6GHZ)
+ return "6GHz";
return NULL;
}
@@ -3797,7 +3827,7 @@ nm_utils_wifi_freq_to_band(guint32 freq)
/**
* nm_utils_wifi_channel_to_freq:
* @channel: channel
- * @band: frequency band for wireless ("a" or "bg")
+ * @band: frequency band for wireless ("a", "bg", "6GHz")
*
* Utility function to translate a Wi-Fi channel to its corresponding frequency.
*
@@ -3812,18 +3842,26 @@ nm_utils_wifi_channel_to_freq(guint32 channel, const char *band)
g_return_val_if_fail(band, 0);
- if (nm_streq(band, "a")) {
- for (i = 0; a_table[i].chan; i++) {
- if (a_table[i].chan == channel)
- return a_table[i].freq;
+ if (nm_streq0(band, "a")) {
+ for (i = 0; table_5ghz[i].chan; i++) {
+ if (table_5ghz[i].chan == channel)
+ return table_5ghz[i].freq;
}
return ((guint32) -1);
}
- if (nm_streq(band, "bg")) {
- for (i = 0; bg_table[i].chan; i++) {
- if (bg_table[i].chan == channel)
- return bg_table[i].freq;
+ if (nm_streq0(band, "bg")) {
+ for (i = 0; table_2ghz[i].chan; i++) {
+ if (table_2ghz[i].chan == channel)
+ return table_2ghz[i].freq;
+ }
+ return ((guint32) -1);
+ }
+
+ if (nm_streq0(band, "6GHz")) {
+ for (i = 0; table_6ghz[i].chan; i++) {
+ if (table_6ghz[i].chan == channel)
+ return table_6ghz[i].freq;
}
return ((guint32) -1);
}
@@ -3835,7 +3873,7 @@ nm_utils_wifi_channel_to_freq(guint32 channel, const char *band)
* nm_utils_wifi_find_next_channel:
* @channel: current channel
* @direction: whether going downward (0 or less) or upward (1 or more)
- * @band: frequency band for wireless ("a" or "bg")
+ * @band: frequency band for wireless ("a", "bg", "6GHz")
*
* Utility function to find out next/previous Wi-Fi channel for a channel.
*
@@ -3844,22 +3882,29 @@ nm_utils_wifi_channel_to_freq(guint32 channel, const char *band)
guint32
nm_utils_wifi_find_next_channel(guint32 channel, int direction, char *band)
{
- size_t a_size = G_N_ELEMENTS(a_table);
- size_t bg_size = G_N_ELEMENTS(bg_table);
+ size_t size_2ghz = G_N_ELEMENTS(table_2ghz);
+ size_t size_5ghz = G_N_ELEMENTS(table_5ghz);
+ size_t size_6ghz = G_N_ELEMENTS(table_6ghz);
const struct cf_pair *pair;
- if (nm_streq(band, "a")) {
- if (channel < a_table[0].chan)
- return a_table[0].chan;
- if (channel > a_table[a_size - 2].chan)
- return a_table[a_size - 2].chan;
- pair = &a_table[0];
- } else if (nm_streq(band, "bg")) {
- if (channel < bg_table[0].chan)
- return bg_table[0].chan;
- if (channel > bg_table[bg_size - 2].chan)
- return bg_table[bg_size - 2].chan;
- pair = &bg_table[0];
+ if (nm_streq0(band, "a")) {
+ if (channel < table_5ghz[0].chan)
+ return table_5ghz[0].chan;
+ if (channel > table_5ghz[size_5ghz - 2].chan)
+ return table_5ghz[size_5ghz - 2].chan;
+ pair = &table_5ghz[0];
+ } else if (nm_streq0(band, "bg")) {
+ if (channel < table_2ghz[0].chan)
+ return table_2ghz[0].chan;
+ if (channel > table_2ghz[size_2ghz - 2].chan)
+ return table_2ghz[size_2ghz - 2].chan;
+ pair = &table_2ghz[0];
+ } else if (nm_streq0(band, "6GHz")) {
+ if (channel < table_6ghz[0].chan)
+ return table_6ghz[0].chan;
+ if (channel > table_6ghz[size_6ghz - 2].chan)
+ return table_6ghz[size_6ghz - 2].chan;
+ pair = &table_6ghz[0];
} else
g_return_val_if_reached(0);
@@ -3880,7 +3925,7 @@ nm_utils_wifi_find_next_channel(guint32 channel, int direction, char *band)
/**
* nm_utils_wifi_is_channel_valid:
* @channel: channel
- * @band: frequency band for wireless ("a" or "bg")
+ * @band: frequency band for wireless ("a", "bg", "6GHz")
*
* Utility function to verify Wi-Fi channel validity.
*
@@ -3930,8 +3975,8 @@ nm_utils_wifi_is_channel_valid(guint32 channel, const char *band)
const guint *
nm_utils_wifi_2ghz_freqs(void)
{
- _nm_assert_wifi_freqs(bg_table, bg_table_freqs);
- return bg_table_freqs;
+ _nm_assert_wifi_freqs(table_2ghz, table_2ghz_freqs);
+ return table_2ghz_freqs;
}
/**
@@ -3946,8 +3991,24 @@ nm_utils_wifi_2ghz_freqs(void)
const guint *
nm_utils_wifi_5ghz_freqs(void)
{
- _nm_assert_wifi_freqs(a_table, a_table_freqs);
- return a_table_freqs;
+ _nm_assert_wifi_freqs(table_5ghz, table_5ghz_freqs);
+ return table_5ghz_freqs;
+}
+
+/**
+ * nm_utils_wifi_6ghz_freqs:
+ *
+ * Utility function to return 6 GHz Wi-Fi frequencies (802.11ax/be, Wi-Fi 6E).
+ *
+ * Returns: zero-terminated array of frequencies numbers (in MHz)
+ *
+ * Since: 1.58
+ **/
+const guint *
+nm_utils_wifi_6ghz_freqs(void)
+{
+ _nm_assert_wifi_freqs(table_6ghz, table_6ghz_freqs);
+ return table_6ghz_freqs;
}
/**
diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c
index cd48004538..d6c991cabb 100644
--- a/src/libnm-core-impl/tests/test-general.c
+++ b/src/libnm-core-impl/tests/test-general.c
@@ -11140,7 +11140,7 @@ _do_wifi_ghz_freqs(const guint *freqs, const char *band)
int j;
int i;
- g_assert(NM_IN_STRSET(band, "a", "bg"));
+ g_assert(NM_IN_STRSET(band, "a", "bg", "6GHz"));
g_assert(freqs);
g_assert(freqs[0] != 0);
@@ -11178,6 +11178,7 @@ test_nm_utils_wifi_ghz_freqs(void)
{
_do_wifi_ghz_freqs(nm_utils_wifi_2ghz_freqs(), "bg");
_do_wifi_ghz_freqs(nm_utils_wifi_5ghz_freqs(), "a");
+ _do_wifi_ghz_freqs(nm_utils_wifi_6ghz_freqs(), "6GHz");
}
/*****************************************************************************/
diff --git a/src/libnm-core-public/nm-utils.h b/src/libnm-core-public/nm-utils.h
index e46bf47280..7095085d05 100644
--- a/src/libnm-core-public/nm-utils.h
+++ b/src/libnm-core-public/nm-utils.h
@@ -143,6 +143,8 @@ NM_AVAILABLE_IN_1_2
const guint *nm_utils_wifi_2ghz_freqs(void);
NM_AVAILABLE_IN_1_2
const guint *nm_utils_wifi_5ghz_freqs(void);
+NM_AVAILABLE_IN_1_58
+const guint *nm_utils_wifi_6ghz_freqs(void);
const char *nm_utils_wifi_strength_bars(guint8 strength);
diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c
index e2ab8dfafe..6ff45935bc 100644
--- a/src/libnmc-setting/nm-meta-setting-desc.c
+++ b/src/libnmc-setting/nm-meta-setting-desc.c
@@ -4292,7 +4292,8 @@ _set_fcn_wireless_channel(ARGS_SET_FCN)
}
if (!nm_utils_wifi_is_channel_valid(chan_int, "a")
- && !nm_utils_wifi_is_channel_valid(chan_int, "bg")) {
+ && !nm_utils_wifi_is_channel_valid(chan_int, "bg")
+ && !nm_utils_wifi_is_channel_valid(chan_int, "6GHz")) {
nm_utils_error_set(error,
NM_UTILS_ERROR_UNKNOWN,
_("'%ld' is not a valid channel"),
@@ -8530,7 +8531,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRELESS[] = {
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_BAND,
.property_type = &_pt_gobject_string,
.property_typ_data = DEFINE_PROPERTY_TYP_DATA (
- .values_static = NM_MAKE_STRV ("a", "bg"),
+ .values_static = NM_MAKE_STRV ("a", "bg", "6GHz"),
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_CHANNEL,
diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in
index 89f8c6d178..662718726b 100644
--- a/src/libnmc-setting/settings-docs.h.in
+++ b/src/libnmc-setting/settings-docs.h.in
@@ -452,7 +452,7 @@
#define DESCRIBE_DOC_NM_SETTING_WIREGUARD_PRIVATE_KEY N_("The 256 bit private-key in base64 encoding.")
#define DESCRIBE_DOC_NM_SETTING_WIREGUARD_PRIVATE_KEY_FLAGS N_("Flags indicating how to handle the \"private-key\" property.")
#define DESCRIBE_DOC_NM_SETTING_WIRELESS_AP_ISOLATION N_("Configures AP isolation, which prevents communication between wireless devices connected to this AP. This property can be set to a value different from \"default\" (-1) only when the interface is configured in AP mode. If set to \"true\" (1), devices are not able to communicate with each other. This increases security because it protects devices against attacks from other clients in the network. At the same time, it prevents devices to access resources on the same wireless networks as file shares, printers, etc. If set to \"false\" (0), devices can talk to each other. When set to \"default\" (-1), the global default is used; in case the global default is unspecified it is assumed to be \"false\" (0).")
-#define DESCRIBE_DOC_NM_SETTING_WIRELESS_BAND N_("802.11 frequency band of the network. One of \"a\" for 5GHz 802.11a or \"bg\" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network to the specific band, i.e. if \"a\" is specified, the device will not associate with the same network in the 2.4GHz band even if the network's settings are compatible. This setting depends on specific driver capability and may not work with all drivers.")
+#define DESCRIBE_DOC_NM_SETTING_WIRELESS_BAND N_("802.11 frequency band of the network. One of \"a\" for 5GHz, \"bg\" for 2.4GHz or \"6GHz\". This will lock associations to the Wi-Fi network to the specific band, i.e. if \"a\" is specified, the device will not associate with the same network in the 2.4GHz (bg) or 6GHz bands even if the network's settings are compatible. This setting depends on specific driver capability and may not work with all drivers.")
#define DESCRIBE_DOC_NM_SETTING_WIRELESS_BSSID N_("If specified, directs the device to only associate with the given access point. This capability is highly driver dependent and not supported by all devices. Note: this property does not control the BSSID used when creating an Ad-Hoc network and is unlikely to in the future. Locking a client profile to a certain BSSID will prevent roaming and also disable background scanning. That can be useful, if there is only one access point for the SSID.")
#define DESCRIBE_DOC_NM_SETTING_WIRELESS_CHANNEL N_("Wireless channel to use for the Wi-Fi connection. The device will only join (or create for Ad-Hoc networks) a Wi-Fi network on the specified channel. Because channel numbers overlap between bands, this property also requires the \"band\" property to be set.")
#define DESCRIBE_DOC_NM_SETTING_WIRELESS_CHANNEL_WIDTH N_("Specifies width of the wireless channel in Access Point (AP) mode. When set to \"auto\" (0) (the default), the channel width is automatically determined. At the moment, this means that the safest (smallest) width is chosen. If the value is not \"auto\" (0), then the 'channel' property must also be set. When using the 2.4GHz band, the width can be at most 40MHz. This property can be set to a value different from \"auto\" (0) only when the interface is configured in AP mode.")
diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c
index e81e710f44..77b7f79c1e 100644
--- a/src/nmcli/devices.c
+++ b/src/nmcli/devices.c
@@ -866,7 +866,7 @@ usage(void)
"]\n"
" [bssid ] [name ] [private yes|no] [hidden "
"yes|no]\n\n"
- " wifi hotspot [ifname ] [con-name ] [ssid ] [band a|bg] "
+ " wifi hotspot [ifname ] [con-name ] [ssid ] [band a|bg|6GHz] "
"[channel ] [password ]\n\n"
" wifi rescan [ifname ] [[ssid ] ...]\n\n"
" wifi show-password [ifname ]\n\n"
@@ -1021,7 +1021,7 @@ usage_device_wifi(void)
"It is also assumed that IP configuration is obtained via DHCP.\n"
"\n"
"ARGUMENTS := hotspot [ifname ] [con-name ] [ssid ]\n"
- " [band a|bg] [channel ] [password ]\n"
+ " [band a|bg|6GHz] [channel ] [password ]\n"
"\n"
"Create a Wi-Fi hotspot. Use 'connection down' or 'device disconnect'\n"
"to stop the hotspot.\n"
@@ -4443,10 +4443,11 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char *
}
band = *argv;
if (argc == 1 && nmc->complete)
- nmc_complete_strings(band, "a", "bg");
- if (strcmp(band, "a") && strcmp(band, "bg")) {
+ nmc_complete_strings(band, "a", "bg", "6GHz");
+ if (!NM_IN_STRSET(band, "a", "bg", "6GHz")) {
g_string_printf(nmc->return_text,
- _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."),
+ _("Error: band argument value '%s' is invalid; use 'a', 'bg' "
+ "or '6GHz'."),
band);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return;
@@ -4494,7 +4495,7 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char *
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return;
}
- if (!nmc_string_to_uint(channel, TRUE, 1, 5825, &value)
+ if (!nmc_string_to_uint(channel, TRUE, 1, G_MAXUINT32, &value)
|| !nm_utils_wifi_is_channel_valid(value, band)) {
g_string_printf(nmc->return_text,
_("Error: channel '%s' not valid for band '%s'."),
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
index 881c41cac8..f4ffcb41f0 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -33,9 +33,9 @@
format="string"
values="infrastructure, adhoc, ap, mesh" />
+ values="a, bg, 6GHz" />