diff --git a/.NetworkManager.metadata b/.NetworkManager.metadata index 8dfa229..d295b56 100644 --- a/.NetworkManager.metadata +++ b/.NetworkManager.metadata @@ -1 +1 @@ -550918f97f1614532a317465220d6b5cab08d47a SOURCES/NetworkManager-1.30.0.tar.xz +d2b4c08e920b5c96c128041948e3092eedcbba80 SOURCES/NetworkManager-1.32.10.tar.xz diff --git a/.gitignore b/.gitignore index 7cd840b..a02fac0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/NetworkManager-1.30.0.tar.xz +SOURCES/NetworkManager-1.32.10.tar.xz diff --git a/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch b/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch index 232a0e7..83c2455 100644 --- a/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch +++ b/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch @@ -1,19 +1,19 @@ -From 6069af3e7a7d506c02f007c71e2a9271b8ef3d09 Mon Sep 17 00:00:00 2001 +From 45f33b5379c41f34fb1a27452e5f62e2d571e85e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 16 Jan 2020 13:40:26 +0100 -Subject: [PATCH 1/1] cloud-setup: avoid unsupported systemd settings in +Subject: [PATCH] cloud-setup: avoid unsupported systemd settings in nm-cloud-setup.service init for rhel-8.2 https://bugzilla.redhat.com/show_bug.cgi?id=1791758 --- - clients/cloud-setup/nm-cloud-setup.service.in | 6 +++--- + src/nm-cloud-setup/nm-cloud-setup.service.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/clients/cloud-setup/nm-cloud-setup.service.in b/clients/cloud-setup/nm-cloud-setup.service.in -index 9866acd8b0ae..a3df3863c4df 100644 ---- a/clients/cloud-setup/nm-cloud-setup.service.in -+++ b/clients/cloud-setup/nm-cloud-setup.service.in -@@ -22,15 +22,15 @@ PrivateDevices=yes +diff --git a/src/nm-cloud-setup/nm-cloud-setup.service.in b/src/nm-cloud-setup/nm-cloud-setup.service.in +index f4b0e2638f14..c59bd47574ba 100644 +--- a/src/nm-cloud-setup/nm-cloud-setup.service.in ++++ b/src/nm-cloud-setup/nm-cloud-setup.service.in +@@ -28,15 +28,15 @@ PrivateDevices=yes PrivateTmp=yes ProtectControlGroups=yes ProtectHome=yes @@ -33,5 +33,5 @@ index 9866acd8b0ae..a3df3863c4df 100644 [Install] -- -2.26.2 +2.31.1 diff --git a/SOURCES/0002-firewall-Default-to-iptables-backend-to-preserve-behavior.patch b/SOURCES/0002-firewall-Default-to-iptables-backend-to-preserve-behavior.patch new file mode 100644 index 0000000..8d4e50b --- /dev/null +++ b/SOURCES/0002-firewall-Default-to-iptables-backend-to-preserve-behavior.patch @@ -0,0 +1,34 @@ +From af25d85a43eb2aa59a80c13aa214cbc5509b6815 Mon Sep 17 00:00:00 2001 +From: Wen Liang +Date: Wed, 16 Jun 2021 22:43:32 +0200 +Subject: [PATCH] firewall: Default to iptables backend to preserve behavior + +For upsteam, the default is "nftables" (if nft is installed). On RHEL8, we will +always default to "iptables" to preserve behavior. +--- + src/core/nm-firewall-utils.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/src/core/nm-firewall-utils.c b/src/core/nm-firewall-utils.c +index a2446553b76f..5525a677cb1d 100644 +--- a/src/core/nm-firewall-utils.c ++++ b/src/core/nm-firewall-utils.c +@@ -744,12 +744,9 @@ nm_firewall_config_apply(NMFirewallConfig *self, gboolean shared) + static NMFirewallBackend + _firewall_backend_detect(void) + { +- if (g_file_test(NFT_PATH, G_FILE_TEST_IS_EXECUTABLE)) +- return NM_FIREWALL_BACKEND_NFTABLES; +- if (g_file_test(IPTABLES_PATH, G_FILE_TEST_IS_EXECUTABLE)) +- return NM_FIREWALL_BACKEND_IPTABLES; +- +- return NM_FIREWALL_BACKEND_NFTABLES; ++ /* For upsteam, the default is "nftables" (if nft is installed). On RHEL8, we will ++ * always default to "iptables" to preserve behavior. */ ++ return NM_FIREWALL_BACKEND_IPTABLES; + } + + NMFirewallBackend +-- +2.31.1 + diff --git a/SOURCES/1000-bond-avoid-logging-warning-to-set-ad_actor_system-00.patch b/SOURCES/1000-bond-avoid-logging-warning-to-set-ad_actor_system-00.patch deleted file mode 100644 index fb34c79..0000000 --- a/SOURCES/1000-bond-avoid-logging-warning-to-set-ad_actor_system-00.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 9f90c590d73eb86e357bf4a854af41b73039342c Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 23 Feb 2021 13:28:10 +0100 -Subject: [PATCH 1/1] bond: avoid logging warning to set - "ad_actor_system=00:00:00:00:00:00" - -The bond option ad_actor_system only matters (and is available) with -mode=802.3ad. - -When you create a new bond, the sysctl value will be set to "00:00:00:00:00:00". -So this seems to be a valid value, and in fact the default value for -this option. However, kernel will fail with EINVAL to set the sysctl to -"00:00:00:00:00:00". Kernel fails both if the value is already -"00:00:00:00:00:00" (i.e. setting the same value results in an error) and -it also fails otherwise (i.e. we cannot ever reset the value to -"00:00:00:00:00:00", at least not via sysfs). - -Avoid the warning in the common case, where the value is already as -expected. - -Otherwise, we still get the warning and won't be able to set the right -value. But this is really a limitation of the kernel API where we cannot -do anything about it (in NetworkManager). - -https://bugzilla.redhat.com/show_bug.cgi?id=1923999 -(cherry picked from commit 9e7af314546d7912ee23b3850230008902aca4d3) -(cherry picked from commit 199ac9b146b0d7b1d6679a8d703822447abc3ce7) ---- - libnm-core/nm-core-internal.h | 2 ++ - libnm-core/nm-setting-bond.c | 2 +- - src/core/devices/nm-device-bond.c | 18 ++++++++++++++++++ - 3 files changed, 21 insertions(+), 1 deletion(-) - -diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h -index d9374fe5a7a8..e386d5e9d074 100644 ---- a/libnm-core/nm-core-internal.h -+++ b/libnm-core/nm-core-internal.h -@@ -586,6 +586,8 @@ NMBondOptionType _nm_setting_bond_get_option_type(NMSettingBond *setting, const - - const char *nm_setting_bond_get_option_or_default(NMSettingBond *self, const char *option); - -+#define NM_BOND_AD_ACTOR_SYSTEM_DEFAULT "00:00:00:00:00:00" -+ - /*****************************************************************************/ - - /* nm_connection_get_uuid() asserts against NULL, which is the right thing to -diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c -index 2d64ef02b48c..68d4ca88f678 100644 ---- a/libnm-core/nm-setting-bond.c -+++ b/libnm-core/nm-setting-bond.c -@@ -337,7 +337,7 @@ _bond_get_option_normalized(NMSettingBond *self, const char *option, gboolean ge - if (nm_streq(option, NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM)) { - /* The default value depends on the current mode */ - if (mode == NM_BOND_MODE_8023AD) -- return "00:00:00:00:00:00"; -+ return NM_BOND_AD_ACTOR_SYSTEM_DEFAULT; - return ""; - } - -diff --git a/src/core/devices/nm-device-bond.c b/src/core/devices/nm-device-bond.c -index f68c080b1839..5814aef4518f 100644 ---- a/src/core/devices/nm-device-bond.c -+++ b/src/core/devices/nm-device-bond.c -@@ -109,6 +109,24 @@ _set_bond_attr(NMDevice *device, const char *attr, const char *value) - int ifindex = nm_device_get_ifindex(device); - gboolean ret; - -+ nm_assert(attr && attr[0]); -+ nm_assert(value); -+ -+ if (nm_streq(value, NM_BOND_AD_ACTOR_SYSTEM_DEFAULT) -+ && nm_streq(attr, NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM)) { -+ gs_free char *cur_val = NULL; -+ -+ /* kernel does not allow setting ad_actor_system to "00:00:00:00:00:00". We would thus -+ * log an EINVAL error. Avoid that... at least, if the value is already "00:00:00:00:00:00". */ -+ cur_val = -+ nm_platform_sysctl_master_get_option(nm_device_get_platform(device), ifindex, attr); -+ if (nm_streq0(cur_val, NM_BOND_AD_ACTOR_SYSTEM_DEFAULT)) -+ return TRUE; -+ -+ /* OK, the current value is different, and we will proceed setting "00:00:00:00:00:00". -+ * That will fail, and we will log a warning. There is nothing else to do. */ -+ } -+ - ret = - nm_platform_sysctl_master_set_option(nm_device_get_platform(device), ifindex, attr, value); - if (!ret) --- -2.29.2 - diff --git a/SOURCES/1000-platform-fix-capturing-addresses-from-platform-for-assuming-after-restart.patch b/SOURCES/1000-platform-fix-capturing-addresses-from-platform-for-assuming-after-restart.patch new file mode 100644 index 0000000..cde533f --- /dev/null +++ b/SOURCES/1000-platform-fix-capturing-addresses-from-platform-for-assuming-after-restart.patch @@ -0,0 +1,48 @@ +From af06ca8b1190240146f746f8aeca6fd11bfbe6ad Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Thu, 19 Aug 2021 13:35:27 +0200 +Subject: [PATCH] platform: fix capturing addresses from platform for assuming + after restart + +Commit c631aa48f034 ('platform: capture NMIP[46]Config from platform +with correct (reversed) order of IP addresses') changed this for IPv6 +and IPv4, but it's not correct for IPv4. + +For IPv6, later `ip addr add` calls adds a new primary address, which +is also listed in `ip addr show` first. Hence, as NMIP6Config tracks +addresses in increasing priority, while NMPlatform tracks them as +exposed by kernel, the order when appending addresses form platform +to NMIP6Config must be reversed. + +That is not the case for IPv4. For IPv4, later `ip addr add` calls +add a secondary IP address. Also, in `ip addr show` output they are +appended. Consequently, IPv4 addresses are tracked by NMPlatform with +decreasing priority (in the reverse order than for IPv6). + +Fix constructing the NMIP4Config by fixing the address order. This is +important, because during restart devices get assumed and our code would +configure the order of addresses as it finds them. + +Fixes: c631aa48f034 ('platform: capture NMIP[46]Config from platform with correct (reversed) order of IP addresses') +(cherry picked from commit c380893dc6757e30b429f968bc90bc1edda68998) +(cherry picked from commit 605373b38ab463826bd7eb80408fb2cfae07ee91) +--- + src/core/nm-ip4-config.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/core/nm-ip4-config.c b/src/core/nm-ip4-config.c +index 90531d0291..52a8faa791 100644 +--- a/src/core/nm-ip4-config.c ++++ b/src/core/nm-ip4-config.c +@@ -543,7 +543,7 @@ nm_ip4_config_capture(NMDedupMultiIndex *multi_idx, NMPlatform *platform, int if + + head_entry = nm_platform_lookup_object(platform, NMP_OBJECT_TYPE_IP4_ADDRESS, ifindex); + if (head_entry) { +- nmp_cache_iter_for_each_reverse (&iter, head_entry, &plobj) { ++ nmp_cache_iter_for_each (&iter, head_entry, &plobj) { + if (!_nm_ip_config_add_obj(priv->multi_idx, + &priv->idx_ip4_addresses_, + ifindex, +-- +2.26.3 + diff --git a/SOURCES/1001-core-increase-limit-of-open-file-descriptors-for-Net.patch b/SOURCES/1001-core-increase-limit-of-open-file-descriptors-for-Net.patch deleted file mode 100644 index de68a7b..0000000 --- a/SOURCES/1001-core-increase-limit-of-open-file-descriptors-for-Net.patch +++ /dev/null @@ -1,41 +0,0 @@ -From a5eb2f55d79b9023fbda6945da09f9bcecea8560 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Sun, 28 Feb 2021 11:18:16 +0100 -Subject: [PATCH 1/1] core: increase limit of open file descriptors for - NetworkManager.service - -Note that POSIX select() can only handle up to 1024 descriptors. That -means, our code (and the libraries that we use) must not use select(). - -Note that libndp uses select(), which means NetworkManager will crash -when using file descriptors larger than 1023. On the other hand, -depriving NetworkManager of file descriptors will also crash it. -So libndp must be fixed ([1]). - -[1] https://listman.redhat.com/archives/libndp-list/2021-February/msg00000.html - -https://bugzilla.redhat.com/show_bug.cgi?id=1926599 -(cherry picked from commit a708a172a6a289d5399897e7da3a0e38721b1b7e) -(cherry picked from commit 2ca405fa9bd047593cd299691b74af7f44184c71) ---- - data/NetworkManager.service.in | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/data/NetworkManager.service.in b/data/NetworkManager.service.in -index 91ebd9a36e65..9cf1c3d28f47 100644 ---- a/data/NetworkManager.service.in -+++ b/data/NetworkManager.service.in -@@ -19,6 +19,10 @@ CapabilityBoundingSet=CAP_NET_ADMIN CAP_DAC_OVERRIDE CAP_NET_RAW CAP_NET_BIND_SE - ProtectSystem=true - ProtectHome=read-only - -+# We require file descriptors for DHCP etc. When activating many interfaces, -+# the default limit of 1024 is easily reached. -+LimitNOFILE=65536 -+ - [Install] - WantedBy=multi-user.target - Also=NetworkManager-dispatcher.service --- -2.29.2 - diff --git a/SOURCES/1001-nmcli-docs-fix-address-order-in-ipv46-addresses-documentation-for-nm-settings-nmcli.patch b/SOURCES/1001-nmcli-docs-fix-address-order-in-ipv46-addresses-documentation-for-nm-settings-nmcli.patch new file mode 100644 index 0000000..6e16cad --- /dev/null +++ b/SOURCES/1001-nmcli-docs-fix-address-order-in-ipv46-addresses-documentation-for-nm-settings-nmcli.patch @@ -0,0 +1,59 @@ +From d0ba892917461659b5b1e429fb217218ff204379 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Thu, 19 Aug 2021 13:53:29 +0200 +Subject: [PATCH] nmcli/docs: fix address order in ipv46.addresses + documentation for `man nm-settings-nmcli` + +For IPv4, the order is not like for IPv6. Of course not. + +Fixes: 7aa4ad0fa22c ('nmcli/docs: better describe ipv[46].addresses in `man nm-settings-nmcli`') +(cherry picked from commit 2f3c2647d2263bf565fd21d14a3db56f6a063b91) +(cherry picked from commit dd8bc31fdb37acc2780f94defeb54e80bb1acf53) +--- + src/libnm-core-impl/nm-setting-ip4-config.c | 2 +- + src/libnmc-setting/settings-docs.h.in | 2 +- + src/nmcli/generate-docs-nm-settings-nmcli.xml.in | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c +index b3a18bcae7..a24ebcfb5c 100644 +--- a/src/libnm-core-impl/nm-setting-ip4-config.c ++++ b/src/libnm-core-impl/nm-setting-ip4-config.c +@@ -967,7 +967,7 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) + * format: a comma separated list of addresses + * description: A list of IPv4 addresses and their prefix length. Multiple addresses + * can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". +- * The addresses are listed in increasing priority, meaning the last address will ++ * The addresses are listed in decreasing priority, meaning the first address will + * be the primary address. + * ---end--- + */ +diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in +index 12625d4459..85c5aca1e4 100644 +--- a/src/libnmc-setting/settings-docs.h.in ++++ b/src/libnmc-setting/settings-docs.h.in +@@ -226,7 +226,7 @@ + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_REMOTE N_("The remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 address.") + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_TOS N_("The type of service (IPv4) or traffic class (IPv6) field to be set on tunneled packets.") + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_TTL N_("The TTL to assign to tunneled packets. 0 is a special value meaning that packets inherit the TTL value.") +-#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ADDRESSES N_("A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"192.168.1.5/24, 10.1.0.5/24\". The addresses are listed in increasing priority, meaning the last address will be the primary address.") ++#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ADDRESSES N_("A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"192.168.1.5/24, 10.1.0.5/24\". The addresses are listed in decreasing priority, meaning the first address will be the primary address.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DAD_TIMEOUT N_("Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID N_("A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values \"mac\" and \"perm-mac\" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value \"ipv6-duid\" uses the DUID from \"ipv6.dhcp-duid\" property as an RFC4361-compliant client identifier. As IAID it uses \"ipv4.dhcp-iaid\" and falls back to \"ipv6.dhcp-iaid\" if unset. The special value \"duid\" generates a RFC4361-compliant client identifier based on \"ipv4.dhcp-iaid\" and uses a DUID generated by hashing /etc/machine-id. The special value \"stable\" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the \"${DEVICE}\" or \"${MAC}\" specifier to get a per-device key. If unset, a globally configured default is used. If still unset, the default depends on the DHCP plugin.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_FQDN N_("If the \"dhcp-send-hostname\" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-hostname\" are mutually exclusive and cannot be set at the same time.") +diff --git a/src/nmcli/generate-docs-nm-settings-nmcli.xml.in b/src/nmcli/generate-docs-nm-settings-nmcli.xml.in +index 88803094d6..ca5225ba28 100644 +--- a/src/nmcli/generate-docs-nm-settings-nmcli.xml.in ++++ b/src/nmcli/generate-docs-nm-settings-nmcli.xml.in +@@ -650,7 +650,7 @@ + description="DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured." /> + ++ description="A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in decreasing priority, meaning the first address will be the primary address." /> + +-- +2.26.3 + diff --git a/SOURCES/1002-initrd-apply-mtu-to-bond-connection.patch b/SOURCES/1002-initrd-apply-mtu-to-bond-connection.patch deleted file mode 100644 index 22e20b1..0000000 --- a/SOURCES/1002-initrd-apply-mtu-to-bond-connection.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 9ab6906ea1c2ddd23a3926b35ed75128dd302d13 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Mon, 1 Mar 2021 21:16:08 +0100 -Subject: [PATCH] initrd: apply the MTU from bond= argument to the bond - connection - -Currently the MTU specified in: - - bond=[::[:[:]]] - -gets applied to the bond ports. Instead it should be applied to the -bond itself. - -Fixes: ecc074b2f8a6 ('initrd: add command line parser') - -https://bugzilla.redhat.com/show_bug.cgi?id=1932502 -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/767 -(cherry picked from commit 8df3ef5063cf0f8ee904f8fd39e9e64cc60836eb) -(cherry picked from commit 43d16d2cd63a3443704ca7bb539ba5cb673ba183) ---- - src/core/initrd/nmi-cmdline-reader.c | 5 +++-- - src/core/initrd/tests/test-cmdline-reader.c | 7 ++++++- - 2 files changed, 9 insertions(+), 3 deletions(-) - -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index 508ef2b25c..5f40f63ef2 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -764,6 +764,9 @@ reader_parse_master(Reader *reader, char *argument, const char *type_name, const - mtu = get_word(&argument, ':'); - } - -+ if (mtu) -+ connection_set(connection, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MTU, mtu); -+ - do { - slave = get_word(&slaves, ','); - if (slave == NULL) -@@ -777,8 +780,6 @@ reader_parse_master(Reader *reader, char *argument, const char *type_name, const - NM_SETTING_CONNECTION_MASTER, - master, - NULL); -- if (mtu) -- connection_set(connection, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MTU, mtu); - } while (slaves && *slaves != '\0'); - - if (argument && *argument) -diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c -index 33fb22d364..4b450aae0f 100644 ---- a/src/core/initrd/tests/test-cmdline-reader.c -+++ b/src/core/initrd/tests/test-cmdline-reader.c -@@ -825,13 +825,14 @@ test_bond(void) - { - gs_unref_hashtable GHashTable *connections = NULL; - const char *const * ARGV = NM_MAKE_STRV("rd.route=192.0.2.53::bong0", -- "bond=bong0:eth0,eth1:mode=balance-rr", -+ "bond=bong0:eth0,eth1:mode=balance-rr:9000", - "nameserver=203.0.113.53"); - NMConnection * connection; - NMSettingConnection * s_con; - NMSettingIPConfig * s_ip4; - NMSettingIPConfig * s_ip6; - NMSettingBond * s_bond; -+ NMSettingWired * s_wired; - NMIPRoute * ip_route; - const char * master_uuid; - -@@ -847,6 +848,10 @@ test_bond(void) - master_uuid = nm_connection_get_uuid(connection); - g_assert(master_uuid); - -+ s_wired = nm_connection_get_setting_wired(connection); -+ g_assert(s_wired); -+ g_assert_cmpint(nm_setting_wired_get_mtu(s_wired), ==, 9000); -+ - s_ip4 = nm_connection_get_setting_ip4_config(connection); - g_assert(s_ip4); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); --- -2.29.2 - diff --git a/SOURCES/1002-preserve-IPv6-multicast-route-rh2004212.patch b/SOURCES/1002-preserve-IPv6-multicast-route-rh2004212.patch new file mode 100644 index 0000000..cc87e0c --- /dev/null +++ b/SOURCES/1002-preserve-IPv6-multicast-route-rh2004212.patch @@ -0,0 +1,99 @@ +From 5f25baaba435aaa71e63350eac72afbf4d4513fd Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Fri, 17 Sep 2021 13:53:18 +0200 +Subject: [PATCH] platform: preserve IPv6 multicast route added by kernel + +Kernels < 5.11 add a route like: + + unicast ff00::/8 dev $IFACE proto boot scope global metric 256 pref medium + +to allow sending and receiving IPv6 multicast traffic. Ensure it's not +removed it when we do a route sync in mode ALL. + +In kernel 5.11 there were commits: + + https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ceed9038b2783d14e0422bdc6fd04f70580efb4c + https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a826b04303a40d52439aa141035fca5654ccaccd + +After those the route looks like + + multicast ff00::/8 dev $IFACE proto kernel metric 256 pref medium + +As NM ignores routes with rtm_type multicast, the code in this commit +is not needed on newer kernels. + +https://bugzilla.redhat.com/show_bug.cgi?id=2004212 +https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/984 +(cherry picked from commit 8003ca68f770c69e109c16f638abbcce44af9439) +(cherry picked from commit ce8eb446b4d9465a906bf8952c1b454dab8d0c7c) +--- + src/libnm-platform/nm-platform.c | 39 ++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c +index 6c0d0015d6..b7a65df597 100644 +--- a/src/libnm-platform/nm-platform.c ++++ b/src/libnm-platform/nm-platform.c +@@ -4304,6 +4304,7 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, + CList * iter; + NMPlatformIP4Route rt_local4; + NMPlatformIP6Route rt_local6; ++ NMPlatformIP6Route rt_mcast6; + const NMPlatformLink * pllink; + const NMPlatformLnkVrf * lnk_vrf; + guint32 local_table; +@@ -4328,6 +4329,7 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, + + rt_local4.plen = 0; + rt_local6.plen = 0; ++ rt_mcast6.plen = 0; + + routes_prune = g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); + +@@ -4420,6 +4422,43 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, + == 0) + continue; + } ++ ++ /* Kernels < 5.11 add a route like: ++ * ++ * unicast ff00::/8 dev $IFACE proto boot scope global metric 256 pref medium ++ * ++ * to allow sending and receiving IPv6 multicast traffic. Don't remove it. ++ * Since kernel 5.11 the route looks like: ++ * ++ * multicast ff00::/8 dev $IFACE proto kernel metric 256 pref medium ++ * ++ * As NM ignores routes with rtm_type multicast, there is no need for the code ++ * below on newer kernels. ++ */ ++ if (nm_platform_ip_route_get_effective_table(&rt->rx) == local_table ++ && rt->rx.plen == 8 && rt->rx.rt_source == NM_IP_CONFIG_SOURCE_RTPROT_BOOT ++ && rt->rx.metric == 256 && rt->r6.rt_pref == NM_ICMPV6_ROUTER_PREF_MEDIUM ++ && IN6_IS_ADDR_UNSPECIFIED(&rt->r6.gateway)) { ++ if (rt_mcast6.plen == 0) { ++ rt_mcast6 = (NMPlatformIP6Route){ ++ .ifindex = ifindex, ++ .type_coerced = nm_platform_route_type_coerce(RTN_UNICAST), ++ .plen = 8, ++ .rt_source = NM_IP_CONFIG_SOURCE_RTPROT_BOOT, ++ .metric = 256, ++ .table_coerced = nm_platform_route_table_coerce(local_table), ++ .rt_pref = NM_ICMPV6_ROUTER_PREF_MEDIUM, ++ .gateway = IN6ADDR_ANY_INIT, ++ .network = {{{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}}, ++ }; ++ } ++ ++ if (nm_platform_ip6_route_cmp(&rt->r6, ++ &rt_mcast6, ++ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) ++ == 0) ++ continue; ++ } + } + break; + +-- +2.31.1 + diff --git a/SOURCES/1003-bond-only-restore-mac-if-cloned.patch b/SOURCES/1003-bond-only-restore-mac-if-cloned.patch deleted file mode 100644 index 008f46e..0000000 --- a/SOURCES/1003-bond-only-restore-mac-if-cloned.patch +++ /dev/null @@ -1,68 +0,0 @@ -From ccc66f603d5fac8748d2271d051bbd1c42eeb682 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Sat, 6 Mar 2021 11:35:12 +0100 -Subject: [PATCH] bond: restore MAC on release only when there is a cloned MAC - address - -Currently we unconditionally reset the MAC to the previous value after -releasing ports. This has some disadvantages: - - - by default, after the last port is removed the bond will have one - of the previous port's address, which could conflict with the port; - - - in some cases, changing the bond MAC is not possible. For example - when the bond is active-backup and has fail_over_mac=1|2. In such - case the netlink call succeeds, but the address doesn't - change; then NM would keep waiting for some time. - -Don't try to restore the MAC unless the bond connection has a cloned -MAC set. - -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/775 -(cherry picked from commit 190fd9aa9f3fbf5705c2b80b9fc64c89d22b7593) -(cherry picked from commit 4c1e60549a5be170185a77439379cc170d6b3631) ---- - src/core/devices/nm-device-bond.c | 20 ++++++++++++++------ - 1 file changed, 14 insertions(+), 6 deletions(-) - -diff --git a/src/core/devices/nm-device-bond.c b/src/core/devices/nm-device-bond.c -index 5814aef451..247ce41c07 100644 ---- a/src/core/devices/nm-device-bond.c -+++ b/src/core/devices/nm-device-bond.c -@@ -444,9 +444,10 @@ release_slave(NMDevice *device, NMDevice *slave, gboolean configure) - _LOGD(LOGD_BOND, "bond slave %s is already released", nm_device_get_ip_iface(slave)); - - if (configure) { -- /* When the last slave is released the bond MAC will be set to a random -- * value by kernel; remember the current one and restore it afterwards. -- */ -+ NMConnection * applied; -+ NMSettingWired *s_wired; -+ const char * cloned_mac; -+ - address = g_strdup(nm_device_get_hw_address(device)); - - if (ifindex_slave > 0) { -@@ -461,9 +462,16 @@ release_slave(NMDevice *device, NMDevice *slave, gboolean configure) - } - } - -- nm_platform_process_events(nm_device_get_platform(device)); -- if (nm_device_update_hw_address(device)) -- nm_device_hw_addr_set(device, address, "restore", FALSE); -+ if ((applied = nm_device_get_applied_connection(device)) -+ && ((s_wired = nm_connection_get_setting_wired(applied))) -+ && ((cloned_mac = nm_setting_wired_get_cloned_mac_address(s_wired)))) { -+ /* When the last slave is released the bond MAC will be set to a random -+ * value by kernel; if we have set a cloned-mac-address, we need to -+ * restore it to the previous value. */ -+ nm_platform_process_events(nm_device_get_platform(device)); -+ if (nm_device_update_hw_address(device)) -+ nm_device_hw_addr_set(device, address, "restore", FALSE); -+ } - - /* Kernel bonding code "closes" the slave when releasing it, (which clears - * IFF_UP), so we must bring it back up here to ensure carrier changes and --- -2.29.2 - diff --git a/SOURCES/1003-cloud-setup-better-handle-other-routes-rh1977984.patch b/SOURCES/1003-cloud-setup-better-handle-other-routes-rh1977984.patch new file mode 100644 index 0000000..7c8e51b --- /dev/null +++ b/SOURCES/1003-cloud-setup-better-handle-other-routes-rh1977984.patch @@ -0,0 +1,1620 @@ +From f79d5a903b769f45f084d81a732ec9b3dcc3f2a9 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 09:30:29 +0200 +Subject: [PATCH 01/10] cloud-setup: return structure for get_config() result + instead of generic hash table + +Returning a struct seems easier to understand, because then the result +is typed. + +Also, we might return additional results, which are system wide and not +per-interface. + +(cherry picked from commit 323e18276894591712a5e29f6e907562c79c5216) +(cherry picked from commit c94b1c43d4b5c5b88d67d7966d23a005028e78d8) +--- + src/nm-cloud-setup/main.c | 54 ++++++++++++++++-------------- + src/nm-cloud-setup/nmcs-provider.c | 28 ++++++++++++++-- + src/nm-cloud-setup/nmcs-provider.h | 20 ++++++++++- + 3 files changed, 72 insertions(+), 30 deletions(-) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 8dc67851794c..04b29f8a4b74 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -200,30 +200,30 @@ _nmc_get_device_by_hwaddr(NMClient *nmc, const char *hwaddr) + /*****************************************************************************/ + + typedef struct { +- GMainLoop * main_loop; +- GHashTable *config_dict; ++ GMainLoop * main_loop; ++ NMCSProviderGetConfigResult *result; + } GetConfigData; + + static void +-_get_config_cb(GObject *source, GAsyncResult *result, gpointer user_data) ++_get_config_cb(GObject *source, GAsyncResult *res, gpointer user_data) + { +- GetConfigData * data = user_data; +- gs_unref_hashtable GHashTable *config_dict = NULL; +- gs_free_error GError *error = NULL; ++ GetConfigData * data = user_data; ++ nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL; ++ gs_free_error GError *error = NULL; + +- config_dict = nmcs_provider_get_config_finish(NMCS_PROVIDER(source), result, &error); ++ result = nmcs_provider_get_config_finish(NMCS_PROVIDER(source), res, &error); + +- if (!config_dict) { ++ if (!result) { + if (!nm_utils_error_is_cancelled(error)) + _LOGI("failure to get meta data: %s", error->message); + } else + _LOGD("meta data received"); + +- data->config_dict = g_steal_pointer(&config_dict); ++ data->result = g_steal_pointer(&result); + g_main_loop_quit(data->main_loop); + } + +-static GHashTable * ++static NMCSProviderGetConfigResult * + _get_config(GCancellable *sigterm_cancellable, NMCSProvider *provider, NMClient *nmc) + { + nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE); +@@ -243,7 +243,7 @@ _get_config(GCancellable *sigterm_cancellable, NMCSProvider *provider, NMClient + + g_main_loop_run(main_loop); + +- return data.config_dict; ++ return data.result; + } + + /*****************************************************************************/ +@@ -396,13 +396,13 @@ _nmc_mangle_connection(NMDevice * device, + /*****************************************************************************/ + + static guint +-_config_data_get_num_valid(GHashTable *config_dict) ++_config_data_get_num_valid(const NMCSProviderGetConfigResult *result) + { + const NMCSProviderGetConfigIfaceData *config_data; + GHashTableIter h_iter; + guint n = 0; + +- g_hash_table_iter_init(&h_iter, config_dict); ++ g_hash_table_iter_init(&h_iter, result->iface_datas); + while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &config_data)) { + if (nmcs_provider_get_config_iface_data_is_valid(config_data)) + n++; +@@ -525,7 +525,9 @@ try_again: + } + + static gboolean +-_config_all(GCancellable *sigterm_cancellable, NMClient *nmc, GHashTable *config_dict) ++_config_all(GCancellable * sigterm_cancellable, ++ NMClient * nmc, ++ const NMCSProviderGetConfigResult *result) + { + GHashTableIter h_iter; + const NMCSProviderGetConfigIfaceData *c_config_data; +@@ -533,9 +535,9 @@ _config_all(GCancellable *sigterm_cancellable, NMClient *nmc, GHashTable *config + gboolean is_single_nic; + gboolean any_changes = FALSE; + +- is_single_nic = (_config_data_get_num_valid(config_dict) <= 1); ++ is_single_nic = (_config_data_get_num_valid(result) <= 1); + +- g_hash_table_iter_init(&h_iter, config_dict); ++ g_hash_table_iter_init(&h_iter, result->iface_datas); + while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { + if (_config_one(sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data)) + any_changes = TRUE; +@@ -564,12 +566,12 @@ sigterm_handler(gpointer user_data) + int + main(int argc, const char *const *argv) + { +- gs_unref_object GCancellable * sigterm_cancellable = NULL; +- nm_auto_destroy_and_unref_gsource GSource *sigterm_source = NULL; +- gs_unref_object NMCSProvider *provider = NULL; +- gs_unref_object NMClient *nmc = NULL; +- gs_unref_hashtable GHashTable *config_dict = NULL; +- gs_free_error GError *error = NULL; ++ gs_unref_object GCancellable * sigterm_cancellable = NULL; ++ nm_auto_destroy_and_unref_gsource GSource *sigterm_source = NULL; ++ gs_unref_object NMCSProvider *provider = NULL; ++ gs_unref_object NMClient * nmc = NULL; ++ nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL; ++ gs_free_error GError *error = NULL; + + _nm_logging_enabled_init(g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_LOG"))); + +@@ -614,17 +616,17 @@ main(int argc, const char *const *argv) + goto done; + } + +- config_dict = _get_config(sigterm_cancellable, provider, nmc); +- if (!config_dict) ++ result = _get_config(sigterm_cancellable, provider, nmc); ++ if (!result) + goto done; + +- if (_config_all(sigterm_cancellable, nmc, config_dict)) ++ if (_config_all(sigterm_cancellable, nmc, result)) + _LOGI("some changes were applied for provider %s", nmcs_provider_get_name(provider)); + else + _LOGD("no changes were applied for provider %s", nmcs_provider_get_name(provider)); + + done: +- nm_clear_pointer(&config_dict, g_hash_table_unref); ++ nm_clear_pointer(&result, nmcs_provider_get_config_result_free); + g_clear_object(&nmc); + g_clear_object(&provider); + +diff --git a/src/nm-cloud-setup/nmcs-provider.c b/src/nm-cloud-setup/nmcs-provider.c +index 678152aa95e0..77f8090a8225 100644 +--- a/src/nm-cloud-setup/nmcs-provider.c ++++ b/src/nm-cloud-setup/nmcs-provider.c +@@ -49,6 +49,28 @@ nmcs_provider_get_main_context(NMCSProvider *self) + + return nm_http_client_get_main_context(NMCS_PROVIDER_GET_PRIVATE(self)->http_client); + } ++/*****************************************************************************/ ++ ++static NMCSProviderGetConfigResult * ++nmcs_provider_get_config_result_new(GHashTable *iface_datas) ++{ ++ NMCSProviderGetConfigResult *result; ++ ++ result = g_new(NMCSProviderGetConfigResult, 1); ++ *result = (NMCSProviderGetConfigResult){ ++ .iface_datas = g_hash_table_ref(iface_datas), ++ }; ++ return result; ++} ++ ++void ++nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result) ++{ ++ if (result) { ++ nm_g_hash_table_unref(result->iface_datas); ++ g_free(result); ++ } ++} + + /*****************************************************************************/ + +@@ -137,8 +159,8 @@ _get_config_task_maybe_return(NMCSProviderGetConfigTaskData *get_config_data, GE + } else { + _LOGD("get-config: success"); + g_task_return_pointer(get_config_data->task, +- g_hash_table_ref(get_config_data->result_dict), +- (GDestroyNotify) g_hash_table_unref); ++ nmcs_provider_get_config_result_new(get_config_data->result_dict), ++ (GDestroyNotify) nmcs_provider_get_config_result_free); + } + + nm_clear_g_signal_handler(g_task_get_cancellable(get_config_data->task), +@@ -217,7 +239,7 @@ nmcs_provider_get_config(NMCSProvider * self, + NMCS_PROVIDER_GET_CLASS(self)->get_config(self, get_config_data); + } + +-GHashTable * ++NMCSProviderGetConfigResult * + nmcs_provider_get_config_finish(NMCSProvider *self, GAsyncResult *result, GError **error) + { + g_return_val_if_fail(NMCS_IS_PROVIDER(self), FALSE); +diff --git a/src/nm-cloud-setup/nmcs-provider.h b/src/nm-cloud-setup/nmcs-provider.h +index 13212b8e4cb4..730ddc9d8f09 100644 +--- a/src/nm-cloud-setup/nmcs-provider.h ++++ b/src/nm-cloud-setup/nmcs-provider.h +@@ -43,6 +43,24 @@ nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceDat + + NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested); + ++/*****************************************************************************/ ++ ++typedef struct { ++ /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). ++ * This is the per-interface result of get_config(). */ ++ GHashTable *iface_datas; ++} NMCSProviderGetConfigResult; ++ ++void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); ++ ++NM_AUTO_DEFINE_FCN0(NMCSProviderGetConfigResult *, ++ _nm_auto_free_nmcs_provider_get_config_result, ++ nmcs_provider_get_config_result_free); ++#define nm_auto_free_nmcs_provider_get_config_result \ ++ nm_auto(_nm_auto_free_nmcs_provider_get_config_result) ++ ++/*****************************************************************************/ ++ + typedef struct { + GTask *task; + +@@ -124,7 +142,7 @@ void nmcs_provider_get_config(NMCSProvider * provider, + GAsyncReadyCallback callback, + gpointer user_data); + +-GHashTable * ++NMCSProviderGetConfigResult * + nmcs_provider_get_config_finish(NMCSProvider *provider, GAsyncResult *result, GError **error); + + #endif /* __NMCS_PROVIDER_H__ */ +-- +2.31.1 + + +From 165dd652446673c826ef0da33b865da359aa22ee Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 09:42:37 +0200 +Subject: [PATCH 02/10] cloud-setup: cache number of valid interfaces in + get-config result + +Now that we return a struct from get_config(), we can have system-wide +properties returned. + +Let it count and cache the number of valid iface_datas. + +Currently that is not yet used, but it will be. + +(cherry picked from commit a3cd66d3fadcecab9b186cc7f634f6ec6a5a92ee) +(cherry picked from commit e74375fc3b68b07d1ed5f6ebca40cbe5b20ed47b) +--- + src/nm-cloud-setup/main.c | 22 +--------------------- + src/nm-cloud-setup/nmcs-provider.c | 15 +++++++++++++-- + src/nm-cloud-setup/nmcs-provider.h | 3 +++ + 3 files changed, 17 insertions(+), 23 deletions(-) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 04b29f8a4b74..686cd2fc0c84 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -395,26 +395,9 @@ _nmc_mangle_connection(NMDevice * device, + + /*****************************************************************************/ + +-static guint +-_config_data_get_num_valid(const NMCSProviderGetConfigResult *result) +-{ +- const NMCSProviderGetConfigIfaceData *config_data; +- GHashTableIter h_iter; +- guint n = 0; +- +- g_hash_table_iter_init(&h_iter, result->iface_datas); +- while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &config_data)) { +- if (nmcs_provider_get_config_iface_data_is_valid(config_data)) +- n++; +- } +- +- return n; +-} +- + static gboolean + _config_one(GCancellable * sigterm_cancellable, + NMClient * nmc, +- gboolean is_single_nic, + const char * hwaddr, + const NMCSProviderGetConfigIfaceData *config_data) + { +@@ -532,14 +515,11 @@ _config_all(GCancellable * sigterm_cancellable, + GHashTableIter h_iter; + const NMCSProviderGetConfigIfaceData *c_config_data; + const char * c_hwaddr; +- gboolean is_single_nic; + gboolean any_changes = FALSE; + +- is_single_nic = (_config_data_get_num_valid(result) <= 1); +- + g_hash_table_iter_init(&h_iter, result->iface_datas); + while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { +- if (_config_one(sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data)) ++ if (_config_one(sigterm_cancellable, nmc, c_hwaddr, c_config_data)) + any_changes = TRUE; + } + +diff --git a/src/nm-cloud-setup/nmcs-provider.c b/src/nm-cloud-setup/nmcs-provider.c +index 77f8090a8225..8f82ddb493ea 100644 +--- a/src/nm-cloud-setup/nmcs-provider.c ++++ b/src/nm-cloud-setup/nmcs-provider.c +@@ -54,12 +54,23 @@ nmcs_provider_get_main_context(NMCSProvider *self) + static NMCSProviderGetConfigResult * + nmcs_provider_get_config_result_new(GHashTable *iface_datas) + { +- NMCSProviderGetConfigResult *result; ++ const NMCSProviderGetConfigIfaceData *iface_data; ++ NMCSProviderGetConfigResult * result; ++ GHashTableIter h_iter; ++ guint num_valid_ifaces = 0; ++ ++ g_hash_table_iter_init(&h_iter, iface_datas); ++ while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { ++ if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) ++ num_valid_ifaces++; ++ } + + result = g_new(NMCSProviderGetConfigResult, 1); + *result = (NMCSProviderGetConfigResult){ +- .iface_datas = g_hash_table_ref(iface_datas), ++ .iface_datas = g_hash_table_ref(iface_datas), ++ .num_valid_ifaces = num_valid_ifaces, + }; ++ + return result; + } + +diff --git a/src/nm-cloud-setup/nmcs-provider.h b/src/nm-cloud-setup/nmcs-provider.h +index 730ddc9d8f09..2e4c8d167a73 100644 +--- a/src/nm-cloud-setup/nmcs-provider.h ++++ b/src/nm-cloud-setup/nmcs-provider.h +@@ -49,6 +49,9 @@ typedef struct { + /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). + * This is the per-interface result of get_config(). */ + GHashTable *iface_datas; ++ ++ /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ ++ guint num_valid_ifaces; + } NMCSProviderGetConfigResult; + + void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); +-- +2.31.1 + + +From 2e6d23ef2496b7a26f6406fab1d274eee66467af Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 10:11:31 +0200 +Subject: [PATCH 03/10] cloud-setup: count numbers of valid IPv4 addresses in + get-config result + +Will be used next. + +(cherry picked from commit 7969ae1a82b90c3a9dbe33875d138c7b55cf6ac8) +(cherry picked from commit ae504433f11480fde2436d3a5acba026db6c47bd) +--- + src/nm-cloud-setup/nmcs-provider.c | 6 +++++- + src/nm-cloud-setup/nmcs-provider.h | 3 +++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/nm-cloud-setup/nmcs-provider.c b/src/nm-cloud-setup/nmcs-provider.c +index 8f82ddb493ea..8901100378d0 100644 +--- a/src/nm-cloud-setup/nmcs-provider.c ++++ b/src/nm-cloud-setup/nmcs-provider.c +@@ -58,17 +58,21 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) + NMCSProviderGetConfigResult * result; + GHashTableIter h_iter; + guint num_valid_ifaces = 0; ++ guint num_ipv4s = 0; + + g_hash_table_iter_init(&h_iter, iface_datas); + while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { +- if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) ++ if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) { + num_valid_ifaces++; ++ num_ipv4s += iface_data->ipv4s_len; ++ } + } + + result = g_new(NMCSProviderGetConfigResult, 1); + *result = (NMCSProviderGetConfigResult){ + .iface_datas = g_hash_table_ref(iface_datas), + .num_valid_ifaces = num_valid_ifaces, ++ .num_ipv4s = num_ipv4s, + }; + + return result; +diff --git a/src/nm-cloud-setup/nmcs-provider.h b/src/nm-cloud-setup/nmcs-provider.h +index 2e4c8d167a73..31fec4449f9e 100644 +--- a/src/nm-cloud-setup/nmcs-provider.h ++++ b/src/nm-cloud-setup/nmcs-provider.h +@@ -52,6 +52,9 @@ typedef struct { + + /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ + guint num_valid_ifaces; ++ ++ /* the number of IPv4 addresses over all valid iface_datas. */ ++ guint num_ipv4s; + } NMCSProviderGetConfigResult; + + void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); +-- +2.31.1 + + +From d80ef34f9390eb2baecb863cbbeded3dbffa1d8e Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 10:15:37 +0200 +Subject: [PATCH 04/10] cloud-setup: skip configuring policy routing if there + is only one interface/address + +nm-cloud-setup automatically configures the network. That may conflict +with what the user wants. In case the user configures some specific +setup, they are encouraged to disable nm-cloud-setup (and its +automatism). + +Still, what we do by default matters, and should play as well with +user's expectations. Configuring policy routing and a higher priority +table (30400+) that hijacks the traffic can cause problems. + +If the system only has one IPv4 address and one interface, then there +is no point in configuring policy routing at all. Detect that, and skip +the change in that case. + +Note that of course we need to handle the case where previously multiple +IP addresses were configured and an update gives only one address. In +that case we need to clear the previously configured rules/routes. The +patch achieves this. + +(cherry picked from commit 5f047968d7a48999d20001f83e2005caa43c80ce) +(cherry picked from commit 8bc8a0f56b97c28cf26fd678a549db41399adcb7) +--- + src/nm-cloud-setup/main.c | 41 +++++++++++++++++++++++++++++++-------- + 1 file changed, 33 insertions(+), 8 deletions(-) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 686cd2fc0c84..bb5c0d5ded9d 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -269,7 +269,9 @@ _nmc_skip_connection(NMConnection *connection) + static gboolean + _nmc_mangle_connection(NMDevice * device, + NMConnection * connection, ++ const NMCSProviderGetConfigResult * result, + const NMCSProviderGetConfigIfaceData *config_data, ++ gboolean * out_skipped_single_addr, + gboolean * out_changed) + { + NMSettingIPConfig * s_ip; +@@ -288,6 +290,9 @@ _nmc_mangle_connection(NMDevice * device, + gs_unref_ptrarray GPtrArray *rules_new = NULL; + gs_unref_ptrarray GPtrArray *routes_new = NULL; + ++ NM_SET_OUT(out_skipped_single_addr, FALSE); ++ NM_SET_OUT(out_changed, FALSE); ++ + if (!nm_streq0(nm_connection_get_connection_type(connection), NM_SETTING_WIRED_SETTING_NAME)) + return FALSE; + +@@ -329,7 +334,11 @@ _nmc_mangle_connection(NMDevice * device, + } + } + +- if (config_data->has_ipv4s && config_data->has_cidr) { ++ if (result->num_valid_ifaces <= 1 && result->num_ipv4s <= 1) { ++ /* this setup only has one interface and one IPv4 address (or less). ++ * We don't need to configure policy routing in this case. */ ++ NM_SET_OUT(out_skipped_single_addr, TRUE); ++ } else if (config_data->has_ipv4s && config_data->has_cidr) { + for (i = 0; i < config_data->ipv4s_len; i++) { + NMIPAddress *entry; + +@@ -398,6 +407,7 @@ _nmc_mangle_connection(NMDevice * device, + static gboolean + _config_one(GCancellable * sigterm_cancellable, + NMClient * nmc, ++ const NMCSProviderGetConfigResult * result, + const char * hwaddr, + const NMCSProviderGetConfigIfaceData *config_data) + { +@@ -406,6 +416,7 @@ _config_one(GCancellable * sigterm_cancellable, + guint64 applied_version_id; + gs_free_error GError *error = NULL; + gboolean changed; ++ gboolean skipped_single_addr; + gboolean version_id_changed; + guint try_count; + gboolean any_changes = FALSE; +@@ -454,16 +465,30 @@ try_again: + return any_changes; + } + +- if (!_nmc_mangle_connection(device, applied_connection, config_data, &changed)) { ++ if (!_nmc_mangle_connection(device, ++ applied_connection, ++ result, ++ config_data, ++ &skipped_single_addr, ++ &changed)) { + _LOGD("config device %s: device has no suitable applied connection. Skip", hwaddr); + return any_changes; + } + + if (!changed) { +- _LOGD("config device %s: device needs no update to applied connection \"%s\" (%s). Skip", +- hwaddr, +- nm_connection_get_id(applied_connection), +- nm_connection_get_uuid(applied_connection)); ++ if (skipped_single_addr) { ++ _LOGD("config device %s: device needs no update to applied connection \"%s\" (%s) " ++ "because there are not multiple IP addresses. Skip", ++ hwaddr, ++ nm_connection_get_id(applied_connection), ++ nm_connection_get_uuid(applied_connection)); ++ } else { ++ _LOGD( ++ "config device %s: device needs no update to applied connection \"%s\" (%s). Skip", ++ hwaddr, ++ nm_connection_get_id(applied_connection), ++ nm_connection_get_uuid(applied_connection)); ++ } + return any_changes; + } + +@@ -472,7 +497,7 @@ try_again: + nm_connection_get_id(applied_connection), + nm_connection_get_uuid(applied_connection)); + +- /* we are about to call Reapply(). If if that fails, it counts as if we changed something. */ ++ /* we are about to call Reapply(). Even if that fails, it counts as if we changed something. */ + any_changes = TRUE; + + if (!nmcs_device_reapply(device, +@@ -519,7 +544,7 @@ _config_all(GCancellable * sigterm_cancellable, + + g_hash_table_iter_init(&h_iter, result->iface_datas); + while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { +- if (_config_one(sigterm_cancellable, nmc, c_hwaddr, c_config_data)) ++ if (_config_one(sigterm_cancellable, nmc, result, c_hwaddr, c_config_data)) + any_changes = TRUE; + } + +-- +2.31.1 + + +From 0042bff5e16e71f548dcb8d046a5dbd3f694de8f Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 14:34:51 +0200 +Subject: [PATCH 05/10] cloud-setup: add "hwaddr" to + NMCSProviderGetConfigIfaceData struct + +get-config() gives a NMCSProviderGetConfigResult structure, and the +main part of data is the GHashTable of MAC addresses and +NMCSProviderGetConfigIfaceData instances. + +Let NMCSProviderGetConfigIfaceData also have a reference to the MAC +address. This way, I'll be able to create a (sorted) list of interface +datas, that also contain the MAC address. + +(cherry picked from commit ec56fe60fbf31768d0d1cae8bb325c1fdf7dbf07) +(cherry picked from commit cc289e53699872a3617aef321453ef6a885d0148) +--- + src/nm-cloud-setup/nmcs-provider-aliyun.c | 32 ++++++++++------------- + src/nm-cloud-setup/nmcs-provider-azure.c | 21 +++++++-------- + src/nm-cloud-setup/nmcs-provider-ec2.c | 27 ++++++++----------- + src/nm-cloud-setup/nmcs-provider-gcp.c | 20 +++++++------- + src/nm-cloud-setup/nmcs-provider.c | 22 +++++++++++----- + src/nm-cloud-setup/nmcs-provider.h | 12 +++++++-- + 6 files changed, 68 insertions(+), 66 deletions(-) + +diff --git a/src/nm-cloud-setup/nmcs-provider-aliyun.c b/src/nm-cloud-setup/nmcs-provider-aliyun.c +index 01a4af0ff5b8..126980fdfe44 100644 +--- a/src/nm-cloud-setup/nmcs-provider-aliyun.c ++++ b/src/nm-cloud-setup/nmcs-provider-aliyun.c +@@ -134,7 +134,6 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, + GetConfigFetchDoneType fetch_type) + { + NMCSProviderGetConfigTaskData *get_config_data; +- const char * hwaddr = NULL; + gs_unref_bytes GBytes *response = NULL; + gs_free_error GError * error = NULL; + NMCSProviderGetConfigIfaceData *config_iface_data; +@@ -146,7 +145,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, + gsize i; + gsize len; + +- nm_utils_user_data_unpack(user_data, &get_config_data, &hwaddr); ++ nm_utils_user_data_unpack(user_data, &get_config_data, &config_iface_data); + + nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); + +@@ -156,8 +155,6 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, + if (error) + goto out; + +- config_iface_data = g_hash_table_lookup(get_config_data->result_dict, hwaddr); +- + switch (fetch_type) { + case GET_CONFIG_FETCH_DONE_TYPE_PRIVATE_IPV4S: + +@@ -300,22 +297,21 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + gs_free char * uri2 = NULL; + gs_free char * uri3 = NULL; + gs_free char * uri4 = NULL; +- const char * hwaddr; + +- if (!g_hash_table_lookup_extended(get_config_data->result_dict, +- v_hwaddr, +- (gpointer *) &hwaddr, +- (gpointer *) &config_iface_data)) { ++ config_iface_data = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); ++ ++ if (!config_iface_data) { + if (!get_config_data->any) { + _LOGD("get-config: skip fetching meta data for %s (%s)", + v_hwaddr, + v_mac_data->path); + continue; + } +- config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE); +- g_hash_table_insert(get_config_data->result_dict, +- (char *) (hwaddr = g_strdup(v_hwaddr)), +- config_iface_data); ++ ++ config_iface_data = ++ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, ++ FALSE, ++ v_hwaddr); + } + + nm_assert(config_iface_data->iface_idx == -1); +@@ -324,7 +320,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + + _LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)", + config_iface_data->iface_idx, +- hwaddr, ++ config_iface_data->hwaddr, + v_mac_data->path); + + get_config_data->n_pending++; +@@ -342,7 +338,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_vpc_cidr_block, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + + get_config_data->n_pending++; + nm_http_client_poll_get( +@@ -359,7 +355,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_private_ipv4s, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + + get_config_data->n_pending++; + nm_http_client_poll_get( +@@ -376,7 +372,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_netmask, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + + get_config_data->n_pending++; + nm_http_client_poll_get( +@@ -393,7 +389,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_gateway, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + } + + _nmcs_provider_get_config_task_maybe_return(get_config_data, NULL); +diff --git a/src/nm-cloud-setup/nmcs-provider-azure.c b/src/nm-cloud-setup/nmcs-provider-azure.c +index 69785d64a8ac..b3f0c68ba666 100644 +--- a/src/nm-cloud-setup/nmcs-provider-azure.c ++++ b/src/nm-cloud-setup/nmcs-provider-azure.c +@@ -97,7 +97,6 @@ typedef struct { + gssize intern_iface_idx; + gssize extern_iface_idx; + guint n_iface_data_pending; +- const char * hwaddr; + } AzureIfaceData; + + static void +@@ -378,25 +377,24 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) + goto out_done; + } + +- if (!g_hash_table_lookup_extended(get_config_data->result_dict, +- v_hwaddr, +- (gpointer *) &iface_data->hwaddr, +- (gpointer *) &iface_data->iface_get_config)) { ++ iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); ++ ++ if (!iface_data->iface_get_config) { + if (!get_config_data->any) { + _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", + v_hwaddr, + iface_data->intern_iface_idx); + goto out_done; + } +- iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); +- g_hash_table_insert(get_config_data->result_dict, +- (char *) (iface_data->hwaddr = g_steal_pointer(&v_hwaddr)), +- iface_data->iface_get_config); ++ iface_data->iface_get_config = ++ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, ++ FALSE, ++ v_hwaddr); + } else { + if (iface_data->iface_get_config->iface_idx >= 0) { + _LOGI("interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", + iface_data->intern_iface_idx, +- iface_data->hwaddr); ++ iface_data->iface_get_config->hwaddr); + error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, + "duplicate MAC address for index %" G_GSSIZE_FORMAT, + iface_data->intern_iface_idx); +@@ -408,7 +406,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) + + _LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s", + iface_data->intern_iface_idx, +- iface_data->hwaddr); ++ iface_data->iface_get_config->hwaddr); + + nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->intern_iface_idx); + +@@ -488,7 +486,6 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat + .intern_iface_idx = intern_iface_idx, + .extern_iface_idx = extern_iface_idx_cnt++, + .n_iface_data_pending = 0, +- .hwaddr = NULL, + }; + g_ptr_array_add(ifaces_arr, iface_data); + } +diff --git a/src/nm-cloud-setup/nmcs-provider-ec2.c b/src/nm-cloud-setup/nmcs-provider-ec2.c +index 6f83238d6871..9fe625182c35 100644 +--- a/src/nm-cloud-setup/nmcs-provider-ec2.c ++++ b/src/nm-cloud-setup/nmcs-provider-ec2.c +@@ -122,14 +122,13 @@ _get_config_fetch_done_cb(NMHttpClient *http_client, + gboolean is_local_ipv4) + { + NMCSProviderGetConfigTaskData *get_config_data; +- const char * hwaddr = NULL; + gs_unref_bytes GBytes *response = NULL; + gs_free_error GError * error = NULL; + NMCSProviderGetConfigIfaceData *config_iface_data; + in_addr_t tmp_addr; + int tmp_prefix; + +- nm_utils_user_data_unpack(user_data, &get_config_data, &hwaddr); ++ nm_utils_user_data_unpack(user_data, &get_config_data, &config_iface_data); + + nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); + +@@ -139,8 +138,6 @@ _get_config_fetch_done_cb(NMHttpClient *http_client, + if (error) + goto out; + +- config_iface_data = g_hash_table_lookup(get_config_data->result_dict, hwaddr); +- + if (is_local_ipv4) { + gs_free const char **s_addrs = NULL; + gsize i, len; +@@ -236,22 +233,20 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NMCSProviderGetConfigIfaceData *config_iface_data; + gs_free char * uri1 = NULL; + gs_free char * uri2 = NULL; +- const char * hwaddr; + +- if (!g_hash_table_lookup_extended(get_config_data->result_dict, +- v_hwaddr, +- (gpointer *) &hwaddr, +- (gpointer *) &config_iface_data)) { ++ config_iface_data = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); ++ ++ if (!config_iface_data) { + if (!get_config_data->any) { + _LOGD("get-config: skip fetching meta data for %s (%s)", + v_hwaddr, + v_mac_data->path); + continue; + } +- config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE); +- g_hash_table_insert(get_config_data->result_dict, +- (char *) (hwaddr = g_strdup(v_hwaddr)), +- config_iface_data); ++ config_iface_data = ++ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, ++ FALSE, ++ v_hwaddr); + } + + nm_assert(config_iface_data->iface_idx == -1); +@@ -260,7 +255,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + + _LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)", + config_iface_data->iface_idx, +- hwaddr, ++ config_iface_data->hwaddr, + v_mac_data->path); + + get_config_data->n_pending++; +@@ -278,7 +273,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_subnet_ipv4_cidr_block, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + + get_config_data->n_pending++; + nm_http_client_poll_get( +@@ -295,7 +290,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us + NULL, + NULL, + _get_config_fetch_done_cb_local_ipv4s, +- nm_utils_user_data_pack(get_config_data, hwaddr)); ++ nm_utils_user_data_pack(get_config_data, config_iface_data)); + } + + _nmcs_provider_get_config_task_maybe_return(get_config_data, NULL); +diff --git a/src/nm-cloud-setup/nmcs-provider-gcp.c b/src/nm-cloud-setup/nmcs-provider-gcp.c +index eacfd5e24805..60425ad97868 100644 +--- a/src/nm-cloud-setup/nmcs-provider-gcp.c ++++ b/src/nm-cloud-setup/nmcs-provider-gcp.c +@@ -247,7 +247,6 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) + GCPIfaceData * iface_data = user_data; + gs_free_error GError * error = NULL; + gs_free char * v_hwaddr = NULL; +- const char * hwaddr = NULL; + gs_free const char * uri = NULL; + char sbuf[100]; + NMCSProviderGetConfigTaskData *get_config_data; +@@ -273,26 +272,25 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) + goto out_done; + } + +- if (!g_hash_table_lookup_extended(get_config_data->result_dict, +- v_hwaddr, +- (gpointer *) &hwaddr, +- (gpointer *) &iface_data->iface_get_config)) { ++ iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); ++ ++ if (!iface_data->iface_get_config) { + if (!get_config_data->any) { + _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", + v_hwaddr, + iface_data->intern_iface_idx); + goto out_done; + } +- iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); +- g_hash_table_insert(get_config_data->result_dict, +- (char *) (hwaddr = g_steal_pointer(&v_hwaddr)), +- iface_data->iface_get_config); ++ iface_data->iface_get_config = ++ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, ++ FALSE, ++ v_hwaddr); + is_requested = FALSE; + } else { + if (iface_data->iface_get_config->iface_idx >= 0) { + _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", + iface_data->intern_iface_idx, +- hwaddr); ++ iface_data->iface_get_config->hwaddr); + error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, + "duplicate MAC address for index %" G_GSSIZE_FORMAT, + iface_data->intern_iface_idx); +@@ -306,7 +304,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) + _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a %sdevice with hwaddr %s", + iface_data->intern_iface_idx, + is_requested ? "requested " : "", +- hwaddr); ++ iface_data->iface_get_config->hwaddr); + + nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->intern_iface_idx); + +diff --git a/src/nm-cloud-setup/nmcs-provider.c b/src/nm-cloud-setup/nmcs-provider.c +index 8901100378d0..56f36646bb8a 100644 +--- a/src/nm-cloud-setup/nmcs-provider.c ++++ b/src/nm-cloud-setup/nmcs-provider.c +@@ -127,15 +127,25 @@ nmcs_provider_detect_finish(NMCSProvider *self, GAsyncResult *result, GError **e + /*****************************************************************************/ + + NMCSProviderGetConfigIfaceData * +-nmcs_provider_get_config_iface_data_new(gboolean was_requested) ++nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas, ++ gboolean was_requested, ++ const char *hwaddr) + { + NMCSProviderGetConfigIfaceData *iface_data; + ++ nm_assert(hwaddr); ++ + iface_data = g_slice_new(NMCSProviderGetConfigIfaceData); + *iface_data = (NMCSProviderGetConfigIfaceData){ ++ .hwaddr = g_strdup(hwaddr), + .iface_idx = -1, + .was_requested = was_requested, + }; ++ ++ /* the has does not own the key (iface_datta->hwaddr), the lifetime of the ++ * key is associated with the iface_data instance. */ ++ g_hash_table_replace(iface_datas, (char *) iface_data->hwaddr, iface_data); ++ + return iface_data; + } + +@@ -146,6 +156,7 @@ _iface_data_free(gpointer data) + + g_free(iface_data->ipv4s_arr); + g_free(iface_data->iproutes_arr); ++ g_free((char *) iface_data->hwaddr); + + nm_g_slice_free(iface_data); + } +@@ -224,16 +235,13 @@ nmcs_provider_get_config(NMCSProvider * self, + *get_config_data = (NMCSProviderGetConfigTaskData){ + .task = nm_g_task_new(self, cancellable, nmcs_provider_get_config, callback, user_data), + .any = any, +- .result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, _iface_data_free), ++ .result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, NULL, _iface_data_free), + }; + + nmcs_wait_for_objects_register(get_config_data->task); + +- for (; hwaddrs && hwaddrs[0]; hwaddrs++) { +- g_hash_table_insert(get_config_data->result_dict, +- g_strdup(hwaddrs[0]), +- nmcs_provider_get_config_iface_data_new(TRUE)); +- } ++ for (; hwaddrs && hwaddrs[0]; hwaddrs++) ++ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, TRUE, hwaddrs[0]); + + if (cancellable) { + gulong cancelled_id; +diff --git a/src/nm-cloud-setup/nmcs-provider.h b/src/nm-cloud-setup/nmcs-provider.h +index 31fec4449f9e..c67184679949 100644 +--- a/src/nm-cloud-setup/nmcs-provider.h ++++ b/src/nm-cloud-setup/nmcs-provider.h +@@ -10,6 +10,10 @@ + /*****************************************************************************/ + + typedef struct { ++ /* And it's exactly the same pointer that is also the key for the iface_datas ++ * dictionary. */ ++ const char *hwaddr; ++ + in_addr_t *ipv4s_arr; + gsize ipv4s_len; + +@@ -41,13 +45,17 @@ nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceDat + && ((config_data->has_ipv4s && config_data->has_cidr) || config_data->iproutes_len); + } + +-NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested); ++NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas, ++ gboolean was_requested, ++ const char *hwaddr); + + /*****************************************************************************/ + + typedef struct { + /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). +- * This is the per-interface result of get_config(). */ ++ * This is the per-interface result of get_config(). ++ * ++ * The key is the same pointer as NMCSProviderGetConfigIfaceData's hwaddr. */ + GHashTable *iface_datas; + + /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ +-- +2.31.1 + + +From 351ff60c9fb34ac6010fd895ad290db536a756a7 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 16:59:19 +0200 +Subject: [PATCH 06/10] cloud-setup: track sorted list of + NMCSProviderGetConfigIfaceData + +Sorted by iface_idx. The iface_idx is probably something useful and +stable, provided by the provider. E.g. it's the order in which +interfaces are exposed on the meta data. + +(cherry picked from commit 1c5cb9d3c2be5addd3b011873cfc6b99204955d1) +(cherry picked from commit 0a2ed627038349d838add8f3fd72e2d282e74693) +--- + src/nm-cloud-setup/nmcs-provider.c | 49 +++++++++++++++++++++++++++++- + src/nm-cloud-setup/nmcs-provider.h | 8 +++++ + 2 files changed, 56 insertions(+), 1 deletion(-) + +diff --git a/src/nm-cloud-setup/nmcs-provider.c b/src/nm-cloud-setup/nmcs-provider.c +index 56f36646bb8a..138e78d41b56 100644 +--- a/src/nm-cloud-setup/nmcs-provider.c ++++ b/src/nm-cloud-setup/nmcs-provider.c +@@ -51,6 +51,19 @@ nmcs_provider_get_main_context(NMCSProvider *self) + } + /*****************************************************************************/ + ++static int ++_result_new_sort_iface_data(gconstpointer pa, gconstpointer pb) ++{ ++ const NMCSProviderGetConfigIfaceData *a = *((const NMCSProviderGetConfigIfaceData *const *) pa); ++ const NMCSProviderGetConfigIfaceData *b = *((const NMCSProviderGetConfigIfaceData *const *) pb); ++ ++ /* negative iface_idx are sorted to the end. */ ++ NM_CMP_DIRECT((a->iface_idx < 0), (b->iface_idx < 0)); ++ ++ NM_CMP_FIELD(a, b, iface_idx); ++ return 0; ++} ++ + static NMCSProviderGetConfigResult * + nmcs_provider_get_config_result_new(GHashTable *iface_datas) + { +@@ -59,6 +72,12 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) + GHashTableIter h_iter; + guint num_valid_ifaces = 0; + guint num_ipv4s = 0; ++ GPtrArray * ptrarr; ++ guint n_iface_datas; ++ ++ n_iface_datas = g_hash_table_size(iface_datas); ++ ++ ptrarr = g_ptr_array_sized_new(n_iface_datas + 1u); + + g_hash_table_iter_init(&h_iter, iface_datas); + while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { +@@ -66,15 +85,42 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) + num_valid_ifaces++; + num_ipv4s += iface_data->ipv4s_len; + } ++ g_ptr_array_add(ptrarr, (gpointer) iface_data); + } + ++ g_ptr_array_sort(ptrarr, _result_new_sort_iface_data); ++ ++ nm_assert(n_iface_datas == ptrarr->len); ++ ++ g_ptr_array_add(ptrarr, NULL); ++ + result = g_new(NMCSProviderGetConfigResult, 1); + *result = (NMCSProviderGetConfigResult){ +- .iface_datas = g_hash_table_ref(iface_datas), ++ .iface_datas = g_hash_table_ref(iface_datas), ++ .n_iface_datas = n_iface_datas, ++ .iface_datas_arr = ++ (const NMCSProviderGetConfigIfaceData **) g_ptr_array_free(ptrarr, FALSE), + .num_valid_ifaces = num_valid_ifaces, + .num_ipv4s = num_ipv4s, + }; + ++#if NM_MORE_ASSERTS > 5 ++ { ++ gsize iface_idx_expected = 0; ++ guint i; ++ ++ for (i = 0; i < result->n_iface_datas; i++) { ++ if (result->iface_datas_arr[i]->iface_idx < 0) { ++ nm_assert(result->iface_datas_arr[i]->iface_idx == -1); ++ iface_idx_expected = -1; ++ continue; ++ } ++ nm_assert(result->iface_datas_arr[i]->iface_idx == iface_idx_expected); ++ iface_idx_expected++; ++ } ++ } ++#endif ++ + return result; + } + +@@ -83,6 +129,7 @@ nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result) + { + if (result) { + nm_g_hash_table_unref(result->iface_datas); ++ g_free((gpointer) result->iface_datas_arr); + g_free(result); + } + } +diff --git a/src/nm-cloud-setup/nmcs-provider.h b/src/nm-cloud-setup/nmcs-provider.h +index c67184679949..366320596492 100644 +--- a/src/nm-cloud-setup/nmcs-provider.h ++++ b/src/nm-cloud-setup/nmcs-provider.h +@@ -63,6 +63,14 @@ typedef struct { + + /* the number of IPv4 addresses over all valid iface_datas. */ + guint num_ipv4s; ++ ++ guint n_iface_datas; ++ ++ /* The sorted value of @iface_datas, sorted by iface_idx. ++ * ++ * Not found entries (iface_idx == -1) are sorted at the end. */ ++ const NMCSProviderGetConfigIfaceData *const *iface_datas_arr; ++ + } NMCSProviderGetConfigResult; + + void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); +-- +2.31.1 + + +From d6832b24cfdb07b3acd2d92dd1ca47df46eeaba4 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 17:23:09 +0200 +Subject: [PATCH 07/10] cloud-setup: process iface-datas in sorted order + +The routes/rules that are configured are independent of the +order in which we process the devices. That is, because they +use the "iface_idx" for cases where there is ambiguity. + +Still, it feels nicer to always process them in a defined order. + +(cherry picked from commit a95ea0eb294d646f17b5e1cf4f17cb1540f8af3a) +(cherry picked from commit 6302cd416d92a8c2f5b4a6be9dded71af4cf7ced) +--- + src/nm-cloud-setup/main.c | 28 +++++++++++++--------------- + 1 file changed, 13 insertions(+), 15 deletions(-) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index bb5c0d5ded9d..403c8d759794 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -405,14 +405,15 @@ _nmc_mangle_connection(NMDevice * device, + /*****************************************************************************/ + + static gboolean +-_config_one(GCancellable * sigterm_cancellable, +- NMClient * nmc, +- const NMCSProviderGetConfigResult * result, +- const char * hwaddr, +- const NMCSProviderGetConfigIfaceData *config_data) ++_config_one(GCancellable * sigterm_cancellable, ++ NMClient * nmc, ++ const NMCSProviderGetConfigResult *result, ++ guint idx) + { +- gs_unref_object NMDevice *device = NULL; +- gs_unref_object NMConnection *applied_connection = NULL; ++ const NMCSProviderGetConfigIfaceData *config_data = result->iface_datas_arr[idx]; ++ const char * hwaddr = config_data->hwaddr; ++ gs_unref_object NMDevice *device = NULL; ++ gs_unref_object NMConnection *applied_connection = NULL; + guint64 applied_version_id; + gs_free_error GError *error = NULL; + gboolean changed; +@@ -537,14 +538,11 @@ _config_all(GCancellable * sigterm_cancellable, + NMClient * nmc, + const NMCSProviderGetConfigResult *result) + { +- GHashTableIter h_iter; +- const NMCSProviderGetConfigIfaceData *c_config_data; +- const char * c_hwaddr; +- gboolean any_changes = FALSE; +- +- g_hash_table_iter_init(&h_iter, result->iface_datas); +- while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { +- if (_config_one(sigterm_cancellable, nmc, result, c_hwaddr, c_config_data)) ++ gboolean any_changes = FALSE; ++ guint i; ++ ++ for (i = 0; i < result->n_iface_datas; i++) { ++ if (_config_one(sigterm_cancellable, nmc, result, i)) + any_changes = TRUE; + } + +-- +2.31.1 + + +From 167faa59d23ab8b2db471169860c4387da625d21 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 19:23:46 +0200 +Subject: [PATCH 08/10] cloud-setup: limit number of supported interfaces to + avoid overlapping table numbers + +The table number is chosen as 30400 + iface_idx. That is, the range is +limited and we shouldn't handle more than 100 devices. Add a check for +that and error out. + +(cherry picked from commit b68d694b78fd9b4b63b0592a2518f387aaa35f87) +(cherry picked from commit 292233e16ed1f60499c2676611d59c271352e2c3) +--- + src/nm-cloud-setup/main.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 403c8d759794..6be8c145f3c9 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -438,6 +438,14 @@ _config_one(GCancellable * sigterm_cancellable, + return FALSE; + } + ++ if (config_data->iface_idx >= 100) { ++ /* since we use the iface_idx to select a table number, the range is limited from ++ * 0 to 99. Note that the providers are required to provide increasing numbers, ++ * so this means we bail out after the first 100 devices. */ ++ _LOGD("config device %s: skip because number of supported interfaces reached", hwaddr); ++ return FALSE; ++ } ++ + _LOGD("config device %s: configuring \"%s\" (%s)...", + hwaddr, + nm_device_get_iface(device) ?: "/unknown/", +-- +2.31.1 + + +From 5d8ac7f10fd9b4a467e8afd7e082acb4b2d33eed Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Mon, 6 Sep 2021 10:35:36 +0200 +Subject: [PATCH 09/10] cloud-setup: cleanup configuring addresses/routes/rules + in _nmc_mangle_connection() + +(cherry picked from commit 0978be5e43f142ec5c6062dcfe1c2f4aa834464b) +(cherry picked from commit ce24b4bca5d3fbad65d4065325cfa80ac05fbfdb) +--- + src/nm-cloud-setup/main.c | 52 +++++++++++++++++---------------------- + 1 file changed, 23 insertions(+), 29 deletions(-) + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 6be8c145f3c9..260d111205f5 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -279,10 +279,6 @@ _nmc_mangle_connection(NMDevice * device, + NMConnection * remote_connection; + NMSettingIPConfig * remote_s_ip = NULL; + gsize i; +- in_addr_t gateway; +- gint64 rt_metric; +- guint32 rt_table; +- NMIPRoute * route_entry; + gboolean addrs_changed = FALSE; + gboolean rules_changed = FALSE; + gboolean routes_changed = FALSE; +@@ -339,47 +335,45 @@ _nmc_mangle_connection(NMDevice * device, + * We don't need to configure policy routing in this case. */ + NM_SET_OUT(out_skipped_single_addr, TRUE); + } else if (config_data->has_ipv4s && config_data->has_cidr) { ++ NMIPAddress * addr_entry; ++ NMIPRoute * route_entry; ++ NMIPRoutingRule *rule_entry; ++ in_addr_t gateway; ++ char sbuf[NM_UTILS_INET_ADDRSTRLEN]; ++ + for (i = 0; i < config_data->ipv4s_len; i++) { +- NMIPAddress *entry; +- +- entry = nm_ip_address_new_binary(AF_INET, +- &config_data->ipv4s_arr[i], +- config_data->cidr_prefix, +- NULL); +- if (entry) +- g_ptr_array_add(addrs_new, entry); ++ addr_entry = nm_ip_address_new_binary(AF_INET, ++ &config_data->ipv4s_arr[i], ++ config_data->cidr_prefix, ++ NULL); ++ nm_assert(addr_entry); ++ g_ptr_array_add(addrs_new, addr_entry); + } ++ + if (config_data->has_gateway && config_data->gateway) { + gateway = config_data->gateway; + } else { + gateway = nm_utils_ip4_address_clear_host_address(config_data->cidr_addr, + config_data->cidr_prefix); +- ((guint8 *) &gateway)[3] += 1; ++ if (config_data->cidr_prefix < 32) ++ ((guint8 *) &gateway)[3] += 1; + } +- rt_metric = 10; +- rt_table = 30400 + config_data->iface_idx; + +- route_entry = +- nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, rt_metric, NULL); ++ route_entry = nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, 10, NULL); + nm_ip_route_set_attribute(route_entry, + NM_IP_ROUTE_ATTRIBUTE_TABLE, +- g_variant_new_uint32(rt_table)); ++ g_variant_new_uint32(30400 + config_data->iface_idx)); + g_ptr_array_add(routes_new, route_entry); + + for (i = 0; i < config_data->ipv4s_len; i++) { +- NMIPRoutingRule *entry; +- char sbuf[NM_UTILS_INET_ADDRSTRLEN]; +- +- entry = nm_ip_routing_rule_new(AF_INET); +- nm_ip_routing_rule_set_priority(entry, rt_table); +- nm_ip_routing_rule_set_from(entry, ++ rule_entry = nm_ip_routing_rule_new(AF_INET); ++ nm_ip_routing_rule_set_priority(rule_entry, 30400 + config_data->iface_idx); ++ nm_ip_routing_rule_set_from(rule_entry, + _nm_utils_inet4_ntop(config_data->ipv4s_arr[i], sbuf), + 32); +- nm_ip_routing_rule_set_table(entry, rt_table); +- +- nm_assert(nm_ip_routing_rule_validate(entry, NULL)); +- +- g_ptr_array_add(rules_new, entry); ++ nm_ip_routing_rule_set_table(rule_entry, 30400 + config_data->iface_idx); ++ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); ++ g_ptr_array_add(rules_new, rule_entry); + } + } + +-- +2.31.1 + + +From c2402be45e2dec931690aef555de43292b015422 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Wed, 1 Sep 2021 10:31:55 +0200 +Subject: [PATCH 10/10] cloud-setup: use suppress_prefixlength rule to honor + non-default-routes in the main table + +Background +========== + +Imagine you run a container on your machine. Then the routing table +might look like: + + default via 10.0.10.1 dev eth0 proto dhcp metric 100 + 10.0.10.0/28 dev eth0 proto kernel scope link src 10.0.10.5 metric 100 + [...] + 10.42.0.0/24 via 10.42.0.0 dev flannel.1 onlink + 10.42.1.2 dev cali02ad7e68ce1 scope link + 10.42.1.3 dev cali8fcecf5aaff scope link + 10.42.2.0/24 via 10.42.2.0 dev flannel.1 onlink + 10.42.3.0/24 via 10.42.3.0 dev flannel.1 onlink + +That is, there are another interfaces with subnets and specific routes. + +If nm-cloud-setup now configures rules: + + 0: from all lookup local + 30400: from 10.0.10.5 lookup 30400 + 32766: from all lookup main + 32767: from all lookup default + +and + + default via 10.0.10.1 dev eth0 table 30400 proto static metric 10 + 10.0.10.1 dev eth0 table 30400 proto static scope link metric 10 + +then these other subnets will also be reached via the default route. + +This container example is just one case where this is a problem. In +general, if you have specific routes on another interface, then the +default route in the 30400+ table will interfere badly. + +The idea of nm-cloud-setup is to automatically configure the network for +secondary IP addresses. When the user has special requirements, then +they should disable nm-cloud-setup and configure whatever they want. +But the container use case is popular and important. It is not something +where the user actively configures the network. This case needs to work better, +out of the box. In general, nm-cloud-setup should work better with the +existing network configuration. + +Change +====== + +Add new routing tables 30200+ with the individual subnets of the +interface: + + 10.0.10.0/24 dev eth0 table 30200 proto static metric 10 + [...] + default via 10.0.10.1 dev eth0 table 30400 proto static metric 10 + 10.0.10.1 dev eth0 table 30400 proto static scope link metric 10 + +Also add more important routing rules with priority 30200+, which select +these tables based on the source address: + + 30200: from 10.0.10.5 lookup 30200 + +These will do source based routing for the subnets on these +interfaces. + +Then, add a rule with priority 30350 + + 30350: lookup main suppress_prefixlength 0 + +which processes the routes from the main table, but ignores the default +routes. 30350 was chosen, because it's in between the rules 30200+ and +30400+, leaving a range for the user to configure their own rules. + +Then, as before, the rules 30400+ again look at the corresponding 30400+ +table, to find a default route. + +Finally, process the main table again, this time honoring the default +route. That is for packets that have a different source address. + +This change means that the source based routing is used for the +subnets that are configured on the interface and for the default route. +Whereas, if there are any more specific routes in the main table, they will +be preferred over the default route. + +Apparently Amazon Linux solves this differently, by not configuring a +routing table for addresses on interface "eth0". That might be an +alternative, but it's not clear to me what is special about eth0 to +warrant this treatment. It also would imply that we somehow recognize +this primary interface. In practise that would be doable by selecting +the interface with "iface_idx" zero. + +Instead choose this approach. This is remotely similar to what WireGuard does +for configuring the default route ([1]), however WireGuard uses fwmark to match +the packets instead of the source address. + +[1] https://www.wireguard.com/netns/#improved-rule-based-routing + +(cherry picked from commit fe80b2d1ecd94639573a944633a5d960db316f60) +(cherry picked from commit 58e58361bd1666e5af822a4bc970bebb8a44bd6e) +--- + man/nm-cloud-setup.xml | 66 +++++++++++++++------------------------ + src/nm-cloud-setup/main.c | 36 +++++++++++++++++++++ + 2 files changed, 62 insertions(+), 40 deletions(-) + +diff --git a/man/nm-cloud-setup.xml b/man/nm-cloud-setup.xml +index 7493cc1d7f26..976fc6472464 100644 +--- a/man/nm-cloud-setup.xml ++++ b/man/nm-cloud-setup.xml +@@ -256,7 +256,9 @@ ln -s /etc/systemd/system/timers.target.wants/nm-cloud-setup.timer /usr/lib/syst + Also, if the device is currently not activated in NetworkManager or if the currently + activated profile has a user-data org.freedesktop.nm-cloud-setup.skip=yes, + it is skipped. +- Then, the tool will change the runtime configuration of the device. ++ If only one interface and one address is configured, then the tool does nothing ++ and leaves the automatic configuration that was obtained via DHCP. ++ Otherwise, the tool will change the runtime configuration of the device. + + + Add static IPv4 addresses for all the configured addresses from local-ipv4s with +@@ -267,15 +269,25 @@ ln -s /etc/systemd/system/timers.target.wants/nm-cloud-setup.timer /usr/lib/syst + Choose a route table 30400 + the index of the interface and + add a default route 0.0.0.0/0. The gateway + is the first IP address in the CIDR subnet block. For +- example, we might get a route "0.0.0.0/0 172.16.5.1 10 table=30401". ++ example, we might get a route "0.0.0.0/0 172.16.5.1 10 table=30400". ++ Also choose a route table 30200 + the interface index. This ++ contains a direct routes to the subnets of this interface. + + + Finally, add a policy routing rule for each address. For example +- "priority 30401 from 172.16.5.3/32 table 30401, priority 30401 from 172.16.5.4/32 table 30401". ++ "priority 30200 from 172.16.5.3/32 table 30200, priority 30200 from 172.16.5.4/32 table 30200". ++ and ++ "priority 30400 from 172.16.5.3/32 table 30400, priority 30400 from 172.16.5.4/32 table 30400" ++ The 30200+ rules select the table to reach the subnet directly, while the 30400+ rules use the ++ default route. Also add a rule ++ "priority 30350 table main suppress_prefixlength 0". This has a priority between ++ the two previous rules and causes a lookup of routes in the main table while ignoring the default ++ route. The purpose of this is so that other specific routes in the main table are honored over ++ the default route in table 30400+. + + + With above example, this roughly corresponds for interface eth0 to +- nmcli device modify "eth0" ipv4.addresses "172.16.5.3/24,172.16.5.4/24" ipv4.routes "0.0.0.0/0 172.16.5.1 10 table=30401" ipv4.routing-rules "priority 30401 from 172.16.5.3/32 table 30401, priority 30401 from 172.16.5.4/32 table 30401". ++ nmcli device modify "eth0" ipv4.addresses "172.16.5.3/24,172.16.5.4/24" ipv4.routes "172.16.5.0/24 0.0.0.0 10 table=30200, 0.0.0.0/0 172.16.5.1 10 table=30400" ipv4.routing-rules "priority 30200 from 172.16.5.3/32 table 30200, priority 30200 from 172.16.5.4/32 table 30200, priority 20350 table main suppress_prefixlength 0, priority 30400 from 172.16.5.3/32 table 30400, priority 30400 from 172.16.5.4/32 table 30400". + Note that this replaces the previous addresses, routes and rules with the new information. + But also note that this only changes the run time configuration of the device. The + connection profile on disk is not affected. +@@ -360,14 +372,8 @@ ln -s /etc/systemd/system/timers.target.wants/nm-cloud-setup.timer /usr/lib/syst + + + At this point, we have a list of all interfaces (by MAC address) and their configured IPv4 addresses. +- For each device, we lookup the currently applied connection in NetworkManager. That implies, that the device is currently activated +- in NetworkManager. If no such device was in NetworkManager, or if the profile has user-data org.freedesktop.nm-cloud-setup.skip=yes, +- we skip the device. Now for each found IP address we add a static address "$ADDR/$SUBNET_PREFIX". Also we configure policy routing +- by adding a static route "$ADDR/$SUBNET_PREFIX $GATEWAY 10, table=$TABLE" where $GATEWAY is the first IP address in the subnet and table +- is 30400 plus the interface index. Also we add a policy routing rule "priority $TABLE from $ADDR/32 table $TABLE". +- The effect is not unlike calling +- nmcli device modify "$DEVICE" ipv4.addresses "$ADDR/$SUBNET [,...]" ipv4.routes "$ADDR/32 $GATEWAY 10 table=$TABLE" ipv4.routing-rules "priority $TABLE from $ADDR/32 table $TABLE" +- for all relevant devices and all found addresses. ++ Then the tool configures the system like doing for AWS environment. That is, using source based policy routing ++ with the tables/rules 30200/30400. + + + +@@ -389,9 +395,10 @@ ln -s /etc/systemd/system/timers.target.wants/nm-cloud-setup.timer /usr/lib/syst + of available interface. Interfaces are identified by their MAC address. + + +- Then for each interface fetch http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/vpc-cidr-block +- , http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/private-ipv4s and +- http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/netmask. ++ Then for each interface fetch http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/vpc-cidr-block, ++ http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/private-ipv4s, ++ http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/netmask and ++ http://100.100.100.200/2016-01-01/meta-data/network/interfaces/macs/$MAC/gateway. + Thereby we get a list of private IPv4 addresses, one CIDR subnet block and private IPv4 addresses prefix. + + +@@ -399,31 +406,10 @@ ln -s /etc/systemd/system/timers.target.wants/nm-cloud-setup.timer /usr/lib/syst + If no ethernet device for the respective MAC address is found, it is skipped. + Also, if the device is currently not activated in NetworkManager or if the currently + activated profile has a user-data org.freedesktop.nm-cloud-setup.skip=yes, +- it is skipped. +- Then, the tool will change the runtime configuration of the device. +- +- +- Add static IPv4 addresses for all the configured addresses from private-ipv4s with +- prefix length according to netmask. For example, +- we might have here 2 IP addresses like "10.0.0.150/24,10.0.0.152/24". +- +- +- Choose a route table 30400 + the index of the interface and +- add a default route 0.0.0.0/0. The gateway +- is the default gateway retrieved from metadata server. For +- example, we might get a route "0.0.0.0/0 10.0.0.253 10 table=30400". +- +- +- Finally, add a policy routing rule for each address. For example +- "priority 30400 from 10.0.0.150/32 table 30400, priority 30400 from 10.0.0.152/32 table 30400". +- +- +- With above example, this roughly corresponds for interface eth0 to +- nmcli device modify "eth0" ipv4.addresses "10.0.0.150/24,10.0.0.152/24" ipv4.routes "0.0.0.0/0 10.0.0.253 10 table=30400" ipv4.routing-rules "priority 30400 from 10.0.0.150/32 table 30400, priority 30400 from 10.0.0.152/32 table 30400". +- Note that this replaces the previous addresses, routes and rules with the new information. +- But also note that this only changes the run time configuration of the device. The +- connection profile on disk is not affected. +- ++ it is skipped. Also, there is only one interface and one IP address, the tool does nothing. ++ Then the tool configures the system like doing for AWS environment. That is, using source based policy routing ++ with the tables/rules 30200/30400. One difference to AWS is that the gateway is also fetched via metadata instead ++ of using the first IP address in the subnet. + + + +diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c +index 260d111205f5..916f41da91d3 100644 +--- a/src/nm-cloud-setup/main.c ++++ b/src/nm-cloud-setup/main.c +@@ -4,6 +4,8 @@ + + #include "libnm-client-aux-extern/nm-libnm-aux.h" + ++#include ++ + #include "nm-cloud-setup-utils.h" + #include "nmcs-provider-ec2.h" + #include "nmcs-provider-gcp.h" +@@ -335,6 +337,8 @@ _nmc_mangle_connection(NMDevice * device, + * We don't need to configure policy routing in this case. */ + NM_SET_OUT(out_skipped_single_addr, TRUE); + } else if (config_data->has_ipv4s && config_data->has_cidr) { ++ gs_unref_hashtable GHashTable *unique_subnets = ++ g_hash_table_new(nm_direct_hash, g_direct_equal); + NMIPAddress * addr_entry; + NMIPRoute * route_entry; + NMIPRoutingRule *rule_entry; +@@ -359,6 +363,38 @@ _nmc_mangle_connection(NMDevice * device, + ((guint8 *) &gateway)[3] += 1; + } + ++ for (i = 0; i < config_data->ipv4s_len; i++) { ++ in_addr_t a = config_data->ipv4s_arr[i]; ++ ++ a = nm_utils_ip4_address_clear_host_address(a, config_data->cidr_prefix); ++ ++ G_STATIC_ASSERT_EXPR(sizeof(gsize) >= sizeof(in_addr_t)); ++ if (g_hash_table_add(unique_subnets, GSIZE_TO_POINTER(a))) { ++ route_entry = ++ nm_ip_route_new_binary(AF_INET, &a, config_data->cidr_prefix, NULL, 10, NULL); ++ nm_ip_route_set_attribute(route_entry, ++ NM_IP_ROUTE_ATTRIBUTE_TABLE, ++ g_variant_new_uint32(30200 + config_data->iface_idx)); ++ g_ptr_array_add(routes_new, route_entry); ++ } ++ ++ rule_entry = nm_ip_routing_rule_new(AF_INET); ++ nm_ip_routing_rule_set_priority(rule_entry, 30200 + config_data->iface_idx); ++ nm_ip_routing_rule_set_from(rule_entry, ++ _nm_utils_inet4_ntop(config_data->ipv4s_arr[i], sbuf), ++ 32); ++ nm_ip_routing_rule_set_table(rule_entry, 30200 + config_data->iface_idx); ++ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); ++ g_ptr_array_add(rules_new, rule_entry); ++ } ++ ++ rule_entry = nm_ip_routing_rule_new(AF_INET); ++ nm_ip_routing_rule_set_priority(rule_entry, 30350); ++ nm_ip_routing_rule_set_table(rule_entry, RT_TABLE_MAIN); ++ nm_ip_routing_rule_set_suppress_prefixlength(rule_entry, 0); ++ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); ++ g_ptr_array_add(rules_new, rule_entry); ++ + route_entry = nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, 10, NULL); + nm_ip_route_set_attribute(route_entry, + NM_IP_ROUTE_ATTRIBUTE_TABLE, +-- +2.31.1 + diff --git a/SOURCES/1004-fix-handling-generated-local-routes-rh1907661.patch b/SOURCES/1004-fix-handling-generated-local-routes-rh1907661.patch deleted file mode 100644 index 5d49f58..0000000 --- a/SOURCES/1004-fix-handling-generated-local-routes-rh1907661.patch +++ /dev/null @@ -1,570 +0,0 @@ -From 549687f0202469289cef3ac322f81a04677873b6 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 23 Mar 2021 17:48:43 +0100 -Subject: [PATCH 1/6] core: avoid logging pointer value in - nm_device_set_ip_config() - -(cherry picked from commit 5da8c073efd67f12292c1c5c67ada64b9c9f5a6c) -(cherry picked from commit c0e937c8b9a1077d1e77c3fe1f480b6e5b54c55b) ---- - src/core/devices/nm-device.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c -index 040dd0b4d367..44b87490c17e 100644 ---- a/src/core/devices/nm-device.c -+++ b/src/core/devices/nm-device.c -@@ -13496,10 +13496,10 @@ nm_device_set_ip_config(NMDevice * self, - nm_assert(IS_IPv4 || !ip4_dev_route_blacklist); - - _LOGD(LOGD_IPX(IS_IPv4), -- "ip%c-config: update (commit=%d, new-config=%p)", -+ "ip%c-config: update (commit=%d, new-config=" NM_HASH_OBFUSCATE_PTR_FMT")", - nm_utils_addr_family_to_char(addr_family), - commit, -- new_config); -+ NM_HASH_OBFUSCATE_PTR(new_config)); - - /* Always commit to nm-platform to update lifetimes */ - if (commit && new_config) { --- -2.30.2 - - -From a633a7855bb08afc9709a8dbed01fb5e4278d540 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 23 Mar 2021 17:56:37 +0100 -Subject: [PATCH 2/6] core: log route-table-sync-mode in - nm_device_set_ip_config() - -(cherry picked from commit f6db2c6261b560ec34b56eeeb3766c9165f5619b) -(cherry picked from commit 2fb1a22e2be6d9e83bfc9e9873f93976286a55b0) ---- - src/core/devices/nm-device.c | 28 ++++++++++++++++++---------- - 1 file changed, 18 insertions(+), 10 deletions(-) - -diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c -index 44b87490c17e..5eaf8c23e7da 100644 ---- a/src/core/devices/nm-device.c -+++ b/src/core/devices/nm-device.c -@@ -13478,12 +13478,13 @@ nm_device_set_ip_config(NMDevice * self, - gboolean commit, - GPtrArray * ip4_dev_route_blacklist) - { -- NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); -- const int IS_IPv4 = NM_IS_IPv4(addr_family); -- NMIPConfig * old_config; -- gboolean has_changes = FALSE; -- gboolean success = TRUE; -- NMSettingsConnection *settings_connection; -+ NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); -+ const int IS_IPv4 = NM_IS_IPv4(addr_family); -+ NMIPConfig * old_config; -+ gboolean has_changes = FALSE; -+ gboolean success = TRUE; -+ NMSettingsConnection * settings_connection; -+ NMIPRouteTableSyncMode route_table_sync_mode; - - nm_assert_addr_family(addr_family); - nm_assert(!new_config || nm_ip_config_get_addr_family(new_config) == addr_family); -@@ -13495,11 +13496,18 @@ nm_device_set_ip_config(NMDevice * self, - }))); - nm_assert(IS_IPv4 || !ip4_dev_route_blacklist); - -+ if (commit && new_config) -+ route_table_sync_mode = _get_route_table_sync_mode_stateful(self, addr_family); -+ else -+ route_table_sync_mode = NM_IP_ROUTE_TABLE_SYNC_MODE_NONE; -+ - _LOGD(LOGD_IPX(IS_IPv4), -- "ip%c-config: update (commit=%d, new-config=" NM_HASH_OBFUSCATE_PTR_FMT")", -+ "ip%c-config: update (commit=%d, new-config=" NM_HASH_OBFUSCATE_PTR_FMT -+ ", route-table-sync-mode=%d)", - nm_utils_addr_family_to_char(addr_family), - commit, -- NM_HASH_OBFUSCATE_PTR(new_config)); -+ NM_HASH_OBFUSCATE_PTR(new_config), -+ (int) route_table_sync_mode); - - /* Always commit to nm-platform to update lifetimes */ - if (commit && new_config) { -@@ -13508,7 +13516,7 @@ nm_device_set_ip_config(NMDevice * self, - if (IS_IPv4) { - success = nm_ip4_config_commit(NM_IP4_CONFIG(new_config), - nm_device_get_platform(self), -- _get_route_table_sync_mode_stateful(self, AF_INET)); -+ route_table_sync_mode); - nm_platform_ip4_dev_route_blacklist_set(nm_device_get_platform(self), - nm_ip_config_get_ifindex(new_config), - ip4_dev_route_blacklist); -@@ -13517,7 +13525,7 @@ nm_device_set_ip_config(NMDevice * self, - - success = nm_ip6_config_commit(NM_IP6_CONFIG(new_config), - nm_device_get_platform(self), -- _get_route_table_sync_mode_stateful(self, AF_INET6), -+ route_table_sync_mode, - &temporary_not_available); - - if (!_rt6_temporary_not_available_set(self, temporary_not_available)) --- -2.30.2 - - -From a9aead98e4c2d5ce73ab6388360139489f677320 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Mon, 22 Mar 2021 17:31:35 +0100 -Subject: [PATCH 3/6] core: add NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE mode - -When we deactivate a device, we flush all IP addresses and -routes. Thus, have yet another sync mode for that. It will sync more -than "ALL". - -(cherry picked from commit e226b5eb829e5e8c623948e35d406e815cd05089) -(cherry picked from commit b263454f241ea944d87e13f935530d0539343bce) ---- - src/core/nm-types.h | 12 ++++++++---- - src/core/platform/nm-platform.c | 29 +++++++++++++++++++---------- - 2 files changed, 27 insertions(+), 14 deletions(-) - -diff --git a/src/core/nm-types.h b/src/core/nm-types.h -index ab2314594d4a..8a32b7d20459 100644 ---- a/src/core/nm-types.h -+++ b/src/core/nm-types.h -@@ -245,12 +245,16 @@ typedef enum { - * local table (255). - * @NM_IP_ROUTE_TABLE_SYNC_MODE_ALL: NM will sync all tables, including the - * local table (255). -+ * @NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE: NM will sync all tables (including -+ * the local table). It will thereby remove all addresses, that is during -+ * deactivation. - */ - typedef enum { -- NM_IP_ROUTE_TABLE_SYNC_MODE_NONE = 0, -- NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN = 1, -- NM_IP_ROUTE_TABLE_SYNC_MODE_FULL = 2, -- NM_IP_ROUTE_TABLE_SYNC_MODE_ALL = 3, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_NONE, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_FULL, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE, - } NMIPRouteTableSyncMode; - - /* settings */ -diff --git a/src/core/platform/nm-platform.c b/src/core/platform/nm-platform.c -index 0e5f8ab54806..8cfcf8bc6654 100644 ---- a/src/core/platform/nm-platform.c -+++ b/src/core/platform/nm-platform.c -@@ -4363,7 +4363,8 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - nm_assert(NM_IN_SET(route_table_sync, - NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN, - NM_IP_ROUTE_TABLE_SYNC_MODE_FULL, -- NM_IP_ROUTE_TABLE_SYNC_MODE_ALL)); -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL, -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE)); - - nmp_lookup_init_object(&lookup, NMP_OBJECT_TYPE_IP_ROUTE(NM_IS_IPv4(addr_family)), ifindex); - head_entry = nm_platform_lookup(self, &lookup); -@@ -4375,16 +4376,24 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - c_list_for_each (iter, &head_entry->lst_entries_head) { - const NMPObject *obj = c_list_entry(iter, NMDedupMultiEntry, lst_entries)->obj; - -- if (route_table_sync == NM_IP_ROUTE_TABLE_SYNC_MODE_FULL) { -- if (nm_platform_ip_route_get_effective_table(NMP_OBJECT_CAST_IP_ROUTE(obj)) -- == RT_TABLE_LOCAL) -- continue; -- } else if (route_table_sync == NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN) { -+ switch (route_table_sync) { -+ case NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN: - if (!nm_platform_route_table_is_main( - nm_platform_ip_route_get_effective_table(NMP_OBJECT_CAST_IP_ROUTE(obj)))) - continue; -- } else -- nm_assert(route_table_sync == NM_IP_ROUTE_TABLE_SYNC_MODE_ALL); -+ break; -+ case NM_IP_ROUTE_TABLE_SYNC_MODE_FULL: -+ if (nm_platform_ip_route_get_effective_table(NMP_OBJECT_CAST_IP_ROUTE(obj)) -+ == RT_TABLE_LOCAL) -+ continue; -+ break; -+ case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL: -+ case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE: -+ break; -+ default: -+ nm_assert_not_reached(); -+ break; -+ } - - g_ptr_array_add(routes_prune, (gpointer) nmp_object_ref(obj)); - } -@@ -4679,7 +4688,7 @@ nm_platform_ip_route_flush(NMPlatform *self, int addr_family, int ifindex) - routes_prune = nm_platform_ip_route_get_prune_list(self, - AF_INET, - ifindex, -- NM_IP_ROUTE_TABLE_SYNC_MODE_ALL); -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE); - success &= nm_platform_ip_route_sync(self, AF_INET, ifindex, NULL, routes_prune, NULL); - } - if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6)) { -@@ -4688,7 +4697,7 @@ nm_platform_ip_route_flush(NMPlatform *self, int addr_family, int ifindex) - routes_prune = nm_platform_ip_route_get_prune_list(self, - AF_INET6, - ifindex, -- NM_IP_ROUTE_TABLE_SYNC_MODE_ALL); -+ NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE); - success &= nm_platform_ip_route_sync(self, AF_INET6, ifindex, NULL, routes_prune, NULL); - } - return success; --- -2.30.2 - - -From 7e6bf896b89c6c51f3524fa26f1214f65e748843 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Mon, 22 Mar 2021 21:43:47 +0100 -Subject: [PATCH 4/6] core: don't add ff00::/8 unicast route to - nm_ip6_config_add_dependent_routes() - -This effectively reverts commit cd89026c5f4f ('core: add dependent -multicast route configured by kernel for IPv6'). - -It's not clear to me why this was done or why it would be correct. - -True, kernel automatically adds multicast route like - - multicast ff00::/8 dev $IFACE table local proto kernel metric 256 pref medium - -But NetworkManager ignores all multicast routes for now. So the dependent -routes cannot contain multicast routes as they are not handled. Also, -the code added a unicast route, so I don't understand why the comment -is talking about multicast. - -This seems just wrong. Drop it. - -(cherry picked from commit c29d995000a147cecbe1dbaa9607936c1844ba10) -(cherry picked from commit 40bc834176fbe8c17a22c7ea77f3cb8aa6c407b6) ---- - src/core/nm-ip6-config.c | 17 ----------------- - 1 file changed, 17 deletions(-) - -diff --git a/src/core/nm-ip6-config.c b/src/core/nm-ip6-config.c -index 1f7def346510..f498fc796a44 100644 ---- a/src/core/nm-ip6-config.c -+++ b/src/core/nm-ip6-config.c -@@ -396,23 +396,6 @@ nm_ip6_config_add_dependent_routes(NMIP6Config *self, - * - * For manually added IPv6 routes, add the device routes explicitly. */ - -- /* Pre-generate multicast route */ -- { -- nm_auto_nmpobj NMPObject *r = NULL; -- NMPlatformIP6Route * route; -- -- r = nmp_object_new(NMP_OBJECT_TYPE_IP6_ROUTE, NULL); -- route = NMP_OBJECT_CAST_IP6_ROUTE(r); -- route->ifindex = ifindex; -- route->network.s6_addr[0] = 0xffu; -- route->plen = 8; -- route->table_coerced = nm_platform_route_table_coerce(RT_TABLE_LOCAL); -- route->type_coerced = nm_platform_route_type_coerce(RTN_UNICAST); -- route->metric = 256; -- -- _add_route(self, r, NULL, NULL); -- } -- - nm_ip_config_iter_ip6_address_for_each (&iter, self, &my_addr) { - NMPlatformIP6Route *route; - gboolean has_peer; --- -2.30.2 - - -From 542388d6b508981656eb96e6940fdf3359ac1353 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 23 Mar 2021 10:05:30 +0100 -Subject: [PATCH 5/6] core: minor cleanup in - nm_platform_ip_route_get_prune_list() - -(cherry picked from commit fe1bf4c907c29997cbc6a28bc0781bfc419cb07f) -(cherry picked from commit 087c7f394cbffcf4bc786a8e92825059d340dfc9) ---- - src/core/platform/nm-platform.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/src/core/platform/nm-platform.c b/src/core/platform/nm-platform.c -index 8cfcf8bc6654..45636ea85ed3 100644 ---- a/src/core/platform/nm-platform.c -+++ b/src/core/platform/nm-platform.c -@@ -4374,22 +4374,22 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - routes_prune = g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); - - c_list_for_each (iter, &head_entry->lst_entries_head) { -- const NMPObject *obj = c_list_entry(iter, NMDedupMultiEntry, lst_entries)->obj; -+ const NMPObject * obj = c_list_entry(iter, NMDedupMultiEntry, lst_entries)->obj; -+ const NMPlatformIPXRoute *rt = NMP_OBJECT_CAST_IPX_ROUTE(obj); - - switch (route_table_sync) { - case NM_IP_ROUTE_TABLE_SYNC_MODE_MAIN: -- if (!nm_platform_route_table_is_main( -- nm_platform_ip_route_get_effective_table(NMP_OBJECT_CAST_IP_ROUTE(obj)))) -+ if (!nm_platform_route_table_is_main(nm_platform_ip_route_get_effective_table(&rt->rx))) - continue; - break; - case NM_IP_ROUTE_TABLE_SYNC_MODE_FULL: -- if (nm_platform_ip_route_get_effective_table(NMP_OBJECT_CAST_IP_ROUTE(obj)) -- == RT_TABLE_LOCAL) -+ if (nm_platform_ip_route_get_effective_table(&rt->rx) == RT_TABLE_LOCAL) - continue; - break; - case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL: - case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE: - break; -+ - default: - nm_assert_not_reached(); - break; --- -2.30.2 - - -From 0a331bb0f4646e3590e30660ed5c4bf599275a8b Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Fri, 19 Mar 2021 21:20:52 +0100 -Subject: [PATCH 6/6] core: don't add dependent local route for addresses - -When adding an IPv4 address, kernel automatically adds a local route. -This is done by fib_add_ifaddr(). Note that if the address is -IFA_F_SECONDARY, then the "src" is the primary address. That means, with - - nmcli connection add con-name t type ethernet ifname t autoconnect no \ - ipv4.method manual ipv6.method disabled \ - ipv4.addresses '192.168.77.10/24, 192.168.77.11/24' - -we get two routes: - - "local 192.168.77.10 dev t table local proto kernel scope host src 192.168.77.10" - "local 192.168.77.11 dev t table local proto kernel scope host src 192.168.77.10" - -Our code would only generate instead: - - "local 192.168.77.10 dev t table local proto kernel scope host src 192.168.77.10" - "local 192.168.77.11 dev t table local proto kernel scope host src 192.168.77.11" - -Afterwards, this artificial route will be leaked: - - #!/bin/bash - - set -vx - - nmcli connection delete t || : - ip link delete t || : - - ip link add name t type veth peer t-veth - - nmcli connection add con-name t type ethernet ifname t autoconnect no ipv4.method manual ipv4.addresses '192.168.77.10/24, 192.168.77.11/24' ipv6.method disabled - - nmcli connection up t - - ip route show table all dev t | grep --color '^\|192.168.77.11' - - sleep 1 - - nmcli device modify t -ipv4.addresses 192.168.77.11/24 - - ip route show table all dev t | grep --color '^\|192.168.77.11' - - ip route show table all dev t | grep -q 192.168.77.11 && echo "the local route 192.168.77.11 is still there, because NM adds a local route with wrong pref-src" - -It will also be leaked because in the example above ipv4.route-table is -unset, so we are not in full route sync mode and the local table is not -synced. - -This was introduced by commit 3e5fc04df320 ('core: add dependent local -routes configured by kernel'), but it's unclear to me why we really need -this. Drop it again and effectively revert commit 3e5fc04df320 ('core: -add dependent local routes configured by kernel'). - -I think this "solution" is still bad. We need to improve our route sync -approach with L3Cfg rework. For now, it's probably good enough. - -https://bugzilla.redhat.com/show_bug.cgi?id=1907661 -(cherry picked from commit 557644f5e03a77b3ebe09ceba672217959cf3bdc) -(cherry picked from commit eb1c607c7054ff6b60209ef3afb10db74e19305e) ---- - src/core/nm-ip4-config.c | 15 ------ - src/core/nm-ip6-config.c | 16 ------ - src/core/platform/nm-platform.c | 91 +++++++++++++++++++++++++++++++++ - 3 files changed, 91 insertions(+), 31 deletions(-) - -diff --git a/src/core/nm-ip4-config.c b/src/core/nm-ip4-config.c -index c49dfb4c34b8..608b7fc8b70c 100644 ---- a/src/core/nm-ip4-config.c -+++ b/src/core/nm-ip4-config.c -@@ -649,21 +649,6 @@ nm_ip4_config_add_dependent_routes(NMIP4Config *self, - if (my_addr->external) - continue; - -- /* Pre-generate local route added by kernel */ -- r = nmp_object_new(NMP_OBJECT_TYPE_IP4_ROUTE, NULL); -- route = NMP_OBJECT_CAST_IP4_ROUTE(r); -- route->ifindex = ifindex; -- route->rt_source = NM_IP_CONFIG_SOURCE_KERNEL; -- route->network = my_addr->address; -- route->plen = 32; -- route->pref_src = my_addr->address; -- route->type_coerced = nm_platform_route_type_coerce(RTN_LOCAL); -- route->scope_inv = nm_platform_route_scope_inv(RT_SCOPE_HOST); -- route->table_coerced = -- nm_platform_route_table_coerce(is_vrf ? route_table : RT_TABLE_LOCAL); -- _add_route(self, r, NULL, NULL); -- nm_clear_pointer(&r, nmp_object_unref); -- - if (nm_utils_ip4_address_is_zeronet(network)) { - /* Kernel doesn't add device-routes for destinations that - * start with 0.x.y.z. Skip them. */ -diff --git a/src/core/nm-ip6-config.c b/src/core/nm-ip6-config.c -index f498fc796a44..1e36050d9bff 100644 ---- a/src/core/nm-ip6-config.c -+++ b/src/core/nm-ip6-config.c -@@ -404,22 +404,6 @@ nm_ip6_config_add_dependent_routes(NMIP6Config *self, - if (my_addr->external) - continue; - -- { -- nm_auto_nmpobj NMPObject *r = NULL; -- -- /* Pre-generate local route added by kernel */ -- r = nmp_object_new(NMP_OBJECT_TYPE_IP6_ROUTE, NULL); -- route = NMP_OBJECT_CAST_IP6_ROUTE(r); -- route->ifindex = ifindex; -- route->network = my_addr->address; -- route->plen = 128; -- route->type_coerced = nm_platform_route_type_coerce(RTN_LOCAL); -- route->metric = 0; -- route->table_coerced = -- nm_platform_route_table_coerce(is_vrf ? route_table : RT_TABLE_LOCAL); -- _add_route(self, r, NULL, NULL); -- } -- - if (NM_FLAGS_HAS(my_addr->n_ifa_flags, IFA_F_NOPREFIXROUTE)) - continue; - if (my_addr->plen == 0) -diff --git a/src/core/platform/nm-platform.c b/src/core/platform/nm-platform.c -index 45636ea85ed3..459a33071700 100644 ---- a/src/core/platform/nm-platform.c -+++ b/src/core/platform/nm-platform.c -@@ -4357,6 +4357,11 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - GPtrArray * routes_prune; - const NMDedupMultiHeadEntry *head_entry; - CList * iter; -+ NMPlatformIP4Route rt_local4; -+ NMPlatformIP6Route rt_local6; -+ const NMPlatformLink * pllink; -+ const NMPlatformLnkVrf * lnk_vrf; -+ guint32 local_table; - - nm_assert(NM_IS_PLATFORM(self)); - nm_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); -@@ -4371,6 +4376,14 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - if (!head_entry) - return NULL; - -+ lnk_vrf = nm_platform_link_get_lnk_vrf(self, ifindex, &pllink); -+ if (!lnk_vrf && pllink && pllink->master > 0) -+ lnk_vrf = nm_platform_link_get_lnk_vrf(self, pllink->master, NULL); -+ local_table = lnk_vrf ? lnk_vrf->table : RT_TABLE_LOCAL; -+ -+ rt_local4.plen = 0; -+ rt_local6.plen = 0; -+ - routes_prune = g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); - - c_list_for_each (iter, &head_entry->lst_entries_head) { -@@ -4387,6 +4400,84 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - continue; - break; - case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL: -+ -+ /* FIXME: we should better handle routes that are automatically added by kernel. -+ * -+ * For now, make a good guess which are those routes and exclude them from -+ * pruning them. */ -+ -+ if (NM_IS_IPv4(addr_family)) { -+ /* for each IPv4 address kernel adds a route like -+ * -+ * local $ADDR dev $IFACE table local proto kernel scope host src $PRIMARY_ADDR -+ * -+ * Check whether route could be of that kind. */ -+ if (nm_platform_ip_route_get_effective_table(&rt->rx) == local_table -+ && rt->rx.plen == 32 && rt->rx.rt_source == NM_IP_CONFIG_SOURCE_RTPROT_KERNEL -+ && rt->rx.metric == 0 -+ && rt->r4.scope_inv == nm_platform_route_scope_inv(RT_SCOPE_HOST) -+ && rt->r4.gateway == INADDR_ANY) { -+ if (rt_local4.plen == 0) { -+ rt_local4 = (NMPlatformIP4Route){ -+ .ifindex = ifindex, -+ .type_coerced = nm_platform_route_type_coerce(RTN_LOCAL), -+ .plen = 32, -+ .rt_source = NM_IP_CONFIG_SOURCE_RTPROT_KERNEL, -+ .metric = 0, -+ .table_coerced = nm_platform_route_table_coerce(local_table), -+ .scope_inv = nm_platform_route_scope_inv(RT_SCOPE_HOST), -+ .gateway = INADDR_ANY, -+ }; -+ } -+ -+ /* the possible "network" depends on the addresses we have. We don't check that -+ * carefully. If the other parameters match, we assume that this route is the one -+ * generated by kernel. */ -+ rt_local4.network = rt->r4.network; -+ rt_local4.pref_src = rt->r4.pref_src; -+ -+ /* to be more confident about comparing the value, use our nm_platform_ip4_route_cmp() -+ * implementation. That will also consider parameters that we leave unspecified here. */ -+ if (nm_platform_ip4_route_cmp(&rt->r4, -+ &rt_local4, -+ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) -+ == 0) -+ continue; -+ } -+ } else { -+ /* for each IPv6 address (that is no longer tentative) kernel adds a route like -+ * -+ * local $ADDR dev $IFACE table local proto kernel metric 0 pref medium -+ * -+ * Same as for the IPv4 case. */ -+ if (nm_platform_ip_route_get_effective_table(&rt->rx) == local_table -+ && rt->rx.plen == 128 && rt->rx.rt_source == NM_IP_CONFIG_SOURCE_RTPROT_KERNEL -+ && rt->rx.metric == 0 && rt->r6.rt_pref == NM_ICMPV6_ROUTER_PREF_MEDIUM -+ && IN6_IS_ADDR_UNSPECIFIED(&rt->r6.gateway)) { -+ if (rt_local6.plen == 0) { -+ rt_local6 = (NMPlatformIP6Route){ -+ .ifindex = ifindex, -+ .type_coerced = nm_platform_route_type_coerce(RTN_LOCAL), -+ .plen = 128, -+ .rt_source = NM_IP_CONFIG_SOURCE_RTPROT_KERNEL, -+ .metric = 0, -+ .table_coerced = nm_platform_route_table_coerce(local_table), -+ .rt_pref = NM_ICMPV6_ROUTER_PREF_MEDIUM, -+ .gateway = IN6ADDR_ANY_INIT, -+ }; -+ } -+ -+ rt_local6.network = rt->r6.network; -+ -+ if (nm_platform_ip6_route_cmp(&rt->r6, -+ &rt_local6, -+ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) -+ == 0) -+ continue; -+ } -+ } -+ break; -+ - case NM_IP_ROUTE_TABLE_SYNC_MODE_ALL_PRUNE: - break; - --- -2.30.2 - diff --git a/SOURCES/1005-initrd-fix-crash-parsing-empty-rd.znet-argument.patch b/SOURCES/1005-initrd-fix-crash-parsing-empty-rd.znet-argument.patch deleted file mode 100644 index 7e54414..0000000 --- a/SOURCES/1005-initrd-fix-crash-parsing-empty-rd.znet-argument.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 31e882a46229c74649216ddc80fdb2ecbf75ab9e Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Tue, 16 Mar 2021 10:00:44 +0100 -Subject: [PATCH 1/1] initrd: fix crash parsing empty rd.znet argument - -Ignore a rd.znet argument without subchannels. When using net.ifnames -(the default), subchannels are used to build the interface name, which -is required to match the right connection. - -With net.ifnames=0 the interface name is build using a prefix and a -global counter and therefore in theory it is possible to omit -subchannels. However, without subchannels there won't be a udev rule -that renames the interface and so it can't work. - -https://bugzilla.redhat.com/show_bug.cgi?id=1931284 -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/783 -(cherry picked from commit 0f8fe3c76b9ecdf52c1690295f7dcc7b7ade16b6) -(cherry picked from commit d0d2d97ca51444bc7013943748ede334cc79a33f) ---- - src/core/initrd/nmi-cmdline-reader.c | 5 +++++ - src/core/initrd/tests/test-cmdline-reader.c | 19 +++++++++++++++++++ - 2 files changed, 24 insertions(+) - -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index 5f40f63ef269..e3ecc7d969bb 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -917,6 +917,11 @@ reader_parse_rd_znet(Reader *reader, char *argument, gboolean net_ifnames) - subchannels[0] = get_word(&argument, ','); - subchannels[1] = get_word(&argument, ','); - -+ /* Without subchannels we can't univocally match -+ * a device. */ -+ if (!subchannels[0] || !subchannels[1]) -+ return; -+ - if (nm_streq0(nettype, "ctc")) { - if (net_ifnames == TRUE) { - prefix = "sl"; -diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c -index 4b450aae0fa4..ba072e7933dc 100644 ---- a/src/core/initrd/tests/test-cmdline-reader.c -+++ b/src/core/initrd/tests/test-cmdline-reader.c -@@ -1815,6 +1815,24 @@ test_rd_znet_no_ip(void) - g_assert_cmpint(g_hash_table_size(connections), ==, 0); - } - -+static void -+test_rd_znet_malformed(void) -+{ -+ const char *const *const ARGV0 = NM_MAKE_STRV("rd.znet="); -+ const char *const *const ARGV1 = NM_MAKE_STRV("rd.znet=,"); -+ const char *const *const ARGV2 = NM_MAKE_STRV("rd.znet=foobar"); -+ const char *const *const ARGV3 = NM_MAKE_STRV("rd.znet=qeth,0.0.0800,,,layer2=0,portno=1"); -+ const char *const *const ARGV[] = {ARGV0, ARGV1, ARGV2, ARGV3}; -+ guint i; -+ -+ for (i = 0; i < G_N_ELEMENTS(ARGV); i++) { -+ gs_unref_hashtable GHashTable *connections = NULL; -+ -+ connections = _parse_cons(ARGV[i]); -+ g_assert_cmpint(g_hash_table_size(connections), ==, 0); -+ } -+} -+ - static void - test_bootif_ip(void) - { -@@ -2173,6 +2191,7 @@ main(int argc, char **argv) - g_test_add_func("/initrd/cmdline/rd_znet", test_rd_znet); - g_test_add_func("/initrd/cmdline/rd_znet/legacy", test_rd_znet_legacy); - g_test_add_func("/initrd/cmdline/rd_znet/no_ip", test_rd_znet_no_ip); -+ g_test_add_func("/initrd/cmdline/rd_znet/empty", test_rd_znet_malformed); - g_test_add_func("/initrd/cmdline/bootif/ip", test_bootif_ip); - g_test_add_func("/initrd/cmdline/bootif/no_ip", test_bootif_no_ip); - g_test_add_func("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype); --- -2.30.2 - diff --git a/SOURCES/1006-core-fix-crash-in-nm_wildcard_match_check.patch b/SOURCES/1006-core-fix-crash-in-nm_wildcard_match_check.patch deleted file mode 100644 index 5305c77..0000000 --- a/SOURCES/1006-core-fix-crash-in-nm_wildcard_match_check.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 0bd46e9042970cdf82d2cc9dcf8d491f3237b408 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 24 Mar 2021 21:05:19 +0100 -Subject: [PATCH 1/1] core: fix crash in nm_wildcard_match_check() - -It's not entirely clear how to treat %NULL. -Clearly "match.interface-name=eth0" should not -match with an interface %NULL. But what about -"match.interface-name=!eth0"? It's now implemented -that negative matches still succeed against %NULL. -What about "match.interface-name=*"? That probably -should also match with %NULL. So we treat %NULL really -like "". - -Against commit 11cd443448bc ('iwd: Don't call IWD methods when device -unmanaged'), we got this backtrace: - - #0 0x00007f1c164069f1 in __strnlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:62 - #1 0x00007f1c1637ac9e in __fnmatch (pattern=, string=, string@entry=0x0, flags=flags@entry=0) at fnmatch.c:379 - p = 0x0 - res = - orig_pattern = - n = - wpattern = 0x7fff8d860730 L"pci-0000:03:00.0" - ps = {__count = 0, __value = {__wch = 0, __wchb = "\000\000\000"}} - wpattern_malloc = 0x0 - wstring_malloc = 0x0 - wstring = - alloca_used = 80 - __PRETTY_FUNCTION__ = "__fnmatch" - #2 0x0000564484a978bf in nm_wildcard_match_check (str=0x0, patterns=, num_patterns=) at src/core/nm-core-utils.c:1959 - is_inverted = 0 - is_mandatory = 0 - match = - p = 0x564486c43fa0 "pci-0000:03:00.0" - has_optional = 0 - has_any_optional = 0 - i = - #3 0x0000564484bf4797 in check_connection_compatible (self=, connection=, error=0x0) at src/core/devices/nm-device.c:7499 - patterns = - device_driver = 0x564486c76bd0 "veth" - num_patterns = 1 - priv = 0x564486cbe0b0 - __func__ = "check_connection_compatible" - device_iface = - local = 0x564486c99a60 - conn_iface = 0x0 - klass = - s_match = 0x564486c63df0 [NMSettingMatch] - #4 0x0000564484c38491 in check_connection_compatible (device=0x564486cbe590 [NMDeviceVeth], connection=0x564486c6b160, error=0x0) at src/core/devices/nm-device-ethernet.c:348 - self = 0x564486cbe590 [NMDeviceVeth] - s_wired = - -Fixes: 3ced486f4162 ('libnm/match: extend syntax for match patterns with '|', '&', '!' and '\\'') - -https://bugzilla.redhat.com/show_bug.cgi?id=1942741 -(cherry picked from commit 420784e342da4883f6debdfe10cde68507b10d27) -(cherry picked from commit eaba0b48458a34494d91dc85e6eb5bd7e2b9b2d0) ---- - src/core/nm-core-utils.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c -index 9075c30dd0c5..eed8cd7ec157 100644 ---- a/src/core/nm-core-utils.c -+++ b/src/core/nm-core-utils.c -@@ -1956,7 +1956,8 @@ nm_wildcard_match_check(const char *str, const char *const *patterns, guint num_ - - _pattern_parse(patterns[i], &p, &is_inverted, &is_mandatory); - -- match = (fnmatch(p, str, 0) == 0); -+ match = (fnmatch(p, str ?: "", 0) == 0); -+ - if (is_inverted) - match = !match; - --- -2.30.2 - diff --git a/SOURCES/1007-initrd-multiconnect-single-for-manual-ip-rh1915493.patch b/SOURCES/1007-initrd-multiconnect-single-for-manual-ip-rh1915493.patch deleted file mode 100644 index a6438fc..0000000 --- a/SOURCES/1007-initrd-multiconnect-single-for-manual-ip-rh1915493.patch +++ /dev/null @@ -1,144 +0,0 @@ -From eba6e2d5f34bea51064cb6f0303255acf3196abf Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Wed, 10 Mar 2021 09:18:59 +0100 -Subject: [PATCH 1/2] initrd: fix may-fail for IPv6 - -(cherry picked from commit 5f736465249fd16115120f022aa0eb5ddf0b2bfc) -(cherry picked from commit 1bf1a902beea3a1b9505cf8c9177d74cfea859b3) ---- - src/core/initrd/nmi-cmdline-reader.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index e3ecc7d969..6d3b2b7dda 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -599,7 +599,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - NULL); - } - } else if (NM_IN_STRSET(kind, "auto6", "dhcp6")) { -- g_object_set(s_ip4, NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE, NULL); -+ g_object_set(s_ip6, NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE, NULL); - if (nm_setting_ip_config_get_num_addresses(s_ip4) == 0) { - g_object_set(s_ip4, - NM_SETTING_IP_CONFIG_METHOD, --- -2.29.2 - -From 118d46a3122ac35b0e4447c976f77a4ccdbdea33 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Thu, 11 Mar 2021 09:15:37 +0100 -Subject: [PATCH 2/2] initrd: set multi-connect=single for connections with - static IP - -We don't want to have multiple devices up with the same static IP. Set -multi-connect=single. - -https://bugzilla.redhat.com/show_bug.cgi?id=1915493 -(cherry picked from commit c27626a0ce4da8438503d764815542927def6dce) -(cherry picked from commit fafefc71f826643ce8279f6a88f97d03f92e8422) ---- - src/core/initrd/nmi-cmdline-reader.c | 12 +++++- - src/core/initrd/tests/test-cmdline-reader.c | 42 +++++++++++++++++++++ - 2 files changed, 52 insertions(+), 2 deletions(-) - -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index 6d3b2b7dda..eae75847ee 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -393,8 +393,9 @@ reader_read_all_connections_from_fw(Reader *reader, const char *sysfs_dir) - static void - reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - { -- NMConnection * connection; -- NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL; -+ NMConnection * connection; -+ NMSettingConnection *s_con; -+ NMSettingIPConfig * s_ip4 = NULL, *s_ip6 = NULL; - gs_unref_hashtable GHashTable *ibft = NULL; - const char * tmp; - const char * tmp2; -@@ -495,6 +496,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - - g_hash_table_add(reader->explicit_ip_connections, g_object_ref(connection)); - -+ s_con = nm_connection_get_setting_connection(connection); - s_ip4 = nm_connection_get_setting_ip4_config(connection); - s_ip6 = nm_connection_get_setting_ip6_config(connection); - -@@ -544,6 +546,12 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - nm_assert_not_reached(); - - if (address) { -+ /* We don't want to have multiple devices up with the -+ * same static address. */ -+ g_object_set(s_con, -+ NM_SETTING_CONNECTION_MULTI_CONNECT, -+ NM_CONNECTION_MULTI_CONNECT_SINGLE, -+ NULL); - switch (client_ip_family) { - case AF_INET: - g_object_set(s_ip4, -diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c -index ba072e7933..187d61c9dc 100644 ---- a/src/core/initrd/tests/test-cmdline-reader.c -+++ b/src/core/initrd/tests/test-cmdline-reader.c -@@ -455,6 +455,47 @@ test_if_ip4_manual(void) - g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); - } - -+static void -+test_if_ip4_manual_no_dev(void) -+{ -+ gs_unref_hashtable GHashTable *connections = NULL; -+ const char *const * ARGV = NM_MAKE_STRV("ip=192.0.2.2::192.0.2.1:24:::"); -+ NMConnection * connection; -+ NMSettingConnection * s_con; -+ NMSettingIPConfig * s_ip4; -+ NMSettingIPConfig * s_ip6; -+ NMIPAddress * ip_addr; -+ -+ connection = _parse_con(ARGV, "default_connection"); -+ g_assert_cmpstr(nm_connection_get_id(connection), ==, "Wired Connection"); -+ -+ s_con = nm_connection_get_setting_connection(connection); -+ g_assert(s_con); -+ g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1); -+ g_assert_cmpint(nm_setting_connection_get_multi_connect(s_con), -+ ==, -+ NM_CONNECTION_MULTI_CONNECT_SINGLE); -+ -+ s_ip4 = nm_connection_get_setting_ip4_config(connection); -+ g_assert(s_ip4); -+ g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), -+ ==, -+ NM_SETTING_IP4_CONFIG_METHOD_MANUAL); -+ g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); -+ g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0); -+ g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1); -+ ip_addr = nm_setting_ip_config_get_address(s_ip4, 0); -+ g_assert(ip_addr); -+ g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "192.0.2.2"); -+ g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24); -+ g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.0.2.1"); -+ -+ s_ip6 = nm_connection_get_setting_ip6_config(connection); -+ g_assert(s_ip6); -+ g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO); -+ g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); -+} -+ - static void - test_if_ip6_manual(void) - { -@@ -2165,6 +2206,7 @@ main(int argc, char **argv) - g_test_add_func("/initrd/cmdline/if_dhcp6", test_if_dhcp6); - g_test_add_func("/initrd/cmdline/if_auto_with_mtu_and_mac", test_if_auto_with_mtu_and_mac); - g_test_add_func("/initrd/cmdline/if_ip4_manual", test_if_ip4_manual); -+ g_test_add_func("/initrd/cmdline/if_ip4_manual_no_dev", test_if_ip4_manual_no_dev); - g_test_add_func("/initrd/cmdline/if_ip6_manual", test_if_ip6_manual); - g_test_add_func("/initrd/cmdline/if_mac_ifname", test_if_mac_ifname); - g_test_add_func("/initrd/cmdline/if_off", test_if_off); --- -2.29.2 - diff --git a/SOURCES/1008-manager-fix-active_connection_find.patch b/SOURCES/1008-manager-fix-active_connection_find.patch deleted file mode 100644 index e73bb74..0000000 --- a/SOURCES/1008-manager-fix-active_connection_find.patch +++ /dev/null @@ -1,176 +0,0 @@ -From 602f73a2e838ea1055ef5e6913aec3d8a87ed610 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Thu, 13 May 2021 10:49:39 +0200 -Subject: [PATCH 1/2] manager: fix active_connection_find() - -Commit 33b9fa3a3caf ("manager: Keep volatile/external connections -while referenced by async_op_lst") changed active_connection_find() to -also return active connections that are not yet activating but are -waiting authorization. - -This has side effect for other callers of the function. In particular, -_get_activatable_connections_filter() should exclude only ACs that are -really active, not those waiting for authorization. - -Otherwise, in ensure_master_active_connection() all the ACs waiting -authorization are missed and we might fail to find the right master -AC. - -Add an argument to active_connection_find to select whether include -ACs waiting authorization. - -Fixes: 33b9fa3a3caf ('manager: Keep volatile/external connections while referenced by async_op_lst') - -https://bugzilla.redhat.com/show_bug.cgi?id=1955101 -(cherry picked from commit e694f2cec1a0e7bc188776c8573e07a4d57851dc) -(cherry picked from commit fc611f60470160fe98512c405d6785f2b24b98a1) ---- - src/core/nm-manager.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c -index 5a6e05a934..c751b2db50 100644 ---- a/src/core/nm-manager.c -+++ b/src/core/nm-manager.c -@@ -363,6 +363,7 @@ static NMActiveConnection *active_connection_find(NMManager * self, - NMSettingsConnection * sett_conn, - const char * uuid, - NMActiveConnectionState max_state, -+ gboolean also_waiting_auth, - GPtrArray ** out_all_matching); - - static NMConnectivity *concheck_get_mgr(NMManager *self); -@@ -833,6 +834,7 @@ _delete_volatile_connection_do(NMManager *self, NMSettingsConnection *connection - connection, - NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, -+ TRUE, - NULL)) - return; - -@@ -978,6 +980,7 @@ active_connection_find( - NMSettingsConnection * sett_conn, - const char * uuid, - NMActiveConnectionState max_state /* candidates in state @max_state will be found */, -+ gboolean also_waiting_auth /* return also ACs waiting authorization */, - GPtrArray ** out_all_matching) - { - NMManagerPrivate * priv = NM_MANAGER_GET_PRIVATE(self); -@@ -1017,6 +1020,9 @@ active_connection_find( - if (!best_ac) { - AsyncOpData *async_op_data; - -+ if (!also_waiting_auth) -+ return NULL; -+ - c_list_for_each_entry (async_op_data, &priv->async_op_lst_head, async_op_lst) { - NMSettingsConnection *ac_conn; - -@@ -1078,6 +1084,7 @@ active_connection_find_by_connection(NMManager * self, - sett_conn, - sett_conn ? NULL : nm_connection_get_uuid(connection), - max_state, -+ FALSE, - out_all_matching); - } - -@@ -1112,6 +1119,7 @@ _get_activatable_connections_filter(NMSettings * settings, - sett_conn, - NULL, - NM_ACTIVE_CONNECTION_STATE_ACTIVATED, -+ FALSE, - NULL); - } - -@@ -2245,6 +2253,7 @@ connection_flags_changed(NMSettings *settings, NMSettingsConnection *connection, - connection, - NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, -+ FALSE, - NULL)) { - /* the connection still has an active-connection. It will be purged - * when the active connection(s) get(s) removed. */ -@@ -2564,6 +2573,7 @@ new_activation_allowed_for_connection(NMManager *self, NMSettingsConnection *con - connection, - NULL, - NM_ACTIVE_CONNECTION_STATE_ACTIVATED, -+ FALSE, - NULL); - } - -@@ -4134,6 +4144,7 @@ find_master(NMManager * self, - master_connection, - NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, -+ FALSE, - NULL); - } - -@@ -4985,6 +4996,7 @@ _internal_activate_device(NMManager *self, NMActiveConnection *active, GError ** - sett_conn, - NULL, - NM_ACTIVE_CONNECTION_STATE_ACTIVATED, -+ FALSE, - &all_ac_arr); - if (ac) { - n_all = all_ac_arr ? all_ac_arr->len : ((guint) 1); --- -2.26.3 - - -From cf2f0e5a5180d2333ce33b925d54c8b7b925e094 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Fri, 30 Apr 2021 22:35:20 +0200 -Subject: [PATCH 2/2] manager: fix assertion failure in - active_connection_find() - -Active-connections in the async_op_lst are not guaranteed to have a -settings-connection. In particular, the settings-connection for an -AddAndActivate() AC is set only after the authorization succeeds. Use -the non-asserting variant of the function to fix the following -failure: - - nm_active_connection_get_settings_connection: assertion 'sett_conn' failed - - 1 _g_log_abort() - 2 g_logv() - 3 g_log() - 4 _nm_g_return_if_fail_warning.constprop.14() - 5 nm_active_connection_get_settings_connection() - 6 active_connection_find() - 7 _get_activatable_connections_filter() - 8 nm_settings_get_connections_clone() - 9 nm_manager_get_activatable_connections() - 10 auto_activate_device_cb() - 11 g_idle_dispatch() - 12 g_main_context_dispatch() - 13 g_main_context_iterate.isra.21() - 14 g_main_loop_run() - 15 main() - -Fixes: 33b9fa3a3caf ('manager: Keep volatile/external connections while referenced by async_op_lst') - -https://bugzilla.redhat.com/show_bug.cgi?id=1933719 -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/834 -(cherry picked from commit 23cc0bf3353ea43d95a906e27c9881b1b68e2bbe) -(cherry picked from commit d0b0c65905ae19145d1c1f2912aa580a3b0a36e0) ---- - src/core/nm-manager.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c -index c751b2db50..3405de86ee 100644 ---- a/src/core/nm-manager.c -+++ b/src/core/nm-manager.c -@@ -1027,7 +1027,7 @@ active_connection_find( - NMSettingsConnection *ac_conn; - - ac = async_op_data->ac_auth.active; -- ac_conn = nm_active_connection_get_settings_connection(ac); -+ ac_conn = _nm_active_connection_get_settings_connection(ac); - if (sett_conn && sett_conn != ac_conn) - continue; - if (uuid && !nm_streq0(uuid, nm_settings_connection_get_uuid(ac_conn))) --- -2.26.3 - diff --git a/SOURCES/1009-bond-support-tlb_dynamic_lb-in-balance-alb-mode.patch b/SOURCES/1009-bond-support-tlb_dynamic_lb-in-balance-alb-mode.patch deleted file mode 100644 index 4da291f..0000000 --- a/SOURCES/1009-bond-support-tlb_dynamic_lb-in-balance-alb-mode.patch +++ /dev/null @@ -1,53 +0,0 @@ -From ba9dbfa4e5aaef9aa646a7718f302433ecf1a001 Mon Sep 17 00:00:00 2001 -From: Wen Liang -Date: Tue, 25 May 2021 08:45:46 -0400 -Subject: [PATCH] bond: support `tlb_dynamic_lb` in `balance-alb` mode - -In kernel, `tlb_dynamic_lb` is supported to configure in bonding mode -`balance-alb`. Therefore, add the support in NetworkManager to avoid -undesirable limitation. - -Kernel previously had such limitation and it was removed in -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e79c1055749e3183a2beee04a24da378623329c5. - -Signed-off-by: Wen Liang - -https://bugzilla.redhat.com/show_bug.cgi?id=1959934 - -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/868 -(cherry picked from commit 18839361aca42d5c9f470268c28063a6e7578851) -(cherry picked from commit 2f42c781edebac329c8031561c4b210118c0b3ab) ---- - libnm-core/nm-setting-bond.c | 2 +- - libnm-core/tests/test-setting.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c -index 68d4ca88f6..ea82d838c7 100644 ---- a/libnm-core/nm-setting-bond.c -+++ b/libnm-core/nm-setting-bond.c -@@ -225,7 +225,7 @@ static NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( - {NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE, ~(BIT(NM_BOND_MODE_ROUNDROBIN))}, - {NM_SETTING_BOND_OPTION_PRIMARY, - ~(BIT(NM_BOND_MODE_ACTIVEBACKUP) | BIT(NM_BOND_MODE_TLB) | BIT(NM_BOND_MODE_ALB))}, -- {NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB, ~(BIT(NM_BOND_MODE_TLB))}, ); -+ {NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB, ~(BIT(NM_BOND_MODE_TLB) | BIT(NM_BOND_MODE_ALB))}, ); - - gboolean - _nm_setting_bond_option_supported(const char *option, NMBondMode mode) -diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c -index 01cdb41cb2..56ba31541a 100644 ---- a/libnm-core/tests/test-setting.c -+++ b/libnm-core/tests/test-setting.c -@@ -687,7 +687,7 @@ test_bond_normalize(void) - ((const char *[]){"mode", "active-backup", "miimon", "1", NULL})); - test_bond_normalize_options( - ((const char *[]){"mode", "balance-alb", "tlb_dynamic_lb", "1", NULL}), -- ((const char *[]){"mode", "balance-alb", NULL})); -+ ((const char *[]){"mode", "balance-alb", "tlb_dynamic_lb", "1", NULL})); - test_bond_normalize_options( - ((const char *[]){"mode", "balance-tlb", "tlb_dynamic_lb", "1", NULL}), - ((const char *[]){"mode", "balance-tlb", "tlb_dynamic_lb", "1", NULL})); --- -2.26.3 - diff --git a/SOURCES/1010-manager-delete-default-connection-when-veth-removed.patch b/SOURCES/1010-manager-delete-default-connection-when-veth-removed.patch deleted file mode 100644 index 5b35c7e..0000000 --- a/SOURCES/1010-manager-delete-default-connection-when-veth-removed.patch +++ /dev/null @@ -1,213 +0,0 @@ -From a2cd778f7d54de1cf9f173fff5f09fededf5f49e Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Wed, 21 Apr 2021 13:42:45 +0200 -Subject: [PATCH 1/2] device: take reference to device object before - 'delete_on_deactivate' - -It's not clear why currently a weak reference is needed. - -(cherry picked from commit a42682d44fe2220412574fb13128814e643ed775) -(cherry picked from commit 8cfbb73294e9eaa475d28a6eada2c5ab14f1d74a) ---- - src/core/devices/nm-device.c | 44 ++++++++++++------------------------ - 1 file changed, 15 insertions(+), 29 deletions(-) - -diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c -index 5eaf8c23e7..7c2a6d3250 100644 ---- a/src/core/devices/nm-device.c -+++ b/src/core/devices/nm-device.c -@@ -125,7 +125,6 @@ typedef struct { - typedef struct { - NMDevice *device; - guint idle_add_id; -- int ifindex; - } DeleteOnDeactivateData; - - typedef struct { -@@ -12141,28 +12140,19 @@ nm_device_is_nm_owned(NMDevice *self) - static gboolean - delete_on_deactivate_link_delete(gpointer user_data) - { -- DeleteOnDeactivateData *data = user_data; -- NMDevice * self = data->device; -+ DeleteOnDeactivateData *data = user_data; -+ nm_auto_unref_object NMDevice *self = data->device; -+ NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); -+ gs_free_error GError *error = NULL; - - _LOGD(LOGD_DEVICE, -- "delete_on_deactivate: cleanup and delete virtual link #%d (id=%u)", -- data->ifindex, -+ "delete_on_deactivate: cleanup and delete virtual link (id=%u)", - data->idle_add_id); - -- if (data->device) { -- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(data->device); -- gs_free_error GError *error = NULL; -+ priv->delete_on_deactivate_data = NULL; - -- g_object_remove_weak_pointer(G_OBJECT(data->device), (void **) &data->device); -- priv->delete_on_deactivate_data = NULL; -- -- if (!nm_device_unrealize(data->device, TRUE, &error)) -- _LOGD(LOGD_DEVICE, -- "delete_on_deactivate: unrealizing %d failed (%s)", -- data->ifindex, -- error->message); -- } else if (data->ifindex > 0) -- nm_platform_link_delete(nm_device_get_platform(self), data->ifindex); -+ if (!nm_device_unrealize(self, TRUE, &error)) -+ _LOGD(LOGD_DEVICE, "delete_on_deactivate: unrealizing failed (%s)", error->message); - - nm_device_emit_recheck_auto_activate(self); - -@@ -12181,17 +12171,16 @@ delete_on_deactivate_unschedule(NMDevice *self) - priv->delete_on_deactivate_data = NULL; - - g_source_remove(data->idle_add_id); -- g_object_remove_weak_pointer(G_OBJECT(self), (void **) &data->device); - _LOGD(LOGD_DEVICE, -- "delete_on_deactivate: cancel cleanup and delete virtual link #%d (id=%u)", -- data->ifindex, -+ "delete_on_deactivate: cancel cleanup and delete virtual link (id=%u)", - data->idle_add_id); -+ g_object_unref(data->device); - g_free(data); - } - } - - static void --delete_on_deactivate_check_and_schedule(NMDevice *self, int ifindex) -+delete_on_deactivate_check_and_schedule(NMDevice *self) - { - NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); - DeleteOnDeactivateData *data; -@@ -12208,16 +12197,13 @@ delete_on_deactivate_check_and_schedule(NMDevice *self, int ifindex) - return; - delete_on_deactivate_unschedule(self); /* always cancel and reschedule */ - -- data = g_new(DeleteOnDeactivateData, 1); -- g_object_add_weak_pointer(G_OBJECT(self), (void **) &data->device); -- data->device = self; -- data->ifindex = ifindex; -+ data = g_new(DeleteOnDeactivateData, 1); -+ data->device = g_object_ref(self); - data->idle_add_id = g_idle_add(delete_on_deactivate_link_delete, data); - priv->delete_on_deactivate_data = data; - - _LOGD(LOGD_DEVICE, -- "delete_on_deactivate: schedule cleanup and delete virtual link #%d (id=%u)", -- ifindex, -+ "delete_on_deactivate: schedule cleanup and delete virtual link (id=%u)", - data->idle_add_id); - } - -@@ -15854,7 +15840,7 @@ _cleanup_generic_post(NMDevice *self, CleanupType cleanup_type) - /* Check if the device was deactivated, and if so, delete_link. - * Don't call delete_link synchronously because we are currently - * handling a state change -- which is not reentrant. */ -- delete_on_deactivate_check_and_schedule(self, nm_device_get_ip_ifindex(self)); -+ delete_on_deactivate_check_and_schedule(self); - } - - /* ip_iface should be cleared after flushing all routes and addresses, since --- -2.26.3 - - -From a8eac46cc6a0579cd1b17634c50d9a54518cb53e Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Wed, 31 Mar 2021 21:32:43 +0200 -Subject: [PATCH 2/2] manager: ensure auto default connection is deleted when a - veth goes away - -When the link goes away the manager keeps software devices alive as -unrealized because there is still a connection for them. - -If the device is software and has a NM-generated connection, keeping -the device alive means that also the generated connection stays -alive. The result is that both stick around forever even if there is -no longer a kernel link. - -Add a check to avoid this situation. - -https://bugzilla.redhat.com/show_bug.cgi?id=1945282 - -Fixes: cd0cf9229d49 ('veth: add support to configure veth interfaces') -(cherry picked from commit d19773ecd4bee36f11749085a15d70a49168c0b7) -(cherry picked from commit 5279b85e02341d24a18fc8dd9238f9f68b733bff) ---- - src/core/nm-manager.c | 45 +++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 43 insertions(+), 2 deletions(-) - -diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c -index c751b2db50..804e8db0f0 100644 ---- a/src/core/nm-manager.c -+++ b/src/core/nm-manager.c -@@ -3519,6 +3519,45 @@ typedef struct { - guint idle_id; - } PlatformLinkCbData; - -+static gboolean -+_check_remove_dev_on_link_deleted(NMManager *self, NMDevice *device) -+{ -+ NMManagerPrivate * priv = NM_MANAGER_GET_PRIVATE(self); -+ NMSettingsConnection *const *scons = NULL; -+ NMConnection * con; -+ guint i; -+ -+ nm_assert(nm_device_is_software(device)); -+ -+ /* In general, software devices stick around as unrealized -+ * until their connection is removed. However, we don't want -+ * that a NM-generated connection keeps the device alive. -+ * If there are no other compatible connections, the device -+ * should be also removed. -+ */ -+ -+ scons = nm_settings_get_connections(priv->settings, NULL); -+ -+ for (i = 0; scons[i]; i++) { -+ con = nm_settings_connection_get_connection(scons[i]); -+ if (!nm_connection_is_virtual(con)) -+ continue; -+ -+ if (NM_FLAGS_HAS(nm_settings_connection_get_flags(scons[i]), -+ NM_SETTINGS_CONNECTION_INT_FLAGS_NM_GENERATED)) -+ continue; -+ -+ if (!nm_device_check_connection_compatible(device, con, NULL)) -+ continue; -+ -+ /* Found a virtual connection compatible, the device must -+ * stay around unrealized. */ -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ - static gboolean - _platform_link_cb_idle(PlatformLinkCbData *data) - { -@@ -3544,13 +3583,15 @@ _platform_link_cb_idle(PlatformLinkCbData *data) - if (device) { - if (nm_device_is_software(device)) { - nm_device_sys_iface_state_set(device, NM_DEVICE_SYS_IFACE_STATE_REMOVED); -- /* Our software devices stick around until their connection is removed */ - if (!nm_device_unrealize(device, FALSE, &error)) { - _LOG2W(LOGD_DEVICE, device, "failed to unrealize: %s", error->message); - g_clear_error(&error); - remove_device(self, device, FALSE); - } else { -- nm_device_update_from_platform_link(device, NULL); -+ if (_check_remove_dev_on_link_deleted(self, device)) -+ remove_device(self, device, FALSE); -+ else -+ nm_device_update_from_platform_link(device, NULL); - } - } else { - /* Hardware and external devices always get removed when their kernel link is gone */ --- -2.26.3 - diff --git a/SOURCES/1011-don-t-touch-device-tc-config-by-default-rh1928078.patch b/SOURCES/1011-don-t-touch-device-tc-config-by-default-rh1928078.patch deleted file mode 100644 index a3476dc..0000000 --- a/SOURCES/1011-don-t-touch-device-tc-config-by-default-rh1928078.patch +++ /dev/null @@ -1,482 +0,0 @@ -From 78e4c3d3d06b411a1bc9e60ee8bf0c460d4453b2 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Tue, 25 May 2021 16:58:28 +0200 -Subject: [PATCH 1/2] core,libnm: don't touch device TC configuration by - default - -NetworkManager supports a very limited set of qdiscs. If users want to -configure a unsupported qdisc, they need to do it outside of -NetworkManager using tc. - -The problem is that NM also removes all qdiscs and filters during -activation if the connection doesn't contain a TC setting. Therefore, -setting TC configuration outside of NM is hard because users need to -do it *after* the connection is up (for example through a dispatcher -script). - -Let NM consider the presence (or absence) of a TC setting in the -connection to determine whether NM should configure (or not) qdiscs -and filters on the interface. We already do something similar for -SR-IOV configuration. - -Since new connections don't have the TC setting, the new behavior -(ignore existing configuration) will be the default. The impact of -this change in different scenarios is: - - - the user previously configured TC settings via NM. This continues - to work as before; - - - the user didn't set any qdiscs or filters in the connection, and - expected NM to clear them from the interface during activation. - Here there is a change in behavior, but it seems unlikely that - anybody relied on the old one; - - - the user didn't care about qdiscs and filters; NM removed all - qdiscs upon activation, and so the default qdisc from kernel was - used. After this change, NM will not touch qdiscs and the default - qdisc will be used, as before; - - - the user set a different qdisc via tc and NM cleared it during - activation. Now this will work as expected. - -So, the new default behavior seems better than the previous one. - -https://bugzilla.redhat.com/show_bug.cgi?id=1928078 -(cherry picked from commit a48edd0410c878d65fc5adcd5192b116ab6f8afc) -(cherry picked from commit 2a8181bcd78d055b7cb9e6c0e026bc3b08231b5a) ---- - .../generate-docs-nm-settings-nmcli.xml.in | 4 +-- - clients/common/settings-docs.h.in | 4 +-- - libnm-core/nm-setting-tc-config.c | 16 ++++++++++++ - src/core/devices/nm-device.c | 26 +++++++++---------- - 4 files changed, 33 insertions(+), 17 deletions(-) - -diff --git a/clients/cli/generate-docs-nm-settings-nmcli.xml.in b/clients/cli/generate-docs-nm-settings-nmcli.xml.in -index 1044ae0d38..0a75a0e681 100644 ---- a/clients/cli/generate-docs-nm-settings-nmcli.xml.in -+++ b/clients/cli/generate-docs-nm-settings-nmcli.xml.in -@@ -914,9 +914,9 @@ - - - -+ description="Array of TC queueing disciplines. When the "tc" setting is present, qdiscs from this property are applied upon activation. If the property is empty, all qdiscs are removed and the device will only have the default qdisc assigned by kernel according to the "net.core.default_qdisc" sysctl. If the "tc" setting is not present, NetworkManager doesn't touch the qdiscs present on the interface." /> - -+ description="Array of TC traffic filters. When the "tc" setting is present, filters from this property are applied upon activation. If the property is empty, NetworkManager removes all the filters. If the "tc" setting is not present, NetworkManager doesn't touch the filters present on the interface." /> - - - -Date: Tue, 25 May 2021 18:00:27 +0200 -Subject: [PATCH 2/2] ifcfg-rh: preserve an empty tc configuration - -If the TC setting contains no qdiscs and filters, it is lost after a -write-read cycle. Fix this by adding a new property to indicate the -presence of the (empty) setting. - -(cherry picked from commit 6a88d4e55cf031da2b5a8458d21487a011357da4) -(cherry picked from commit acf0c4df2b0fb0dc332aa929131953390998828f) ---- - Makefile.am | 1 + - libnm-core/nm-setting-tc-config.c | 14 +++- - .../plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 3 +- - .../plugins/ifcfg-rh/nms-ifcfg-rh-utils.c | 1 + - .../plugins/ifcfg-rh/nms-ifcfg-rh-utils.h | 2 +- - .../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 38 +++++---- - .../ifcfg-test-tc-write-empty.cexpected | 15 ++++ - .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 80 +++++++++++++++++++ - 8 files changed, 128 insertions(+), 26 deletions(-) - create mode 100644 src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected - -diff --git a/Makefile.am b/Makefile.am -index 9279672c1f..c8e417729b 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -3300,6 +3300,7 @@ EXTRA_DIST += \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-static-routes-legacy.cexpected \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected \ -+ src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-1 \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-2 \ - src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-invalid \ -diff --git a/libnm-core/nm-setting-tc-config.c b/libnm-core/nm-setting-tc-config.c -index 2fad98b1e8..31e829c1d2 100644 ---- a/libnm-core/nm-setting-tc-config.c -+++ b/libnm-core/nm-setting-tc-config.c -@@ -1822,8 +1822,11 @@ nm_setting_tc_config_class_init(NMSettingTCConfigClass *klass) - **/ - /* ---ifcfg-rh--- - * property: qdiscs -- * variable: QDISC1(+), QDISC2(+), ... -- * description: Queueing disciplines -+ * variable: QDISC1(+), QDISC2(+), ..., TC_COMMIT(+) -+ * description: Queueing disciplines to set on the interface. When no -+ * QDISC1, QDISC2, ..., FILTER1, FILTER2, ... keys are present, -+ * NetworkManager doesn't touch qdiscs and filters present on the -+ * interface, unless TC_COMMIT is set to 'yes'. - * example: QDISC1=ingress, QDISC2="root handle 1234: fq_codel" - * ---end--- - */ -@@ -1853,8 +1856,11 @@ nm_setting_tc_config_class_init(NMSettingTCConfigClass *klass) - **/ - /* ---ifcfg-rh--- - * property: qdiscs -- * variable: FILTER1(+), FILTER2(+), ... -- * description: Traffic filters -+ * variable: FILTER1(+), FILTER2(+), ..., TC_COMMIT(+) -+ * description: Traffic filters to set on the interface. When no -+ * QDISC1, QDISC2, ..., FILTER1, FILTER2, ... keys are present, -+ * NetworkManager doesn't touch qdiscs and filters present on the -+ * interface, unless TC_COMMIT is set to 'yes'. - * example: FILTER1="parent ffff: matchall action simple sdata Input", ... - * ---end--- - */ -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 209957d9b8..a42c418884 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 -@@ -2707,7 +2707,8 @@ make_tc_setting(shvarFile *ifcfg) - } - - if (nm_setting_tc_config_get_num_qdiscs(s_tc) > 0 -- || nm_setting_tc_config_get_num_tfilters(s_tc) > 0) -+ || nm_setting_tc_config_get_num_tfilters(s_tc) > 0 -+ || svGetValueBoolean(ifcfg, "TC_COMMIT", FALSE)) - return NM_SETTING(s_tc); - - g_object_unref(s_tc); -diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -index 8da5de473b..ada1942acb 100644 ---- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -@@ -1026,6 +1026,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = { - _KEY_TYPE("STABLE_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("STP", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("SUBCHANNELS", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -+ _KEY_TYPE("TC_COMMIT", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("TEAM_CONFIG", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("TEAM_MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("TEAM_MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -index 36ec922514..04a1b63d3e 100644 ---- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -@@ -33,7 +33,7 @@ typedef struct { - NMSIfcfgKeyTypeFlags key_flags; - } NMSIfcfgKeyTypeInfo; - --extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[247]; -+extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[248]; - - const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info(const char *key, gssize *out_idx); - -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 a968fce0ba..65bacb293a 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 -@@ -2511,46 +2511,46 @@ write_sriov_setting(NMConnection *connection, shvarFile *ifcfg) - } - } - --static gboolean --write_tc_setting(NMConnection *connection, shvarFile *ifcfg, GError **error) -+static void -+write_tc_setting(NMConnection *connection, shvarFile *ifcfg) - { - NMSettingTCConfig *s_tc; -- guint i, num, n; -+ guint num_qdiscs; -+ guint num_filters; -+ guint i; -+ guint n; - char tag[64]; - - s_tc = nm_connection_get_setting_tc_config(connection); - if (!s_tc) -- return TRUE; -+ return; - -- num = nm_setting_tc_config_get_num_qdiscs(s_tc); -- for (n = 1, i = 0; i < num; i++) { -+ num_qdiscs = nm_setting_tc_config_get_num_qdiscs(s_tc); -+ for (n = 1, i = 0; i < num_qdiscs; i++) { - NMTCQdisc * qdisc; - gs_free char *str = NULL; - - qdisc = nm_setting_tc_config_get_qdisc(s_tc, i); -- str = nm_utils_tc_qdisc_to_str(qdisc, error); -- if (!str) -- return FALSE; -- -+ str = nm_utils_tc_qdisc_to_str(qdisc, NULL); -+ nm_assert(str); - svSetValueStr(ifcfg, numbered_tag(tag, "QDISC", n), str); - n++; - } - -- num = nm_setting_tc_config_get_num_tfilters(s_tc); -- for (n = 1, i = 0; i < num; i++) { -+ num_filters = nm_setting_tc_config_get_num_tfilters(s_tc); -+ for (n = 1, i = 0; i < num_filters; i++) { - NMTCTfilter * tfilter; - gs_free char *str = NULL; - - tfilter = nm_setting_tc_config_get_tfilter(s_tc, i); -- str = nm_utils_tc_tfilter_to_str(tfilter, error); -- if (!str) -- return FALSE; -- -+ str = nm_utils_tc_tfilter_to_str(tfilter, NULL); -+ nm_assert(str); - svSetValueStr(ifcfg, numbered_tag(tag, "FILTER", n), str); - n++; - } - -- return TRUE; -+ if (num_qdiscs == 0 && num_filters == 0) -+ svSetValueBoolean(ifcfg, "TC_COMMIT", TRUE); - } - - static void -@@ -3373,9 +3373,7 @@ do_write_construct(NMConnection * connection, - write_match_setting(connection, ifcfg); - write_hostname_setting(connection, ifcfg); - write_sriov_setting(connection, ifcfg); -- -- if (!write_tc_setting(connection, ifcfg, error)) -- return FALSE; -+ write_tc_setting(connection, ifcfg); - - route_path_is_svformat = utils_has_route_file_new_syntax(route_path); - -diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected -new file mode 100644 -index 0000000000..4df768b463 ---- /dev/null -+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected -@@ -0,0 +1,15 @@ -+TYPE=Ethernet -+PROXY_METHOD=none -+BROWSER_ONLY=no -+TC_COMMIT=yes -+BOOTPROTO=none -+IPADDR=1.1.1.3 -+PREFIX=24 -+GATEWAY=1.1.1.1 -+DEFROUTE=yes -+IPV4_FAILURE_FATAL=no -+IPV6INIT=no -+NAME="Test Write TC config" -+UUID=${UUID} -+DEVICE=eth0 -+ONBOOT=yes -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 59127d0103..9d9ed62653 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 -@@ -11108,6 +11108,85 @@ test_tc_read(void) - g_object_unref(connection); - } - -+static void -+test_tc_write_empty(void) -+{ -+ nmtst_auto_unlinkfile char *testfile = NULL; -+ gs_unref_object NMConnection *connection = NULL; -+ gs_unref_object NMConnection *reread = NULL; -+ NMSettingConnection * s_con; -+ NMSettingIPConfig * s_ip4; -+ NMSettingIPConfig * s_ip6; -+ NMSettingWired * s_wired; -+ NMSettingTCConfig * s_tc; -+ NMIPAddress * addr; -+ GError * error = NULL; -+ -+ connection = nm_simple_connection_new(); -+ -+ /* Connection setting */ -+ s_con = (NMSettingConnection *) nm_setting_connection_new(); -+ nm_connection_add_setting(connection, NM_SETTING(s_con)); -+ -+ g_object_set(s_con, -+ NM_SETTING_CONNECTION_ID, -+ "Test Write TC config", -+ NM_SETTING_CONNECTION_UUID, -+ nm_utils_uuid_generate_a(), -+ NM_SETTING_CONNECTION_AUTOCONNECT, -+ TRUE, -+ NM_SETTING_CONNECTION_INTERFACE_NAME, -+ "eth0", -+ NM_SETTING_CONNECTION_TYPE, -+ NM_SETTING_WIRED_SETTING_NAME, -+ NULL); -+ -+ /* Wired setting */ -+ s_wired = (NMSettingWired *) nm_setting_wired_new(); -+ nm_connection_add_setting(connection, NM_SETTING(s_wired)); -+ -+ /* IP4 setting */ -+ s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new(); -+ nm_connection_add_setting(connection, NM_SETTING(s_ip4)); -+ -+ g_object_set(s_ip4, -+ NM_SETTING_IP_CONFIG_METHOD, -+ NM_SETTING_IP4_CONFIG_METHOD_MANUAL, -+ NM_SETTING_IP_CONFIG_GATEWAY, -+ "1.1.1.1", -+ NM_SETTING_IP_CONFIG_MAY_FAIL, -+ TRUE, -+ NULL); -+ -+ addr = nm_ip_address_new(AF_INET, "1.1.1.3", 24, &error); -+ g_assert_no_error(error); -+ nm_setting_ip_config_add_address(s_ip4, addr); -+ nm_ip_address_unref(addr); -+ -+ /* IP6 setting */ -+ 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); -+ -+ /* TC setting */ -+ s_tc = (NMSettingTCConfig *) nm_setting_tc_config_new(); -+ nm_connection_add_setting(connection, NM_SETTING(s_tc)); -+ -+ nm_connection_add_setting(connection, nm_setting_proxy_new()); -+ -+ nmtst_assert_connection_verifies_without_normalization(connection); -+ -+ _writer_new_connec_exp(connection, -+ TEST_SCRATCH_DIR, -+ TEST_IFCFG_DIR "/ifcfg-test-tc-write-empty.cexpected", -+ &testfile); -+ -+ reread = _connection_from_file(testfile, NULL, TYPE_BOND, NULL); -+ -+ nmtst_assert_connection_equals(connection, FALSE, reread, FALSE); -+} -+ - static void - test_tc_write(void) - { -@@ -11848,6 +11927,7 @@ main(int argc, char **argv) - - g_test_add_func(TPATH "tc/read", test_tc_read); - g_test_add_func(TPATH "tc/write", test_tc_write); -+ g_test_add_func(TPATH "tc/write_empty", test_tc_write_empty); - g_test_add_func(TPATH "utils/test_well_known_keys", test_well_known_keys); - g_test_add_func(TPATH "utils/test_utils_has_route_file_new_syntax", - test_utils_has_route_file_new_syntax); --- -2.31.1 - diff --git a/SOURCES/1012-prefer-IPv4-to-determine-the-hostname.patch b/SOURCES/1012-prefer-IPv4-to-determine-the-hostname.patch deleted file mode 100644 index 55f6004..0000000 --- a/SOURCES/1012-prefer-IPv4-to-determine-the-hostname.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 65ea6e97238a76386d0477abc0d22b2227f38d60 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Thu, 17 Jun 2021 11:35:54 +0200 -Subject: [PATCH] policy: prefer IPv4 to determine the hostname - -When determining the hostname, it is preferable to evaluate devices in -a predictable order to avoid that the hostname changes between -different boots. - -The current order is based first on hostname priority, then on the -presence of a best default route, and then on activation order. - -The activation order is not a very strong condition, as it is -basically useless for devices that are autoactivated at boot. - -As we already prefer IPv4 over IPv6 within the same connection, also -prefer it when 2 connections have the same priority and the same -default route status, to achieve better predictability. - -https://bugzilla.redhat.com/show_bug.cgi?id=1970335 -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/895 -(cherry picked from commit 637a45e25b58afd1ac22af8657121e0956093b61) -(cherry picked from commit 21051dc6d8b87c48fafb44b5cde901633b0a7cd2) -(cherry picked from commit b793925889a3137b77fa2b8679144b1e4948d246) ---- - src/core/nm-policy.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/core/nm-policy.c b/src/core/nm-policy.c -index db4983f889..71aa1eceaf 100644 ---- a/src/core/nm-policy.c -+++ b/src/core/nm-policy.c -@@ -652,6 +652,7 @@ device_hostname_info_compare(gconstpointer a, gconstpointer b) - - NM_CMP_FIELD(info1, info2, priority); - NM_CMP_FIELD_UNSAFE(info2, info1, is_default); -+ NM_CMP_FIELD_UNSAFE(info2, info1, IS_IPv4); - - return 0; - } --- -2.31.1 - diff --git a/SOURCES/1013-platform-preserve-IPv6-multicast-route-added-by-kern.patch b/SOURCES/1013-platform-preserve-IPv6-multicast-route-added-by-kern.patch deleted file mode 100644 index 7c8efb6..0000000 --- a/SOURCES/1013-platform-preserve-IPv6-multicast-route-added-by-kern.patch +++ /dev/null @@ -1,100 +0,0 @@ -From d01912d2fc964af30b3c9a47e98c7925a5f60c07 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Fri, 17 Sep 2021 13:53:18 +0200 -Subject: [PATCH] platform: preserve IPv6 multicast route added by kernel - -Kernels < 5.11 add a route like: - - unicast ff00::/8 dev $IFACE proto boot scope global metric 256 pref medium - -to allow sending and receiving IPv6 multicast traffic. Ensure it's not -removed it when we do a route sync in mode ALL. - -In kernel 5.11 there were commits: - - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ceed9038b2783d14e0422bdc6fd04f70580efb4c - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a826b04303a40d52439aa141035fca5654ccaccd - -After those the route looks like - - multicast ff00::/8 dev $IFACE proto kernel metric 256 pref medium - -As NM ignores routes with rtm_type multicast, the code in this commit -is not needed on newer kernels. - -https://bugzilla.redhat.com/show_bug.cgi?id=2004212 -https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/984 -(cherry picked from commit 8003ca68f770c69e109c16f638abbcce44af9439) -(cherry picked from commit ce8eb446b4d9465a906bf8952c1b454dab8d0c7c) -(cherry picked from commit d01912d2fc964af30b3c9a47e98c7925a5f60c07) ---- - src/core/platform/nm-platform.c | 39 +++++++++++++++++++++++++++++++++ - 1 file changed, 39 insertions(+) - -diff --git a/src/core/platform/nm-platform.c b/src/core/platform/nm-platform.c -index 459a330717..febc3a8d6f 100644 ---- a/src/core/platform/nm-platform.c -+++ b/src/core/platform/nm-platform.c -@@ -4359,6 +4359,7 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - CList * iter; - NMPlatformIP4Route rt_local4; - NMPlatformIP6Route rt_local6; -+ NMPlatformIP6Route rt_mcast6; - const NMPlatformLink * pllink; - const NMPlatformLnkVrf * lnk_vrf; - guint32 local_table; -@@ -4383,6 +4384,7 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - - rt_local4.plen = 0; - rt_local6.plen = 0; -+ rt_mcast6.plen = 0; - - routes_prune = g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); - -@@ -4475,6 +4477,43 @@ nm_platform_ip_route_get_prune_list(NMPlatform * self, - == 0) - continue; - } -+ -+ /* Kernels < 5.11 add a route like: -+ * -+ * unicast ff00::/8 dev $IFACE proto boot scope global metric 256 pref medium -+ * -+ * to allow sending and receiving IPv6 multicast traffic. Don't remove it. -+ * Since kernel 5.11 the route looks like: -+ * -+ * multicast ff00::/8 dev $IFACE proto kernel metric 256 pref medium -+ * -+ * As NM ignores routes with rtm_type multicast, there is no need for the code -+ * below on newer kernels. -+ */ -+ if (nm_platform_ip_route_get_effective_table(&rt->rx) == local_table -+ && rt->rx.plen == 8 && rt->rx.rt_source == NM_IP_CONFIG_SOURCE_RTPROT_BOOT -+ && rt->rx.metric == 256 && rt->r6.rt_pref == NM_ICMPV6_ROUTER_PREF_MEDIUM -+ && IN6_IS_ADDR_UNSPECIFIED(&rt->r6.gateway)) { -+ if (rt_mcast6.plen == 0) { -+ rt_mcast6 = (NMPlatformIP6Route){ -+ .ifindex = ifindex, -+ .type_coerced = nm_platform_route_type_coerce(RTN_UNICAST), -+ .plen = 8, -+ .rt_source = NM_IP_CONFIG_SOURCE_RTPROT_BOOT, -+ .metric = 256, -+ .table_coerced = nm_platform_route_table_coerce(local_table), -+ .rt_pref = NM_ICMPV6_ROUTER_PREF_MEDIUM, -+ .gateway = IN6ADDR_ANY_INIT, -+ .network = {{{0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}}, -+ }; -+ } -+ -+ if (nm_platform_ip6_route_cmp(&rt->r6, -+ &rt_mcast6, -+ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) -+ == 0) -+ continue; -+ } - } - break; - --- -2.31.1 - diff --git a/SOURCES/1014-default-route-inter-feres-with-other-subnets-on-the-VM.patch b/SOURCES/1014-default-route-inter-feres-with-other-subnets-on-the-VM.patch deleted file mode 100644 index b12192f..0000000 --- a/SOURCES/1014-default-route-inter-feres-with-other-subnets-on-the-VM.patch +++ /dev/null @@ -1,1844 +0,0 @@ -From 85d1baca1f12fb3d096bc6018d73747c31e2bd91 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 12:14:13 +0200 -Subject: [PATCH 01/15] glib-aux: add _nm_utils_ascii_str_to_int64_bin() helper - -(cherry picked from commit 70b7ad1a761405f4ac9398832d0365c47cd5aa0f) -(cherry picked from commit b8bb585052331a48764d6d5d21ee23e2f82f1078) ---- - shared/nm-glib-aux/nm-shared-utils.c | 39 ++++++++++++++++++++++++++++ - shared/nm-glib-aux/nm-shared-utils.h | 7 +++++ - 2 files changed, 46 insertions(+) - -diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c -index 3215a33b5b..30ef68874f 100644 ---- a/shared/nm-glib-aux/nm-shared-utils.c -+++ b/shared/nm-glib-aux/nm-shared-utils.c -@@ -1381,6 +1381,45 @@ _nm_utils_ascii_str_to_uint64(const char *str, - - /*****************************************************************************/ - -+gint64 -+_nm_utils_ascii_str_to_int64_bin(const char *str, -+ gssize len, -+ guint base, -+ gint64 min, -+ gint64 max, -+ gint64 fallback) -+{ -+ gs_free char *str_clone = NULL; -+ -+ /* This is like _nm_utils_ascii_str_to_int64(), but the user may provide -+ * an optional string length, in which case str is not assumed to be NUL -+ * terminated. In that case, any NUL characters inside the first len characters -+ * lead to a failure, except one last NUL character is allowed. */ -+ -+ if (len >= 0) { -+ gsize l = len; -+ -+ nm_assert(l == 0 || str); -+ -+ if (l > 0 && str[l - 1u] == '\0') { -+ /* we accept one '\0' at the end of the string. */ -+ l--; -+ } -+ -+ if (l > 0 && memchr(str, '\0', l)) { -+ /* but we don't accept other NUL characters in the middle. */ -+ errno = EINVAL; -+ return fallback; -+ } -+ -+ str = nm_strndup_a(300, str, len, &str_clone); -+ } -+ -+ return _nm_utils_ascii_str_to_int64(str, base, min, max, fallback); -+} -+ -+/*****************************************************************************/ -+ - int - nm_strcmp_with_data(gconstpointer a, gconstpointer b, gpointer user_data) - { -diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h -index 7d330458c1..ed4fcaf9c1 100644 ---- a/shared/nm-glib-aux/nm-shared-utils.h -+++ b/shared/nm-glib-aux/nm-shared-utils.h -@@ -760,6 +760,13 @@ guint64 _nm_utils_ascii_str_to_uint64(const char *str, - guint64 max, - guint64 fallback); - -+gint64 _nm_utils_ascii_str_to_int64_bin(const char *str, -+ gssize len, -+ guint base, -+ gint64 min, -+ gint64 max, -+ gint64 fallback); -+ - int _nm_utils_ascii_str_to_bool(const char *str, int default_value); - - /*****************************************************************************/ --- -2.31.1 - - -From eb82099df0276babc2c7dd8fa44753741f1be891 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 15 Jun 2021 19:04:39 +0200 -Subject: [PATCH 02/15] libnm: expose nm_ip_address_dup(), nm_ip_route_dup() - API in libnm - -This fixes commit 21c8a6b20eff ('libnm-core, all: merge IPv4 and IPv6 -address/route types'), which introduced this API but didn't export it -in the library. In practice this API is thus only usable since 1.32.0. - -(cherry picked from commit 05f2a0b0247ee4aa3da371658f310bc655cbf1af) -(cherry picked from commit eea912dfb31a40909cad7b784a82bbfbe56ef486) -(cherry picked from commit 2585e34e598074e41445e4dd25d1b496ffbcea3f) ---- - libnm-core/nm-setting-ip-config.c | 12 ++++++++++++ - libnm-core/nm-setting-ip-config.h | 3 +++ - libnm/libnm.ver | 2 ++ - 3 files changed, 17 insertions(+) - -diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c -index 45ecbd8868..c121907cef 100644 ---- a/libnm-core/nm-setting-ip-config.c -+++ b/libnm-core/nm-setting-ip-config.c -@@ -363,6 +363,12 @@ nm_ip_address_equal(NMIPAddress *address, NMIPAddress *other) - * Creates a copy of @address - * - * Returns: (transfer full): a copy of @address -+ * -+ * This API was part of public headers before 1.32.0 but -+ * was erroneously not exported in the ABI. It is thus only -+ * usable since 1.32.0, 1.30.0. -+ * -+ * Since: 1.32, 1.30 - **/ - NMIPAddress * - nm_ip_address_dup(NMIPAddress *address) -@@ -820,6 +826,12 @@ nm_ip_route_equal(NMIPRoute *route, NMIPRoute *other) - * Creates a copy of @route - * - * Returns: (transfer full): a copy of @route -+ * -+ * This API was part of public headers before 1.32.0 but -+ * was erroneously not exported in the ABI. It is thus only -+ * usable since 1.32.0, 1.30.0. -+ * -+ * Since: 1.32, 1.30 - **/ - NMIPRoute * - nm_ip_route_dup(NMIPRoute *route) -diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h -index 1cb1671714..1421402c76 100644 ---- a/libnm-core/nm-setting-ip-config.h -+++ b/libnm-core/nm-setting-ip-config.h -@@ -49,6 +49,8 @@ gboolean nm_ip_address_equal(NMIPAddress *address, NMIPAddress *other); - NM_AVAILABLE_IN_1_22 - int - nm_ip_address_cmp_full(const NMIPAddress *a, const NMIPAddress *b, NMIPAddressCmpFlags cmp_flags); -+ -+NM_AVAILABLE_IN_1_30 - NMIPAddress *nm_ip_address_dup(NMIPAddress *address); - - int nm_ip_address_get_family(NMIPAddress *address); -@@ -92,6 +94,7 @@ enum { /*< flags >*/ - NM_AVAILABLE_IN_1_10 - gboolean nm_ip_route_equal_full(NMIPRoute *route, NMIPRoute *other, guint cmp_flags); - -+NM_AVAILABLE_IN_1_30 - NMIPRoute *nm_ip_route_dup(NMIPRoute *route); - - int nm_ip_route_get_family(NMIPRoute *route); -diff --git a/libnm/libnm.ver b/libnm/libnm.ver -index c61792c749..516ff9cae0 100644 ---- a/libnm/libnm.ver -+++ b/libnm/libnm.ver -@@ -1759,6 +1759,8 @@ global: - libnm_1_30_0 { - global: - nm_device_veth_get_type; -+ nm_ip_address_dup; -+ nm_ip_route_dup; - nm_keyfile_handler_data_fail_with_error; - nm_keyfile_handler_data_get_context; - nm_keyfile_handler_data_warn_get; --- -2.31.1 - - -From f7154197006b070de57d8a57d2887d30d4f7001b Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 09:30:29 +0200 -Subject: [PATCH 03/15] cloud-setup: return structure for get_config() result - instead of generic hash table - -Returning a struct seems easier to understand, because then the result -is typed. - -Also, we might return additional results, which are system wide and not -per-interface. - -(cherry picked from commit 323e18276894591712a5e29f6e907562c79c5216) -(cherry picked from commit c94b1c43d4b5c5b88d67d7966d23a005028e78d8) -(cherry picked from commit b2ed9e7d5df01dc20ae3ce18066f38f69fe31e9d) ---- - clients/cloud-setup/main.c | 54 +++++++++++++++-------------- - clients/cloud-setup/nmcs-provider.c | 28 +++++++++++++-- - clients/cloud-setup/nmcs-provider.h | 20 ++++++++++- - 3 files changed, 72 insertions(+), 30 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 065901760a..c57c5ab5ca 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -198,30 +198,30 @@ _nmc_get_device_by_hwaddr(NMClient *nmc, const char *hwaddr) - /*****************************************************************************/ - - typedef struct { -- GMainLoop * main_loop; -- GHashTable *config_dict; -+ GMainLoop * main_loop; -+ NMCSProviderGetConfigResult *result; - } GetConfigData; - - static void --_get_config_cb(GObject *source, GAsyncResult *result, gpointer user_data) -+_get_config_cb(GObject *source, GAsyncResult *res, gpointer user_data) - { -- GetConfigData * data = user_data; -- gs_unref_hashtable GHashTable *config_dict = NULL; -- gs_free_error GError *error = NULL; -+ GetConfigData * data = user_data; -+ nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL; -+ gs_free_error GError *error = NULL; - -- config_dict = nmcs_provider_get_config_finish(NMCS_PROVIDER(source), result, &error); -+ result = nmcs_provider_get_config_finish(NMCS_PROVIDER(source), res, &error); - -- if (!config_dict) { -+ if (!result) { - if (!nm_utils_error_is_cancelled(error)) - _LOGI("failure to get meta data: %s", error->message); - } else - _LOGD("meta data received"); - -- data->config_dict = g_steal_pointer(&config_dict); -+ data->result = g_steal_pointer(&result); - g_main_loop_quit(data->main_loop); - } - --static GHashTable * -+static NMCSProviderGetConfigResult * - _get_config(GCancellable *sigterm_cancellable, NMCSProvider *provider, NMClient *nmc) - { - nm_auto_unref_gmainloop GMainLoop *main_loop = g_main_loop_new(NULL, FALSE); -@@ -241,7 +241,7 @@ _get_config(GCancellable *sigterm_cancellable, NMCSProvider *provider, NMClient - - g_main_loop_run(main_loop); - -- return data.config_dict; -+ return data.result; - } - - /*****************************************************************************/ -@@ -361,13 +361,13 @@ _nmc_mangle_connection(NMDevice * device, - /*****************************************************************************/ - - static guint --_config_data_get_num_valid(GHashTable *config_dict) -+_config_data_get_num_valid(const NMCSProviderGetConfigResult *result) - { - const NMCSProviderGetConfigIfaceData *config_data; - GHashTableIter h_iter; - guint n = 0; - -- g_hash_table_iter_init(&h_iter, config_dict); -+ g_hash_table_iter_init(&h_iter, result->iface_datas); - while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &config_data)) { - if (nmcs_provider_get_config_iface_data_is_valid(config_data)) - n++; -@@ -490,7 +490,9 @@ try_again: - } - - static gboolean --_config_all(GCancellable *sigterm_cancellable, NMClient *nmc, GHashTable *config_dict) -+_config_all(GCancellable * sigterm_cancellable, -+ NMClient * nmc, -+ const NMCSProviderGetConfigResult *result) - { - GHashTableIter h_iter; - const NMCSProviderGetConfigIfaceData *c_config_data; -@@ -498,9 +500,9 @@ _config_all(GCancellable *sigterm_cancellable, NMClient *nmc, GHashTable *config - gboolean is_single_nic; - gboolean any_changes = FALSE; - -- is_single_nic = (_config_data_get_num_valid(config_dict) <= 1); -+ is_single_nic = (_config_data_get_num_valid(result) <= 1); - -- g_hash_table_iter_init(&h_iter, config_dict); -+ g_hash_table_iter_init(&h_iter, result->iface_datas); - while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { - if (_config_one(sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data)) - any_changes = TRUE; -@@ -529,12 +531,12 @@ sigterm_handler(gpointer user_data) - int - main(int argc, const char *const *argv) - { -- gs_unref_object GCancellable * sigterm_cancellable = NULL; -- nm_auto_destroy_and_unref_gsource GSource *sigterm_source = NULL; -- gs_unref_object NMCSProvider *provider = NULL; -- gs_unref_object NMClient *nmc = NULL; -- gs_unref_hashtable GHashTable *config_dict = NULL; -- gs_free_error GError *error = NULL; -+ gs_unref_object GCancellable * sigterm_cancellable = NULL; -+ nm_auto_destroy_and_unref_gsource GSource *sigterm_source = NULL; -+ gs_unref_object NMCSProvider *provider = NULL; -+ gs_unref_object NMClient * nmc = NULL; -+ nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL; -+ gs_free_error GError *error = NULL; - - _nm_logging_enabled_init(g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_LOG"))); - -@@ -579,17 +581,17 @@ main(int argc, const char *const *argv) - goto done; - } - -- config_dict = _get_config(sigterm_cancellable, provider, nmc); -- if (!config_dict) -+ result = _get_config(sigterm_cancellable, provider, nmc); -+ if (!result) - goto done; - -- if (_config_all(sigterm_cancellable, nmc, config_dict)) -+ if (_config_all(sigterm_cancellable, nmc, result)) - _LOGI("some changes were applied for provider %s", nmcs_provider_get_name(provider)); - else - _LOGD("no changes were applied for provider %s", nmcs_provider_get_name(provider)); - - done: -- nm_clear_pointer(&config_dict, g_hash_table_unref); -+ nm_clear_pointer(&result, nmcs_provider_get_config_result_free); - g_clear_object(&nmc); - g_clear_object(&provider); - -diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c -index c700d8e1a3..d335193166 100644 ---- a/clients/cloud-setup/nmcs-provider.c -+++ b/clients/cloud-setup/nmcs-provider.c -@@ -49,6 +49,28 @@ nmcs_provider_get_main_context(NMCSProvider *self) - - return nm_http_client_get_main_context(NMCS_PROVIDER_GET_PRIVATE(self)->http_client); - } -+/*****************************************************************************/ -+ -+static NMCSProviderGetConfigResult * -+nmcs_provider_get_config_result_new(GHashTable *iface_datas) -+{ -+ NMCSProviderGetConfigResult *result; -+ -+ result = g_new(NMCSProviderGetConfigResult, 1); -+ *result = (NMCSProviderGetConfigResult){ -+ .iface_datas = g_hash_table_ref(iface_datas), -+ }; -+ return result; -+} -+ -+void -+nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result) -+{ -+ if (result) { -+ nm_g_hash_table_unref(result->iface_datas); -+ g_free(result); -+ } -+} - - /*****************************************************************************/ - -@@ -137,8 +159,8 @@ _get_config_task_maybe_return(NMCSProviderGetConfigTaskData *get_config_data, GE - } else { - _LOGD("get-config: success"); - g_task_return_pointer(get_config_data->task, -- g_hash_table_ref(get_config_data->result_dict), -- (GDestroyNotify) g_hash_table_unref); -+ nmcs_provider_get_config_result_new(get_config_data->result_dict), -+ (GDestroyNotify) nmcs_provider_get_config_result_free); - } - - nm_clear_g_signal_handler(g_task_get_cancellable(get_config_data->task), -@@ -217,7 +239,7 @@ nmcs_provider_get_config(NMCSProvider * self, - NMCS_PROVIDER_GET_CLASS(self)->get_config(self, get_config_data); - } - --GHashTable * -+NMCSProviderGetConfigResult * - nmcs_provider_get_config_finish(NMCSProvider *self, GAsyncResult *result, GError **error) - { - g_return_val_if_fail(NMCS_IS_PROVIDER(self), FALSE); -diff --git a/clients/cloud-setup/nmcs-provider.h b/clients/cloud-setup/nmcs-provider.h -index 3b0c2529ed..81aca966e4 100644 ---- a/clients/cloud-setup/nmcs-provider.h -+++ b/clients/cloud-setup/nmcs-provider.h -@@ -41,6 +41,24 @@ nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceDat - - NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested); - -+/*****************************************************************************/ -+ -+typedef struct { -+ /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). -+ * This is the per-interface result of get_config(). */ -+ GHashTable *iface_datas; -+} NMCSProviderGetConfigResult; -+ -+void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); -+ -+NM_AUTO_DEFINE_FCN0(NMCSProviderGetConfigResult *, -+ _nm_auto_free_nmcs_provider_get_config_result, -+ nmcs_provider_get_config_result_free); -+#define nm_auto_free_nmcs_provider_get_config_result \ -+ nm_auto(_nm_auto_free_nmcs_provider_get_config_result) -+ -+/*****************************************************************************/ -+ - typedef struct { - GTask *task; - -@@ -122,7 +140,7 @@ void nmcs_provider_get_config(NMCSProvider * provider, - GAsyncReadyCallback callback, - gpointer user_data); - --GHashTable * -+NMCSProviderGetConfigResult * - nmcs_provider_get_config_finish(NMCSProvider *provider, GAsyncResult *result, GError **error); - - #endif /* __NMCS_PROVIDER_H__ */ --- -2.31.1 - - -From dcd9ca4fb9280c80e810e1ec203459646b5ff387 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 09:42:37 +0200 -Subject: [PATCH 04/15] cloud-setup: cache number of valid interfaces in - get-config result - -Now that we return a struct from get_config(), we can have system-wide -properties returned. - -Let it count and cache the number of valid iface_datas. - -Currently that is not yet used, but it will be. - -(cherry picked from commit a3cd66d3fadcecab9b186cc7f634f6ec6a5a92ee) -(cherry picked from commit e74375fc3b68b07d1ed5f6ebca40cbe5b20ed47b) -(cherry picked from commit 7fcc89db6ee3701511f80efea5498bf1533dea8a) ---- - clients/cloud-setup/main.c | 22 +--------------------- - clients/cloud-setup/nmcs-provider.c | 15 +++++++++++++-- - clients/cloud-setup/nmcs-provider.h | 3 +++ - 3 files changed, 17 insertions(+), 23 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index c57c5ab5ca..32d29ef4fa 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -360,26 +360,9 @@ _nmc_mangle_connection(NMDevice * device, - - /*****************************************************************************/ - --static guint --_config_data_get_num_valid(const NMCSProviderGetConfigResult *result) --{ -- const NMCSProviderGetConfigIfaceData *config_data; -- GHashTableIter h_iter; -- guint n = 0; -- -- g_hash_table_iter_init(&h_iter, result->iface_datas); -- while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &config_data)) { -- if (nmcs_provider_get_config_iface_data_is_valid(config_data)) -- n++; -- } -- -- return n; --} -- - static gboolean - _config_one(GCancellable * sigterm_cancellable, - NMClient * nmc, -- gboolean is_single_nic, - const char * hwaddr, - const NMCSProviderGetConfigIfaceData *config_data) - { -@@ -497,14 +480,11 @@ _config_all(GCancellable * sigterm_cancellable, - GHashTableIter h_iter; - const NMCSProviderGetConfigIfaceData *c_config_data; - const char * c_hwaddr; -- gboolean is_single_nic; - gboolean any_changes = FALSE; - -- is_single_nic = (_config_data_get_num_valid(result) <= 1); -- - g_hash_table_iter_init(&h_iter, result->iface_datas); - while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { -- if (_config_one(sigterm_cancellable, nmc, is_single_nic, c_hwaddr, c_config_data)) -+ if (_config_one(sigterm_cancellable, nmc, c_hwaddr, c_config_data)) - any_changes = TRUE; - } - -diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c -index d335193166..795532d344 100644 ---- a/clients/cloud-setup/nmcs-provider.c -+++ b/clients/cloud-setup/nmcs-provider.c -@@ -54,12 +54,23 @@ nmcs_provider_get_main_context(NMCSProvider *self) - static NMCSProviderGetConfigResult * - nmcs_provider_get_config_result_new(GHashTable *iface_datas) - { -- NMCSProviderGetConfigResult *result; -+ const NMCSProviderGetConfigIfaceData *iface_data; -+ NMCSProviderGetConfigResult * result; -+ GHashTableIter h_iter; -+ guint num_valid_ifaces = 0; -+ -+ g_hash_table_iter_init(&h_iter, iface_datas); -+ while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { -+ if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) -+ num_valid_ifaces++; -+ } - - result = g_new(NMCSProviderGetConfigResult, 1); - *result = (NMCSProviderGetConfigResult){ -- .iface_datas = g_hash_table_ref(iface_datas), -+ .iface_datas = g_hash_table_ref(iface_datas), -+ .num_valid_ifaces = num_valid_ifaces, - }; -+ - return result; - } - -diff --git a/clients/cloud-setup/nmcs-provider.h b/clients/cloud-setup/nmcs-provider.h -index 81aca966e4..6832aa7f07 100644 ---- a/clients/cloud-setup/nmcs-provider.h -+++ b/clients/cloud-setup/nmcs-provider.h -@@ -47,6 +47,9 @@ typedef struct { - /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). - * This is the per-interface result of get_config(). */ - GHashTable *iface_datas; -+ -+ /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ -+ guint num_valid_ifaces; - } NMCSProviderGetConfigResult; - - void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); --- -2.31.1 - - -From 33934ae9315ee36f0aa49edbe459786f2b179cf1 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 10:11:31 +0200 -Subject: [PATCH 05/15] cloud-setup: count numbers of valid IPv4 addresses in - get-config result - -Will be used next. - -(cherry picked from commit 7969ae1a82b90c3a9dbe33875d138c7b55cf6ac8) -(cherry picked from commit ae504433f11480fde2436d3a5acba026db6c47bd) -(cherry picked from commit ef7a97977a9a0327f084eec9dfa34750c6ee7959) ---- - clients/cloud-setup/nmcs-provider.c | 6 +++++- - clients/cloud-setup/nmcs-provider.h | 3 +++ - 2 files changed, 8 insertions(+), 1 deletion(-) - -diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c -index 795532d344..152b874a15 100644 ---- a/clients/cloud-setup/nmcs-provider.c -+++ b/clients/cloud-setup/nmcs-provider.c -@@ -58,17 +58,21 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) - NMCSProviderGetConfigResult * result; - GHashTableIter h_iter; - guint num_valid_ifaces = 0; -+ guint num_ipv4s = 0; - - g_hash_table_iter_init(&h_iter, iface_datas); - while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { -- if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) -+ if (nmcs_provider_get_config_iface_data_is_valid(iface_data)) { - num_valid_ifaces++; -+ num_ipv4s += iface_data->ipv4s_len; -+ } - } - - result = g_new(NMCSProviderGetConfigResult, 1); - *result = (NMCSProviderGetConfigResult){ - .iface_datas = g_hash_table_ref(iface_datas), - .num_valid_ifaces = num_valid_ifaces, -+ .num_ipv4s = num_ipv4s, - }; - - return result; -diff --git a/clients/cloud-setup/nmcs-provider.h b/clients/cloud-setup/nmcs-provider.h -index 6832aa7f07..9e6fb2cb87 100644 ---- a/clients/cloud-setup/nmcs-provider.h -+++ b/clients/cloud-setup/nmcs-provider.h -@@ -50,6 +50,9 @@ typedef struct { - - /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ - guint num_valid_ifaces; -+ -+ /* the number of IPv4 addresses over all valid iface_datas. */ -+ guint num_ipv4s; - } NMCSProviderGetConfigResult; - - void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); --- -2.31.1 - - -From d73f141231ab795559ae54470569515bea585be3 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 10:15:37 +0200 -Subject: [PATCH 06/15] cloud-setup: skip configuring policy routing if there - is only one interface/address - -nm-cloud-setup automatically configures the network. That may conflict -with what the user wants. In case the user configures some specific -setup, they are encouraged to disable nm-cloud-setup (and its -automatism). - -Still, what we do by default matters, and should play as well with -user's expectations. Configuring policy routing and a higher priority -table (30400+) that hijacks the traffic can cause problems. - -If the system only has one IPv4 address and one interface, then there -is no point in configuring policy routing at all. Detect that, and skip -the change in that case. - -Note that of course we need to handle the case where previously multiple -IP addresses were configured and an update gives only one address. In -that case we need to clear the previously configured rules/routes. The -patch achieves this. - -(cherry picked from commit 5f047968d7a48999d20001f83e2005caa43c80ce) -(cherry picked from commit 8bc8a0f56b97c28cf26fd678a549db41399adcb7) -(cherry picked from commit 2e4b73c7fe8168701c2561dc6563c027ac92f456) ---- - clients/cloud-setup/main.c | 35 ++++++++++++++++++++++++++++------- - 1 file changed, 28 insertions(+), 7 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 32d29ef4fa..3188418d7b 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -267,7 +267,9 @@ _nmc_skip_connection(NMConnection *connection) - static gboolean - _nmc_mangle_connection(NMDevice * device, - NMConnection * connection, -+ const NMCSProviderGetConfigResult * result, - const NMCSProviderGetConfigIfaceData *config_data, -+ gboolean * out_skipped_single_addr, - gboolean * out_changed) - { - NMSettingIPConfig *s_ip; -@@ -283,6 +285,9 @@ _nmc_mangle_connection(NMDevice * device, - gs_unref_ptrarray GPtrArray *rules_new = NULL; - gs_unref_ptrarray GPtrArray *routes_new = NULL; - -+ NM_SET_OUT(out_skipped_single_addr, FALSE); -+ NM_SET_OUT(out_changed, FALSE); -+ - if (!nm_streq0(nm_connection_get_connection_type(connection), NM_SETTING_WIRED_SETTING_NAME)) - return FALSE; - -@@ -363,6 +368,7 @@ _nmc_mangle_connection(NMDevice * device, - static gboolean - _config_one(GCancellable * sigterm_cancellable, - NMClient * nmc, -+ const NMCSProviderGetConfigResult * result, - const char * hwaddr, - const NMCSProviderGetConfigIfaceData *config_data) - { -@@ -371,6 +377,7 @@ _config_one(GCancellable * sigterm_cancellable, - guint64 applied_version_id; - gs_free_error GError *error = NULL; - gboolean changed; -+ gboolean skipped_single_addr; - gboolean version_id_changed; - guint try_count; - gboolean any_changes = FALSE; -@@ -419,16 +426,30 @@ try_again: - return any_changes; - } - -- if (!_nmc_mangle_connection(device, applied_connection, config_data, &changed)) { -+ if (!_nmc_mangle_connection(device, -+ applied_connection, -+ result, -+ config_data, -+ &skipped_single_addr, -+ &changed)) { - _LOGD("config device %s: device has no suitable applied connection. Skip", hwaddr); - return any_changes; - } - - if (!changed) { -- _LOGD("config device %s: device needs no update to applied connection \"%s\" (%s). Skip", -- hwaddr, -- nm_connection_get_id(applied_connection), -- nm_connection_get_uuid(applied_connection)); -+ if (skipped_single_addr) { -+ _LOGD("config device %s: device needs no update to applied connection \"%s\" (%s) " -+ "because there are not multiple IP addresses. Skip", -+ hwaddr, -+ nm_connection_get_id(applied_connection), -+ nm_connection_get_uuid(applied_connection)); -+ } else { -+ _LOGD( -+ "config device %s: device needs no update to applied connection \"%s\" (%s). Skip", -+ hwaddr, -+ nm_connection_get_id(applied_connection), -+ nm_connection_get_uuid(applied_connection)); -+ } - return any_changes; - } - -@@ -437,7 +458,7 @@ try_again: - nm_connection_get_id(applied_connection), - nm_connection_get_uuid(applied_connection)); - -- /* we are about to call Reapply(). If if that fails, it counts as if we changed something. */ -+ /* we are about to call Reapply(). Even if that fails, it counts as if we changed something. */ - any_changes = TRUE; - - if (!nmcs_device_reapply(device, -@@ -484,7 +505,7 @@ _config_all(GCancellable * sigterm_cancellable, - - g_hash_table_iter_init(&h_iter, result->iface_datas); - while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { -- if (_config_one(sigterm_cancellable, nmc, c_hwaddr, c_config_data)) -+ if (_config_one(sigterm_cancellable, nmc, result, c_hwaddr, c_config_data)) - any_changes = TRUE; - } - --- -2.31.1 - - -From 028dc267c53e9e92fcd8eebe01ed0dfd0a4c63d3 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 13:46:47 +0200 -Subject: [PATCH 07/15] cloud-setup: use _nm_utils_ascii_str_to_int64_bin() in - Azure's _get_config_fetch_done_cb() - -(cherry picked from commit a2fded3cee0f6d4da86962bfc671f03bfe4c5da4) -(cherry picked from commit 91ddd5f5bacf75f8819fbb014ff4bfd47c0c1ae3) ---- - clients/cloud-setup/nmcs-provider-azure.c | 10 ++-------- - 1 file changed, 2 insertions(+), 8 deletions(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index 0a5d522cc3..cedaad6b77 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -154,14 +154,9 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - iface_get_config->has_ipv4s = TRUE; - iface_get_config->ipv4s_len++; - } else { -- int tmp_prefix = -1; -- -- if (fip_len > 0 && memchr(fip_str, '\0', fip_len - 1)) { -- /* we have an embedded "\0" inside the string (except trailing). That is not -- * allowed*/ -- } else -- tmp_prefix = _nm_utils_ascii_str_to_int64(fip_str, 10, 0, 32, -1); -+ int tmp_prefix; - -+ tmp_prefix = _nm_utils_ascii_str_to_int64_bin(fip_str, fip_len, 10, 0, 32, -1); - if (tmp_prefix == -1) { - _LOGD("interface[%" G_GSSIZE_FORMAT "]: invalid prefix", iface_data->intern_iface_idx); - error = -@@ -244,7 +239,6 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - ((char *) line)[--line_len] = '\0'; - - ips_prefix_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXINT64, -1); -- - if (ips_prefix_idx < 0) - continue; - --- -2.31.1 - - -From e4a643006a68d88f98e940508eb2a84ed4eed9a2 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 13:49:04 +0200 -Subject: [PATCH 08/15] cloud-setup/trivial: rename variables in Azure's - _get_config_fetch_done_cb() - -The previous name seem not very expressive/fitting. Naming is hard, but -I think these are better names. - -(cherry picked from commit 89f326785910ca7a4e6994b9d4052f8ab43fc63e) -(cherry picked from commit 8bad924931176c487776ab16c0768c54a6ab2002) ---- - clients/cloud-setup/nmcs-provider-azure.c | 26 +++++++++++------------ - 1 file changed, 13 insertions(+), 13 deletions(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index cedaad6b77..33d94db94e 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -98,7 +98,7 @@ typedef struct { - NMCSProviderGetConfigIfaceData *iface_get_config; - gssize intern_iface_idx; - gssize extern_iface_idx; -- guint n_ips_prefix_pending; -+ guint n_iface_data_pending; - const char * hwaddr; - } AzureIfaceData; - -@@ -118,8 +118,8 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - NMCSProviderGetConfigIfaceData *iface_get_config; - gs_unref_bytes GBytes *response = NULL; - gs_free_error GError *error = NULL; -- const char * fip_str = NULL; -- gsize fip_len; -+ const char * resp_str = NULL; -+ gsize resp_len; - - nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); - -@@ -131,8 +131,8 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - if (error) - goto out_done; - -- fip_str = g_bytes_get_data(response, &fip_len); -- nm_assert(fip_str[fip_len] == '\0'); -+ resp_str = g_bytes_get_data(response, &resp_len); -+ nm_assert(resp_str[resp_len] == '\0'); - - iface_data->iface_get_config = - g_hash_table_lookup(get_config_data->result_dict, iface_data->hwaddr); -@@ -142,7 +142,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - char tmp_addr_str[NM_UTILS_INET_ADDRSTRLEN]; - in_addr_t tmp_addr; - -- if (!nmcs_utils_ipaddr_normalize_bin(AF_INET, fip_str, fip_len, NULL, &tmp_addr)) { -+ if (!nmcs_utils_ipaddr_normalize_bin(AF_INET, resp_str, resp_len, NULL, &tmp_addr)) { - error = - nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "ip is not a valid private ip address"); - goto out_done; -@@ -156,7 +156,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - } else { - int tmp_prefix; - -- tmp_prefix = _nm_utils_ascii_str_to_int64_bin(fip_str, fip_len, 10, 0, 32, -1); -+ tmp_prefix = _nm_utils_ascii_str_to_int64_bin(resp_str, resp_len, 10, 0, 32, -1); - if (tmp_prefix == -1) { - _LOGD("interface[%" G_GSSIZE_FORMAT "]: invalid prefix", iface_data->intern_iface_idx); - error = -@@ -173,8 +173,8 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - - out_done: - if (!error) { -- --iface_data->n_ips_prefix_pending; -- if (iface_data->n_ips_prefix_pending > 0) -+ --iface_data->n_iface_data_pending; -+ if (iface_data->n_iface_data_pending > 0) - return; - } - -@@ -246,7 +246,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - gs_free const char *uri = NULL; - char buf[100]; - -- iface_data->n_ips_prefix_pending++; -+ iface_data->n_iface_data_pending++; - - nm_http_client_poll_get( - NM_HTTP_CLIENT(source), -@@ -269,13 +269,13 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - } - - iface_data->iface_get_config->ipv4s_len = 0; -- iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_ips_prefix_pending); -+ iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_iface_data_pending); - - { - gs_free const char *uri = NULL; - char buf[30]; - -- iface_data->n_ips_prefix_pending++; -+ iface_data->n_iface_data_pending++; - nm_http_client_poll_get( - NM_HTTP_CLIENT(source), - (uri = _azure_uri_interfaces( -@@ -439,7 +439,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat - .iface_get_config = NULL, - .intern_iface_idx = intern_iface_idx, - .extern_iface_idx = extern_iface_idx_cnt++, -- .n_ips_prefix_pending = 0, -+ .n_iface_data_pending = 0, - .hwaddr = NULL, - }; - g_ptr_array_add(ifaces_arr, iface_data); --- -2.31.1 - - -From b3203a8ede6c828326859784971a0e8d9cb8b8cf Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 14:34:51 +0200 -Subject: [PATCH 09/15] cloud-setup: add "hwaddr" to - NMCSProviderGetConfigIfaceData struct - -get-config() gives a NMCSProviderGetConfigResult structure, and the -main part of data is the GHashTable of MAC addresses and -NMCSProviderGetConfigIfaceData instances. - -Let NMCSProviderGetConfigIfaceData also have a reference to the MAC -address. This way, I'll be able to create a (sorted) list of interface -datas, that also contain the MAC address. - -(cherry picked from commit ec56fe60fbf31768d0d1cae8bb325c1fdf7dbf07) -(cherry picked from commit cc289e53699872a3617aef321453ef6a885d0148) -(cherry picked from commit c36e42dbd9c0be96146888d610ad187fa57802e2) ---- - clients/cloud-setup/nmcs-provider-azure.c | 35 ++++++++++++++--------- - clients/cloud-setup/nmcs-provider-ec2.c | 27 +++++++---------- - clients/cloud-setup/nmcs-provider-gcp.c | 20 ++++++------- - clients/cloud-setup/nmcs-provider.c | 22 +++++++++----- - clients/cloud-setup/nmcs-provider.h | 12 ++++++-- - 5 files changed, 66 insertions(+), 50 deletions(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index 33d94db94e..3b923e4ce5 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -99,7 +99,6 @@ typedef struct { - gssize intern_iface_idx; - gssize extern_iface_idx; - guint n_iface_data_pending; -- const char * hwaddr; - } AzureIfaceData; - - static void -@@ -118,6 +117,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - NMCSProviderGetConfigIfaceData *iface_get_config; - gs_unref_bytes GBytes *response = NULL; - gs_free_error GError *error = NULL; -+ gs_free char * v_hwaddr = NULL; - const char * resp_str = NULL; - gsize resp_len; - -@@ -134,8 +134,17 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - resp_str = g_bytes_get_data(response, &resp_len); - nm_assert(resp_str[resp_len] == '\0'); - -- iface_data->iface_get_config = -- g_hash_table_lookup(get_config_data->result_dict, iface_data->hwaddr); -+ v_hwaddr = nmcs_utils_hwaddr_normalize_gbytes(response); -+ if (!v_hwaddr) { -+ _LOGI("interface[%" G_GSSIZE_FORMAT "]: invalid MAC address returned", -+ iface_data->intern_iface_idx); -+ error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, -+ "invalid MAC address for index %" G_GSSIZE_FORMAT, -+ iface_data->intern_iface_idx); -+ goto out_done; -+ } -+ -+ iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); - iface_get_config = iface_data->iface_get_config; - - if (is_ipv4) { -@@ -330,25 +339,24 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) - goto out_done; - } - -- if (!g_hash_table_lookup_extended(get_config_data->result_dict, -- v_hwaddr, -- (gpointer *) &iface_data->hwaddr, -- (gpointer *) &iface_data->iface_get_config)) { -+ iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); -+ -+ if (!iface_data->iface_get_config) { - if (!get_config_data->any) { - _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", - v_hwaddr, - iface_data->intern_iface_idx); - goto out_done; - } -- iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); -- g_hash_table_insert(get_config_data->result_dict, -- (char *) (iface_data->hwaddr = g_steal_pointer(&v_hwaddr)), -- iface_data->iface_get_config); -+ iface_data->iface_get_config = -+ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, -+ FALSE, -+ v_hwaddr); - } else { - if (iface_data->iface_get_config->iface_idx >= 0) { - _LOGI("interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", - iface_data->intern_iface_idx, -- iface_data->hwaddr); -+ iface_data->iface_get_config->hwaddr); - error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, - "duplicate MAC address for index %" G_GSSIZE_FORMAT, - iface_data->intern_iface_idx); -@@ -360,7 +368,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) - - _LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s", - iface_data->intern_iface_idx, -- iface_data->hwaddr); -+ iface_data->iface_get_config->hwaddr); - - nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->intern_iface_idx); - -@@ -440,7 +448,6 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat - .intern_iface_idx = intern_iface_idx, - .extern_iface_idx = extern_iface_idx_cnt++, - .n_iface_data_pending = 0, -- .hwaddr = NULL, - }; - g_ptr_array_add(ifaces_arr, iface_data); - } -diff --git a/clients/cloud-setup/nmcs-provider-ec2.c b/clients/cloud-setup/nmcs-provider-ec2.c -index 1e060034f5..ac449271fb 100644 ---- a/clients/cloud-setup/nmcs-provider-ec2.c -+++ b/clients/cloud-setup/nmcs-provider-ec2.c -@@ -136,14 +136,13 @@ _get_config_fetch_done_cb(NMHttpClient *http_client, - gboolean is_local_ipv4) - { - NMCSProviderGetConfigTaskData *get_config_data; -- const char * hwaddr = NULL; - gs_unref_bytes GBytes *response = NULL; - gs_free_error GError * error = NULL; - NMCSProviderGetConfigIfaceData *config_iface_data; - in_addr_t tmp_addr; - int tmp_prefix; - -- nm_utils_user_data_unpack(user_data, &get_config_data, &hwaddr); -+ nm_utils_user_data_unpack(user_data, &get_config_data, &config_iface_data); - - nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); - -@@ -153,8 +152,6 @@ _get_config_fetch_done_cb(NMHttpClient *http_client, - if (error) - goto out; - -- config_iface_data = g_hash_table_lookup(get_config_data->result_dict, hwaddr); -- - if (is_local_ipv4) { - gs_free const char **s_addrs = NULL; - gsize i, len; -@@ -250,22 +247,20 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us - NMCSProviderGetConfigIfaceData *config_iface_data; - gs_free char * uri1 = NULL; - gs_free char * uri2 = NULL; -- const char * hwaddr; - -- if (!g_hash_table_lookup_extended(get_config_data->result_dict, -- v_hwaddr, -- (gpointer *) &hwaddr, -- (gpointer *) &config_iface_data)) { -+ config_iface_data = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); -+ -+ if (!config_iface_data) { - if (!get_config_data->any) { - _LOGD("get-config: skip fetching meta data for %s (%s)", - v_hwaddr, - v_mac_data->path); - continue; - } -- config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE); -- g_hash_table_insert(get_config_data->result_dict, -- (char *) (hwaddr = g_strdup(v_hwaddr)), -- config_iface_data); -+ config_iface_data = -+ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, -+ FALSE, -+ v_hwaddr); - } - - nm_assert(config_iface_data->iface_idx == -1); -@@ -274,7 +269,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us - - _LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)", - config_iface_data->iface_idx, -- hwaddr, -+ config_iface_data->hwaddr, - v_mac_data->path); - - get_config_data->n_pending++; -@@ -292,7 +287,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us - NULL, - NULL, - _get_config_fetch_done_cb_subnet_ipv4_cidr_block, -- nm_utils_user_data_pack(get_config_data, hwaddr)); -+ nm_utils_user_data_pack(get_config_data, config_iface_data)); - - get_config_data->n_pending++; - nm_http_client_poll_get( -@@ -309,7 +304,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us - NULL, - NULL, - _get_config_fetch_done_cb_local_ipv4s, -- nm_utils_user_data_pack(get_config_data, hwaddr)); -+ nm_utils_user_data_pack(get_config_data, config_iface_data)); - } - - _nmcs_provider_get_config_task_maybe_return(get_config_data, NULL); -diff --git a/clients/cloud-setup/nmcs-provider-gcp.c b/clients/cloud-setup/nmcs-provider-gcp.c -index 1deaea10f3..2389c9ee18 100644 ---- a/clients/cloud-setup/nmcs-provider-gcp.c -+++ b/clients/cloud-setup/nmcs-provider-gcp.c -@@ -247,7 +247,6 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) - GCPIfaceData * iface_data = user_data; - gs_free_error GError * error = NULL; - gs_free char * v_hwaddr = NULL; -- const char * hwaddr = NULL; - gs_free const char * uri = NULL; - char sbuf[100]; - NMCSProviderGetConfigTaskData *get_config_data; -@@ -273,26 +272,25 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) - goto out_done; - } - -- if (!g_hash_table_lookup_extended(get_config_data->result_dict, -- v_hwaddr, -- (gpointer *) &hwaddr, -- (gpointer *) &iface_data->iface_get_config)) { -+ iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); -+ -+ if (!iface_data->iface_get_config) { - if (!get_config_data->any) { - _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", - v_hwaddr, - iface_data->intern_iface_idx); - goto out_done; - } -- iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); -- g_hash_table_insert(get_config_data->result_dict, -- (char *) (hwaddr = g_steal_pointer(&v_hwaddr)), -- iface_data->iface_get_config); -+ iface_data->iface_get_config = -+ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, -+ FALSE, -+ v_hwaddr); - is_requested = FALSE; - } else { - if (iface_data->iface_get_config->iface_idx >= 0) { - _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", - iface_data->intern_iface_idx, -- hwaddr); -+ iface_data->iface_get_config->hwaddr); - error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, - "duplicate MAC address for index %" G_GSSIZE_FORMAT, - iface_data->intern_iface_idx); -@@ -306,7 +304,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) - _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a %sdevice with hwaddr %s", - iface_data->intern_iface_idx, - is_requested ? "requested " : "", -- hwaddr); -+ iface_data->iface_get_config->hwaddr); - - nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->intern_iface_idx); - -diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c -index 152b874a15..1ac5cd42bb 100644 ---- a/clients/cloud-setup/nmcs-provider.c -+++ b/clients/cloud-setup/nmcs-provider.c -@@ -127,15 +127,25 @@ nmcs_provider_detect_finish(NMCSProvider *self, GAsyncResult *result, GError **e - /*****************************************************************************/ - - NMCSProviderGetConfigIfaceData * --nmcs_provider_get_config_iface_data_new(gboolean was_requested) -+nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas, -+ gboolean was_requested, -+ const char *hwaddr) - { - NMCSProviderGetConfigIfaceData *iface_data; - -+ nm_assert(hwaddr); -+ - iface_data = g_slice_new(NMCSProviderGetConfigIfaceData); - *iface_data = (NMCSProviderGetConfigIfaceData){ -+ .hwaddr = g_strdup(hwaddr), - .iface_idx = -1, - .was_requested = was_requested, - }; -+ -+ /* the has does not own the key (iface_datta->hwaddr), the lifetime of the -+ * key is associated with the iface_data instance. */ -+ g_hash_table_replace(iface_datas, (char *) iface_data->hwaddr, iface_data); -+ - return iface_data; - } - -@@ -146,6 +156,7 @@ _iface_data_free(gpointer data) - - g_free(iface_data->ipv4s_arr); - g_free(iface_data->iproutes_arr); -+ g_free((char *) iface_data->hwaddr); - - nm_g_slice_free(iface_data); - } -@@ -224,16 +235,13 @@ nmcs_provider_get_config(NMCSProvider * self, - *get_config_data = (NMCSProviderGetConfigTaskData){ - .task = nm_g_task_new(self, cancellable, nmcs_provider_get_config, callback, user_data), - .any = any, -- .result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, _iface_data_free), -+ .result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, NULL, _iface_data_free), - }; - - nmcs_wait_for_objects_register(get_config_data->task); - -- for (; hwaddrs && hwaddrs[0]; hwaddrs++) { -- g_hash_table_insert(get_config_data->result_dict, -- g_strdup(hwaddrs[0]), -- nmcs_provider_get_config_iface_data_new(TRUE)); -- } -+ for (; hwaddrs && hwaddrs[0]; hwaddrs++) -+ nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, TRUE, hwaddrs[0]); - - if (cancellable) { - gulong cancelled_id; -diff --git a/clients/cloud-setup/nmcs-provider.h b/clients/cloud-setup/nmcs-provider.h -index 9e6fb2cb87..19bf56bd05 100644 ---- a/clients/cloud-setup/nmcs-provider.h -+++ b/clients/cloud-setup/nmcs-provider.h -@@ -10,6 +10,10 @@ - /*****************************************************************************/ - - typedef struct { -+ /* And it's exactly the same pointer that is also the key for the iface_datas -+ * dictionary. */ -+ const char *hwaddr; -+ - in_addr_t *ipv4s_arr; - gsize ipv4s_len; - -@@ -39,13 +43,17 @@ nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceDat - && ((config_data->has_ipv4s && config_data->has_cidr) || config_data->iproutes_len); - } - --NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested); -+NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas, -+ gboolean was_requested, -+ const char *hwaddr); - - /*****************************************************************************/ - - typedef struct { - /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). -- * This is the per-interface result of get_config(). */ -+ * This is the per-interface result of get_config(). -+ * -+ * The key is the same pointer as NMCSProviderGetConfigIfaceData's hwaddr. */ - GHashTable *iface_datas; - - /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ --- -2.31.1 - - -From cf729a3a821415913b8f40306dd31d6d76cd4a60 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 16:59:19 +0200 -Subject: [PATCH 10/15] cloud-setup: track sorted list of - NMCSProviderGetConfigIfaceData - -Sorted by iface_idx. The iface_idx is probably something useful and -stable, provided by the provider. E.g. it's the order in which -interfaces are exposed on the meta data. - -(cherry picked from commit 1c5cb9d3c2be5addd3b011873cfc6b99204955d1) -(cherry picked from commit 0a2ed627038349d838add8f3fd72e2d282e74693) -(cherry picked from commit 48e79fb4b29f297d29502e75a8956ffe65fe51db) ---- - clients/cloud-setup/nmcs-provider.c | 49 ++++++++++++++++++++++++++++- - clients/cloud-setup/nmcs-provider.h | 8 +++++ - 2 files changed, 56 insertions(+), 1 deletion(-) - -diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c -index 1ac5cd42bb..8dd5cc1997 100644 ---- a/clients/cloud-setup/nmcs-provider.c -+++ b/clients/cloud-setup/nmcs-provider.c -@@ -51,6 +51,19 @@ nmcs_provider_get_main_context(NMCSProvider *self) - } - /*****************************************************************************/ - -+static int -+_result_new_sort_iface_data(gconstpointer pa, gconstpointer pb) -+{ -+ const NMCSProviderGetConfigIfaceData *a = *((const NMCSProviderGetConfigIfaceData *const *) pa); -+ const NMCSProviderGetConfigIfaceData *b = *((const NMCSProviderGetConfigIfaceData *const *) pb); -+ -+ /* negative iface_idx are sorted to the end. */ -+ NM_CMP_DIRECT((a->iface_idx < 0), (b->iface_idx < 0)); -+ -+ NM_CMP_FIELD(a, b, iface_idx); -+ return 0; -+} -+ - static NMCSProviderGetConfigResult * - nmcs_provider_get_config_result_new(GHashTable *iface_datas) - { -@@ -59,6 +72,12 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) - GHashTableIter h_iter; - guint num_valid_ifaces = 0; - guint num_ipv4s = 0; -+ GPtrArray * ptrarr; -+ guint n_iface_datas; -+ -+ n_iface_datas = g_hash_table_size(iface_datas); -+ -+ ptrarr = g_ptr_array_sized_new(n_iface_datas + 1u); - - g_hash_table_iter_init(&h_iter, iface_datas); - while (g_hash_table_iter_next(&h_iter, NULL, (gpointer *) &iface_data)) { -@@ -66,15 +85,42 @@ nmcs_provider_get_config_result_new(GHashTable *iface_datas) - num_valid_ifaces++; - num_ipv4s += iface_data->ipv4s_len; - } -+ g_ptr_array_add(ptrarr, (gpointer) iface_data); - } - -+ g_ptr_array_sort(ptrarr, _result_new_sort_iface_data); -+ -+ nm_assert(n_iface_datas == ptrarr->len); -+ -+ g_ptr_array_add(ptrarr, NULL); -+ - result = g_new(NMCSProviderGetConfigResult, 1); - *result = (NMCSProviderGetConfigResult){ -- .iface_datas = g_hash_table_ref(iface_datas), -+ .iface_datas = g_hash_table_ref(iface_datas), -+ .n_iface_datas = n_iface_datas, -+ .iface_datas_arr = -+ (const NMCSProviderGetConfigIfaceData **) g_ptr_array_free(ptrarr, FALSE), - .num_valid_ifaces = num_valid_ifaces, - .num_ipv4s = num_ipv4s, - }; - -+#if NM_MORE_ASSERTS > 5 -+ { -+ gsize iface_idx_expected = 0; -+ guint i; -+ -+ for (i = 0; i < result->n_iface_datas; i++) { -+ if (result->iface_datas_arr[i]->iface_idx < 0) { -+ nm_assert(result->iface_datas_arr[i]->iface_idx == -1); -+ iface_idx_expected = -1; -+ continue; -+ } -+ nm_assert(result->iface_datas_arr[i]->iface_idx == iface_idx_expected); -+ iface_idx_expected++; -+ } -+ } -+#endif -+ - return result; - } - -@@ -83,6 +129,7 @@ nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result) - { - if (result) { - nm_g_hash_table_unref(result->iface_datas); -+ g_free((gpointer) result->iface_datas_arr); - g_free(result); - } - } -diff --git a/clients/cloud-setup/nmcs-provider.h b/clients/cloud-setup/nmcs-provider.h -index 19bf56bd05..261f589f2f 100644 ---- a/clients/cloud-setup/nmcs-provider.h -+++ b/clients/cloud-setup/nmcs-provider.h -@@ -61,6 +61,14 @@ typedef struct { - - /* the number of IPv4 addresses over all valid iface_datas. */ - guint num_ipv4s; -+ -+ guint n_iface_datas; -+ -+ /* The sorted value of @iface_datas, sorted by iface_idx. -+ * -+ * Not found entries (iface_idx == -1) are sorted at the end. */ -+ const NMCSProviderGetConfigIfaceData *const *iface_datas_arr; -+ - } NMCSProviderGetConfigResult; - - void nmcs_provider_get_config_result_free(NMCSProviderGetConfigResult *result); --- -2.31.1 - - -From 8ab1777edacf722c4ffa80e4d4380771cce99e5b Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 17:23:09 +0200 -Subject: [PATCH 11/15] cloud-setup: process iface-datas in sorted order - -The routes/rules that are configured are independent of the -order in which we process the devices. That is, because they -use the "iface_idx" for cases where there is ambiguity. - -Still, it feels nicer to always process them in a defined order. - -(cherry picked from commit a95ea0eb294d646f17b5e1cf4f17cb1540f8af3a) -(cherry picked from commit 6302cd416d92a8c2f5b4a6be9dded71af4cf7ced) -(cherry picked from commit 67a83b54cd58e44ef50e5e3a7c6a9463995235dd) ---- - clients/cloud-setup/main.c | 28 +++++++++++++--------------- - 1 file changed, 13 insertions(+), 15 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 3188418d7b..3485034198 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -366,14 +366,15 @@ _nmc_mangle_connection(NMDevice * device, - /*****************************************************************************/ - - static gboolean --_config_one(GCancellable * sigterm_cancellable, -- NMClient * nmc, -- const NMCSProviderGetConfigResult * result, -- const char * hwaddr, -- const NMCSProviderGetConfigIfaceData *config_data) -+_config_one(GCancellable * sigterm_cancellable, -+ NMClient * nmc, -+ const NMCSProviderGetConfigResult *result, -+ guint idx) - { -- gs_unref_object NMDevice *device = NULL; -- gs_unref_object NMConnection *applied_connection = NULL; -+ const NMCSProviderGetConfigIfaceData *config_data = result->iface_datas_arr[idx]; -+ const char * hwaddr = config_data->hwaddr; -+ gs_unref_object NMDevice *device = NULL; -+ gs_unref_object NMConnection *applied_connection = NULL; - guint64 applied_version_id; - gs_free_error GError *error = NULL; - gboolean changed; -@@ -498,14 +499,11 @@ _config_all(GCancellable * sigterm_cancellable, - NMClient * nmc, - const NMCSProviderGetConfigResult *result) - { -- GHashTableIter h_iter; -- const NMCSProviderGetConfigIfaceData *c_config_data; -- const char * c_hwaddr; -- gboolean any_changes = FALSE; -- -- g_hash_table_iter_init(&h_iter, result->iface_datas); -- while (g_hash_table_iter_next(&h_iter, (gpointer *) &c_hwaddr, (gpointer *) &c_config_data)) { -- if (_config_one(sigterm_cancellable, nmc, result, c_hwaddr, c_config_data)) -+ gboolean any_changes = FALSE; -+ guint i; -+ -+ for (i = 0; i < result->n_iface_datas; i++) { -+ if (_config_one(sigterm_cancellable, nmc, result, i)) - any_changes = TRUE; - } - --- -2.31.1 - - -From 7aea4169bcf8b4f27eea7283d84a328cd5ea3cea Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 19:23:46 +0200 -Subject: [PATCH 12/15] cloud-setup: limit number of supported interfaces to - avoid overlapping table numbers - -The table number is chosen as 30400 + iface_idx. That is, the range is -limited and we shouldn't handle more than 100 devices. Add a check for -that and error out. - -(cherry picked from commit b68d694b78fd9b4b63b0592a2518f387aaa35f87) -(cherry picked from commit 292233e16ed1f60499c2676611d59c271352e2c3) -(cherry picked from commit 661da869b3419c0761296caaf12002e2eba25f48) ---- - clients/cloud-setup/main.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 3485034198..5f27275c90 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -399,6 +399,14 @@ _config_one(GCancellable * sigterm_cancellable, - return FALSE; - } - -+ if (config_data->iface_idx >= 100) { -+ /* since we use the iface_idx to select a table number, the range is limited from -+ * 0 to 99. Note that the providers are required to provide increasing numbers, -+ * so this means we bail out after the first 100 devices. */ -+ _LOGD("config device %s: skip because number of supported interfaces reached", hwaddr); -+ return FALSE; -+ } -+ - _LOGD("config device %s: configuring \"%s\" (%s)...", - hwaddr, - nm_device_get_iface(device) ?: "/unknown/", --- -2.31.1 - - -From defaccdd3924c12fe61ce1fb90007f1fa3c67f14 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Mon, 6 Sep 2021 10:35:36 +0200 -Subject: [PATCH 13/15] cloud-setup: cleanup configuring addresses/routes/rules - in _nmc_mangle_connection() - -(cherry picked from commit 0978be5e43f142ec5c6062dcfe1c2f4aa834464b) -(cherry picked from commit ce24b4bca5d3fbad65d4065325cfa80ac05fbfdb) -(cherry picked from commit b33eac5281935a6a07aa66938a9130cfd0b84180) ---- - clients/cloud-setup/main.c | 49 ++++++++++++++++---------------------- - 1 file changed, 20 insertions(+), 29 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 5f27275c90..8b0f3ecc8f 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -274,10 +274,6 @@ _nmc_mangle_connection(NMDevice * device, - { - NMSettingIPConfig *s_ip; - gsize i; -- in_addr_t gateway; -- gint64 rt_metric; -- guint32 rt_table; -- NMIPRoute * route_entry; - gboolean addrs_changed = FALSE; - gboolean rules_changed = FALSE; - gboolean routes_changed = FALSE; -@@ -302,45 +298,40 @@ _nmc_mangle_connection(NMDevice * device, - (GDestroyNotify) nm_ip_route_unref); - - if (config_data->has_ipv4s && config_data->has_cidr) { -+ NMIPAddress * addr_entry; -+ NMIPRoute * route_entry; -+ NMIPRoutingRule *rule_entry; -+ in_addr_t gateway; -+ char sbuf[NM_UTILS_INET_ADDRSTRLEN]; -+ - for (i = 0; i < config_data->ipv4s_len; i++) { -- NMIPAddress *entry; -- -- entry = nm_ip_address_new_binary(AF_INET, -- &config_data->ipv4s_arr[i], -- config_data->cidr_prefix, -- NULL); -- if (entry) -- g_ptr_array_add(addrs_new, entry); -+ addr_entry = nm_ip_address_new_binary(AF_INET, -+ &config_data->ipv4s_arr[i], -+ config_data->cidr_prefix, -+ NULL); -+ nm_assert(addr_entry); -+ g_ptr_array_add(addrs_new, addr_entry); - } - - gateway = nm_utils_ip4_address_clear_host_address(config_data->cidr_addr, - config_data->cidr_prefix); - ((guint8 *) &gateway)[3] += 1; - -- rt_metric = 10; -- rt_table = 30400 + config_data->iface_idx; -- -- route_entry = -- nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, rt_metric, NULL); -+ route_entry = nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, 10, NULL); - nm_ip_route_set_attribute(route_entry, - NM_IP_ROUTE_ATTRIBUTE_TABLE, -- g_variant_new_uint32(rt_table)); -+ g_variant_new_uint32(30400 + config_data->iface_idx)); - g_ptr_array_add(routes_new, route_entry); - - for (i = 0; i < config_data->ipv4s_len; i++) { -- NMIPRoutingRule *entry; -- char sbuf[NM_UTILS_INET_ADDRSTRLEN]; -- -- entry = nm_ip_routing_rule_new(AF_INET); -- nm_ip_routing_rule_set_priority(entry, rt_table); -- nm_ip_routing_rule_set_from(entry, -+ rule_entry = nm_ip_routing_rule_new(AF_INET); -+ nm_ip_routing_rule_set_priority(rule_entry, 30400 + config_data->iface_idx); -+ nm_ip_routing_rule_set_from(rule_entry, - _nm_utils_inet4_ntop(config_data->ipv4s_arr[i], sbuf), - 32); -- nm_ip_routing_rule_set_table(entry, rt_table); -- -- nm_assert(nm_ip_routing_rule_validate(entry, NULL)); -- -- g_ptr_array_add(rules_new, entry); -+ nm_ip_routing_rule_set_table(rule_entry, 30400 + config_data->iface_idx); -+ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); -+ g_ptr_array_add(rules_new, rule_entry); - } - } - --- -2.31.1 - - -From 5cbf31d758e9cd322420143383a9c31386e98ded Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 1 Sep 2021 10:31:55 +0200 -Subject: [PATCH 14/15] cloud-setup: use suppress_prefixlength rule to honor - non-default-routes in the main table - -Background -========== - -Imagine you run a container on your machine. Then the routing table -might look like: - - default via 10.0.10.1 dev eth0 proto dhcp metric 100 - 10.0.10.0/28 dev eth0 proto kernel scope link src 10.0.10.5 metric 100 - [...] - 10.42.0.0/24 via 10.42.0.0 dev flannel.1 onlink - 10.42.1.2 dev cali02ad7e68ce1 scope link - 10.42.1.3 dev cali8fcecf5aaff scope link - 10.42.2.0/24 via 10.42.2.0 dev flannel.1 onlink - 10.42.3.0/24 via 10.42.3.0 dev flannel.1 onlink - -That is, there are another interfaces with subnets and specific routes. - -If nm-cloud-setup now configures rules: - - 0: from all lookup local - 30400: from 10.0.10.5 lookup 30400 - 32766: from all lookup main - 32767: from all lookup default - -and - - default via 10.0.10.1 dev eth0 table 30400 proto static metric 10 - 10.0.10.1 dev eth0 table 30400 proto static scope link metric 10 - -then these other subnets will also be reached via the default route. - -This container example is just one case where this is a problem. In -general, if you have specific routes on another interface, then the -default route in the 30400+ table will interfere badly. - -The idea of nm-cloud-setup is to automatically configure the network for -secondary IP addresses. When the user has special requirements, then -they should disable nm-cloud-setup and configure whatever they want. -But the container use case is popular and important. It is not something -where the user actively configures the network. This case needs to work better, -out of the box. In general, nm-cloud-setup should work better with the -existing network configuration. - -Change -====== - -Add new routing tables 30200+ with the individual subnets of the -interface: - - 10.0.10.0/24 dev eth0 table 30200 proto static metric 10 - [...] - default via 10.0.10.1 dev eth0 table 30400 proto static metric 10 - 10.0.10.1 dev eth0 table 30400 proto static scope link metric 10 - -Also add more important routing rules with priority 30200+, which select -these tables based on the source address: - - 30200: from 10.0.10.5 lookup 30200 - -These will do source based routing for the subnets on these -interfaces. - -Then, add a rule with priority 30350 - - 30350: lookup main suppress_prefixlength 0 - -which processes the routes from the main table, but ignores the default -routes. 30350 was chosen, because it's in between the rules 30200+ and -30400+, leaving a range for the user to configure their own rules. - -Then, as before, the rules 30400+ again look at the corresponding 30400+ -table, to find a default route. - -Finally, process the main table again, this time honoring the default -route. That is for packets that have a different source address. - -This change means that the source based routing is used for the -subnets that are configured on the interface and for the default route. -Whereas, if there are any more specific routes in the main table, they will -be preferred over the default route. - -Apparently Amazon Linux solves this differently, by not configuring a -routing table for addresses on interface "eth0". That might be an -alternative, but it's not clear to me what is special about eth0 to -warrant this treatment. It also would imply that we somehow recognize -this primary interface. In practise that would be doable by selecting -the interface with "iface_idx" zero. - -Instead choose this approach. This is remotely similar to what WireGuard does -for configuring the default route ([1]), however WireGuard uses fwmark to match -the packets instead of the source address. - -[1] https://www.wireguard.com/netns/#improved-rule-based-routing - -(cherry picked from commit fe80b2d1ecd94639573a944633a5d960db316f60) -(cherry picked from commit 58e58361bd1666e5af822a4bc970bebb8a44bd6e) -(cherry picked from commit 6fef8c7235235011d83681e89e8fa02dc89ffb2c) ---- - clients/cloud-setup/main.c | 36 ++++++++++++++++++++++++++++++++++++ - man/nm-cloud-setup.xml | 30 ++++++++++++++++++------------ - 2 files changed, 54 insertions(+), 12 deletions(-) - -diff --git a/clients/cloud-setup/main.c b/clients/cloud-setup/main.c -index 8b0f3ecc8f..aac7bdbf98 100644 ---- a/clients/cloud-setup/main.c -+++ b/clients/cloud-setup/main.c -@@ -4,6 +4,8 @@ - - #include "nm-libnm-aux/nm-libnm-aux.h" - -+#include -+ - #include "nm-cloud-setup-utils.h" - #include "nmcs-provider-ec2.h" - #include "nmcs-provider-gcp.h" -@@ -298,6 +300,8 @@ _nmc_mangle_connection(NMDevice * device, - (GDestroyNotify) nm_ip_route_unref); - - if (config_data->has_ipv4s && config_data->has_cidr) { -+ gs_unref_hashtable GHashTable *unique_subnets = -+ g_hash_table_new(nm_direct_hash, g_direct_equal); - NMIPAddress * addr_entry; - NMIPRoute * route_entry; - NMIPRoutingRule *rule_entry; -@@ -317,6 +321,38 @@ _nmc_mangle_connection(NMDevice * device, - config_data->cidr_prefix); - ((guint8 *) &gateway)[3] += 1; - -+ for (i = 0; i < config_data->ipv4s_len; i++) { -+ in_addr_t a = config_data->ipv4s_arr[i]; -+ -+ a = nm_utils_ip4_address_clear_host_address(a, config_data->cidr_prefix); -+ -+ G_STATIC_ASSERT_EXPR(sizeof(gsize) >= sizeof(in_addr_t)); -+ if (g_hash_table_add(unique_subnets, GSIZE_TO_POINTER(a))) { -+ route_entry = -+ nm_ip_route_new_binary(AF_INET, &a, config_data->cidr_prefix, NULL, 10, NULL); -+ nm_ip_route_set_attribute(route_entry, -+ NM_IP_ROUTE_ATTRIBUTE_TABLE, -+ g_variant_new_uint32(30200 + config_data->iface_idx)); -+ g_ptr_array_add(routes_new, route_entry); -+ } -+ -+ rule_entry = nm_ip_routing_rule_new(AF_INET); -+ nm_ip_routing_rule_set_priority(rule_entry, 30200 + config_data->iface_idx); -+ nm_ip_routing_rule_set_from(rule_entry, -+ _nm_utils_inet4_ntop(config_data->ipv4s_arr[i], sbuf), -+ 32); -+ nm_ip_routing_rule_set_table(rule_entry, 30200 + config_data->iface_idx); -+ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); -+ g_ptr_array_add(rules_new, rule_entry); -+ } -+ -+ rule_entry = nm_ip_routing_rule_new(AF_INET); -+ nm_ip_routing_rule_set_priority(rule_entry, 30350); -+ nm_ip_routing_rule_set_table(rule_entry, RT_TABLE_MAIN); -+ nm_ip_routing_rule_set_suppress_prefixlength(rule_entry, 0); -+ nm_assert(nm_ip_routing_rule_validate(rule_entry, NULL)); -+ g_ptr_array_add(rules_new, rule_entry); -+ - route_entry = nm_ip_route_new_binary(AF_INET, &nm_ip_addr_zero, 0, &gateway, 10, NULL); - nm_ip_route_set_attribute(route_entry, - NM_IP_ROUTE_ATTRIBUTE_TABLE, -diff --git a/man/nm-cloud-setup.xml b/man/nm-cloud-setup.xml -index 388ef3ba91..4ae4042f84 100644 ---- a/man/nm-cloud-setup.xml -+++ b/man/nm-cloud-setup.xml -@@ -221,7 +221,9 @@ - Also, if the device is currently not activated in NetworkManager or if the currently - activated profile has a user-data org.freedesktop.nm-cloud-setup.skip=yes, - it is skipped. -- Then, the tool will change the runtime configuration of the device. -+ If only one interface and one address is configured, then the tool does nothing -+ and leaves the automatic configuration that was obtained via DHCP. -+ Otherwise, the tool will change the runtime configuration of the device. - - - Add static IPv4 addresses for all the configured addresses from local-ipv4s with -@@ -232,15 +234,25 @@ - Choose a route table 30400 + the index of the interface and - add a default route 0.0.0.0/0. The gateway - is the first IP address in the CIDR subnet block. For -- example, we might get a route "0.0.0.0/0 172.16.5.1 10 table=30401". -+ example, we might get a route "0.0.0.0/0 172.16.5.1 10 table=30400". -+ Also choose a route table 30200 + the interface index. This -+ contains a direct routes to the subnets of this interface. - - - Finally, add a policy routing rule for each address. For example -- "priority 30401 from 172.16.5.3/32 table 30401, priority 30401 from 172.16.5.4/32 table 30401". -+ "priority 30200 from 172.16.5.3/32 table 30200, priority 30200 from 172.16.5.4/32 table 30200". -+ and -+ "priority 30400 from 172.16.5.3/32 table 30400, priority 30400 from 172.16.5.4/32 table 30400" -+ The 30200+ rules select the table to reach the subnet directly, while the 30400+ rules use the -+ default route. Also add a rule -+ "priority 30350 table main suppress_prefixlength 0". This has a priority between -+ the two previous rules and causes a lookup of routes in the main table while ignoring the default -+ route. The purpose of this is so that other specific routes in the main table are honored over -+ the default route in table 30400+. - - - With above example, this roughly corresponds for interface eth0 to -- nmcli device modify "eth0" ipv4.addresses "172.16.5.3/24,172.16.5.4/24" ipv4.routes "0.0.0.0/0 172.16.5.1 10 table=30401" ipv4.routing-rules "priority 30401 from 172.16.5.3/32 table 30401, priority 30401 from 172.16.5.4/32 table 30401". -+ nmcli device modify "eth0" ipv4.addresses "172.16.5.3/24,172.16.5.4/24" ipv4.routes "172.16.5.0/24 0.0.0.0 10 table=30200, 0.0.0.0/0 172.16.5.1 10 table=30400" ipv4.routing-rules "priority 30200 from 172.16.5.3/32 table 30200, priority 30200 from 172.16.5.4/32 table 30200, priority 20350 table main suppress_prefixlength 0, priority 30400 from 172.16.5.3/32 table 30400, priority 30400 from 172.16.5.4/32 table 30400". - Note that this replaces the previous addresses, routes and rules with the new information. - But also note that this only changes the run time configuration of the device. The - connection profile on disk is not affected. -@@ -323,14 +335,8 @@ - - - At this point, we have a list of all interfaces (by MAC address) and their configured IPv4 addresses. -- For each device, we lookup the currently applied connection in NetworkManager. That implies, that the device is currently activated -- in NetworkManager. If no such device was in NetworkManager, or if the profile has user-data org.freedesktop.nm-cloud-setup.skip=yes, -- we skip the device. Now for each found IP address we add a static address "$ADDR/$SUBNET_PREFIX". Also we configure policy routing -- by adding a static route "$ADDR/$SUBNET_PREFIX $GATEWAY 10, table=$TABLE" where $GATEWAY is the first IP address in the subnet and table -- is 30400 plus the interface index. Also we add a policy routing rule "priority $TABLE from $ADDR/32 table $TABLE". -- The effect is not unlike calling -- nmcli device modify "$DEVICE" ipv4.addresses "$ADDR/$SUBNET [,...]" ipv4.routes "$ADDR/32 $GATEWAY 10 table=$TABLE" ipv4.routing-rules "priority $TABLE from $ADDR/32 table $TABLE" -- for all relevant devices and all found addresses. -+ Then the tool configures the system like doing for AWS environment. That is, using source based policy routing -+ with the tables/rules 30200/30400. - - - --- -2.31.1 - - -From a788d968b0e4efab18eefa1333df27846b5d5f04 Mon Sep 17 00:00:00 2001 -From: Fernando Fernandez Mancera -Date: Mon, 4 Oct 2021 18:26:11 +0200 -Subject: [PATCH 15/15] cloud-setup: follow the clang-format - -Signed-off-by: Fernando Fernandez Mancera -(cherry picked from commit 9cb01cdefd43c954653202eada0b094e61c86015) ---- - clients/cloud-setup/nmcs-provider-azure.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index 3b923e4ce5..a0e6076fd3 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -145,7 +145,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - } - - iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); -- iface_get_config = iface_data->iface_get_config; -+ iface_get_config = iface_data->iface_get_config; - - if (is_ipv4) { - char tmp_addr_str[NM_UTILS_INET_ADDRSTRLEN]; --- -2.31.1 - diff --git a/SOURCES/1015-initrd-set-IPv4-required-timeout-rh1961666.patch b/SOURCES/1015-initrd-set-IPv4-required-timeout-rh1961666.patch deleted file mode 100644 index 58d06d6..0000000 --- a/SOURCES/1015-initrd-set-IPv4-required-timeout-rh1961666.patch +++ /dev/null @@ -1,7181 +0,0 @@ -From 41d181842411924014af63bad28f8a7843040879 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Fri, 20 Aug 2021 09:43:47 +0200 -Subject: [PATCH 1/9] libnm: add NM_VERSION_1_30_8 - -(cherry picked from commit ce02f563565d3221a1bd7f2db09a249d5034a30e) ---- - libnm-core/nm-version-macros.h.in | 1 + - libnm-core/nm-version.h | 6 ++++++ - 2 files changed, 7 insertions(+) - -diff --git a/libnm-core/nm-version-macros.h.in b/libnm-core/nm-version-macros.h.in -index 4a6f46e9f0..08486efc4e 100644 ---- a/libnm-core/nm-version-macros.h.in -+++ b/libnm-core/nm-version-macros.h.in -@@ -67,6 +67,7 @@ - #define NM_VERSION_1_26 (NM_ENCODE_VERSION (1, 26, 0)) - #define NM_VERSION_1_28 (NM_ENCODE_VERSION (1, 28, 0)) - #define NM_VERSION_1_30 (NM_ENCODE_VERSION (1, 30, 0)) -+#define NM_VERSION_1_30_8 (NM_ENCODE_VERSION (1, 30, 8)) - - /* For releases, NM_API_VERSION is equal to NM_VERSION. - * -diff --git a/libnm-core/nm-version.h b/libnm-core/nm-version.h -index 3f1ad3f2eb..7aa2b6fd1c 100644 ---- a/libnm-core/nm-version.h -+++ b/libnm-core/nm-version.h -@@ -271,6 +271,12 @@ - #define NM_AVAILABLE_IN_1_30 - #endif - -+#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_30_8 -+ #define NM_AVAILABLE_IN_1_30_8 G_UNAVAILABLE(1, 30.8) -+#else -+ #define NM_AVAILABLE_IN_1_30_8 -+#endif -+ - /* - * Synchronous API for calling D-Bus in libnm is deprecated. See - * https://developer.gnome.org/libnm/stable/usage.html#sync-api --- -2.31.1 - -From c388085d13e39c819f3db20be8209cb2e7013dd9 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 16 Feb 2021 21:23:37 +0100 -Subject: [PATCH 2/9] initrd: cleanup parsing DNS in reader_parse_ip() - -(cherry picked from commit e258410c877ee081a19f38653d20d884d3923d04) -(cherry picked from commit f8645d6a86537f0094b6182bda950119f068ce05) ---- - src/core/initrd/nmi-cmdline-reader.c | 37 +++++++++++----------------- - 1 file changed, 15 insertions(+), 22 deletions(-) - -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index eae75847ee..79156c9ea9 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -411,10 +411,12 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - int client_ip_family = AF_UNSPEC; - int client_ip_prefix = -1; - const char * dns[2] = { -- 0, -+ NULL, -+ NULL, - }; - int dns_addr_family[2] = { -- 0, -+ AF_UNSPEC, -+ AF_UNSPEC, - }; - int i; - GError *error = NULL; -@@ -472,11 +474,15 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - tmp = get_word(&argument, ':'); - dns_addr_family[0] = get_ip_address_family(tmp, FALSE); - if (dns_addr_family[0] != AF_UNSPEC) { -- dns[0] = tmp; -- dns[1] = get_word(&argument, ':'); -- dns_addr_family[1] = get_ip_address_family(dns[1], FALSE); -- if (*argument) -- _LOGW(LOGD_CORE, "Ignoring extra: '%s'.", argument); -+ dns[0] = tmp; -+ dns[1] = get_word(&argument, ':'); -+ if (dns[1]) { -+ dns_addr_family[1] = get_ip_address_family(dns[1], FALSE); -+ if (dns_addr_family[1] == AF_UNSPEC) -+ _LOGW(LOGD_CORE, "Ignoring invalid DNS server: '%s'.", dns[1]); -+ if (*argument) -+ _LOGW(LOGD_CORE, "Ignoring extra: '%s'.", argument); -+ } - } else { - mtu = tmp; - macaddr = argument; -@@ -693,21 +699,8 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - for (i = 0; i < 2; i++) { - if (dns_addr_family[i] == AF_UNSPEC) - break; -- if (nm_utils_ipaddr_is_valid(dns_addr_family[i], dns[i])) { -- switch (dns_addr_family[i]) { -- case AF_INET: -- nm_setting_ip_config_add_dns(s_ip4, dns[i]); -- break; -- case AF_INET6: -- nm_setting_ip_config_add_dns(s_ip6, dns[i]); -- break; -- default: -- _LOGW(LOGD_CORE, "Unknown address family: %s", dns[i]); -- break; -- } -- } else { -- _LOGW(LOGD_CORE, "Invalid name server: %s", dns[i]); -- } -+ nm_assert(nm_utils_ipaddr_is_valid(dns_addr_family[i], dns[i])); -+ nm_setting_ip_config_add_dns(NM_IS_IPv4(dns_addr_family[i]) ? s_ip4 : s_ip6, dns[i]); - } - - if (mtu && *mtu) --- -2.31.1 - -From 8121af668e1a5b0a76433a4d116ffd6e457b340b Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Wed, 19 May 2021 23:17:43 +0200 -Subject: [PATCH 3/9] glib-aux: add nm_g_source_sentinel_get() util - -This helper is useful to get a dummy GSource instance that can be -refed, unrefed and destroyed. It can act as a replacement for -a timeout source with infinite timeout. - -(cherry picked from commit ce7c28c514c8ae1f1a9f5d9b56fbe503ec815109) -(cherry picked from commit 3a58255247aef2e6303713a764753cc70c0b36a5) ---- - shared/nm-glib-aux/nm-shared-utils.c | 27 ++++++++++ - shared/nm-glib-aux/nm-shared-utils.h | 25 +++++++++ - .../nm-glib-aux/tests/test-shared-general.c | 53 +++++++++++++++++++ - 3 files changed, 105 insertions(+) - -diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c -index 3215a33b5b..496294b184 100644 ---- a/shared/nm-glib-aux/nm-shared-utils.c -+++ b/shared/nm-glib-aux/nm-shared-utils.c -@@ -4682,6 +4682,33 @@ nm_utils_parse_debug_string(const char *string, const GDebugKey *keys, guint nke - - /*****************************************************************************/ - -+GSource *_nm_g_source_sentinel[] = { -+ NULL, -+}; -+ -+GSource * -+_nm_g_source_sentinel_get_init(GSource **p_source) -+{ -+ static const GSourceFuncs source_funcs = { -+ NULL, -+ }; -+ GSource *source; -+ -+again: -+ source = g_source_new((GSourceFuncs *) &source_funcs, sizeof(GSource)); -+ g_source_set_priority(source, G_PRIORITY_DEFAULT_IDLE); -+ g_source_set_name(source, "nm_g_source_sentinel"); -+ -+ if (!g_atomic_pointer_compare_and_exchange(p_source, NULL, source)) { -+ g_source_unref(source); -+ goto again; -+ } -+ -+ return source; -+} -+ -+/*****************************************************************************/ -+ - GSource * - nm_g_idle_source_new(int priority, - GSourceFunc func, -diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h -index 7d330458c1..9aa44cc62b 100644 ---- a/shared/nm-glib-aux/nm-shared-utils.h -+++ b/shared/nm-glib-aux/nm-shared-utils.h -@@ -1328,6 +1328,31 @@ nm_source_func_unref_gobject(gpointer user_data) - return G_SOURCE_REMOVE; - } - -+extern GSource *_nm_g_source_sentinel[1]; -+ -+GSource *_nm_g_source_sentinel_get_init(GSource **p_source); -+ -+/* Get a GSource sentinel (dummy instance). This instance should never be -+ * attached to a GMainContext. The only currently known purpose is to use it -+ * as dummy value instead of an infinity timeout. That is, if we configurably -+ * want to schedule a timeout that might be infinity, we might set the GSource -+ * instance to nm_g_source_sentinel_get(). On this instance, we still may -+ * call g_source_ref(), g_source_unref() and g_source_destroy(). But nothing -+ * else. */ -+#define nm_g_source_sentinel_get(idx) \ -+ ({ \ -+ GSource *_s; \ -+ \ -+ G_STATIC_ASSERT((idx) >= 0); \ -+ G_STATIC_ASSERT((idx) < G_N_ELEMENTS(_nm_g_source_sentinel)); \ -+ \ -+ _s = g_atomic_pointer_get(&_nm_g_source_sentinel[idx]); \ -+ if (G_UNLIKELY(!_s)) \ -+ _s = _nm_g_source_sentinel_get_init(&_nm_g_source_sentinel[idx]); \ -+ \ -+ _s; \ -+ }) -+ - GSource *nm_g_idle_source_new(int priority, - GSourceFunc func, - gpointer user_data, -diff --git a/shared/nm-glib-aux/tests/test-shared-general.c b/shared/nm-glib-aux/tests/test-shared-general.c -index f42c6fb108..3bf63d6df2 100644 ---- a/shared/nm-glib-aux/tests/test-shared-general.c -+++ b/shared/nm-glib-aux/tests/test-shared-general.c -@@ -1256,6 +1256,58 @@ again: - - /*****************************************************************************/ - -+static void -+test_nm_g_source_sentinel(void) -+{ -+ GSource *s1; -+ GSource *s2; -+ int n; -+ int i; -+ int refs; -+ -+ s1 = nm_g_source_sentinel_get(0); -+ g_assert_nonnull(s1); -+ g_assert_cmpint(g_atomic_int_get(&s1->ref_count), ==, 1); -+ -+ s2 = nm_g_source_sentinel_get(0); -+ g_assert_nonnull(s2); -+ g_assert(s2 == s1); -+ g_assert_cmpint(g_atomic_int_get(&s1->ref_count), ==, 1); -+ -+ n = nmtst_get_rand_uint32() % 7; -+ for (refs = 0, i = 0; i < n; i++) { -+ if (nmtst_get_rand_bool()) { -+ refs++; -+ g_source_ref(s1); -+ } -+ if (nmtst_get_rand_bool()) -+ g_source_destroy(s1); -+ if (refs > 0 && nmtst_get_rand_bool()) { -+ refs--; -+ g_source_unref(s1); -+ } -+ -+ if (nmtst_get_rand_bool()) { -+ s2 = nm_g_source_sentinel_get(0); -+ g_assert(s2 == s1); -+ g_assert_cmpint(g_atomic_int_get(&s1->ref_count), >=, 1); -+ } -+ } -+ -+ for (; refs > 0;) { -+ if (nmtst_get_rand_bool()) -+ g_source_destroy(s1); -+ if (nmtst_get_rand_bool()) { -+ refs--; -+ g_source_unref(s1); -+ } -+ } -+ -+ g_assert_cmpint(g_atomic_int_get(&s1->ref_count), ==, 1); -+} -+ -+/*****************************************************************************/ -+ - NMTST_DEFINE(); - - int -@@ -1284,6 +1336,7 @@ main(int argc, char **argv) - g_test_add_func("/general/test_is_specific_hostname", test_is_specific_hostname); - g_test_add_func("/general/test_strv_dup_packed", test_strv_dup_packed); - g_test_add_func("/general/test_utils_hashtable_cmp", test_utils_hashtable_cmp); -+ g_test_add_func("/general/test_nm_g_source_sentinel", test_nm_g_source_sentinel); - - return g_test_run(); - } --- -2.31.1 - -From a76c65e1dec0d826ee407888513a7f87b3504da7 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 8 Jun 2021 13:32:29 +0200 -Subject: [PATCH 4/9] glib-aux/tests: avoid coverity warning in - test_nm_g_source_sentinel() - -Coverity wrongly think there is a use after free in the test: - - Error: USE_AFTER_FREE (CWE-416): [#def559] [important] - NetworkManager-1.31.90/src/libnm-glib-aux/tests/test-shared-general.c:1305: alias: Assigning: "s1" = "_s". Now both point to the same storage. - NetworkManager-1.31.90/src/libnm-glib-aux/tests/test-shared-general.c:1324: freed_arg: "g_source_unref" frees "s1". - NetworkManager-1.31.90/src/libnm-glib-aux/tests/test-shared-general.c:1330: deref_after_free: Dereferencing freed pointer "s1". - # 1328| s2 = nm_g_source_sentinel_get(0); - # 1329| g_assert(s2 == s1); - # 1330|-> g_assert_cmpint(g_atomic_int_get(&s1->ref_count), >=, 1); - # 1331| } - # 1332| } - -Rework the code in the hope to avoid the false warning. - -(cherry picked from commit 7825609f1f7bb0a0ea710a2fddba426f30a519de) -(cherry picked from commit c47c823c9dad6fb61014a71510b76ed82e72be84) -(cherry picked from commit bd7cbd57704233669b248b035391919272aa2edc) ---- - shared/nm-glib-aux/tests/test-shared-general.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/shared/nm-glib-aux/tests/test-shared-general.c b/shared/nm-glib-aux/tests/test-shared-general.c -index 3bf63d6df2..a6ad8dffdc 100644 ---- a/shared/nm-glib-aux/tests/test-shared-general.c -+++ b/shared/nm-glib-aux/tests/test-shared-general.c -@@ -1289,8 +1289,8 @@ test_nm_g_source_sentinel(void) - - if (nmtst_get_rand_bool()) { - s2 = nm_g_source_sentinel_get(0); -+ g_assert_cmpint(g_atomic_int_get(&s2->ref_count), >=, 1); - g_assert(s2 == s1); -- g_assert_cmpint(g_atomic_int_get(&s1->ref_count), >=, 1); - } - } - --- -2.31.1 - -From 859e39fcb322304cf2689c1dd14238efde290d95 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Thu, 5 Aug 2021 08:38:07 +0200 -Subject: [PATCH 5/9] glib-aux: fix thread-safe initialization in - _nm_g_source_sentinel_get_init() - -Fixes: ce7c28c514c8 ('glib-aux: add nm_g_source_sentinel_get() util') -(cherry picked from commit 2140bbf7f52429a34993ed98098b2afb5443c676) -(cherry picked from commit c37f72acd314c707bdf6912f47e0fbdd4c6b3969) -(cherry picked from commit 660932163f7d0c5e9fe6af3dc867394775bbee4b) ---- - shared/nm-glib-aux/nm-shared-utils.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c -index 496294b184..154d9fc29b 100644 ---- a/shared/nm-glib-aux/nm-shared-utils.c -+++ b/shared/nm-glib-aux/nm-shared-utils.c -@@ -4694,14 +4694,14 @@ _nm_g_source_sentinel_get_init(GSource **p_source) - }; - GSource *source; - --again: - source = g_source_new((GSourceFuncs *) &source_funcs, sizeof(GSource)); - g_source_set_priority(source, G_PRIORITY_DEFAULT_IDLE); - g_source_set_name(source, "nm_g_source_sentinel"); - - if (!g_atomic_pointer_compare_and_exchange(p_source, NULL, source)) { - g_source_unref(source); -- goto again; -+ source = g_atomic_pointer_get(p_source); -+ nm_assert(source); - } - - return source; --- -2.31.1 - -From 896bc9d3c43626a247828ab69d994fba8db89308 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Mon, 5 Jul 2021 09:48:54 +0200 -Subject: [PATCH 6/9] initrd: rename NMI_WAIT_DEVICE_TIMEOUT_MS to _MSEC - -(cherry picked from commit fa42ba9df267765cd6f7456707d932271e1252a0) -(cherry picked from commit f2d9f4bf66c0b459701cf9b6ab0a9f6690e3407b) -(cherry picked from commit 671dc82f94c24f25e3eb67680c7c0f17990e7815) ---- - src/core/initrd/nm-initrd-generator.h | 2 +- - src/core/initrd/nmi-cmdline-reader.c | 2 +- - src/core/initrd/tests/test-cmdline-reader.c | 10 +++++----- - 3 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/src/core/initrd/nm-initrd-generator.h b/src/core/initrd/nm-initrd-generator.h -index 56dcfd68f3..534edcb783 100644 ---- a/src/core/initrd/nm-initrd-generator.h -+++ b/src/core/initrd/nm-initrd-generator.h -@@ -9,7 +9,7 @@ - #include "nm-connection.h" - #include "nm-utils.h" - --#define NMI_WAIT_DEVICE_TIMEOUT_MS 60000 -+#define NMI_WAIT_DEVICE_TIMEOUT_MSEC 60000 - - static inline int - get_ip_address_family(const char *str, gboolean with_prefix) -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index 79156c9ea9..2202ab34ea 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -1047,7 +1047,7 @@ connection_set_needed(NMConnection *connection) - - g_object_set(s_con, - NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT, -- (int) NMI_WAIT_DEVICE_TIMEOUT_MS, -+ (int) NMI_WAIT_DEVICE_TIMEOUT_MSEC, - NULL); - } - -diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c -index 187d61c9dc..cffa607ce7 100644 ---- a/src/core/initrd/tests/test-cmdline-reader.c -+++ b/src/core/initrd/tests/test-cmdline-reader.c -@@ -704,7 +704,7 @@ test_multiple_bootdev(void) - g_assert(s_con); - g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), - ==, -- NMI_WAIT_DEVICE_TIMEOUT_MS); -+ NMI_WAIT_DEVICE_TIMEOUT_MSEC); - s_ip4 = nm_connection_get_setting_ip4_config(connection); - g_assert(s_ip4); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); -@@ -746,7 +746,7 @@ test_bootdev(void) - g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "ens3"); - g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), - ==, -- NMI_WAIT_DEVICE_TIMEOUT_MS); -+ NMI_WAIT_DEVICE_TIMEOUT_MSEC); - - connection = g_hash_table_lookup(connections, "vlan2"); - nmtst_assert_connection_verifies_without_normalization(connection); -@@ -1924,7 +1924,7 @@ test_neednet(void) - g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno1"); - g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), - ==, -- NMI_WAIT_DEVICE_TIMEOUT_MS); -+ NMI_WAIT_DEVICE_TIMEOUT_MSEC); - - connection = g_hash_table_lookup(connections, "eno2"); - nmtst_assert_connection_verifies_without_normalization(connection); -@@ -1933,7 +1933,7 @@ test_neednet(void) - g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno2"); - g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), - ==, -- NMI_WAIT_DEVICE_TIMEOUT_MS); -+ NMI_WAIT_DEVICE_TIMEOUT_MSEC); - - connection = g_hash_table_lookup(connections, "eno3"); - nmtst_assert_connection_verifies_without_normalization(connection); -@@ -1942,7 +1942,7 @@ test_neednet(void) - g_assert_cmpstr(nm_setting_connection_get_interface_name(s_con), ==, "eno3"); - g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), - ==, -- NMI_WAIT_DEVICE_TIMEOUT_MS); -+ NMI_WAIT_DEVICE_TIMEOUT_MSEC); - - connection = g_hash_table_lookup(connections, "br0"); - nmtst_assert_connection_verifies_without_normalization(connection); --- -2.31.1 - -From d405e8fe0ba9fda39ccab678a6a37c6083f64031 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Wed, 23 Jun 2021 15:01:34 +0200 -Subject: [PATCH 7/9] all: add a new ipv{4,6}.required-timeout property - -Add a new property to specify the minimum time interval in -milliseconds for which dynamic IP configuration should be tried before -the connection succeeds. - -This property is useful for example if both IPv4 and IPv6 are enabled -and are allowed to fail. Normally the connection succeeds as soon as -one of the two address families completes; by setting a required -timeout for e.g. IPv4, one can ensure that even if IP6 succeeds -earlier than IPv4, NetworkManager waits some time for IPv4 before the -connection becomes active. - -(cherry picked from commit cb5960cef7fa170535903a9ca099094354f61b32) -(cherry picked from commit 08ce20481caa3ecb1fc4c522528f9b675c220a50) -(cherry picked from commit 253de76195171de6007ae2d7cda8cebf0cd498a7) ---- - .../generate-docs-nm-settings-nmcli.xml.in | 4 + - clients/common/nm-meta-setting-desc.c | 30 + - clients/common/settings-docs.h.in | 2 + - .../test_003.expected | 636 ++++++++----- - .../test_004.expected | 900 ++++++++++-------- - libnm-core/nm-setting-ip-config.c | 60 ++ - libnm-core/nm-setting-ip-config.h | 3 + - libnm-core/tests/test-general.c | 1 + - libnm/libnm.ver | 5 + - .../plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 4 + - .../plugins/ifcfg-rh/nms-ifcfg-rh-utils.c | 2 + - .../plugins/ifcfg-rh/nms-ifcfg-rh-utils.h | 2 +- - .../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 6 + - 13 files changed, 1022 insertions(+), 633 deletions(-) - -diff --git a/clients/cli/generate-docs-nm-settings-nmcli.xml.in b/clients/cli/generate-docs-nm-settings-nmcli.xml.in -index 0a75a0e681..2ce665241f 100644 ---- a/clients/cli/generate-docs-nm-settings-nmcli.xml.in -+++ b/clients/cli/generate-docs-nm-settings-nmcli.xml.in -@@ -675,6 +675,8 @@ - description="If TRUE, this connection will never be the default connection for this IP type, meaning it will never be assigned the default route by NetworkManager." /> - -+ - - - -+ - - >> - connection.id: con-gsm1 - connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL -@@ -203,6 +203,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -221,6 +222,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -256,12 +258,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4563 -+size: 4669 - location: clients/tests/test-client.py:test_003()/13 - cmd: $NMCLI con s con-gsm1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4423 bytes -+stdout: 4529 bytes - >>> - connection.id: con-gsm1 - connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL -@@ -309,6 +311,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -327,6 +330,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -494,12 +498,12 @@ UUID NAME - UUID-ethernet-REPLACED-REPLACED-REPL ethernet - - <<< --size: 4308 -+size: 4414 - location: clients/tests/test-client.py:test_003()/25 - cmd: $NMCLI -f ALL con s ethernet - lang: C - returncode: 0 --stdout: 4171 bytes -+stdout: 4277 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -561,6 +565,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -579,6 +584,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -595,12 +601,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4336 -+size: 4442 - location: clients/tests/test-client.py:test_003()/26 - cmd: $NMCLI -f ALL con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4189 bytes -+stdout: 4295 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -662,6 +668,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -680,6 +687,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -716,12 +724,12 @@ stdout: 51 bytes - GENERAL.STATE: aktywowano - - <<< --size: 5010 -+size: 5116 - location: clients/tests/test-client.py:test_003()/29 - cmd: $NMCLI con s ethernet - lang: C - returncode: 0 --stdout: 4880 bytes -+stdout: 4986 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -783,6 +791,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -801,6 +810,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -830,12 +840,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5042 -+size: 5148 - location: clients/tests/test-client.py:test_003()/30 - cmd: $NMCLI con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4902 bytes -+stdout: 5008 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -897,6 +907,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -915,6 +926,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1418,12 +1430,12 @@ UUID NAME - UUID-ethernet-REPLACED-REPLACED-REPL ethernet - - <<< --size: 4308 -+size: 4414 - location: clients/tests/test-client.py:test_003()/50 - cmd: $NMCLI -f ALL con s ethernet - lang: C - returncode: 0 --stdout: 4171 bytes -+stdout: 4277 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -1485,6 +1497,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1503,6 +1516,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1519,12 +1533,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4336 -+size: 4442 - location: clients/tests/test-client.py:test_003()/51 - cmd: $NMCLI -f ALL con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4189 bytes -+stdout: 4295 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -1586,6 +1600,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1604,6 +1619,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1644,12 +1660,12 @@ GENERAL.STATE: aktywowano - GENERAL.STATE: aktywowano - - <<< --size: 5720 -+size: 5826 - location: clients/tests/test-client.py:test_003()/54 - cmd: $NMCLI con s ethernet - lang: C - returncode: 0 --stdout: 5590 bytes -+stdout: 5696 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -1711,6 +1727,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1729,6 +1746,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1772,12 +1790,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5756 -+size: 5862 - location: clients/tests/test-client.py:test_003()/55 - cmd: $NMCLI con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5616 bytes -+stdout: 5722 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -1839,6 +1857,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1857,6 +1876,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -2292,12 +2312,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 5723 -+size: 5829 - location: clients/tests/test-client.py:test_003()/68 - cmd: $NMCLI con s ethernet - lang: C - returncode: 0 --stdout: 5593 bytes -+stdout: 5699 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -2359,6 +2379,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -2377,6 +2398,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -2420,12 +2442,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5760 -+size: 5866 - location: clients/tests/test-client.py:test_003()/69 - cmd: $NMCLI con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5620 bytes -+stdout: 5726 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -2487,6 +2509,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -2505,6 +2528,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -2548,12 +2572,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5053 -+size: 5159 - location: clients/tests/test-client.py:test_003()/70 - cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 4883 bytes -+stdout: 4989 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -2615,6 +2639,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -2633,6 +2658,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -2662,12 +2688,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5086 -+size: 5192 - location: clients/tests/test-client.py:test_003()/71 - cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4906 bytes -+stdout: 5012 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -2729,6 +2755,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -2747,6 +2774,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -2976,12 +3004,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 5735 -+size: 5841 - location: clients/tests/test-client.py:test_003()/78 - cmd: $NMCLI --color yes con s ethernet - lang: C - returncode: 0 --stdout: 5593 bytes -+stdout: 5699 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -3043,6 +3071,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3061,6 +3090,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3104,12 +3134,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5772 -+size: 5878 - location: clients/tests/test-client.py:test_003()/79 - cmd: $NMCLI --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5620 bytes -+stdout: 5726 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -3171,6 +3201,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3189,6 +3220,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3232,12 +3264,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5065 -+size: 5171 - location: clients/tests/test-client.py:test_003()/80 - cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 4883 bytes -+stdout: 4989 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -3299,6 +3331,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3317,6 +3350,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3346,12 +3380,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5098 -+size: 5204 - location: clients/tests/test-client.py:test_003()/81 - cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4906 bytes -+stdout: 5012 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -3413,6 +3447,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3431,6 +3466,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3676,12 +3712,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 6977 -+size: 7083 - location: clients/tests/test-client.py:test_003()/88 - cmd: $NMCLI --pretty con s ethernet - lang: C - returncode: 0 --stdout: 6838 bytes -+stdout: 6944 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -3748,6 +3784,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3767,6 +3804,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3820,12 +3858,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 7033 -+size: 7139 - location: clients/tests/test-client.py:test_003()/89 - cmd: $NMCLI --pretty con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6884 bytes -+stdout: 6990 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -3892,6 +3930,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -3911,6 +3950,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -3964,12 +4004,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 5994 -+size: 6100 - location: clients/tests/test-client.py:test_003()/90 - cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5815 bytes -+stdout: 5921 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -4036,6 +4076,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4055,6 +4096,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4090,12 +4132,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6039 -+size: 6145 - location: clients/tests/test-client.py:test_003()/91 - cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5850 bytes -+stdout: 5956 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -4162,6 +4204,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4181,6 +4224,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4456,12 +4500,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 6989 -+size: 7095 - location: clients/tests/test-client.py:test_003()/98 - cmd: $NMCLI --pretty --color yes con s ethernet - lang: C - returncode: 0 --stdout: 6838 bytes -+stdout: 6944 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -4528,6 +4572,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4547,6 +4592,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4600,12 +4646,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 7045 -+size: 7151 - location: clients/tests/test-client.py:test_003()/99 - cmd: $NMCLI --pretty --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6884 bytes -+stdout: 6990 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -4672,6 +4718,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4691,6 +4738,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4744,12 +4792,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6007 -+size: 6113 - location: clients/tests/test-client.py:test_003()/100 - cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5815 bytes -+stdout: 5921 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -4816,6 +4864,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4835,6 +4884,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4870,12 +4920,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6052 -+size: 6158 - location: clients/tests/test-client.py:test_003()/101 - cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5850 bytes -+stdout: 5956 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -4942,6 +4992,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4961,6 +5012,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -5216,12 +5268,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet - - <<< --size: 3070 -+size: 3120 - location: clients/tests/test-client.py:test_003()/108 - cmd: $NMCLI --terse con s ethernet - lang: C - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -5283,6 +5335,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -5301,6 +5354,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -5344,12 +5398,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 3080 -+size: 3130 - location: clients/tests/test-client.py:test_003()/109 - cmd: $NMCLI --terse con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -5411,6 +5465,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -5429,6 +5484,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -5472,12 +5528,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2720 -+size: 2770 - location: clients/tests/test-client.py:test_003()/110 - cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -5539,6 +5595,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -5557,6 +5614,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -5586,12 +5644,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2730 -+size: 2780 - location: clients/tests/test-client.py:test_003()/111 - cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -5653,6 +5711,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -5671,6 +5730,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -5896,12 +5956,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet - - <<< --size: 3082 -+size: 3132 - location: clients/tests/test-client.py:test_003()/118 - cmd: $NMCLI --terse --color yes con s ethernet - lang: C - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -5963,6 +6023,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -5981,6 +6042,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -6024,12 +6086,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 3092 -+size: 3142 - location: clients/tests/test-client.py:test_003()/119 - cmd: $NMCLI --terse --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -6091,6 +6153,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -6109,6 +6172,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -6152,12 +6216,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2732 -+size: 2782 - location: clients/tests/test-client.py:test_003()/120 - cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -6219,6 +6283,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -6237,6 +6302,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -6266,12 +6332,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2742 -+size: 2792 - location: clients/tests/test-client.py:test_003()/121 - cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -6333,6 +6399,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -6351,6 +6418,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -6580,12 +6648,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 3838 -+size: 3910 - location: clients/tests/test-client.py:test_003()/128 - cmd: $NMCLI --mode tabular con s ethernet - lang: C - returncode: 0 --stdout: 3692 bytes -+stdout: 3764 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 -@@ -6593,11 +6661,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none no -- -- -@@ -6611,12 +6679,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 3872 -+size: 3944 - location: clients/tests/test-client.py:test_003()/129 - cmd: $NMCLI --mode tabular con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3716 bytes -+stdout: 3788 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 -@@ -6624,11 +6692,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none nie -- -- -@@ -6642,12 +6710,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza - - - <<< --size: 3376 -+size: 3448 - location: clients/tests/test-client.py:test_003()/130 - cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 3190 bytes -+stdout: 3262 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 -@@ -6655,11 +6723,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none no -- -- -@@ -6669,12 +6737,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 3408 -+size: 3480 - location: clients/tests/test-client.py:test_003()/131 - cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3212 bytes -+stdout: 3284 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 -@@ -6682,11 +6750,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none nie -- -- -@@ -6824,12 +6892,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 3850 -+size: 3922 - location: clients/tests/test-client.py:test_003()/138 - cmd: $NMCLI --mode tabular --color yes con s ethernet - lang: C - returncode: 0 --stdout: 3692 bytes -+stdout: 3764 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 -@@ -6837,11 +6905,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none no -- -- -@@ -6855,12 +6923,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 3884 -+size: 3956 - location: clients/tests/test-client.py:test_003()/139 - cmd: $NMCLI --mode tabular --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3716 bytes -+stdout: 3788 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 -@@ -6868,11 +6936,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none nie -- -- -@@ -6886,12 +6954,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza - - - <<< --size: 3388 -+size: 3460 - location: clients/tests/test-client.py:test_003()/140 - cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 3190 bytes -+stdout: 3262 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 -@@ -6899,11 +6967,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none no -- -- -@@ -6913,12 +6981,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 3420 -+size: 3492 - location: clients/tests/test-client.py:test_003()/141 - cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3212 bytes -+stdout: 3284 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 -@@ -6926,11 +6994,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth - name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - proxy none nie -- -- -@@ -7084,12 +7152,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 6242 -+size: 6350 - location: clients/tests/test-client.py:test_003()/148 - cmd: $NMCLI --mode tabular --pretty con s ethernet - lang: C - returncode: 0 --stdout: 6087 bytes -+stdout: 6195 bytes - >>> - ========================================= - Connection profile details (ethernet) -@@ -7102,13 +7170,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7131,12 +7199,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 6336 -+size: 6444 - location: clients/tests/test-client.py:test_003()/149 - cmd: $NMCLI --mode tabular --pretty con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6171 bytes -+stdout: 6279 bytes - >>> - =========================================== - Szczegóły profilu połączenia (ethernet) -@@ -7149,13 +7217,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7178,12 +7246,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza - - - <<< --size: 5318 -+size: 5426 - location: clients/tests/test-client.py:test_003()/150 - cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5123 bytes -+stdout: 5231 bytes - >>> - ========================================= - Connection profile details (ethernet) -@@ -7196,13 +7264,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7217,12 +7285,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 5390 -+size: 5498 - location: clients/tests/test-client.py:test_003()/151 - cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5185 bytes -+stdout: 5293 bytes - >>> - =========================================== - Szczegóły profilu połączenia (ethernet) -@@ -7235,13 +7303,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7424,12 +7492,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet - - <<< --size: 6254 -+size: 6362 - location: clients/tests/test-client.py:test_003()/158 - cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet - lang: C - returncode: 0 --stdout: 6087 bytes -+stdout: 6195 bytes - >>> - ========================================= - Connection profile details (ethernet) -@@ -7442,13 +7510,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7471,12 +7539,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 6348 -+size: 6456 - location: clients/tests/test-client.py:test_003()/159 - cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6171 bytes -+stdout: 6279 bytes - >>> - =========================================== - Szczegóły profilu połączenia (ethernet) -@@ -7489,13 +7557,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7518,12 +7586,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza - - - <<< --size: 5330 -+size: 5438 - location: clients/tests/test-client.py:test_003()/160 - cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5123 bytes -+stdout: 5231 bytes - >>> - ========================================= - Connection profile details (ethernet) -@@ -7536,13 +7604,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7557,12 +7625,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac - - - <<< --size: 5402 -+size: 5510 - location: clients/tests/test-client.py:test_003()/161 - cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5185 bytes -+stdout: 5293 bytes - >>> - =========================================== - Szczegóły profilu połączenia (ethernet) -@@ -7575,13 +7643,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name method browser-only pac-url pac-script - -------------------------------------------------- -@@ -7744,66 +7812,66 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet - - <<< --size: 853 -+size: 859 - location: clients/tests/test-client.py:test_003()/168 - cmd: $NMCLI --mode tabular --terse con s ethernet - lang: C - returncode: 0 --stdout: 700 bytes -+stdout: 706 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 863 -+size: 869 - location: clients/tests/test-client.py:test_003()/169 - cmd: $NMCLI --mode tabular --terse con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 700 bytes -+stdout: 706 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 701 -+size: 707 - location: clients/tests/test-client.py:test_003()/170 - cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 508 bytes -+stdout: 514 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 711 -+size: 717 - location: clients/tests/test-client.py:test_003()/171 - cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 508 bytes -+stdout: 514 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - -@@ -7898,66 +7966,66 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm - UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet - - <<< --size: 865 -+size: 871 - location: clients/tests/test-client.py:test_003()/178 - cmd: $NMCLI --mode tabular --terse --color yes con s ethernet - lang: C - returncode: 0 --stdout: 700 bytes -+stdout: 706 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 875 -+size: 881 - location: clients/tests/test-client.py:test_003()/179 - cmd: $NMCLI --mode tabular --terse --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 700 bytes -+stdout: 706 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 713 -+size: 719 - location: clients/tests/test-client.py:test_003()/180 - cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 508 bytes -+stdout: 514 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - - <<< --size: 723 -+size: 729 - location: clients/tests/test-client.py:test_003()/181 - cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 508 bytes -+stdout: 514 bytes - >>> - connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 - 802-3-ethernet::0::no:::::auto::::default: --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - proxy:none:no:: - GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: - -@@ -8200,12 +8268,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA - TYPE: ethernet - - <<< --size: 5741 -+size: 5847 - location: clients/tests/test-client.py:test_003()/188 - cmd: $NMCLI --mode multiline con s ethernet - lang: C - returncode: 0 --stdout: 5593 bytes -+stdout: 5699 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -8267,6 +8335,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -8285,6 +8354,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -8328,12 +8398,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5778 -+size: 5884 - location: clients/tests/test-client.py:test_003()/189 - cmd: $NMCLI --mode multiline con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5620 bytes -+stdout: 5726 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -8395,6 +8465,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -8413,6 +8484,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -8456,12 +8528,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5071 -+size: 5177 - location: clients/tests/test-client.py:test_003()/190 - cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 4883 bytes -+stdout: 4989 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -8523,6 +8595,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -8541,6 +8614,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -8570,12 +8644,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5104 -+size: 5210 - location: clients/tests/test-client.py:test_003()/191 - cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4906 bytes -+stdout: 5012 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -8637,6 +8711,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -8655,6 +8730,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -9028,12 +9104,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA - TYPE: ethernet - - <<< --size: 5753 -+size: 5859 - location: clients/tests/test-client.py:test_003()/198 - cmd: $NMCLI --mode multiline --color yes con s ethernet - lang: C - returncode: 0 --stdout: 5593 bytes -+stdout: 5699 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -9095,6 +9171,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -9113,6 +9190,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -9156,12 +9234,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5790 -+size: 5896 - location: clients/tests/test-client.py:test_003()/199 - cmd: $NMCLI --mode multiline --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5620 bytes -+stdout: 5726 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -9223,6 +9301,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -9241,6 +9320,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -9284,12 +9364,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5083 -+size: 5189 - location: clients/tests/test-client.py:test_003()/200 - cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 4883 bytes -+stdout: 4989 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -9351,6 +9431,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -9369,6 +9450,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -9398,12 +9480,12 @@ GENERAL.ZONE: -- - GENERAL.MASTER-PATH: -- - - <<< --size: 5116 -+size: 5222 - location: clients/tests/test-client.py:test_003()/201 - cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4906 bytes -+stdout: 5012 bytes - >>> - connection.id: ethernet - connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL -@@ -9465,6 +9547,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -9483,6 +9566,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -9886,12 +9970,12 @@ TYPE: ethernet - ------------------------------------------------------------------------------- - - <<< --size: 6995 -+size: 7101 - location: clients/tests/test-client.py:test_003()/208 - cmd: $NMCLI --mode multiline --pretty con s ethernet - lang: C - returncode: 0 --stdout: 6838 bytes -+stdout: 6944 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -9958,6 +10042,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -9977,6 +10062,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -10030,12 +10116,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 7051 -+size: 7157 - location: clients/tests/test-client.py:test_003()/209 - cmd: $NMCLI --mode multiline --pretty con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6884 bytes -+stdout: 6990 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -10102,6 +10188,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -10121,6 +10208,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -10174,12 +10262,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6012 -+size: 6118 - location: clients/tests/test-client.py:test_003()/210 - cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5815 bytes -+stdout: 5921 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -10246,6 +10334,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -10265,6 +10354,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -10300,12 +10390,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6057 -+size: 6163 - location: clients/tests/test-client.py:test_003()/211 - cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5850 bytes -+stdout: 5956 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -10372,6 +10462,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -10391,6 +10482,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -10824,12 +10916,12 @@ TYPE: ethernet - ------------------------------------------------------------------------------- - - <<< --size: 7007 -+size: 7113 - location: clients/tests/test-client.py:test_003()/218 - cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet - lang: C - returncode: 0 --stdout: 6838 bytes -+stdout: 6944 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -10896,6 +10988,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -10915,6 +11008,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -10968,12 +11062,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 7063 -+size: 7169 - location: clients/tests/test-client.py:test_003()/219 - cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6884 bytes -+stdout: 6990 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -11040,6 +11134,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11059,6 +11154,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11112,12 +11208,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6024 -+size: 6130 - location: clients/tests/test-client.py:test_003()/220 - cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 5815 bytes -+stdout: 5921 bytes - >>> - =============================================================================== - Connection profile details (ethernet) -@@ -11184,6 +11280,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11203,6 +11300,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11238,12 +11336,12 @@ GENERAL.MASTER-PATH: -- - ------------------------------------------------------------------------------- - - <<< --size: 6069 -+size: 6175 - location: clients/tests/test-client.py:test_003()/221 - cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5850 bytes -+stdout: 5956 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (ethernet) -@@ -11310,6 +11408,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11329,6 +11428,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11732,12 +11832,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA - TYPE:802-3-ethernet - - <<< --size: 3087 -+size: 3137 - location: clients/tests/test-client.py:test_003()/228 - cmd: $NMCLI --mode multiline --terse con s ethernet - lang: C - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -11799,6 +11899,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -11817,6 +11918,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -11860,12 +11962,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 3097 -+size: 3147 - location: clients/tests/test-client.py:test_003()/229 - cmd: $NMCLI --mode multiline --terse con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -11927,6 +12029,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -11945,6 +12048,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -11988,12 +12092,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2737 -+size: 2787 - location: clients/tests/test-client.py:test_003()/230 - cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12055,6 +12159,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -12073,6 +12178,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -12102,12 +12208,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2747 -+size: 2797 - location: clients/tests/test-client.py:test_003()/231 - cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12169,6 +12275,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -12187,6 +12294,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -12560,12 +12668,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA - TYPE:802-3-ethernet - - <<< --size: 3099 -+size: 3149 - location: clients/tests/test-client.py:test_003()/238 - cmd: $NMCLI --mode multiline --terse --color yes con s ethernet - lang: C - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12627,6 +12735,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -12645,6 +12754,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -12688,12 +12798,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 3109 -+size: 3159 - location: clients/tests/test-client.py:test_003()/239 - cmd: $NMCLI --mode multiline --terse --color yes con s ethernet - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2931 bytes -+stdout: 2981 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12755,6 +12865,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -12773,6 +12884,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -12816,12 +12928,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2749 -+size: 2799 - location: clients/tests/test-client.py:test_003()/240 - cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: C - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12883,6 +12995,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -12901,6 +13014,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -12930,12 +13044,12 @@ GENERAL.ZONE: - GENERAL.MASTER-PATH: - - <<< --size: 2759 -+size: 2809 - location: clients/tests/test-client.py:test_003()/241 - cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2541 bytes -+stdout: 2591 bytes - >>> - connection.id:ethernet - connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL -@@ -12997,6 +13111,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -13015,6 +13130,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -diff --git a/clients/tests/test-client.check-on-disk/test_004.expected b/clients/tests/test-client.check-on-disk/test_004.expected -index 5140c02216..9cda8fce0c 100644 ---- a/clients/tests/test-client.check-on-disk/test_004.expected -+++ b/clients/tests/test-client.check-on-disk/test_004.expected -@@ -58,12 +58,12 @@ location: clients/tests/test-client.py:test_004()/7 - cmd: $NMCLI connection mod con-xx1 ipv4.addresses 192.168.77.5/24 ipv4.routes '2.3.4.5/32 192.168.77.1' ipv6.addresses 1:2:3:4::6/64 ipv6.routes 1:2:3:4:5:6::5/128 - lang: C - returncode: 0 --size: 4603 -+size: 4709 - location: clients/tests/test-client.py:test_004()/8 - cmd: $NMCLI con s con-xx1 - lang: C - returncode: 0 --stdout: 4475 bytes -+stdout: 4581 bytes - >>> - connection.id: con-xx1 - connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA -@@ -129,6 +129,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -147,6 +148,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -163,12 +165,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4631 -+size: 4737 - location: clients/tests/test-client.py:test_004()/9 - cmd: $NMCLI con s con-xx1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4493 bytes -+stdout: 4599 bytes - >>> - connection.id: con-xx1 - connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA -@@ -234,6 +236,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -252,6 +255,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -304,12 +308,12 @@ con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP vpn -- - con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi -- - - <<< --size: 4017 -+size: 4123 - location: clients/tests/test-client.py:test_004()/13 - cmd: $NMCLI con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3886 bytes -+stdout: 3992 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -357,6 +361,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -375,6 +380,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -397,12 +403,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4037 -+size: 4143 - location: clients/tests/test-client.py:test_004()/14 - cmd: $NMCLI con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3896 bytes -+stdout: 4002 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -450,6 +456,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -468,6 +475,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -562,12 +570,12 @@ con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi wlan0 - con-1 5fcfd6d7-1e63-3332-8826-a7eda103792d ethernet -- - - <<< --size: 5145 -+size: 5251 - location: clients/tests/test-client.py:test_004()/21 - cmd: $NMCLI con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5014 bytes -+stdout: 5120 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -615,6 +623,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -633,6 +642,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -676,12 +686,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5171 -+size: 5277 - location: clients/tests/test-client.py:test_004()/22 - cmd: $NMCLI con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5030 bytes -+stdout: 5136 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -729,6 +739,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -747,6 +758,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -790,12 +802,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5151 -+size: 5257 - location: clients/tests/test-client.py:test_004()/23 - cmd: $NMCLI con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -843,6 +855,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -861,6 +874,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -904,12 +918,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5181 -+size: 5287 - location: clients/tests/test-client.py:test_004()/24 - cmd: $NMCLI con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -957,6 +971,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -975,6 +990,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1018,12 +1034,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5151 -+size: 5257 - location: clients/tests/test-client.py:test_004()/25 - cmd: $NMCLI con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -1071,6 +1087,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1089,6 +1106,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1132,12 +1150,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5181 -+size: 5287 - location: clients/tests/test-client.py:test_004()/26 - cmd: $NMCLI con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -1185,6 +1203,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1203,6 +1222,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1246,12 +1266,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 4024 -+size: 4130 - location: clients/tests/test-client.py:test_004()/27 - cmd: $NMCLI -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3886 bytes -+stdout: 3992 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -1299,6 +1319,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1317,6 +1338,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -1339,12 +1361,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4044 -+size: 4150 - location: clients/tests/test-client.py:test_004()/28 - cmd: $NMCLI -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3896 bytes -+stdout: 4002 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -1392,6 +1414,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -1410,6 +1433,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4012,12 +4036,12 @@ connection.type: 802-11-wireless - connection.interface-name: -- - - <<< --size: 5163 -+size: 5269 - location: clients/tests/test-client.py:test_004()/73 - cmd: $NMCLI --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4065,6 +4089,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4083,6 +4108,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4126,12 +4152,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5193 -+size: 5299 - location: clients/tests/test-client.py:test_004()/74 - cmd: $NMCLI --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4179,6 +4205,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4197,6 +4224,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4240,12 +4268,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5163 -+size: 5269 - location: clients/tests/test-client.py:test_004()/75 - cmd: $NMCLI --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4293,6 +4321,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4311,6 +4340,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4354,12 +4384,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5193 -+size: 5299 - location: clients/tests/test-client.py:test_004()/76 - cmd: $NMCLI --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4407,6 +4437,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4425,6 +4456,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4468,12 +4500,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 4036 -+size: 4142 - location: clients/tests/test-client.py:test_004()/77 - cmd: $NMCLI --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3886 bytes -+stdout: 3992 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4521,6 +4553,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4539,6 +4572,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -4561,12 +4595,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4056 -+size: 4162 - location: clients/tests/test-client.py:test_004()/78 - cmd: $NMCLI --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3896 bytes -+stdout: 4002 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -4614,6 +4648,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -4632,6 +4667,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7234,12 +7270,12 @@ connection.type: 802-11-wireless - connection.interface-name: -- - - <<< --size: 6173 -+size: 6279 - location: clients/tests/test-client.py:test_004()/123 - cmd: $NMCLI --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -7291,6 +7327,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7310,6 +7347,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7361,12 +7399,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6215 -+size: 6321 - location: clients/tests/test-client.py:test_004()/124 - cmd: $NMCLI --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -7418,6 +7456,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7437,6 +7476,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7488,12 +7528,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6173 -+size: 6279 - location: clients/tests/test-client.py:test_004()/125 - cmd: $NMCLI --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -7545,6 +7585,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7564,6 +7605,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7615,12 +7657,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6215 -+size: 6321 - location: clients/tests/test-client.py:test_004()/126 - cmd: $NMCLI --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -7672,6 +7714,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7691,6 +7734,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7742,12 +7786,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 4653 -+size: 4759 - location: clients/tests/test-client.py:test_004()/127 - cmd: $NMCLI --pretty -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 4505 bytes -+stdout: 4611 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -7799,6 +7843,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7818,6 +7863,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -7843,12 +7889,12 @@ proxy.pac-script: -- - ------------------------------------------------------------------------------- - - <<< --size: 4678 -+size: 4784 - location: clients/tests/test-client.py:test_004()/128 - cmd: $NMCLI --pretty -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4520 bytes -+stdout: 4626 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -7900,6 +7946,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -7919,6 +7966,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11128,12 +11176,12 @@ connection.interface-name: -- - ------------------------------------------------------------------------------- - - <<< --size: 6185 -+size: 6291 - location: clients/tests/test-client.py:test_004()/173 - cmd: $NMCLI --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -11185,6 +11233,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11204,6 +11253,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11255,12 +11305,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6227 -+size: 6333 - location: clients/tests/test-client.py:test_004()/174 - cmd: $NMCLI --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -11312,6 +11362,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11331,6 +11382,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11382,12 +11434,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6185 -+size: 6291 - location: clients/tests/test-client.py:test_004()/175 - cmd: $NMCLI --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -11439,6 +11491,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11458,6 +11511,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11509,12 +11563,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6227 -+size: 6333 - location: clients/tests/test-client.py:test_004()/176 - cmd: $NMCLI --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -11566,6 +11620,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11585,6 +11640,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11636,12 +11692,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 4665 -+size: 4771 - location: clients/tests/test-client.py:test_004()/177 - cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 4505 bytes -+stdout: 4611 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -11693,6 +11749,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11712,6 +11769,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -11737,12 +11795,12 @@ proxy.pac-script: -- - ------------------------------------------------------------------------------- - - <<< --size: 4690 -+size: 4796 - location: clients/tests/test-client.py:test_004()/178 - cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4520 bytes -+stdout: 4626 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -11794,6 +11852,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -11813,6 +11872,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -15022,12 +15082,12 @@ connection.interface-name: -- - ------------------------------------------------------------------------------- - - <<< --size: 2602 -+size: 2652 - location: clients/tests/test-client.py:test_004()/223 - cmd: $NMCLI --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15075,6 +15135,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15093,6 +15154,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -15136,12 +15198,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2612 -+size: 2662 - location: clients/tests/test-client.py:test_004()/224 - cmd: $NMCLI --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15189,6 +15251,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15207,6 +15270,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -15250,12 +15314,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2602 -+size: 2652 - location: clients/tests/test-client.py:test_004()/225 - cmd: $NMCLI --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15303,6 +15367,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15321,6 +15386,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -15364,12 +15430,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2612 -+size: 2662 - location: clients/tests/test-client.py:test_004()/226 - cmd: $NMCLI --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15417,6 +15483,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15435,6 +15502,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -15478,12 +15546,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2027 -+size: 2077 - location: clients/tests/test-client.py:test_004()/227 - cmd: $NMCLI --terse -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15531,6 +15599,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15549,6 +15618,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -15571,12 +15641,12 @@ proxy.pac-url: - proxy.pac-script: - - <<< --size: 2037 -+size: 2087 - location: clients/tests/test-client.py:test_004()/228 - cmd: $NMCLI --terse -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -15624,6 +15694,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -15642,6 +15713,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18214,12 +18286,12 @@ connection.type:802-11-wireless - connection.interface-name: - - <<< --size: 2614 -+size: 2664 - location: clients/tests/test-client.py:test_004()/273 - cmd: $NMCLI --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18267,6 +18339,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18285,6 +18358,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18328,12 +18402,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2624 -+size: 2674 - location: clients/tests/test-client.py:test_004()/274 - cmd: $NMCLI --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18381,6 +18455,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18399,6 +18474,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18442,12 +18518,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2614 -+size: 2664 - location: clients/tests/test-client.py:test_004()/275 - cmd: $NMCLI --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18495,6 +18571,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18513,6 +18590,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18556,12 +18634,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2624 -+size: 2674 - location: clients/tests/test-client.py:test_004()/276 - cmd: $NMCLI --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18609,6 +18687,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18627,6 +18706,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18670,12 +18750,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2039 -+size: 2089 - location: clients/tests/test-client.py:test_004()/277 - cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18723,6 +18803,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18741,6 +18822,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -18763,12 +18845,12 @@ proxy.pac-url: - proxy.pac-script: - - <<< --size: 2049 -+size: 2099 - location: clients/tests/test-client.py:test_004()/278 - cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -18816,6 +18898,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -18834,6 +18917,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -21406,21 +21490,21 @@ connection.type:802-11-wireless - connection.interface-name: - - <<< --size: 3379 -+size: 3451 - location: clients/tests/test-client.py:test_004()/323 - cmd: $NMCLI --mode tabular con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3232 bytes -+stdout: 3304 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -21435,21 +21519,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3402 -+size: 3474 - location: clients/tests/test-client.py:test_004()/324 - cmd: $NMCLI --mode tabular con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3245 bytes -+stdout: 3317 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -21464,21 +21548,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3379 -+size: 3451 - location: clients/tests/test-client.py:test_004()/325 - cmd: $NMCLI --mode tabular con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3232 bytes -+stdout: 3304 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -21493,21 +21577,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3402 -+size: 3474 - location: clients/tests/test-client.py:test_004()/326 - cmd: $NMCLI --mode tabular con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3245 bytes -+stdout: 3317 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -21522,21 +21606,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 2627 -+size: 2699 - location: clients/tests/test-client.py:test_004()/327 - cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2473 bytes -+stdout: 2545 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -21546,21 +21630,21 @@ proxy none no -- -- - - - <<< --size: 2639 -+size: 2711 - location: clients/tests/test-client.py:test_004()/328 - cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2475 bytes -+stdout: 2547 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -23060,21 +23144,21 @@ interface-name - - - <<< --size: 3391 -+size: 3463 - location: clients/tests/test-client.py:test_004()/373 - cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3232 bytes -+stdout: 3304 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -23089,21 +23173,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3414 -+size: 3486 - location: clients/tests/test-client.py:test_004()/374 - cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3245 bytes -+stdout: 3317 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -23118,21 +23202,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3391 -+size: 3463 - location: clients/tests/test-client.py:test_004()/375 - cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3232 bytes -+stdout: 3304 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -23147,21 +23231,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 3414 -+size: 3486 - location: clients/tests/test-client.py:test_004()/376 - cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3245 bytes -+stdout: 3317 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -23176,21 +23260,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 2639 -+size: 2711 - location: clients/tests/test-client.py:test_004()/377 - cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2473 bytes -+stdout: 2545 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 -@@ -23200,21 +23284,21 @@ proxy none no -- -- - - - <<< --size: 2651 -+size: 2723 - location: clients/tests/test-client.py:test_004()/378 - cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2475 bytes -+stdout: 2547 bytes - >>> - name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr wait-device-timeout - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 -@@ -24714,12 +24798,12 @@ interface-name - - - <<< --size: 5346 -+size: 5454 - location: clients/tests/test-client.py:test_004()/423 - cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5190 bytes -+stdout: 5298 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -24728,13 +24812,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -24756,12 +24840,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5402 -+size: 5510 - location: clients/tests/test-client.py:test_004()/424 - cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5236 bytes -+stdout: 5344 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -24770,13 +24854,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -24798,12 +24882,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5346 -+size: 5454 - location: clients/tests/test-client.py:test_004()/425 - cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5190 bytes -+stdout: 5298 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -24812,13 +24896,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -24840,12 +24924,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5402 -+size: 5510 - location: clients/tests/test-client.py:test_004()/426 - cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5236 bytes -+stdout: 5344 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -24854,13 +24938,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -24882,12 +24966,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 4002 -+size: 4110 - location: clients/tests/test-client.py:test_004()/427 - cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3839 bytes -+stdout: 3947 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -24896,13 +24980,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -24914,12 +24998,12 @@ proxy none no -- -- - - - <<< --size: 4025 -+size: 4133 - location: clients/tests/test-client.py:test_004()/428 - cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3852 bytes -+stdout: 3960 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -24928,13 +25012,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27022,12 +27106,12 @@ interface-name - - - <<< --size: 5358 -+size: 5466 - location: clients/tests/test-client.py:test_004()/473 - cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5190 bytes -+stdout: 5298 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -27036,13 +27120,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27064,12 +27148,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5414 -+size: 5522 - location: clients/tests/test-client.py:test_004()/474 - cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5236 bytes -+stdout: 5344 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -27078,13 +27162,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27106,12 +27190,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5358 -+size: 5466 - location: clients/tests/test-client.py:test_004()/475 - cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5190 bytes -+stdout: 5298 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -27120,13 +27204,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27148,12 +27232,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 5414 -+size: 5522 - location: clients/tests/test-client.py:test_004()/476 - cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5236 bytes -+stdout: 5344 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -27162,13 +27246,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27190,12 +27274,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE - VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 4014 -+size: 4122 - location: clients/tests/test-client.py:test_004()/477 - cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3839 bytes -+stdout: 3947 bytes - >>> - ========================================== - Connection profile details (con-vpn-1) -@@ -27204,13 +27288,13 @@ name id uuid stable-id type in - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no -- -- 0 (default) yes -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) yes -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -27222,12 +27306,12 @@ proxy none no -- -- - - - <<< --size: 4037 -+size: 4145 - location: clients/tests/test-client.py:test_004()/478 - cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3852 bytes -+stdout: 3960 bytes - >>> - ============================================ - Szczegóły profilu połączenia (con-vpn-1) -@@ -27236,13 +27320,13 @@ name id uuid stable-id type in - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -1 - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -- -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-reject-servers -+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie -- -- 0 (default) tak -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -- - --name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- -+name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy addr-gen-mode ra-timeout dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-hostname-flags token -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -+ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (default) -1 (unknown) stable-privacy 0 (default) -- -- 0 (default) tak -- 0x0 (none) -- - - name service-type user-name data secrets persistent timeout - ------------------------------------------------------------------------------------------------------------------------------- -@@ -29330,94 +29414,94 @@ interface-name - - - <<< --size: 811 -+size: 817 - location: clients/tests/test-client.py:test_004()/523 - cmd: $NMCLI --mode tabular --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 821 -+size: 827 - location: clients/tests/test-client.py:test_004()/524 - cmd: $NMCLI --mode tabular --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 811 -+size: 817 - location: clients/tests/test-client.py:test_004()/525 - cmd: $NMCLI --mode tabular --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 821 -+size: 827 - location: clients/tests/test-client.py:test_004()/526 - cmd: $NMCLI --mode tabular --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 518 -+size: 524 - location: clients/tests/test-client.py:test_004()/527 - cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 357 bytes -+stdout: 363 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - - <<< --size: 528 -+size: 534 - location: clients/tests/test-client.py:test_004()/528 - cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 357 bytes -+stdout: 363 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - -@@ -30268,94 +30352,94 @@ UUID-con-xx1-REPLACED-REPLACED-REPLA - - - <<< --size: 823 -+size: 829 - location: clients/tests/test-client.py:test_004()/573 - cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 833 -+size: 839 - location: clients/tests/test-client.py:test_004()/574 - cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 823 -+size: 829 - location: clients/tests/test-client.py:test_004()/575 - cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 833 -+size: 839 - location: clients/tests/test-client.py:test_004()/576 - cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 657 bytes -+stdout: 663 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: - VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 - - <<< --size: 530 -+size: 536 - location: clients/tests/test-client.py:test_004()/577 - cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 357 bytes -+stdout: 363 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - - <<< --size: 540 -+size: 546 - location: clients/tests/test-client.py:test_004()/578 - cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 357 bytes -+stdout: 363 bytes - >>> - connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1:-1 --ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:: --ipv6:auto::::0::::-1:0::no:no:no:yes:-1:stable-privacy:0:::0:yes::0x0: -+ipv4:auto::::0::::-1:0::no:no:::0:yes:::0x0:no:yes:-1:-1:: -+ipv6:auto::::0::::-1:0::no:no:no:yes:-1:-1:stable-privacy:0:::0:yes::0x0: - vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 - proxy:none:no:: - -@@ -31206,12 +31290,12 @@ UUID-con-xx1-REPLACED-REPLACED-REPLA - - - <<< --size: 5169 -+size: 5275 - location: clients/tests/test-client.py:test_004()/623 - cmd: $NMCLI --mode multiline con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31259,6 +31343,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31277,6 +31362,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -31320,12 +31406,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5199 -+size: 5305 - location: clients/tests/test-client.py:test_004()/624 - cmd: $NMCLI --mode multiline con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31373,6 +31459,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31391,6 +31478,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -31434,12 +31522,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5169 -+size: 5275 - location: clients/tests/test-client.py:test_004()/625 - cmd: $NMCLI --mode multiline con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31487,6 +31575,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31505,6 +31594,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -31548,12 +31638,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5199 -+size: 5305 - location: clients/tests/test-client.py:test_004()/626 - cmd: $NMCLI --mode multiline con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31601,6 +31691,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31619,6 +31710,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -31662,12 +31754,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 4042 -+size: 4148 - location: clients/tests/test-client.py:test_004()/627 - cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3886 bytes -+stdout: 3992 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31715,6 +31807,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31733,6 +31826,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -31755,12 +31849,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4062 -+size: 4168 - location: clients/tests/test-client.py:test_004()/628 - cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3896 bytes -+stdout: 4002 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -31808,6 +31902,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -31826,6 +31921,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -34928,12 +35024,12 @@ connection.type: 802-11-wireless - connection.interface-name: -- - - <<< --size: 5181 -+size: 5287 - location: clients/tests/test-client.py:test_004()/673 - cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -34981,6 +35077,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -34999,6 +35096,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -35042,12 +35140,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5211 -+size: 5317 - location: clients/tests/test-client.py:test_004()/674 - cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -35095,6 +35193,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -35113,6 +35212,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -35156,12 +35256,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5181 -+size: 5287 - location: clients/tests/test-client.py:test_004()/675 - cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 5020 bytes -+stdout: 5126 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -35209,6 +35309,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -35227,6 +35328,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -35270,12 +35372,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 5211 -+size: 5317 - location: clients/tests/test-client.py:test_004()/676 - cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 5040 bytes -+stdout: 5146 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -35323,6 +35425,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -35341,6 +35444,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -35384,12 +35488,12 @@ VPN.CFG[2]: key2 = val2 - VPN.CFG[3]: key3 = val3 - - <<< --size: 4054 -+size: 4160 - location: clients/tests/test-client.py:test_004()/677 - cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 3886 bytes -+stdout: 3992 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -35437,6 +35541,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -35455,6 +35560,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -35477,12 +35583,12 @@ proxy.pac-url: -- - proxy.pac-script: -- - - <<< --size: 4074 -+size: 4180 - location: clients/tests/test-client.py:test_004()/678 - cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 3896 bytes -+stdout: 4002 bytes - >>> - connection.id: con-vpn-1 - connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -35530,6 +35636,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -35548,6 +35655,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -38650,12 +38758,12 @@ connection.type: 802-11-wireless - connection.interface-name: -- - - <<< --size: 6190 -+size: 6296 - location: clients/tests/test-client.py:test_004()/723 - cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -38707,6 +38815,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -38726,6 +38835,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -38777,12 +38887,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6232 -+size: 6338 - location: clients/tests/test-client.py:test_004()/724 - cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -38834,6 +38944,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -38853,6 +38964,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -38904,12 +39016,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6190 -+size: 6296 - location: clients/tests/test-client.py:test_004()/725 - cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -38961,6 +39073,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -38980,6 +39093,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -39031,12 +39145,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6232 -+size: 6338 - location: clients/tests/test-client.py:test_004()/726 - cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -39088,6 +39202,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -39107,6 +39222,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -39158,12 +39274,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 4670 -+size: 4776 - location: clients/tests/test-client.py:test_004()/727 - cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 4505 bytes -+stdout: 4611 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -39215,6 +39331,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -39234,6 +39351,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -39259,12 +39377,12 @@ proxy.pac-script: -- - ------------------------------------------------------------------------------- - - <<< --size: 4695 -+size: 4801 - location: clients/tests/test-client.py:test_004()/728 - cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4520 bytes -+stdout: 4626 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -39316,6 +39434,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -39335,6 +39454,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43074,12 +43194,12 @@ connection.interface-name: -- - ------------------------------------------------------------------------------- - - <<< --size: 6202 -+size: 6308 - location: clients/tests/test-client.py:test_004()/773 - cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -43131,6 +43251,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43150,6 +43271,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43201,12 +43323,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6244 -+size: 6350 - location: clients/tests/test-client.py:test_004()/774 - cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -43258,6 +43380,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43277,6 +43400,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43328,12 +43452,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6202 -+size: 6308 - location: clients/tests/test-client.py:test_004()/775 - cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 6032 bytes -+stdout: 6138 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -43385,6 +43509,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43404,6 +43529,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43455,12 +43581,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 6244 -+size: 6350 - location: clients/tests/test-client.py:test_004()/776 - cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 6064 bytes -+stdout: 6170 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -43512,6 +43638,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43531,6 +43658,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43582,12 +43710,12 @@ VPN.CFG[3]: key3 = val3 - ------------------------------------------------------------------------------- - - <<< --size: 4682 -+size: 4788 - location: clients/tests/test-client.py:test_004()/777 - cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 4505 bytes -+stdout: 4611 bytes - >>> - =============================================================================== - Connection profile details (con-vpn-1) -@@ -43639,6 +43767,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: no - ipv4.may-fail: yes -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43658,6 +43787,7 @@ ipv6.ignore-auto-routes: no - ipv6.ignore-auto-dns: no - ipv6.never-default: no - ipv6.may-fail: yes -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -43683,12 +43813,12 @@ proxy.pac-script: -- - ------------------------------------------------------------------------------- - - <<< --size: 4707 -+size: 4813 - location: clients/tests/test-client.py:test_004()/778 - cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 4520 bytes -+stdout: 4626 bytes - >>> - =============================================================================== - Szczegóły profilu połączenia (con-vpn-1) -@@ -43740,6 +43870,7 @@ ipv4.dhcp-fqdn: -- - ipv4.dhcp-hostname-flags: 0x0 (none) - ipv4.never-default: nie - ipv4.may-fail: tak -+ipv4.required-timeout: -1 (default) - ipv4.dad-timeout: -1 (default) - ipv4.dhcp-vendor-class-identifier: -- - ipv4.dhcp-reject-servers: -- -@@ -43759,6 +43890,7 @@ ipv6.ignore-auto-routes: nie - ipv6.ignore-auto-dns: nie - ipv6.never-default: nie - ipv6.may-fail: tak -+ipv6.required-timeout: -1 (default) - ipv6.ip6-privacy: -1 (unknown) - ipv6.addr-gen-mode: stable-privacy - ipv6.ra-timeout: 0 (default) -@@ -47498,12 +47630,12 @@ connection.interface-name: -- - ------------------------------------------------------------------------------- - - <<< --size: 2619 -+size: 2669 - location: clients/tests/test-client.py:test_004()/823 - cmd: $NMCLI --mode multiline --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -47551,6 +47683,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -47569,6 +47702,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -47612,12 +47746,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2629 -+size: 2679 - location: clients/tests/test-client.py:test_004()/824 - cmd: $NMCLI --mode multiline --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -47665,6 +47799,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -47683,6 +47818,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -47726,12 +47862,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2619 -+size: 2669 - location: clients/tests/test-client.py:test_004()/825 - cmd: $NMCLI --mode multiline --terse con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -47779,6 +47915,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -47797,6 +47934,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -47840,12 +47978,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2629 -+size: 2679 - location: clients/tests/test-client.py:test_004()/826 - cmd: $NMCLI --mode multiline --terse con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -47893,6 +48031,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -47911,6 +48050,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -47954,12 +48094,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2044 -+size: 2094 - location: clients/tests/test-client.py:test_004()/827 - cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -48007,6 +48147,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -48025,6 +48166,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -48047,12 +48189,12 @@ proxy.pac-url: - proxy.pac-script: - - <<< --size: 2054 -+size: 2104 - location: clients/tests/test-client.py:test_004()/828 - cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -48100,6 +48242,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -48118,6 +48261,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51220,12 +51364,12 @@ connection.type:802-11-wireless - connection.interface-name: - - <<< --size: 2631 -+size: 2681 - location: clients/tests/test-client.py:test_004()/873 - cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51273,6 +51417,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51291,6 +51436,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51334,12 +51480,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2641 -+size: 2691 - location: clients/tests/test-client.py:test_004()/874 - cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51387,6 +51533,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51405,6 +51552,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51448,12 +51596,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2631 -+size: 2681 - location: clients/tests/test-client.py:test_004()/875 - cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 - lang: C - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51501,6 +51649,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51519,6 +51668,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51562,12 +51712,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2641 -+size: 2691 - location: clients/tests/test-client.py:test_004()/876 - cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 2462 bytes -+stdout: 2512 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51615,6 +51765,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51633,6 +51784,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51676,12 +51828,12 @@ VPN.CFG[2]:key2 = val2 - VPN.CFG[3]:key3 = val3 - - <<< --size: 2056 -+size: 2106 - location: clients/tests/test-client.py:test_004()/877 - cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 - lang: C - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51729,6 +51881,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51747,6 +51900,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -@@ -51769,12 +51923,12 @@ proxy.pac-url: - proxy.pac-script: - - <<< --size: 2066 -+size: 2116 - location: clients/tests/test-client.py:test_004()/878 - cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 - lang: pl_PL.UTF-8 - returncode: 0 --stdout: 1880 bytes -+stdout: 1930 bytes - >>> - connection.id:con-vpn-1 - connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP -@@ -51822,6 +51976,7 @@ ipv4.dhcp-fqdn: - ipv4.dhcp-hostname-flags:0x0 - ipv4.never-default:no - ipv4.may-fail:yes -+ipv4.required-timeout:-1 - ipv4.dad-timeout:-1 - ipv4.dhcp-vendor-class-identifier: - ipv4.dhcp-reject-servers: -@@ -51840,6 +51995,7 @@ ipv6.ignore-auto-routes:no - ipv6.ignore-auto-dns:no - ipv6.never-default:no - ipv6.may-fail:yes -+ipv6.required-timeout:-1 - ipv6.ip6-privacy:-1 - ipv6.addr-gen-mode:stable-privacy - ipv6.ra-timeout:0 -diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c -index 45ecbd8868..efee988927 100644 ---- a/libnm-core/nm-setting-ip-config.c -+++ b/libnm-core/nm-setting-ip-config.c -@@ -3679,6 +3679,7 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMSettingIPConfig, - PROP_MAY_FAIL, - PROP_DAD_TIMEOUT, - PROP_DHCP_TIMEOUT, -+ PROP_REQUIRED_TIMEOUT, - PROP_DHCP_IAID, - PROP_DHCP_REJECT_SERVERS, ); - -@@ -3699,6 +3700,7 @@ typedef struct { - int dns_priority; - int dad_timeout; - int dhcp_timeout; -+ int required_timeout; - guint32 route_table; - bool ignore_auto_routes : 1; - bool ignore_auto_dns : 1; -@@ -4979,6 +4981,25 @@ nm_setting_ip_config_get_dhcp_timeout(NMSettingIPConfig *setting) - return NM_SETTING_IP_CONFIG_GET_PRIVATE(setting)->dhcp_timeout; - } - -+/** -+ * nm_setting_ip_config_get_required_timeout: -+ * @setting: the #NMSettingIPConfig -+ * -+ * Returns the value contained in the #NMSettingIPConfig:required-timeout -+ * property. -+ * -+ * Returns: the required timeout for the address family -+ * -+ * Since: 1.34, 1.32.4, 1.30.8 -+ **/ -+int -+nm_setting_ip_config_get_required_timeout(NMSettingIPConfig *setting) -+{ -+ g_return_val_if_fail(NM_IS_SETTING_IP_CONFIG(setting), -1); -+ -+ return NM_SETTING_IP_CONFIG_GET_PRIVATE(setting)->required_timeout; -+} -+ - /** - * nm_setting_ip_config_get_dhcp_iaid: - * @setting: the #NMSettingIPConfig -@@ -5627,6 +5648,9 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) - case PROP_DHCP_TIMEOUT: - g_value_set_int(value, nm_setting_ip_config_get_dhcp_timeout(setting)); - break; -+ case PROP_REQUIRED_TIMEOUT: -+ g_value_set_int(value, nm_setting_ip_config_get_required_timeout(setting)); -+ break; - case PROP_DHCP_IAID: - g_value_set_string(value, nm_setting_ip_config_get_dhcp_iaid(setting)); - break; -@@ -5737,6 +5761,9 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps - case PROP_DHCP_TIMEOUT: - priv->dhcp_timeout = g_value_get_int(value); - break; -+ case PROP_REQUIRED_TIMEOUT: -+ priv->required_timeout = g_value_get_int(value); -+ break; - case PROP_DHCP_IAID: - priv->dhcp_iaid = g_value_dup_string(value); - break; -@@ -5767,6 +5794,7 @@ nm_setting_ip_config_init(NMSettingIPConfig *setting) - priv->dhcp_send_hostname = TRUE; - priv->may_fail = TRUE; - priv->dad_timeout = -1; -+ priv->required_timeout = -1; - } - - static void -@@ -6201,6 +6229,38 @@ nm_setting_ip_config_class_init(NMSettingIPConfigClass *klass) - 0, - G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_STATIC_STRINGS); - -+ /** -+ * NMSettingIPConfig:required-timeout: -+ * -+ * The minimum time interval in milliseconds for which dynamic IP configuration -+ * should be tried before the connection succeeds. -+ * -+ * This property is useful for example if both IPv4 and IPv6 are enabled and -+ * are allowed to fail. Normally the connection succeeds as soon as one of -+ * the two address families completes; by setting a required timeout for -+ * e.g. IPv4, one can ensure that even if IP6 succeeds earlier than IPv4, -+ * NetworkManager waits some time for IPv4 before the connection becomes -+ * active. -+ * -+ * Note that if #NMSettingIPConfig:may-fail is FALSE for the same address -+ * family, this property has no effect as NetworkManager needs to wait for -+ * the full DHCP timeout. -+ * -+ * A zero value means that no required timeout is present, -1 means the -+ * default value (either configuration ipvx.required-timeout override or -+ * zero). -+ * -+ * Since: 1.34, 1.32.4, 1.30.8 -+ **/ -+ obj_properties[PROP_REQUIRED_TIMEOUT] = g_param_spec_int( -+ NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -+ "", -+ "", -+ -1, -+ G_MAXINT32, -+ -1, -+ G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_STATIC_STRINGS); -+ - /** - * NMSettingIPConfig:dhcp-iaid: - * -diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h -index 1cb1671714..fde604bbc5 100644 ---- a/libnm-core/nm-setting-ip-config.h -+++ b/libnm-core/nm-setting-ip-config.h -@@ -319,6 +319,7 @@ char *nm_ip_routing_rule_to_string(const NMIPRoutingRule * self, - #define NM_SETTING_IP_CONFIG_MAY_FAIL "may-fail" - #define NM_SETTING_IP_CONFIG_DAD_TIMEOUT "dad-timeout" - #define NM_SETTING_IP_CONFIG_DHCP_TIMEOUT "dhcp-timeout" -+#define NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT "required-timeout" - #define NM_SETTING_IP_CONFIG_DHCP_IAID "dhcp-iaid" - #define NM_SETTING_IP_CONFIG_DHCP_REJECT_SERVERS "dhcp-reject-servers" - -@@ -473,6 +474,8 @@ NM_AVAILABLE_IN_1_2 - int nm_setting_ip_config_get_dad_timeout(NMSettingIPConfig *setting); - NM_AVAILABLE_IN_1_2 - int nm_setting_ip_config_get_dhcp_timeout(NMSettingIPConfig *setting); -+NM_AVAILABLE_IN_1_30_8 -+int nm_setting_ip_config_get_required_timeout(NMSettingIPConfig *setting); - NM_AVAILABLE_IN_1_22 - const char *nm_setting_ip_config_get_dhcp_iaid(NMSettingIPConfig *setting); - -diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c -index 885319fc16..217632dfc1 100644 ---- a/libnm-core/tests/test-general.c -+++ b/libnm-core/tests/test-general.c -@@ -3668,6 +3668,7 @@ test_connection_diff_a_only(void) - {NM_SETTING_IP_CONFIG_NEVER_DEFAULT, NM_SETTING_DIFF_RESULT_IN_A}, - {NM_SETTING_IP_CONFIG_MAY_FAIL, NM_SETTING_DIFF_RESULT_IN_A}, - {NM_SETTING_IP_CONFIG_DAD_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A}, -+ {NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A}, - {NM_SETTING_IP_CONFIG_DNS_PRIORITY, NM_SETTING_DIFF_RESULT_IN_A}, - {NM_SETTING_IP_CONFIG_DHCP_IAID, NM_SETTING_DIFF_RESULT_IN_A}, - {NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, NM_SETTING_DIFF_RESULT_IN_A}, -diff --git a/libnm/libnm.ver b/libnm/libnm.ver -index c61792c749..7cdcf8104f 100644 ---- a/libnm/libnm.ver -+++ b/libnm/libnm.ver -@@ -1784,3 +1784,8 @@ global: - nm_setting_veth_new; - nm_utils_print; - } libnm_1_28_0; -+ -+libnm_1_30_8 { -+global: -+ nm_setting_ip_config_get_required_timeout; -+} libnm_1_30_0; -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 a42c418884..9c05cd278b 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 -@@ -1896,6 +1896,8 @@ make_ip4_setting(shvarFile *ifcfg, - svGetValueBoolean(ifcfg, "DHCP_SEND_HOSTNAME", TRUE), - NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, - (int) svGetValueInt64(ifcfg, "IPV4_DHCP_TIMEOUT", 10, 0, G_MAXINT32, 0), -+ NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -+ (int) svGetValueInt64(ifcfg, "IPV4_REQUIRED_TIMEOUT", 10, 0, G_MAXINT32, -1), - NULL); - - nm_clear_g_free(&value); -@@ -2404,6 +2406,8 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea - svGetValueBoolean(ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), - NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, - (int) svGetValueInt64(ifcfg, "IPV6_DHCP_TIMEOUT", 10, 0, G_MAXINT32, 0), -+ NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -+ (int) svGetValueInt64(ifcfg, "IPV6_REQUIRED_TIMEOUT", 10, 0, G_MAXINT32, -1), - NM_SETTING_IP6_CONFIG_RA_TIMEOUT, - (int) svGetValueInt64(ifcfg, "IPV6_RA_TIMEOUT", 10, 0, G_MAXINT32, 0), - NULL); -diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -index ada1942acb..d40c64dfbf 100644 ---- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c -@@ -942,6 +942,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = { - _KEY_TYPE("IPV4_DHCP_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV4_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV4_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -+ _KEY_TYPE("IPV4_REQUIRED_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV4_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV4_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6ADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -@@ -964,6 +965,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = { - _KEY_TYPE("IPV6_PRIVACY", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6_PRIVACY_PREFER_PUBLIC_IP", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6_RA_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -+ _KEY_TYPE("IPV6_REQUIRED_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6_RES_OPTIONS", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN), - _KEY_TYPE("IPV6_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN), -diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -index 04a1b63d3e..d100c1462f 100644 ---- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h -@@ -33,7 +33,7 @@ typedef struct { - NMSIfcfgKeyTypeFlags key_flags; - } NMSIfcfgKeyTypeInfo; - --extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[248]; -+extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[250]; - - const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info(const char *key, gssize *out_idx); - -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 65bacb293a..a6c251c039 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 -@@ -2824,6 +2824,9 @@ write_ip4_setting(NMConnection *connection, - timeout = nm_setting_ip_config_get_dhcp_timeout(s_ip4); - svSetValueInt64_cond(ifcfg, "IPV4_DHCP_TIMEOUT", timeout != 0, timeout); - -+ timeout = nm_setting_ip_config_get_required_timeout(s_ip4); -+ svSetValueInt64_cond(ifcfg, "IPV4_REQUIRED_TIMEOUT", timeout != -1, timeout); -+ - svSetValueBoolean(ifcfg, "IPV4_FAILURE_FATAL", !nm_setting_ip_config_get_may_fail(s_ip4)); - - route_metric = nm_setting_ip_config_get_route_metric(s_ip4); -@@ -3021,6 +3024,9 @@ write_ip6_setting(NMConnection *connection, - timeout = nm_setting_ip_config_get_dhcp_timeout(s_ip6); - svSetValueInt64_cond(ifcfg, "IPV6_DHCP_TIMEOUT", timeout != 0, timeout); - -+ timeout = nm_setting_ip_config_get_required_timeout(s_ip6); -+ svSetValueInt64_cond(ifcfg, "IPV6_REQUIRED_TIMEOUT", timeout != -1, timeout); -+ - flags = nm_setting_ip_config_get_dhcp_hostname_flags(s_ip6); - svSetValueInt64_cond(ifcfg, - "DHCPV6_HOSTNAME_FLAGS", --- -2.31.1 - -From bfc0ee437556c9d4f7bf2daa659b7e17f729cbfa Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Wed, 23 Jun 2021 18:08:47 +0200 -Subject: [PATCH 8/9] device: use the 'required-timeout' property from IP - setting - -Change the logic in check_ip_state() to delay the connection ACTIVATED -state if an address family is pending and its required-timeout has not -expired. - -(cherry picked from commit 35cccc41cbb46707a5714f2b132623bd772bae84) -(cherry picked from commit 51e5df275c10855319d0a29cde1cebd5e9be0f38) -(cherry picked from commit 65868803e03c32fa0fe91664ca98818a17b37b40) ---- - man/NetworkManager.conf.xml | 6 ++ - src/core/devices/nm-device.c | 116 +++++++++++++++++++++++++++++++++++ - 2 files changed, 122 insertions(+) - -diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml -index 79f18e45e9..512b2d2203 100644 ---- a/man/NetworkManager.conf.xml -+++ b/man/NetworkManager.conf.xml -@@ -800,6 +800,9 @@ ipv6.ip6-privacy=0 - If unspecified or zero, use 50 for VPN profiles - and 100 for other profiles. - -+ -+ ipv4.required-timeout -+ - - ipv4.route-metric - -@@ -842,6 +845,9 @@ ipv6.ip6-privacy=0 - "/proc/sys/net/ipv6/conf/default/use_tempaddr" as last fallback. - - -+ -+ ipv6.required-timeout -+ - - ipv6.route-metric - -diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c -index 901d309c59..79286557bc 100644 ---- a/src/core/devices/nm-device.c -+++ b/src/core/devices/nm-device.c -@@ -493,6 +493,7 @@ typedef struct _NMDevicePrivate { - bool device_link_changed_down : 1; - - bool concheck_rp_filter_checked : 1; -+ bool ip_config_started : 1; - - NMDeviceStageState stage1_sriov_state : 3; - -@@ -501,6 +502,14 @@ typedef struct _NMDevicePrivate { - - char *current_stable_id; - -+ union { -+ struct { -+ GSource *ip_req_timeout_source_6; -+ GSource *ip_req_timeout_source_4; -+ }; -+ GSource *ip_req_timeout_source_x[2]; -+ }; -+ - /* Proxy Configuration */ - NMProxyConfig * proxy_config; - NMPacrunnerConfId *pacrunner_conf_id; -@@ -764,6 +773,7 @@ static void sriov_op_cb(GError *error, gpointer user_data); - - static void device_ifindex_changed_cb(NMManager *manager, NMDevice *device_changed, NMDevice *self); - static gboolean device_link_changed(NMDevice *self); -+static void check_ip_state(NMDevice *self, gboolean may_fail, gboolean full_state_update); - - /*****************************************************************************/ - -@@ -1500,6 +1510,40 @@ out: - return timeout; - } - -+static guint32 -+_prop_get_ipvx_required_timeout(NMDevice *self, int addr_family) -+{ -+ NMConnection * connection; -+ NMSettingIPConfig *s_ip; -+ int timeout; -+ -+ nm_assert(NM_IS_DEVICE(self)); -+ nm_assert_addr_family(addr_family); -+ -+ connection = nm_device_get_applied_connection(self); -+ if (!connection) -+ return 0; -+ -+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family); -+ if (!s_ip) -+ return 0; -+ -+ timeout = nm_setting_ip_config_get_required_timeout(s_ip); -+ nm_assert(timeout >= -1); -+ -+ if (timeout > -1) -+ return (guint32) timeout; -+ -+ return nm_config_data_get_connection_default_int64( -+ NM_CONFIG_GET_DATA, -+ NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.required-timeout") -+ : NM_CON_DEFAULT("ipv6.required-timeout"), -+ self, -+ 0, -+ G_MAXINT32, -+ 0); -+} -+ - /** - * _prop_get_ipvx_dhcp_iaid: - * @self: the #NMDevice -@@ -2818,14 +2862,72 @@ static NM_UTILS_LOOKUP_STR_DEFINE(_ip_state_to_string, - NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_IP_STATE_DONE, "done"), - NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_IP_STATE_FAIL, "fail"), ); - -+static gboolean -+ip_required_timeout_x(NMDevice *self, int addr_family) -+{ -+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); -+ -+ _LOGD(LOGD_CORE, -+ "required-timeout expired for IPv%c", -+ nm_utils_addr_family_to_char(addr_family)); -+ nm_clear_g_source_inst(&priv->ip_req_timeout_source_x[NM_IS_IPv4(addr_family)]); -+ check_ip_state(self, FALSE, TRUE); -+ return G_SOURCE_CONTINUE; -+} -+ -+static gboolean -+ip_required_timeout_4(gpointer data) -+{ -+ return ip_required_timeout_x(data, AF_INET); -+} -+ -+static gboolean -+ip_required_timeout_6(gpointer data) -+{ -+ return ip_required_timeout_x(data, AF_INET6); -+} -+ - static void - _set_ip_state(NMDevice *self, int addr_family, NMDeviceIPState new_state) - { - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); - const int IS_IPv4 = NM_IS_IPv4(addr_family); -+ guint timeout_msec; -+ int v4; - - nm_assert_addr_family(addr_family); - -+ if (new_state == NM_DEVICE_IP_STATE_CONF && !priv->ip_config_started) { -+ /* Start the required-timeout timers when one of IPv4/IPv6 -+ * enters the CONF state. This means that if there is no carrier and -+ * ipv4.method=auto,ipv6.method=manual, the timeout for IPv4 will -+ * start as soon as connection is activated, even if DHCPv4 did not -+ * start yet. -+ */ -+ priv->ip_config_started = TRUE; -+ -+ for (v4 = 1; v4 >= 0; v4--) { -+ char buf[32]; -+ -+ nm_assert(!priv->ip_req_timeout_source_x[v4]); -+ if ((timeout_msec = _prop_get_ipvx_required_timeout(self, v4 ? AF_INET : AF_INET6))) { -+ _LOGD(LOGD_CORE, -+ "required-timeout in %s msec for IPv%c", -+ timeout_msec == G_MAXINT32 ? "∞" : nm_sprintf_buf(buf, "%u", timeout_msec), -+ v4 ? '4' : '6'); -+ -+ if (timeout_msec == G_MAXINT32) { -+ priv->ip_req_timeout_source_x[v4] = g_source_ref(nm_g_source_sentinel_get(0)); -+ } else { -+ priv->ip_req_timeout_source_x[v4] = -+ nm_g_timeout_add_source(timeout_msec, -+ v4 ? ip_required_timeout_4 : ip_required_timeout_6, -+ self); -+ } -+ } -+ } -+ } -+ - if (priv->ip_state_x[IS_IPv4] == new_state) - return; - -@@ -6618,6 +6720,7 @@ check_ip_state(NMDevice *self, gboolean may_fail, gboolean full_state_update) - gboolean ip4_disabled = FALSE, ip6_disabled = FALSE; - NMSettingIPConfig *s_ip4, *s_ip6; - NMDeviceState state; -+ int IS_IPv4; - - if (full_state_update && nm_device_get_state(self) != NM_DEVICE_STATE_IP_CONFIG) - return; -@@ -6647,6 +6750,13 @@ check_ip_state(NMDevice *self, gboolean may_fail, gboolean full_state_update) - return; - } - -+ for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { -+ if (priv->ip_state_x[IS_IPv4] == NM_DEVICE_IP_STATE_CONF -+ && priv->ip_req_timeout_source_x[IS_IPv4]) { -+ return; -+ } -+ } -+ - if ((priv->ip_state_4 == NM_DEVICE_IP_STATE_FAIL - || (ip4_disabled && priv->ip_state_4 == NM_DEVICE_IP_STATE_DONE)) - && (priv->ip_state_6 == NM_DEVICE_IP_STATE_FAIL -@@ -11793,6 +11903,8 @@ activate_stage5_ip_config_result_x(NMDevice *self, int addr_family) - req = nm_device_get_act_request(self); - g_assert(req); - -+ nm_clear_g_source_inst(&priv->ip_req_timeout_source_x[IS_IPv4]); -+ - /* Interface must be IFF_UP before IP config can be applied */ - ip_ifindex = nm_device_get_ip_ifindex(self); - g_return_if_fail(ip_ifindex); -@@ -15769,6 +15881,10 @@ _cleanup_generic_pre(NMDevice *self, CleanupType cleanup_type) - - _cleanup_ip_pre(self, AF_INET, cleanup_type); - _cleanup_ip_pre(self, AF_INET6, cleanup_type); -+ -+ priv->ip_config_started = FALSE; -+ nm_clear_g_source_inst(&priv->ip_req_timeout_source_4); -+ nm_clear_g_source_inst(&priv->ip_req_timeout_source_6); - } - - static void --- -2.31.1 - -From 0f9e872e509937a0693dd9c351bf71629a5e7174 Mon Sep 17 00:00:00 2001 -From: Beniamino Galvani -Date: Thu, 24 Jun 2021 08:09:10 +0200 -Subject: [PATCH 9/9] initrd: set required-timeout for default IPv4 - configuration - -If the kernel command-line doesn't contain an explict ip=$method, -currently the generator creates connections with both IPv4 and IPv6 -set to 'auto', and both allowed to fail. - -Since NM is run in configure-and-quit mode in the initrd, NM can get -an IPv4 address or an IPv6 one (or both) depending on which address -family is quicker to complete. This unpredictable behavior is not -present in the legacy module, which always does IPv4 only by default. - -Set a required-timeout of 20 seconds for IPv4, so that NM will -preferably get an IPv4, or will fall back to IPv6. - -See also: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/729 - -(cherry picked from commit 0a18e97345894a6ea76fd336a5b4e2ed7a1b537b) -(cherry picked from commit 1b9cf8c513767ecb41407224e5c4f0b7f6947db8) -(cherry picked from commit 3565f155fb91cf5d5cff695a69925065a8a6c2c6) ---- - src/core/initrd/nm-initrd-generator.h | 1 + - src/core/initrd/nmi-cmdline-reader.c | 32 +++++++++------ - src/core/initrd/tests/test-cmdline-reader.c | 44 ++++++++++++++++++++- - 3 files changed, 63 insertions(+), 14 deletions(-) - -diff --git a/src/core/initrd/nm-initrd-generator.h b/src/core/initrd/nm-initrd-generator.h -index 534edcb783..2ec52a010a 100644 ---- a/src/core/initrd/nm-initrd-generator.h -+++ b/src/core/initrd/nm-initrd-generator.h -@@ -10,6 +10,7 @@ - #include "nm-utils.h" - - #define NMI_WAIT_DEVICE_TIMEOUT_MSEC 60000 -+#define NMI_IP_REQUIRED_TIMEOUT_MSEC 20000 - - static inline int - get_ip_address_family(const char *str, gboolean with_prefix) -diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c -index 2202ab34ea..5d737a4434 100644 ---- a/src/core/initrd/nmi-cmdline-reader.c -+++ b/src/core/initrd/nmi-cmdline-reader.c -@@ -117,6 +117,8 @@ reader_create_connection(Reader * reader, - reader->dhcp_timeout, - NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, - reader->dhcp4_vci, -+ NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -+ NMI_IP_REQUIRED_TIMEOUT_MSEC, - NULL); - - setting = nm_setting_ip6_config_new(); -@@ -399,18 +401,19 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - gs_unref_hashtable GHashTable *ibft = NULL; - const char * tmp; - const char * tmp2; -- const char * kind = NULL; -- const char * client_ip = NULL; -- const char * peer = NULL; -- const char * gateway_ip = NULL; -- const char * netmask = NULL; -- const char * client_hostname = NULL; -- const char * iface_spec = NULL; -- const char * mtu = NULL; -- const char * macaddr = NULL; -- int client_ip_family = AF_UNSPEC; -- int client_ip_prefix = -1; -- const char * dns[2] = { -+ const char * kind = NULL; -+ const char * client_ip = NULL; -+ const char * peer = NULL; -+ const char * gateway_ip = NULL; -+ const char * netmask = NULL; -+ const char * client_hostname = NULL; -+ const char * iface_spec = NULL; -+ const char * mtu = NULL; -+ const char * macaddr = NULL; -+ int client_ip_family = AF_UNSPEC; -+ int client_ip_prefix = -1; -+ gboolean clear_ip4_required_timeout = TRUE; -+ const char * dns[2] = { - NULL, - NULL, - }; -@@ -672,8 +675,13 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) - g_clear_error(&error); - } - } -+ } else { -+ clear_ip4_required_timeout = FALSE; - } - -+ if (clear_ip4_required_timeout) -+ g_object_set(s_ip4, NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -1, NULL); -+ - if (peer && *peer) - _LOGW(LOGD_CORE, "Ignoring peer: %s (not implemented)\n", peer); - -diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c -index cffa607ce7..d228d14d81 100644 ---- a/src/core/initrd/tests/test-cmdline-reader.c -+++ b/src/core/initrd/tests/test-cmdline-reader.c -@@ -276,6 +276,7 @@ test_dhcp_timeout(void) - ==, - NM_SETTING_IP4_CONFIG_METHOD_AUTO); - g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip4), ==, data[i].timeout); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip4), ==, -1); - - s_ip6 = nm_connection_get_setting_ip6_config(connection); - g_assert(s_ip6); -@@ -283,6 +284,7 @@ test_dhcp_timeout(void) - ==, - NM_SETTING_IP6_CONFIG_METHOD_AUTO); - g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, data[i].timeout); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); - } - } - -@@ -421,6 +423,7 @@ test_if_ip4_manual(void) - g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24); - g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.0.2.1"); - g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname0.example.com"); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip4), ==, -1); - - s_ip6 = nm_connection_get_setting_ip6_config(connection); - g_assert(s_ip6); -@@ -428,6 +431,7 @@ test_if_ip4_manual(void) - ==, - NM_SETTING_IP6_CONFIG_METHOD_DISABLED); - g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); - - connection = g_hash_table_lookup(connections, "eth4"); - nmtst_assert_connection_verifies_without_normalization(connection); -@@ -1155,6 +1159,9 @@ test_bridge(void) - g_assert_cmpint(nm_ip_route_get_metric(ip_route), ==, -1); - g_assert(!nm_ip_route_get_next_hop(ip_route)); - g_assert_cmpint(nm_ip_route_get_prefix(ip_route), ==, 32); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip4), -+ ==, -+ NMI_IP_REQUIRED_TIMEOUT_MSEC); - - s_ip6 = nm_connection_get_setting_ip6_config(connection); - g_assert(s_ip6); -@@ -1164,6 +1171,7 @@ test_bridge(void) - g_assert(!nm_setting_ip_config_get_gateway(s_ip6)); - g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0); - g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, 10); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); - - s_bridge = nm_connection_get_setting_bridge(connection); - g_assert(s_bridge); -@@ -1904,7 +1912,38 @@ test_bootif_ip(void) - } - - static void --test_neednet(void) -+test_neednet_no_args(void) -+{ -+ const char *const *ARGV = NM_MAKE_STRV("rd.neednet"); -+ gs_unref_object NMConnection *connection = NULL; -+ NMSettingWired * s_wired; -+ NMSettingIPConfig * s_ip4; -+ NMSettingIPConfig * s_ip6; -+ -+ connection = _parse_con(ARGV, "default_connection"); -+ -+ g_assert_cmpstr(nm_connection_get_id(connection), ==, "Wired Connection"); -+ -+ s_wired = nm_connection_get_setting_wired(connection); -+ g_assert(s_wired); -+ -+ s_ip4 = nm_connection_get_setting_ip4_config(connection); -+ g_assert(s_ip4); -+ g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); -+ g_assert(nm_setting_ip_config_get_may_fail(s_ip4)); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip4), -+ ==, -+ NMI_IP_REQUIRED_TIMEOUT_MSEC); -+ -+ s_ip6 = nm_connection_get_setting_ip6_config(connection); -+ g_assert(s_ip6); -+ g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO); -+ g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); -+ g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); -+} -+ -+static void -+test_neednet_args(void) - { - gs_unref_hashtable GHashTable *connections = NULL; - const char *const * ARGV = NM_MAKE_STRV("rd.neednet", -@@ -2238,7 +2277,8 @@ main(int argc, char **argv) - g_test_add_func("/initrd/cmdline/bootif/no_ip", test_bootif_no_ip); - g_test_add_func("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype); - g_test_add_func("/initrd/cmdline/bootif/off", test_bootif_off); -- g_test_add_func("/initrd/cmdline/neednet", test_neednet); -+ g_test_add_func("/initrd/cmdline/neednet/no_args", test_neednet_no_args); -+ g_test_add_func("/initrd/cmdline/neednet/args", test_neednet_args); - g_test_add_func("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id); - g_test_add_func("/initrd/cmdline/infiniband/iface", test_infiniband_iface); - g_test_add_func("/initrd/cmdline/infiniband/mac", test_infiniband_mac); --- -2.31.1 - diff --git a/SOURCES/1016-cloud-setup-azure-fix-gateway-rh1912236.patch b/SOURCES/1016-cloud-setup-azure-fix-gateway-rh1912236.patch deleted file mode 100644 index d5b845b..0000000 --- a/SOURCES/1016-cloud-setup-azure-fix-gateway-rh1912236.patch +++ /dev/null @@ -1,461 +0,0 @@ -From 302779f46c6d04eb92257606826c97c0e226ff29 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 13:46:29 +0200 -Subject: [PATCH 1/4] cloud-setup: remove redundant check in Azure's - _get_net_ifaces_list_cb() - -This condition always true, because there is a check above. - -(cherry picked from commit d3f07d5ca2a459e3410611902d2de02bb7be1ae7) -(cherry picked from commit 3256239b1f2b31359861c85c642c7009f07f3797) ---- - clients/cloud-setup/nmcs-provider-azure.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index a0e6076fd3..b9c0ffc08a 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -434,7 +434,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat - * extra NULL character after the buffer. */ - ((char *) line)[line_len] = '\0'; - -- if (line[line_len - 1] == '/' && line_len != 0) -+ if (line[line_len - 1] == '/') - ((char *) line)[--line_len] = '\0'; - - intern_iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1); --- -2.31.1 - - -From 0b885286ad2a350d14933b54002b943cc032ad96 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 14:31:58 +0200 -Subject: [PATCH 2/4] cloud-setup/azure: cleanup constructing URI in - _get_config_ips_prefix_list_cb() - -(cherry picked from commit c9fc3f5b037422e7ead7f5ef1a56fcd2a750d152) -(cherry picked from commit 57c6a4fddc20af78b1594515981d174fa43383c9) ---- - clients/cloud-setup/nmcs-provider-azure.c | 58 +++++++++++------------ - 1 file changed, 27 insertions(+), 31 deletions(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index b9c0ffc08a..98b34e2960 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -216,6 +216,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - NMCSProviderGetConfigTaskData *get_config_data; - const char * line; - gsize line_len; -+ char iface_idx_str[30]; - - nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error); - -@@ -231,12 +232,16 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - /* NMHttpClient guarantees that there is a trailing NUL after the data. */ - nm_assert(response_str[response_len] == 0); - -- nm_assert(!iface_data->iface_get_config->has_ipv4s); - nm_assert(!iface_data->iface_get_config->ipv4s_arr); -+ nm_assert(!iface_data->iface_get_config->has_ipv4s); - nm_assert(!iface_data->iface_get_config->has_cidr); - -+ nm_sprintf_buf(iface_idx_str, "%" G_GSSIZE_FORMAT, iface_data->intern_iface_idx); -+ - while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) { -- gint64 ips_prefix_idx; -+ gint64 ips_prefix_idx; -+ gs_free char *uri = NULL; -+ char buf[100]; - - if (line_len == 0) - continue; -@@ -251,45 +256,36 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - if (ips_prefix_idx < 0) - continue; - -- { -- gs_free const char *uri = NULL; -- char buf[100]; -- -- iface_data->n_iface_data_pending++; -- -- nm_http_client_poll_get( -- NM_HTTP_CLIENT(source), -- (uri = _azure_uri_interfaces(nm_sprintf_buf( -- buf, -- "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/%" G_GINT64_FORMAT "/privateIpAddress", -- iface_data->intern_iface_idx, -- ips_prefix_idx))), -- HTTP_TIMEOUT_MS, -- 512 * 1024, -- 10000, -- 1000, -- NM_MAKE_STRV(NM_AZURE_METADATA_HEADER), -- get_config_data->intern_cancellable, -- NULL, -- NULL, -- _get_config_fetch_done_cb_private_ipv4s, -- iface_data); -- } -+ iface_data->n_iface_data_pending++; -+ -+ nm_http_client_poll_get( -+ NM_HTTP_CLIENT(source), -+ (uri = _azure_uri_interfaces(iface_idx_str, -+ "/ipv4/ipAddress/", -+ nm_sprintf_buf(buf, "%" G_GINT64_FORMAT, ips_prefix_idx), -+ "/privateIpAddress")), -+ HTTP_TIMEOUT_MS, -+ 512 * 1024, -+ 10000, -+ 1000, -+ NM_MAKE_STRV(NM_AZURE_METADATA_HEADER), -+ get_config_data->intern_cancellable, -+ NULL, -+ NULL, -+ _get_config_fetch_done_cb_private_ipv4s, -+ iface_data); - } - - iface_data->iface_get_config->ipv4s_len = 0; - iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_iface_data_pending); - - { -- gs_free const char *uri = NULL; -- char buf[30]; -+ gs_free char *uri = NULL; - - iface_data->n_iface_data_pending++; - nm_http_client_poll_get( - NM_HTTP_CLIENT(source), -- (uri = _azure_uri_interfaces( -- nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT, iface_data->intern_iface_idx), -- "/ipv4/subnet/0/prefix/")), -+ (uri = _azure_uri_interfaces(iface_idx_str, "/ipv4/subnet/0/prefix/")), - HTTP_TIMEOUT_MS, - 512 * 1024, - 10000, --- -2.31.1 - - -From 9173aee61c088badbe172019de1f05e20e25aa52 Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 14:56:15 +0200 -Subject: [PATCH 3/4] cloud-setup/azure: refactor callback for - _get_config_ips_prefix_list_cb() - -(cherry picked from commit 889498c12cc5cd4ab718cbc8adbccc1f197adda5) -(cherry picked from commit 783d470b6f741c79d2b38d229db0338210343a35) ---- - clients/cloud-setup/nmcs-provider-azure.c | 75 ++++++++++++----------- - 1 file changed, 40 insertions(+), 35 deletions(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index 98b34e2960..c7dbc712cb 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -93,6 +93,11 @@ detect(NMCSProvider *provider, GTask *task) - - /*****************************************************************************/ - -+typedef enum { -+ GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS, -+ GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX, -+} GetConfigFetchType; -+ - typedef struct { - NMCSProviderGetConfigTaskData * get_config_data; - NMCSProviderGetConfigIfaceData *iface_get_config; -@@ -108,25 +113,28 @@ _azure_iface_data_destroy(AzureIfaceData *iface_data) - } - - static void --_get_config_fetch_done_cb(NMHttpClient * http_client, -- GAsyncResult * result, -- AzureIfaceData *iface_data, -- gboolean is_ipv4) -+_get_config_fetch_done_cb(NMHttpClient * http_client, -+ GAsyncResult * result, -+ AzureIfaceData * iface_data, -+ GetConfigFetchType fetch_type) - { - NMCSProviderGetConfigTaskData * get_config_data; - NMCSProviderGetConfigIfaceData *iface_get_config; - gs_unref_bytes GBytes *response = NULL; - gs_free_error GError *error = NULL; -- gs_free char * v_hwaddr = NULL; - const char * resp_str = NULL; - gsize resp_len; -+ char tmp_addr_str[NM_UTILS_INET_ADDRSTRLEN]; -+ in_addr_t tmp_addr; -+ int tmp_prefix = -1; - - nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); - - if (nm_utils_error_is_cancelled(error)) - return; - -- get_config_data = iface_data->get_config_data; -+ get_config_data = iface_data->get_config_data; -+ iface_get_config = iface_data->iface_get_config; - - if (error) - goto out_done; -@@ -134,36 +142,23 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - resp_str = g_bytes_get_data(response, &resp_len); - nm_assert(resp_str[resp_len] == '\0'); - -- v_hwaddr = nmcs_utils_hwaddr_normalize_gbytes(response); -- if (!v_hwaddr) { -- _LOGI("interface[%" G_GSSIZE_FORMAT "]: invalid MAC address returned", -- iface_data->intern_iface_idx); -- error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, -- "invalid MAC address for index %" G_GSSIZE_FORMAT, -- iface_data->intern_iface_idx); -- goto out_done; -- } -- -- iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr); -- iface_get_config = iface_data->iface_get_config; -- -- if (is_ipv4) { -- char tmp_addr_str[NM_UTILS_INET_ADDRSTRLEN]; -- in_addr_t tmp_addr; -+ switch (fetch_type) { -+ case GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS: - - if (!nmcs_utils_ipaddr_normalize_bin(AF_INET, resp_str, resp_len, NULL, &tmp_addr)) { - error = - nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "ip is not a valid private ip address"); - goto out_done; - } -- _LOGD("interface[%" G_GSSIZE_FORMAT "]: adding private ip %s", -+ _LOGD("interface[%" G_GSSIZE_FORMAT "]: received address %s", - iface_data->intern_iface_idx, - _nm_utils_inet4_ntop(tmp_addr, tmp_addr_str)); - iface_get_config->ipv4s_arr[iface_get_config->ipv4s_len] = tmp_addr; - iface_get_config->has_ipv4s = TRUE; - iface_get_config->ipv4s_len++; -- } else { -- int tmp_prefix; -+ break; -+ -+ case GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX: - - tmp_prefix = _nm_utils_ascii_str_to_int64_bin(resp_str, resp_len, 10, 0, 32, -1); - if (tmp_prefix == -1) { -@@ -173,11 +168,11 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - goto out_done; - } - -- _LOGD("interface[%" G_GSSIZE_FORMAT "]: adding prefix %d", -+ _LOGD("interface[%" G_GSSIZE_FORMAT "]: received subnet prefix %d", - iface_data->intern_iface_idx, - tmp_prefix); - iface_get_config->cidr_prefix = tmp_prefix; -- iface_get_config->has_cidr = TRUE; -+ break; - } - - out_done: -@@ -192,17 +187,25 @@ out_done: - } - - static void --_get_config_fetch_done_cb_private_ipv4s(GObject *source, GAsyncResult *result, gpointer user_data) -+_get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress(GObject * source, -+ GAsyncResult *result, -+ gpointer user_data) - { -- _get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, TRUE); -+ _get_config_fetch_done_cb(NM_HTTP_CLIENT(source), -+ result, -+ user_data, -+ GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS); - } - - static void --_get_config_fetch_done_cb_subnet_cidr_prefix(GObject * source, -- GAsyncResult *result, -- gpointer user_data) -+_get_config_fetch_done_cb_ipv4_subnet_0_prefix(GObject * source, -+ GAsyncResult *result, -+ gpointer user_data) - { -- _get_config_fetch_done_cb(NM_HTTP_CLIENT(source), result, user_data, FALSE); -+ _get_config_fetch_done_cb(NM_HTTP_CLIENT(source), -+ result, -+ user_data, -+ GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX); - } - - static void -@@ -245,6 +248,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - - if (line_len == 0) - continue; -+ - /* Truncate the string. It's safe to do, because we own @response an it has an - * extra NULL character after the buffer. */ - ((char *) line)[line_len] = '\0'; -@@ -253,6 +257,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - ((char *) line)[--line_len] = '\0'; - - ips_prefix_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXINT64, -1); -+ - if (ips_prefix_idx < 0) - continue; - -@@ -272,7 +277,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - get_config_data->intern_cancellable, - NULL, - NULL, -- _get_config_fetch_done_cb_private_ipv4s, -+ _get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress, - iface_data); - } - -@@ -294,7 +299,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - get_config_data->intern_cancellable, - NULL, - NULL, -- _get_config_fetch_done_cb_subnet_cidr_prefix, -+ _get_config_fetch_done_cb_ipv4_subnet_0_prefix, - iface_data); - } - return; --- -2.31.1 - - -From ff2c2c4cabefc178767c4f535b9c82da7d765d6e Mon Sep 17 00:00:00 2001 -From: Thomas Haller -Date: Tue, 20 Apr 2021 10:52:04 +0200 -Subject: [PATCH 4/4] cloud-setup/azure: fix detecting the gateway address - -The code never set "iface_get_config->cidr_addr", despite -setting "cidr_prefix" and "has_cidr". As a result, cloud-setup -would think that the subnet is "0.0.0.0/$PLEN", and calculate -the gateway as "0.0.0.1". - -As a result it would add a default route to table 30400 via 0.0.0.1, -which is obviously wrong. - -How to detect the right gateway? Let's try obtain the subnet also via -the meta data. That seems mostly correct, except that we only access -subnet at index 0. What if there are multiple ones? I don't know. - -https://bugzilla.redhat.com/show_bug.cgi?id=1912236 -(cherry picked from commit c2629f72b0e6b438bf3f2b93967f58c9defafea6) -(cherry picked from commit 5d112092bc184ac284cb7f6c5fda68fcd5f5cd22) ---- - clients/cloud-setup/nmcs-provider-azure.c | 45 +++++++++++++++++++++++ - man/nm-cloud-setup.xml | 4 +- - 2 files changed, 48 insertions(+), 1 deletion(-) - -diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c -index c7dbc712cb..28019bac42 100644 ---- a/clients/cloud-setup/nmcs-provider-azure.c -+++ b/clients/cloud-setup/nmcs-provider-azure.c -@@ -95,6 +95,7 @@ detect(NMCSProvider *provider, GTask *task) - - typedef enum { - GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS, -+ GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS, - GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX, - } GetConfigFetchType; - -@@ -158,6 +159,18 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, - iface_get_config->ipv4s_len++; - break; - -+ case GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS: -+ -+ if (!nmcs_utils_ipaddr_normalize_bin(AF_INET, resp_str, resp_len, NULL, &tmp_addr)) { -+ error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "ip is not a subnet address"); -+ goto out_done; -+ } -+ _LOGD("interface[%" G_GSSIZE_FORMAT "]: received subnet address %s", -+ iface_data->intern_iface_idx, -+ _nm_utils_inet4_ntop(tmp_addr, tmp_addr_str)); -+ iface_get_config->cidr_addr = tmp_addr; -+ break; -+ - case GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX: - - tmp_prefix = _nm_utils_ascii_str_to_int64_bin(resp_str, resp_len, 10, 0, 32, -1); -@@ -180,6 +193,10 @@ out_done: - --iface_data->n_iface_data_pending; - if (iface_data->n_iface_data_pending > 0) - return; -+ -+ /* we surely have cidr_addr and cidr_prefix, otherwise -+ * we would have errored out above. */ -+ iface_get_config->has_cidr = TRUE; - } - - --get_config_data->n_pending; -@@ -197,6 +214,17 @@ _get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress(GObject * source - GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS); - } - -+static void -+_get_config_fetch_done_cb_ipv4_subnet_0_address(GObject * source, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ _get_config_fetch_done_cb(NM_HTTP_CLIENT(source), -+ result, -+ user_data, -+ GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS); -+} -+ - static void - _get_config_fetch_done_cb_ipv4_subnet_0_prefix(GObject * source, - GAsyncResult *result, -@@ -287,6 +315,23 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u - { - gs_free char *uri = NULL; - -+ iface_data->n_iface_data_pending++; -+ nm_http_client_poll_get( -+ NM_HTTP_CLIENT(source), -+ (uri = _azure_uri_interfaces(iface_idx_str, "/ipv4/subnet/0/address/")), -+ HTTP_TIMEOUT_MS, -+ 512 * 1024, -+ 10000, -+ 1000, -+ NM_MAKE_STRV(NM_AZURE_METADATA_HEADER), -+ get_config_data->intern_cancellable, -+ NULL, -+ NULL, -+ _get_config_fetch_done_cb_ipv4_subnet_0_address, -+ iface_data); -+ -+ nm_clear_g_free(&uri); -+ - iface_data->n_iface_data_pending++; - nm_http_client_poll_get( - NM_HTTP_CLIENT(source), -diff --git a/man/nm-cloud-setup.xml b/man/nm-cloud-setup.xml -index 4ae4042f84..a4ed737bc5 100644 ---- a/man/nm-cloud-setup.xml -+++ b/man/nm-cloud-setup.xml -@@ -329,7 +329,9 @@ - - Then, for each IP address index fetch the address at - http://169.254.169.254/metadata/instance/network/interface/$IFACE_INDEX/ipv4/ipAddress/$ADDR_INDEX/privateIpAddress?format=text&api-version=2017-04-02. -- Also fetch the size of the subnet (the netmask) for the interface from -+ Also fetch the size of the subnet and prefix for the interface from -+ http://169.254.169.254/metadata/instance/network/interface/$IFACE_INDEX/ipv4/subnet/0/address/?format=text&api-version=2017-04-02. -+ and - http://169.254.169.254/metadata/instance/network/interface/$IFACE_INDEX/ipv4/subnet/0/prefix/?format=text&api-version=2017-04-02. - - --- -2.31.1 - diff --git a/SOURCES/9999-fix-pregen-doc.patch b/SOURCES/9999-fix-pregen-doc.patch index d44f06c..a4e81b3 100644 --- a/SOURCES/9999-fix-pregen-doc.patch +++ b/SOURCES/9999-fix-pregen-doc.patch @@ -1,7 +1,7 @@ -From ce8ee35cb4e94e85ac1ecb268c6fa1ea14b1ae8d Mon Sep 17 00:00:00 2001 +From 7423b47a3333b09fce9ddce33041e5dbdbb4c7e6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 27 Aug 2019 15:47:32 +0200 -Subject: [PATCH 1/1] patch documentation with the proper default values +Subject: [PATCH] patch documentation with the proper default values We don't regenerate the documentation for RHEL builds, but the docs from the tarball are generated with a certain set @@ -9,15 +9,21 @@ of defaults. Patch the man pages with the proper values. --- - docs/api/html/NetworkManager.conf.html | 2 +- - man/NetworkManager.conf.5 | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) + docs/api/html/NetworkManager.conf.html | 2 +- + docs/api/html/nm-settings-nmcli.html | 2 +- + man/NetworkManager.conf.5 | 2 +- + man/nm-settings-nmcli.5 | 2 +- + man/nm-settings-nmcli.xml | 2 +- + src/libnm-client-impl/nm-property-infos-nmcli.xml | 2 +- + src/libnmc-setting/settings-docs.h | 2 +- + src/nmcli/generate-docs-nm-settings-nmcli.xml | 2 +- + 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api/html/NetworkManager.conf.html b/docs/api/html/NetworkManager.conf.html -index 44b25c4cbc9d..1ee9c2fb1e83 100644 +index e8efb5e7fe7d..f432f6736691 100644 --- a/docs/api/html/NetworkManager.conf.html +++ b/docs/api/html/NetworkManager.conf.html -@@ -574,7 +574,7 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth +@@ -658,7 +658,7 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth are "syslog" and "journal". When NetworkManager is started with "--debug" in addition all messages will be printed to stderr. @@ -26,11 +32,24 @@ index 44b25c4cbc9d..1ee9c2fb1e83 100644

+diff --git a/docs/api/html/nm-settings-nmcli.html b/docs/api/html/nm-settings-nmcli.html +index e221ce1496fa..1ce647f7bf7d 100644 +--- a/docs/api/html/nm-settings-nmcli.html ++++ b/docs/api/html/nm-settings-nmcli.html +@@ -1955,7 +1955,7 @@ + +

+ Alias: ip4

+-

A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in increasing priority, meaning the last address will be the primary address.

++

A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in decreasing priority, meaning the first address will be the primary address.

+

+ Format: a comma separated list of addresses

+ diff --git a/man/NetworkManager.conf.5 b/man/NetworkManager.conf.5 -index 396267e3ec09..7702b84b04fc 100644 +index 33850bb0e398..cd0379806b29 100644 --- a/man/NetworkManager.conf.5 +++ b/man/NetworkManager.conf.5 -@@ -598,7 +598,7 @@ INFO\&. +@@ -664,7 +664,7 @@ INFO\&. .PP \fIbackend\fR .RS 4 @@ -39,6 +58,71 @@ index 396267e3ec09..7702b84b04fc 100644 .RE .PP \fIaudit\fR +diff --git a/man/nm-settings-nmcli.5 b/man/nm-settings-nmcli.5 +index 2d9c067a4679..d3a03d306a1d 100644 +--- a/man/nm-settings-nmcli.5 ++++ b/man/nm-settings-nmcli.5 +@@ -1655,7 +1655,7 @@ Properties: + .RS 4 + Alias: ip4 + .sp +-A list of IPv4 addresses and their prefix length\&. Multiple addresses can be separated by comma\&. For example "192\&.168\&.1\&.5/24, 10\&.1\&.0\&.5/24"\&. The addresses are listed in increasing priority, meaning the last address will be the primary address\&. ++A list of IPv4 addresses and their prefix length\&. Multiple addresses can be separated by comma\&. For example "192\&.168\&.1\&.5/24, 10\&.1\&.0\&.5/24"\&. The addresses are listed in decreasing priority, meaning the first address will be the primary address\&. + .sp + Format: a comma separated list of addresses + .RE +diff --git a/man/nm-settings-nmcli.xml b/man/nm-settings-nmcli.xml +index 258e4135009b..199e49e91794 100644 +--- a/man/nm-settings-nmcli.xml ++++ b/man/nm-settings-nmcli.xml +@@ -274,7 +274,7 @@ + Format: stringipv4 settingIPv4 Settings. + Properties: + +- Alias: ip4A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in increasing priority, meaning the last address will be the primary address. ++ Alias: ip4A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in decreasing priority, meaning the first address will be the primary address. + Format: a comma separated list of addressesTimeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4. + Format: int32A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values "mac" and "perm-mac" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value "ipv6-duid" uses the DUID from "ipv6.dhcp-duid" property as an RFC4361-compliant client identifier. As IAID it uses "ipv4.dhcp-iaid" and falls back to "ipv6.dhcp-iaid" if unset. The special value "duid" generates a RFC4361-compliant client identifier based on "ipv4.dhcp-iaid" and uses a DUID generated by hashing /etc/machine-id. The special value "stable" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the "${DEVICE}" or "${MAC}" specifier to get a per-device key. If unset, a globally configured default is used. If still unset, the default depends on the DHCP plugin. + Format: stringIf the "dhcp-send-hostname" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and "dhcp-hostname" are mutually exclusive and cannot be set at the same time. +diff --git a/src/libnm-client-impl/nm-property-infos-nmcli.xml b/src/libnm-client-impl/nm-property-infos-nmcli.xml +index b771b74c5909..d6aa8a80c8e3 100644 +--- a/src/libnm-client-impl/nm-property-infos-nmcli.xml ++++ b/src/libnm-client-impl/nm-property-infos-nmcli.xml +@@ -34,7 +34,7 @@ + + + +- ++ + + + +diff --git a/src/libnmc-setting/settings-docs.h b/src/libnmc-setting/settings-docs.h +index 12625d445966..85c5aca1e4c8 100644 +--- a/src/libnmc-setting/settings-docs.h ++++ b/src/libnmc-setting/settings-docs.h +@@ -226,7 +226,7 @@ + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_REMOTE N_("The remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 address.") + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_TOS N_("The type of service (IPv4) or traffic class (IPv6) field to be set on tunneled packets.") + #define DESCRIBE_DOC_NM_SETTING_IP_TUNNEL_TTL N_("The TTL to assign to tunneled packets. 0 is a special value meaning that packets inherit the TTL value.") +-#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ADDRESSES N_("A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"192.168.1.5/24, 10.1.0.5/24\". The addresses are listed in increasing priority, meaning the last address will be the primary address.") ++#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ADDRESSES N_("A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"192.168.1.5/24, 10.1.0.5/24\". The addresses are listed in decreasing priority, meaning the first address will be the primary address.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DAD_TIMEOUT N_("Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID N_("A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values \"mac\" and \"perm-mac\" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value \"ipv6-duid\" uses the DUID from \"ipv6.dhcp-duid\" property as an RFC4361-compliant client identifier. As IAID it uses \"ipv4.dhcp-iaid\" and falls back to \"ipv6.dhcp-iaid\" if unset. The special value \"duid\" generates a RFC4361-compliant client identifier based on \"ipv4.dhcp-iaid\" and uses a DUID generated by hashing /etc/machine-id. The special value \"stable\" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the \"${DEVICE}\" or \"${MAC}\" specifier to get a per-device key. If unset, a globally configured default is used. If still unset, the default depends on the DHCP plugin.") + #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_FQDN N_("If the \"dhcp-send-hostname\" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-hostname\" are mutually exclusive and cannot be set at the same time.") +diff --git a/src/nmcli/generate-docs-nm-settings-nmcli.xml b/src/nmcli/generate-docs-nm-settings-nmcli.xml +index 88803094d6ce..ca5225ba2811 100644 +--- a/src/nmcli/generate-docs-nm-settings-nmcli.xml ++++ b/src/nmcli/generate-docs-nm-settings-nmcli.xml +@@ -650,7 +650,7 @@ + description="DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured." /> + ++ description="A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example "192.168.1.5/24, 10.1.0.5/24". The addresses are listed in decreasing priority, meaning the first address will be the primary address." /> + -- -2.26.2 +2.31.1 diff --git a/SOURCES/NetworkManager.conf b/SOURCES/NetworkManager.conf index 6ee4797..2fd5127 100644 --- a/SOURCES/NetworkManager.conf +++ b/SOURCES/NetworkManager.conf @@ -3,20 +3,18 @@ # See "man 5 NetworkManager.conf" for details. # # The directories /usr/lib/NetworkManager/conf.d/ and /run/NetworkManager/conf.d/ -# can contain additional configuration snippets installed by packages. These files are +# can contain additional .conf snippets installed by packages. These files are # read before NetworkManager.conf and have thus lowest priority. -# The directory /etc/NetworkManager/conf.d/ can contain additional configuration +# The directory /etc/NetworkManager/conf.d/ can contain additional .conf # snippets. Those snippets are merged last and overwrite the settings from this main # file. # # The files within one conf.d/ directory are read in asciibetical order. # -# If /etc/NetworkManager/conf.d/ contains a file with the same name as -# /usr/lib/NetworkManager/conf.d/, the latter file is shadowed and thus ignored. -# Hence, to disable loading a file from /usr/lib/NetworkManager/conf.d/ you can -# put an empty file to /etc with the same name. The same applies with respect -# to the directory /run/NetworkManager/conf.d where files in /run shadow -# /usr/lib and are themselves shadowed by files under /etc. +# You can prevent loading a file /usr/lib/NetworkManager/conf.d/NAME.conf +# by having a file NAME.conf in either /run/NetworkManager/conf.d/ or /etc/NetworkManager/conf.d/. +# Likewise, snippets from /run can be prevented from loading by placing +# a file with the same name in /etc/NetworkManager/conf.d/. # # If two files define the same key, the one that is read afterwards will overwrite # the previous one. @@ -30,8 +28,7 @@ # # Logfiles contain no passwords and little sensitive information. But please # check before posting the file online. You can also personally hand over the -# logfile to a NM developer to treat it confidential. Meet us on #nm on freenode. -# Please post full logfiles except minimal modifications of private data. +# logfile to a NM developer to treat it confidential. Meet us on #nm on Libera.Chat. # # You can also change the log-level at runtime via # $ nmcli general logging level TRACE domains ALL @@ -42,9 +39,14 @@ # You will find the logfiles in syslog, for example via # $ journalctl -u NetworkManager # +# Please post full logfiles for bug reports without pre-filtering or truncation. +# Also, for debugging the entire `journalctl` output can be interesting. Don't +# limit unnecessarily with `journalctl -u`. Exceptions are if you are worried +# about private data. Check before posting logfiles! +# # Note that debug logging of NetworkManager can be quite verbose. Some messages # might be rate-limited by the logging daemon (see RateLimitIntervalSec, RateLimitBurst -# in man journald.conf). Please disable rate-limiting before collecting debug logs. +# in man journald.conf). Please disable rate-limiting before collecting debug logs! # #level=TRACE #domains=ALL diff --git a/SPECS/NetworkManager.spec b/SPECS/NetworkManager.spec index 57e6dc9..3168024 100644 --- a/SPECS/NetworkManager.spec +++ b/SPECS/NetworkManager.spec @@ -5,9 +5,9 @@ %global glib2_version %(pkg-config --modversion glib-2.0 2>/dev/null || echo bad) %global epoch_version 1 -%global rpm_version 1.30.0 -%global real_version 1.30.0 -%global release_version 13 +%global rpm_version 1.32.10 +%global real_version 1.32.10 +%global release_version 4 %global snapshot %{nil} %global git_sha %{nil} @@ -60,10 +60,8 @@ %bcond_without ppp %bcond_without nmtui %bcond_without nm_cloud_setup - # on RHEL we don't regenerate the documentation %bcond_with regen_docs - %if %{bcond_default_debug} %bcond_without debug %else @@ -108,7 +106,7 @@ ############################################################################### -%if 0%{?fedora} +%if 0%{?fedora} || 0%{?rhel} > 7 %global dbus_version 1.9.18 %global dbus_sys_dir %{_datadir}/dbus-1/system.d %else @@ -116,6 +114,14 @@ %global dbus_sys_dir %{_sysconfdir}/dbus-1/system.d %endif +# Older libndp versions use select() (rh#1933041). On well known distros, +# choose a version that has the necessary fix. +%if 0%{?rhel} && 0%{?rhel} == 8 +%global libndp_version 1.7-4 +%else +%global libndp_version %{nil} +%endif + %if %{with bluetooth} || %{with wwan} %global with_modem_manager_1 1 %else @@ -184,25 +190,13 @@ Source6: 70-nm-connectivity.conf # These are not bugfixes, hence they are also relevant after # the next rebase of the source tarball. Patch1: 0001-cloud-setup-systemd-unit-rh1791758.patch +Patch2: 0002-firewall-Default-to-iptables-backend-to-preserve-behavior.patch # Bugfixes that are only relevant until next rebase of the package. -Patch1000: 1000-bond-avoid-logging-warning-to-set-ad_actor_system-00.patch -Patch1001: 1001-core-increase-limit-of-open-file-descriptors-for-Net.patch -Patch1002: 1002-initrd-apply-mtu-to-bond-connection.patch -Patch1003: 1003-bond-only-restore-mac-if-cloned.patch -Patch1004: 1004-fix-handling-generated-local-routes-rh1907661.patch -Patch1005: 1005-initrd-fix-crash-parsing-empty-rd.znet-argument.patch -Patch1006: 1006-core-fix-crash-in-nm_wildcard_match_check.patch -Patch1007: 1007-initrd-multiconnect-single-for-manual-ip-rh1915493.patch -Patch1008: 1008-manager-fix-active_connection_find.patch -Patch1009: 1009-bond-support-tlb_dynamic_lb-in-balance-alb-mode.patch -Patch1010: 1010-manager-delete-default-connection-when-veth-removed.patch -Patch1011: 1011-don-t-touch-device-tc-config-by-default-rh1928078.patch -Patch1012: 1012-prefer-IPv4-to-determine-the-hostname.patch -Patch1013: 1013-platform-preserve-IPv6-multicast-route-added-by-kern.patch -Patch1014: 1014-default-route-inter-feres-with-other-subnets-on-the-VM.patch -Patch1015: 1015-initrd-set-IPv4-required-timeout-rh1961666.patch -Patch1016: 1016-cloud-setup-azure-fix-gateway-rh1912236.patch +Patch1000: 1000-platform-fix-capturing-addresses-from-platform-for-assuming-after-restart.patch +Patch1001: 1001-nmcli-docs-fix-address-order-in-ipv46-addresses-documentation-for-nm-settings-nmcli.patch +Patch1002: 1002-preserve-IPv6-multicast-route-rh2004212.patch +Patch1003: 1003-cloud-setup-better-handle-other-routes-rh1977984.patch # The pregenerated docs contain default values and paths that depend # on the configure options when creating the source tarball. @@ -219,8 +213,9 @@ Requires(postun): systemd Requires: dbus >= %{dbus_version} Requires: glib2 >= %{glib2_version} Requires: %{name}-libnm%{?_isa} = %{epoch}:%{version}-%{release} -Requires: libndp >= 1.7-4 -Obsoletes: dhcdbd +%if "%{libndp_version}" != "" +Requires: libndp >= %{libndp_version} +%endif Obsoletes: NetworkManager < %{obsoletes_device_plugins} Obsoletes: NetworkManager < %{obsoletes_ppp_plugin} Obsoletes: NetworkManager-wimax < 1.2 @@ -269,7 +264,6 @@ BuildRequires: gtk-doc BuildRequires: libudev-devel BuildRequires: libuuid-devel BuildRequires: /usr/bin/valac -BuildRequires: iptables BuildRequires: libxslt %if %{with bluetooth} BuildRequires: bluez-libs-devel @@ -327,7 +321,7 @@ Provides: %{name}-dispatcher%{?_isa} = %{epoch}:%{version}-%{release} # that the scripts that would parse the SPEC file naively would be unlikely # to fail. Refer to git log for the real date and commit number of last # synchronization: -# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/commits/master/src/systemd +# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/commits/main/src/ Provides: bundled(systemd) = 0 @@ -345,7 +339,6 @@ Summary: ADSL device plugin for NetworkManager Group: System Environment/Base Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} Obsoletes: NetworkManager < %{obsoletes_device_plugins} -Obsoletes: NetworkManager-atm %description adsl This package contains NetworkManager support for ADSL devices. @@ -365,7 +358,6 @@ Requires: NetworkManager-wwan = %{epoch}:%{version}-%{release} Requires: bluez >= 4.101-5 %endif Obsoletes: NetworkManager < %{obsoletes_device_plugins} -Obsoletes: NetworkManager-bt %description bluetooth This package contains NetworkManager support for Bluetooth devices. @@ -470,7 +462,7 @@ This package contains NetworkManager support for PPP. %package libnm Summary: Libraries for adding NetworkManager support to applications. Group: Development/Libraries -Conflicts: NetworkManager-glib < %{epoch}:%{version}-%{release} +Conflicts: NetworkManager-glib < 1:1.31.0 License: LGPLv2+ %description libnm @@ -538,7 +530,7 @@ Summary: NetworkManager dispatcher file for advanced routing rules Group: System Environment/Base BuildArch: noarch Provides: %{name}-config-routing-rules = %{epoch}:%{version}-%{release} -Obsoletes: %{name}-config-routing-rules < %{epoch}:%{version}-%{release} +Obsoletes: %{name}-config-routing-rules < 1:1.31.0 %description dispatcher-routing-rules This adds a NetworkManager dispatcher file to support networking @@ -586,6 +578,8 @@ This tool is still experimental. %if %{with test} --werror \ %endif + -Dnft=/usr/sbin/nft \ + -Diptables=/usr/sbin/iptables \ -Ddhcpcanon=no \ -Ddhcpcd=no \ -Dconfig_dhcp_default=%{dhcp_default} \ @@ -714,6 +708,8 @@ intltoolize --automake --copy --force --with-runstatedir=%{_rundir} \ --disable-silent-rules \ --disable-static \ + --with-nft=/usr/sbin/nft \ + --with-iptables=/usr/sbin/iptables \ --with-dhclient=yes \ --with-dhcpcd=no \ --with-dhcpcanon=no \ @@ -1000,6 +996,7 @@ fi %dir %{_sysconfdir}/%{name}/dnsmasq-shared.d %dir %{_sysconfdir}/%{name}/system-connections %config(noreplace) %{_sysconfdir}/%{name}/NetworkManager.conf +%ghost %{_sysconfdir}/%{name}/VPN %{_bindir}/nm-online %{_libexecdir}/nm-ifup %ghost %attr(755, root, root) %{_sbindir}/ifup @@ -1009,6 +1006,7 @@ fi %{_libexecdir}/nm-dispatcher %{_libexecdir}/nm-iface-helper %{_libexecdir}/nm-initrd-generator +%{_libexecdir}/nm-daemon-helper %dir %{_libdir}/%{name} %dir %{nmplugindir} %{nmplugindir}/libnm-settings-plugin*.so @@ -1028,6 +1026,7 @@ fi %{_mandir}/man7/nmcli-examples.7* %{_mandir}/man8/nm-initrd-generator.8.gz %{_mandir}/man8/NetworkManager.8.gz +%{_mandir}/man8/NetworkManager-dispatcher.8.gz %dir %{_localstatedir}/lib/NetworkManager %dir %{_sysconfdir}/sysconfig/network-scripts %{_datadir}/dbus-1/system-services/org.freedesktop.nm_dispatcher.service @@ -1042,7 +1041,7 @@ fi %{systemd_dir}/NetworkManager-dispatcher.service %dir %{_datadir}/doc/NetworkManager/examples %{_datadir}/doc/NetworkManager/examples/server.conf -%doc NEWS AUTHORS README CONTRIBUTING TODO +%doc NEWS AUTHORS README CONTRIBUTING.md TODO %license COPYING %license COPYING.LGPL %license COPYING.GFDL @@ -1167,35 +1166,84 @@ fi %changelog -* Thu Oct 14 2021 Ana Cabral - 1:1.30.0-13 -- Fixes nm-cloud-setup.service interference in network connectivity (rh#2013208) - -* Thu Oct 7 2021 Fernando Fernandez Mancera - 1:1.30.0-12 -- initrd: set an IPv4 required-timeout of 20 seconds, to prefer IPv4 - over IPv6 for default connections (rh #1961666) - -* Tue Oct 5 2021 Fernando Fernandez Mancera - 1:1.30.0-11 -- platform: preserve IPv6 multicast route added by kernel (rh #2007264) -- cloud-setup: don't interfere with other subnets (rh #2007341) - -* Mon Jul 12 2021 Beniamino Galvani - 1:1.30.0-10 -- core: prefer IPv4 to determine the hostname (rh #1970335) - -* Fri Jun 18 2021 Beniamino Galvani - 1:1.30.0-9 -- core: don't touch device traffic control (TC) configuration by default (rh #1928078) - -* Fri Jun 4 2021 Wen Liang - 1:1.30.0-8 -- core: fix finding active connection for controller (rh #1965337) -- bond: support 'tlb_dynamic_lb' in 'balance-alb' mode (rh #1965948) -- manager: delete default connection when veth removed (rh #1965336) - -* Fri Mar 26 2021 Beniamino Galvani - 1:1.30.0-7 -- initrd: set multi-connect=single for connections with static IP (rh #1915493) - -* Thu Mar 25 2021 Thomas Haller - 1:1.30.0-6 -- core: fix handling local routes generated by kernel (rh #1907661) -- initrd: fix crash with rd.znet= argument (rh #1941106) -- core: fix crash handling path match (rh #1942741) +* Tue Sep 28 2021 Thomas Haller - 1:1.32.10-4 +- revert unapproved patches part of "cloud-setup" change (rh #1977984) + +* Fri Sep 24 2021 Beniamino Galvani - 1:1.32.10-3 +- preserve the IPv6 multicast route added by kernel (rh #2004212) +- cloud-setup: better handle other route configuration (rh #1977984) + +* Thu Aug 19 2021 Wen Liang - 1:1.32.10-2 +- platform: fix capturing IPv4 addresses from platform for assuming after restart (rh #1988751) + +* Wed Aug 18 2021 Wen Liang - 1:1.32.10-1 +- update to 1.32.10 release +- nm-initrd-generator: add kernel command line options ethtool autoneg and speed (rh #1940934) +- IP: fix the order of IP addresses during service restart (rh #1988751) + +* Tue Aug 10 2021 Fernando Fernandez Mancera - 1:1.32.8-1 +- Upgrade to 1.32.8 release +- firewalld: configure zones on "Reloaded" signal (rh #1982403) +- ethtool: support configuring newer gigabit ethernet speeds (rh #1897004) +- core: fix wrong MTU for bridge interfaces (rh #1973536) +- cloud-setup: fix gateway address for Aliyun cloud (rh #1823315) + +* Thu Jul 29 2021 Gris Ge - 1:1.32.6-1 +- Upgrade to 1.32.6 release +- core: fix adding stale local routes when address changes (rh #1979192) +- dhcp: handle filename/bootfile_name DHCP option and write it to device state + file for initrd/kickstart (rh #1979387) +- initrd: add "ib.pkey=" command line option (rh #1805708) +- core: introduce "keep-configuration" device option to forcefully activate a + profile on start (rh #1934122) + +* Wed Jul 21 2021 Gris Ge - 1:1.32.4-1 +- Upgrade to 1.32.4 with fixes of: +- nmcli: show DNS SEARCH field in device information. (rh #1852317) +- device: avoid crash setting VPN config during unrealize. (rh #1912423) +- core: send ARP announcements when there is carrier. (rh #1956793) +- core: add ipv[46].required-timeout option to wait for IP configuration while activating. (rh #1961666) +- core: start DHCPv6 when a prefix delegation is needed for shared mode. (rh #1973199) +- ifcfg: log warning about invalid keys in ifcfg files. (rh #1959656) +- cloud-setup: add support for Aliyun cloud. (rh #1823315) + +* Thu Jul 1 2021 Wen Liang - 1:1.32.2-1 +- update to 1.32.2 release +- device: prefer IPv6 not-deprecated addresses for hostname lookup (rh #1820770) +- docs: describe qdiscs and tfilters in nm-settings manpage (rh #1847894) +- cloud-setup: preserve IPv4 addresses/routes/rules from profile (rh #1971527) +- daemon: performance improvements (rh #1847125) +- dhcp/systemd: ignore FORCERENEW requests for DHCPV4 (rh #1961251, CVE-2020-13529) +- Add bridge_role in 802-3-ethernet.s390-options using nmcli (rh #1935842) + +* Fri Jun 18 2021 Wen Liang - 1:1.32.0-1 +- update to 1.32.0 release +- veth: fix null error when deleting the device (rh #1915278) +- veth: fix crash when deleting the device profile (rh #1915276) +- firewall: add new "nftables" firewall-backend (rh #1548825) +- DNS: fix lookup of hostname via DNS (rh #1970335) + +* Mon Jun 7 2021 Thomas Haller - 1:1.32.0-0.5 +- update to 1.32-rc1 (1.31.90) (release candidate) +- core: allow to preserved external TFilter and QDisc settings (rh #1928078) +- bond: support "tlb_dynamic_lb" in "balance-alb" mode (rh #1959934) + +* Thu May 20 2021 Wen Liang - 1:1.32.0-0.4 +- Update to 1.31.5 (development) +- core: configure MTU early before DHCP completes (rh #1890234) +- core: fix activation handling for ports (rh #1955101, rh #1959961) +- core: add support for ethtool pause parameters (rh #1899372) +- dhcp: support option 249 (Microsoft Classless Static Route) (rh #1959461) + +* Wed May 5 2021 Beniamino Galvani - 1:1.32.0-0.3 +- Update to 1.31.4 (development) +- core: fix assertion failure in activation handling (rh #1933719) + +* Thu Apr 22 2021 Beniamino Galvani - 1:1.32.0-0.2 +- Update to 1.31.3 (development) + +* Thu Mar 25 2021 Beniamino Galvani - 1:1.32.0-0.1 +- Update to 1.31.2 (development) * Tue Mar 23 2021 Beniamino Galvani - 1:1.30.0-5 - bond: restore MAC on release only when there is a cloned MAC address (rh #1933292)