diff options
Diffstat (limited to 'src/core/settings')
11 files changed, 182 insertions, 34 deletions
diff --git a/src/core/settings/nm-settings-connection.c b/src/core/settings/nm-settings-connection.c index 7ed3712b..c8f5f290 100644 --- a/src/core/settings/nm-settings-connection.c +++ b/src/core/settings/nm-settings-connection.c @@ -1866,6 +1866,8 @@ impl_settings_connection_update2(NMDBusObject *obj, g_variant_iter_init(&iter, args); while (g_variant_iter_next(&iter, "{&sv}", &args_name, &args_value)) { + gs_unref_variant GVariant *args_value_unref = args_value; + if (plugin_name == NULL && nm_streq(args_name, "plugin") && g_variant_is_of_type(args_value, G_VARIANT_TYPE_STRING)) { plugin_name = g_variant_dup_string(args_value, NULL); diff --git a/src/core/settings/nm-settings.c b/src/core/settings/nm-settings.c index 702c53d5..3fe9c76a 100644 --- a/src/core/settings/nm-settings.c +++ b/src/core/settings/nm-settings.c @@ -2934,6 +2934,8 @@ impl_settings_add_connection2(NMDBusObject *obj, g_variant_iter_init(&iter, args); while (g_variant_iter_next(&iter, "{&sv}", &args_name, &args_value)) { + gs_unref_variant GVariant *args_value_unref = args_value; + if (plugin == NULL && nm_streq(args_name, "plugin") && g_variant_is_of_type(args_value, G_VARIANT_TYPE_STRING)) { plugin = g_variant_dup_string(args_value, NULL); 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 728dccac..6312154c 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,19 +4518,18 @@ 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) { + if (!NM_IN_STRSET(value, "a", "bg", "6GHz")) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "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, @@ -4540,22 +4539,26 @@ make_wireless_setting(shvarFile *ifcfg, GError **error) g_free(value); goto error; } - } else { + } + + g_object_set(s_wireless, NM_SETTING_WIRELESS_BAND, value, NULL); + g_free(value); + } else if (chan > 0) { + if (chan > _NM_WIFI_CHANNEL_MAX_5GHZ) { g_set_error(error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "Invalid wireless band '%s'", - value); + "Setting channel without band is ambiguous and deprecated. Not supported " + "for 6GHz."); 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) + } 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 21908090..dc60fdf1 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); @@ -3598,6 +3600,7 @@ do_write_construct(NMConnection *connection, } else route_ignore = FALSE; + /* Unsupported properties */ if ((s_ip4 = nm_connection_get_setting_ip4_config(connection))) { if (nm_setting_ip_config_get_dhcp_dscp(s_ip4)) { set_error_unsupported(error, @@ -3616,6 +3619,14 @@ do_write_construct(NMConnection *connection, FALSE); return FALSE; } + if (nm_setting_ip4_config_get_clat(NM_SETTING_IP4_CONFIG(s_ip4)) + != NM_SETTING_IP4_CONFIG_CLAT_DEFAULT) { + set_error_unsupported(error, + connection, + NM_SETTING_IP4_CONFIG_SETTING_NAME "." NM_SETTING_IP4_CONFIG_CLAT, + FALSE); + return FALSE; + } } write_ip4_setting(connection, 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 caeaaff8..8199a9b4 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 00000000..d8ffe48e --- /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 index 7e3d4f02..90570ea3 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 00000000..803ca19b --- /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 00000000..26fc29fe --- /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 2f3035ef..f5f80ed8 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); @@ -4025,6 +4025,77 @@ test_write_wifi_band_a(void) } 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) { nmtst_auto_unlinkfile char *testfile = NULL; @@ -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); @@ -4073,6 +4144,18 @@ test_write_wifi_ap_mode(void) } 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) { gs_free_error GError *error = NULL; @@ -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/settings/plugins/keyfile/nms-keyfile-writer.c b/src/core/settings/plugins/keyfile/nms-keyfile-writer.c index c7c88260..962f3d15 100644 --- a/src/core/settings/plugins/keyfile/nms-keyfile-writer.c +++ b/src/core/settings/plugins/keyfile/nms-keyfile-writer.c @@ -143,7 +143,9 @@ cert_writer(NMConnection *connection, vtable->setting_key, strrchr(new_path, '/') + 1); } else { - nm_log_warn(LOGD_SETTINGS, + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_FAILED, "keyfile: %s.%s: failed to write certificate to file %s: %s", setting_name, vtable->setting_key, |