ifcfg: read/write full IPv6 settings also for method ignore/disabled

Do "bother" to read/write settings.

For the umpteenth time, it's not up to the reader/writer to decide
what properties are valid for a profile or which makes sense.

Only nm_connection_verify() can decide that. For example nm_connection_verify()
has no problem with ipv6.method=disabled while also setting ipv6.addr-gen-mode.
We cannot just shortcut the parsing/writing.

The reader only ignores addresses, dns and dns-searches, so that we don't start
parsing invalid files, where the setting would have been ignore
previously.

In particular,

   echo "DEVICE=eth0" > /etc/sysconfig/network-scripts/ifcfg-xxx
   nmcli connection load /etc/sysconfig/network-scripts/ifcfg-xxx
   nmcli -f ipv6.method,ipv6.addr-gen-mode connection show /etc/sysconfig/network-scripts/ifcfg-xxx

needs to show eui64 addr-gen-mode.
This commit is contained in:
Thomas Haller 2021-08-16 23:02:59 +02:00
parent 7de4322d51
commit 8733d22343
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
19 changed files with 108 additions and 27 deletions

View file

@ -2250,6 +2250,7 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
gboolean ip6_privacy = FALSE, ip6_privacy_prefer_public_ip;
NMSettingIP6ConfigPrivacy ip6_privacy_val;
guint32 route_table;
gboolean is_disabled;
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new();
@ -2376,10 +2377,9 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
NULL);
/* Don't bother to read IP, DNS and routes when IPv6 is disabled */
if (NM_IN_STRSET(method,
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP6_CONFIG_METHOD_DISABLED))
return NM_SETTING(g_steal_pointer(&s_ip6));
is_disabled = NM_IN_STRSET(method,
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
nm_clear_g_free(&value);
v = svGetValueStr(ifcfg, "DHCPV6_DUID", &value);
@ -2439,15 +2439,23 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
NULL);
list = nm_strsplit_set(value, " ");
for (iter = list, i = 0; iter && *iter; iter++, i++) {
NMIPAddress *addr = NULL;
if (list) {
if (is_disabled)
PARSE_WARNING("ignore IPv6 addresses with method disabled/ignore");
else {
for (iter = list, i = 0; *iter; iter++, i++) {
nm_auto_unref_ip_address NMIPAddress *addr = NULL;
if (!parse_full_ip6_address(ifcfg, *iter, i, &addr, error))
return NULL;
if (!parse_full_ip6_address(ifcfg, *iter, i, &addr, is_disabled ? NULL : error)) {
if (is_disabled)
break;
return NULL;
}
if (!nm_setting_ip_config_add_address(s_ip6, addr))
PARSE_WARNING("duplicate IP6 address");
nm_ip_address_unref(addr);
if (!nm_setting_ip_config_add_address(s_ip6, addr))
PARSE_WARNING("duplicate IP6 address");
}
}
}
/* Gateway */
@ -2463,18 +2471,20 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
}
if (v) {
char *ptr;
if ((ptr = strchr(v, '%')) != NULL)
*ptr = '\0'; /* remove %interface prefix if present */
if (!nm_utils_ipaddr_is_valid(AF_INET6, v)) {
g_set_error(error,
NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid IP6 address '%s'",
v);
return NULL;
}
g_object_set(s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL);
if (!is_disabled) {
g_set_error(error,
NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid IP6 address '%s'",
v);
return NULL;
}
} else
g_object_set(s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL);
}
}
@ -2508,11 +2518,17 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
break;
if (nm_utils_ipaddr_is_valid(AF_INET6, v)) {
if (is_disabled) {
PARSE_WARNING("ignore DNS server addresses with method disabled/ignore");
break;
}
if (!nm_setting_ip_config_add_dns(s_ip6, v))
PARSE_WARNING("duplicate DNS server %s", tag);
} else if (nm_utils_ipaddr_is_valid(AF_INET, v)) {
/* Ignore IPv4 addresses */
} else {
if (is_disabled)
continue;
g_set_error(error,
NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_INVALID_CONNECTION,
@ -2541,9 +2557,13 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
searches = nm_strsplit_set(v, " ");
if (searches) {
for (iter = searches; *iter; iter++) {
if (!nm_setting_ip_config_add_dns_search(s_ip6, *iter))
PARSE_WARNING("duplicate DNS domain '%s'", *iter);
if (is_disabled) {
PARSE_WARNING("ignore IPV6_DOMAIN with method disabled/ignore");
} else {
for (iter = searches; *iter; iter++) {
if (!nm_setting_ip_config_add_dns_search(s_ip6, *iter))
PARSE_WARNING("duplicate DNS domain '%s'", *iter);
}
}
}
}

View file

@ -2991,11 +2991,9 @@ write_ip6_setting(NMConnection *connection, shvarFile *ifcfg, GString **out_rout
g_assert(value);
if (!strcmp(value, NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) {
svSetValueStr(ifcfg, "IPV6INIT", "no");
return;
} else if (!strcmp(value, NM_SETTING_IP6_CONFIG_METHOD_DISABLED)) {
svSetValueStr(ifcfg, "IPV6_DISABLED", "yes");
svSetValueStr(ifcfg, "IPV6INIT", "no");
return;
} else if (!strcmp(value, NM_SETTING_IP6_CONFIG_METHOD_AUTO)) {
svSetValueStr(ifcfg, "IPV6INIT", "yes");
svSetValueStr(ifcfg, "IPV6_AUTOCONF", "yes");

View file

@ -16,6 +16,8 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="System test-wired-802-1X-subj-matches"
UUID=${UUID}
DEVICE=eth0

View file

@ -11,6 +11,9 @@ GATEWAY=1.1.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write Bond Main"
UUID=${UUID}
DEVICE=bond0

View file

@ -5,6 +5,9 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write Permissions"
UUID=${UUID}
ONBOOT=yes

View file

@ -11,6 +11,9 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write Wifi LEAP"
UUID=${UUID}
ONBOOT=yes

View file

@ -10,6 +10,9 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write Wifi WEP 104 ASCII"
UUID=${UUID}
ONBOOT=yes

View file

@ -17,6 +17,8 @@ IPV4_FAILURE_FATAL=no
ACD_TIMEOUT=400
ARPING_WAIT=1
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Test Write Wired Static Routes"
UUID=${UUID}
ONBOOT=yes

View file

@ -8,6 +8,8 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Test Write Wired with Match setting"
UUID=${UUID}
ONBOOT=yes

View file

@ -17,6 +17,8 @@ PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Vlan test-vlan-interface"
UUID=${UUID}
DEVICE=vlan43

View file

@ -8,6 +8,8 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="random wifi connection"
UUID=${UUID}
ONBOOT=yes

View file

@ -8,6 +8,8 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="random wifi connection 2"
UUID=${UUID}
ONBOOT=yes

View file

@ -6,6 +6,8 @@ DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6_DISABLED=yes
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Test Write Wired Disabled IP6"
UUID=${UUID}
ONBOOT=yes

View file

@ -12,6 +12,9 @@ GATEWAY=1.1.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write SR-IOV config"
UUID=${UUID}
DEVICE=eth0

View file

@ -6,6 +6,8 @@ BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=test-static-routes-legacy
UUID=ba60d05a-7898-820d-c2db-427a88f8f2a5
DEVICE=eth0

View file

@ -9,6 +9,9 @@ GATEWAY=1.1.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write TC config"
UUID=${UUID}
DEVICE=eth0

View file

@ -10,6 +10,9 @@ GATEWAY=1.1.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write TC config"
UUID=${UUID}
DEVICE=eth0

View file

@ -9,6 +9,8 @@ HWADDR=
PROXY_METHOD=none
BROWSER_ONLY=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="Vlan test-vlan-vlanid-use"
UUID=${UUID}
DEVICE=eth0.9

View file

@ -5287,7 +5287,12 @@ test_write_wired_match(void)
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new();
nm_connection_add_setting(connection, NM_SETTING(s_ip6));
g_object_set(s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
g_object_set(s_ip6,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
/* Match setting */
s_match = (NMSettingMatch *) nm_setting_match_new();
@ -5480,7 +5485,12 @@ test_write_ip6_disabled(void)
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new();
nm_connection_add_setting(connection, NM_SETTING(s_ip6));
g_object_set(s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_DISABLED, NULL);
g_object_set(s_ip6,
NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP6_CONFIG_METHOD_DISABLED,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -5755,6 +5765,8 @@ test_write_wired_static_routes(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -5834,6 +5846,8 @@ test_write_wired_dhcp_8021x_peap_mschapv2(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
/* 802.1x setting */
@ -6331,6 +6345,8 @@ test_write_wifi_open(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -6498,6 +6514,8 @@ test_write_wifi_wep(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -7781,6 +7799,8 @@ test_write_wifi_wpa_then_open(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -7904,6 +7924,8 @@ test_write_wifi_wpa_then_wep_with_perms(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
nmtst_assert_connection_verifies(connection);
@ -8303,6 +8325,8 @@ test_write_wifi_wep_agent_keys(void)
NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
NM_SETTING_IP_CONFIG_MAY_FAIL,
TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
(int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
NULL);
/* Wifi setting */