From a5cc5a753902d2543037729624a9024d203f3b47 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 7 Sep 2025 08:41:31 +0200 Subject: [PATCH 01/31] netns: add a CLAT IP reservation type This will be used to obtain an IPv4 address to be used for the CLAT (464XLAT). Based on a patch by Mary Strodl . --- src/core/nm-netns.c | 8 ++++++++ src/core/nm-netns.h | 1 + src/core/tests/test-netns.c | 39 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c index f55d1132d0..c4b3e913e5 100644 --- a/src/core/nm-netns.c +++ b/src/core/nm-netns.c @@ -588,6 +588,14 @@ static const IPReservationTypeDesc ip_reservation_types[_NM_NETNS_IP_RESERVATION .num_addrs = 256, .allow_reuse = TRUE, }, + [NM_NETNS_IP_RESERVATION_TYPE_CLAT] = + { + .name = "clat", + .start_addr = 0xc0000000, /* 192.0.0.0 */ + .prefix_len = 32, + .num_addrs = 8, + .allow_reuse = FALSE, + }, }; NMNetnsIPReservation * diff --git a/src/core/nm-netns.h b/src/core/nm-netns.h index 5ddb852ad5..e32d5680aa 100644 --- a/src/core/nm-netns.h +++ b/src/core/nm-netns.h @@ -43,6 +43,7 @@ NML3Cfg *nm_netns_l3cfg_acquire(NMNetns *netns, int ifindex); typedef enum { NM_NETNS_IP_RESERVATION_TYPE_SHARED4, + NM_NETNS_IP_RESERVATION_TYPE_CLAT, _NM_NETNS_IP_RESERVATION_TYPE_NUM, } NMNetnsIPReservationType; diff --git a/src/core/tests/test-netns.c b/src/core/tests/test-netns.c index 26ecbcb8b8..bbe990099e 100644 --- a/src/core/tests/test-netns.c +++ b/src/core/tests/test-netns.c @@ -53,6 +53,44 @@ test_ip_reservation_shared4(void) } } +static void +test_ip_reservation_clat(void) +{ + gs_unref_object NMPlatform *platform = NULL; + gs_unref_object NMNetns *netns = NULL; + NMNetnsIPReservation *res[8]; + NMNetnsIPReservation *res1; + char buf[NM_INET_ADDRSTRLEN]; + guint i; + + platform = g_object_ref(NM_PLATFORM_GET); + netns = nm_netns_new(platform); + + /* Allocate addresses from 192.0.0.0 to 192.0.0.7 */ + for (i = 0; i < 8; i++) { + res[i] = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_CLAT); + g_snprintf(buf, sizeof(buf), "192.0.0.%u", i); + nmtst_assert_ip4_address(res[i]->addr, buf); + g_assert_cmpint(res[i]->_ref_count, ==, 1); + } + + /* Release an address and get it back */ + nm_netns_ip_reservation_release(res[2]); + res[2] = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_CLAT); + nmtst_assert_ip4_address(res[2]->addr, "192.0.0.2"); + + /* No reuse */ + NMTST_EXPECT_NM_ERROR("netns[*]: clat: ran out of IP addresses"); + res1 = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_CLAT); + g_test_assert_expected_messages(); + g_assert_null(res1); + + /* Release all */ + for (i = 0; i < 8; i++) { + nm_netns_ip_reservation_release(res[i]); + } +} + /*****************************************************************************/ NMTST_DEFINE(); @@ -64,6 +102,7 @@ main(int argc, char **argv) nm_linux_platform_setup(); g_test_add_func("/netns/ip_reservation/shared4", test_ip_reservation_shared4); + g_test_add_func("/netns/ip_reservation/clat", test_ip_reservation_clat); return g_test_run(); } From fd4cd2a7edd6747e04a865aaa2fc1771af0f5796 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Tue, 4 Feb 2025 22:40:17 -0500 Subject: [PATCH 02/31] clat: propagate network_id down to l3cfg --- src/core/ndisc/nm-ndisc.c | 8 ++++++-- src/core/ndisc/nm-ndisc.h | 3 ++- src/core/nm-l3-config-data.c | 26 ++++++++++++++++++++++++++ src/core/nm-l3-config-data.h | 4 ++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/core/ndisc/nm-ndisc.c b/src/core/ndisc/nm-ndisc.c index 1a2bf48072..758ce0a05c 100644 --- a/src/core/ndisc/nm-ndisc.c +++ b/src/core/ndisc/nm-ndisc.c @@ -109,7 +109,8 @@ nm_ndisc_data_to_l3cd(NMDedupMultiIndex *multi_idx, int ifindex, const NMNDiscData *rdata, NMSettingIP6ConfigPrivacy ip6_privacy, - NMUtilsIPv6IfaceId *token) + NMUtilsIPv6IfaceId *token, + const char *network_id) { nm_auto_unref_l3cd_init NML3ConfigData *l3cd = NULL; guint32 ifa_flags; @@ -218,6 +219,8 @@ nm_ndisc_data_to_l3cd(NMDedupMultiIndex *multi_idx, nm_l3_config_data_set_ip6_mtu(l3cd, rdata->mtu); if (token) nm_l3_config_data_set_ip6_token(l3cd, *token); + if (network_id) + nm_l3_config_data_set_network_id(l3cd, network_id); return g_steal_pointer(&l3cd); } @@ -437,7 +440,8 @@ nm_ndisc_emit_config_change(NMNDisc *self, NMNDiscConfigMap changed) nm_l3cfg_get_ifindex(priv->config.l3cfg), rdata, priv->config.ip6_privacy, - priv->iid_is_token ? &priv->iid : NULL); + priv->iid_is_token ? &priv->iid : NULL, + priv->config.network_id); l3cd = nm_l3_config_data_seal(l3cd); if (!nm_l3_config_data_equal(priv->l3cd, l3cd)) diff --git a/src/core/ndisc/nm-ndisc.h b/src/core/ndisc/nm-ndisc.h index 8f1a12a267..eda1e696d9 100644 --- a/src/core/ndisc/nm-ndisc.h +++ b/src/core/ndisc/nm-ndisc.h @@ -282,6 +282,7 @@ struct _NML3ConfigData *nm_ndisc_data_to_l3cd(NMDedupMultiIndex *multi_id int ifindex, const NMNDiscData *rdata, NMSettingIP6ConfigPrivacy ip6_privacy, - NMUtilsIPv6IfaceId *token); + NMUtilsIPv6IfaceId *token, + const char *network_id); #endif /* __NETWORKMANAGER_NDISC_H__ */ diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 328f59b6ce..9d849744d8 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -122,6 +122,7 @@ struct _NML3ConfigData { NMSettingConnectionDnsOverTls dns_over_tls; NMSettingConnectionDnssec dnssec; NMUtilsIPv6IfaceId ip6_token; + NMRefString *network_id; NML3ConfigDatFlags flags; @@ -603,6 +604,10 @@ nm_l3_config_data_log(const NML3ConfigData *self, nm_utils_inet6_interface_identifier_to_token(&self->ip6_token, sbuf_addr)); } + if (self->network_id) { + _L("network-id: %s", self->network_id->str); + } + if (self->metered != NM_TERNARY_DEFAULT) _L("metered: %s", self->metered ? "yes" : "no"); @@ -822,6 +827,7 @@ nm_l3_config_data_unref(const NML3ConfigData *self) nm_ref_string_unref(mutable->nis_domain); nm_ref_string_unref(mutable->proxy_pac_url); nm_ref_string_unref(mutable->proxy_pac_script); + nm_ref_string_unref(mutable->network_id); nm_g_slice_free(mutable); } @@ -1957,6 +1963,22 @@ nm_l3_config_data_set_ip6_token(NML3ConfigData *self, NMUtilsIPv6IfaceId ipv6_to return TRUE; } +const char * +nm_l3_config_data_get_network_id(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return nm_ref_string_get_str(self->network_id); +} + +gboolean +nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *value) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); + + return nm_ref_string_reset_str(&self->network_id, value); +} + NMMptcpFlags nm_l3_config_data_get_mptcp_flags(const NML3ConfigData *self) { @@ -2484,6 +2506,7 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_OTHER)) { NM_CMP_DIRECT(a->flags, b->flags); NM_CMP_DIRECT(a->ip6_token.id, b->ip6_token.id); + NM_CMP_DIRECT_REF_STRING(a->network_id, b->network_id); NM_CMP_DIRECT(a->mtu, b->mtu); NM_CMP_DIRECT(a->ip6_mtu, b->ip6_mtu); NM_CMP_DIRECT_UNSAFE(a->metered, b->metered); @@ -3506,6 +3529,9 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (self->ip6_token.id == 0) self->ip6_token.id = src->ip6_token.id; + if (!self->network_id) + self->network_id = nm_ref_string_ref(src->network_id); + self->metered = NM_MAX((NMTernary) self->metered, (NMTernary) src->metered); if (self->proxy_method == NM_PROXY_CONFIG_METHOD_UNKNOWN) diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index 4102b6e137..081ac5c152 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -490,6 +490,10 @@ NMUtilsIPv6IfaceId nm_l3_config_data_get_ip6_token(const NML3ConfigData *self); gboolean nm_l3_config_data_set_ip6_token(NML3ConfigData *self, NMUtilsIPv6IfaceId ipv6_token); +gboolean nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *network_id); + +const char *nm_l3_config_data_get_network_id(const NML3ConfigData *self); + NMMptcpFlags nm_l3_config_data_get_mptcp_flags(const NML3ConfigData *self); gboolean nm_l3_config_data_set_mptcp_flags(NML3ConfigData *self, NMMptcpFlags mptcp_flags); From a6be1934907168e1131cc32ad1997e5365b4426e Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 6 Feb 2025 14:31:33 -0500 Subject: [PATCH 03/31] l3-config-data: make get_direct_route_for_host public --- src/core/nm-l3-config-data.c | 8 +++++--- src/core/nm-l3-config-data.h | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 9d849744d8..4eeefe9b06 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -2547,8 +2547,10 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, /*****************************************************************************/ -static const NMPObject * -_data_get_direct_route_for_host(const NML3ConfigData *self, int addr_family, gconstpointer host) +const NMPObject * +nm_l3_config_data_get_direct_route_for_host(const NML3ConfigData *self, + int addr_family, + gconstpointer host) { const int IS_IPv4 = NM_IS_IPv4(addr_family); const NMPObject *best_route_obj = NULL; @@ -2706,7 +2708,7 @@ nm_l3_config_data_add_dependent_onlink_routes(NML3ConfigData *self, int addr_fam if (NM_FLAGS_HAS(route_src->rx.r_rtm_flags, (unsigned) RTNH_F_ONLINK)) continue; - if (_data_get_direct_route_for_host(self, addr_family, p_gateway)) + if (nm_l3_config_data_get_direct_route_for_host(self, addr_family, p_gateway)) continue; new_route = nmp_object_clone(obj_src, FALSE); diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index 081ac5c152..b35f23c3e1 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -225,6 +225,10 @@ nm_l3_config_data_equal(const NML3ConfigData *a, const NML3ConfigData *b) /*****************************************************************************/ +const NMPObject *nm_l3_config_data_get_direct_route_for_host(const NML3ConfigData *self, + int addr_family, + gconstpointer host); + const NMDedupMultiIdxType *nm_l3_config_data_lookup_index(const NML3ConfigData *self, NMPObjectType obj_type); From 503673cab31514e01452803d402b80326c8ee00a Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Sun, 12 Jan 2025 14:03:24 -0500 Subject: [PATCH 04/31] contrib: Add libbpf and libxdp to dependencies Required for CLAT support --- .gitlab-ci.yml | 10 +++++----- contrib/alpine/REQUIRED_PACKAGES | 3 +++ contrib/debian/REQUIRED_PACKAGES | 3 +++ contrib/fedora/REQUIRED_PACKAGES | 3 +++ contrib/fedora/rpm/NetworkManager.spec | 5 +++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 67fcf0264e..dc8509071c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -60,11 +60,11 @@ variables: # # This is done by running `ci-fairy generate-template` and possibly bumping # ".default_tag". - ALPINE_TAG: 'tag-0c3a6f855fb8' - CENTOS_TAG: 'tag-c1c23df75dda' - DEBIAN_TAG: 'tag-d4bf5db9e214' - FEDORA_TAG: 'tag-c1c23df75dda' - UBUNTU_TAG: 'tag-d4bf5db9e214' + ALPINE_TAG: 'tag-9048a8c683b9' + CENTOS_TAG: 'tag-026f017b5a4a' + DEBIAN_TAG: 'tag-27883e6c662f' + FEDORA_TAG: 'tag-026f017b5a4a' + UBUNTU_TAG: 'tag-27883e6c662f' ALPINE_EXEC: 'bash .gitlab-ci/alpine-install.sh' CENTOS_EXEC: 'bash .gitlab-ci/fedora-install.sh' diff --git a/contrib/alpine/REQUIRED_PACKAGES b/contrib/alpine/REQUIRED_PACKAGES index 3a3cc1abeb..a429c1c733 100755 --- a/contrib/alpine/REQUIRED_PACKAGES +++ b/contrib/alpine/REQUIRED_PACKAGES @@ -8,6 +8,7 @@ apk add \ 'alpine-sdk' \ 'autoconf' \ 'bash' \ + 'bpftool' \ 'clang' \ 'curl-dev' \ 'dbus' \ @@ -23,6 +24,7 @@ apk add \ 'iproute2' \ 'iptables' \ 'jansson-dev' \ + 'libbpf-dev' \ 'libgudev-dev' \ 'libndp-dev' \ 'libnvme-dev' \ @@ -30,6 +32,7 @@ apk add \ 'libpsl-dev' \ 'libsoup-dev' \ 'libteam-dev' \ + 'libxdp-dev' \ 'linux-headers' \ 'meson' \ 'mobile-broadband-provider-info' \ diff --git a/contrib/debian/REQUIRED_PACKAGES b/contrib/debian/REQUIRED_PACKAGES index 68f62570cc..a61ec0d184 100755 --- a/contrib/debian/REQUIRED_PACKAGES +++ b/contrib/debian/REQUIRED_PACKAGES @@ -32,6 +32,7 @@ install_ignore_missing() { install \ \ + bpftool \ clang \ dbus \ dbus-x11 \ @@ -43,6 +44,7 @@ install \ iproute2 \ iptables \ libaudit-dev \ + libbpf-dev \ libcurl4-gnutls-dev \ libdbus-1-dev \ libgirepository1.0-dev \ @@ -63,6 +65,7 @@ install \ libsystemd-dev \ libteam-dev \ libudev-dev \ + libxdp-dev \ locales \ meson \ mobile-broadband-provider-info \ diff --git a/contrib/fedora/REQUIRED_PACKAGES b/contrib/fedora/REQUIRED_PACKAGES index 6f70537d40..6d37d8280f 100755 --- a/contrib/fedora/REQUIRED_PACKAGES +++ b/contrib/fedora/REQUIRED_PACKAGES @@ -49,6 +49,7 @@ install \ ModemManager-glib-devel \ audit-libs-devel \ bluez-libs-devel \ + bpftool \ clang \ dbus-devel \ dbus-x11 \ @@ -64,11 +65,13 @@ install \ iptables \ jansson-devel \ jq \ + libbpf-devel \ libcurl-devel \ libndp-devel \ libnvme-devel \ libselinux-devel \ libuuid-devel \ + libxdp-devel \ meson \ mobile-broadband-provider-info-devel \ newt-devel \ diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec index cc952f213e..23d89b8717 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -198,6 +198,7 @@ Requires(postun): systemd Requires: dbus >= %{dbus_version} Requires: glib2 >= %{glib2_version} Requires: %{name}-libnm%{?_isa} = %{epoch}:%{version}-%{release} +Requires: libbpf Recommends: iputils @@ -248,6 +249,7 @@ Conflicts: NetworkManager-dispatcher-routing-rules <= 1:1.47.5-3 %endif BuildRequires: gcc +BuildRequires: clang BuildRequires: pkgconfig BuildRequires: meson BuildRequires: gettext-devel >= 0.19.8 @@ -302,6 +304,9 @@ BuildRequires: firewalld-filesystem BuildRequires: iproute BuildRequires: iproute-tc BuildRequires: libnvme-devel >= 1.5 +BuildRequires: libbpf-devel +BuildRequires: libxdp-devel +BuildRequires: bpftool Provides: %{name}-dispatcher%{?_isa} = %{epoch}:%{version}-%{release} From b75c247b6dd915f5086dbd0952463089a4ed785d Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 15:59:30 -0500 Subject: [PATCH 05/31] Add CLAT BPF program and build machinery --- config.h.meson | 3 + meson.build | 10 + meson_options.txt | 3 + src/core/bpf/clat.bpf.c | 697 +++++++++++++++++++++++++++++++++++++++ src/core/bpf/clat.h | 27 ++ src/core/bpf/meson.build | 236 +++++++++++++ src/core/meson.build | 13 +- 7 files changed, 987 insertions(+), 2 deletions(-) create mode 100644 src/core/bpf/clat.bpf.c create mode 100644 src/core/bpf/clat.h create mode 100644 src/core/bpf/meson.build diff --git a/config.h.meson b/config.h.meson index 05d346bb8f..e220c3f0c6 100644 --- a/config.h.meson +++ b/config.h.meson @@ -294,3 +294,6 @@ /* Define to 1 if dlvsym() is available */ #mesondefine HAVE_DLVSYM + +/* Define to 1 if you want CLAT support. */ +#mesondefine HAVE_CLAT diff --git a/meson.build b/meson.build index 606d8c7a19..d7b0745885 100644 --- a/meson.build +++ b/meson.build @@ -485,6 +485,15 @@ if enable_selinux endif config_h.set10('HAVE_SELINUX', enable_selinux) +# CLAT support +enable_clat = get_option('clat') +if enable_clat + libbpf = dependency('libbpf', version: '>= 0.1.0', required: false) + assert(libbpf.found(), 'You must have libbpf installed to build. Use -Dclat=false to disable use of it') + libxdp = dependency('libxdp', version: '>= 0.1.0', required: false) +endif +config_h.set10('HAVE_CLAT', enable_clat) + # libaudit support libaudit = get_option('libaudit') enable_libaudit = libaudit.contains('yes') @@ -1152,5 +1161,6 @@ output += 'have-nss: ' + crypto_nss_dep.found().to_string() + ')\n' output += ' sanitizers: ' + get_option('b_sanitize') + '\n' output += ' Mozilla Public Suffix List: ' + enable_libpsl.to_string() + '\n' output += ' vapi: ' + enable_vapi.to_string() + '\n' +output += ' clat: ' + enable_clat.to_string() + '\n' output += ' readline: ' + with_readline + '\n' message(output) diff --git a/meson_options.txt b/meson_options.txt index 6b5674443b..5502271cac 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -48,6 +48,9 @@ option('nm_cloud_setup', type: 'boolean', value: true, description: 'Build nm-cl option('bluez5_dun', type: 'boolean', value: false, description: 'enable Bluez5 DUN support') option('ebpf', type: 'combo', choices: ['auto', 'true', 'false'], description: 'Enable eBPF support (deprecated)') option('nbft', type: 'boolean', value: true, description: 'Enable NBFT support in the initrd generator') +option('clat', type: 'boolean', value: true, description: 'Build with CLAT support') +option('bpf-compiler', type : 'combo', choices : ['auto', 'clang', 'gcc'], + description : 'compiler used to build BPF programs') # configuration plugins option('config_plugins_default', type: 'string', value: '', description: 'Default configuration option for main.plugins setting, used as fallback if the configuration option is unset') diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c new file mode 100644 index 0000000000..6dd16a48a8 --- /dev/null +++ b/src/core/bpf/clat.bpf.c @@ -0,0 +1,697 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright 2021 Toke Høiland-Jørgensen */ +/* Copyright 2025 Mary Strodl */ + +/** + * This is an implementation of a CLAT in eBPF. BPF is a different environment + * than the rest of NetworkManager, and we don't have access to most of the + * C standard library, so some things might look a little different from what + * you're used to. + * + * Check out src/core/bpf/meson.build to see how this gets built. + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "clat.h" + +char _license[] SEC("license") = "GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct clat_v4_config_key); + __type(value, struct clat_v4_config_value); + __uint(max_entries, 16); + __uint(map_flags, BPF_F_NO_PREALLOC); +} v4_config_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct clat_v6_config_key); + __type(value, struct clat_v6_config_value); + __uint(max_entries, 16); + __uint(map_flags, BPF_F_NO_PREALLOC); +} v6_config_map SEC(".maps"); + +#ifdef DEBUG +#define DBG(fmt, ...) \ + ({ \ + char ____fmt[] = "clat: " fmt; \ + bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__); \ + }) +#else +#define DBG(fmt, ...) +#endif + +struct icmpv6_pseudo { + struct in6_addr saddr; + struct in6_addr daddr; + __u32 len; + __u8 padding[3]; + __u8 nh; +} __attribute__((packed)); + +static __always_inline void +update_l4_checksum(struct __sk_buff *skb, + struct ipv6hdr *ip6h, + struct iphdr *iph, + int ip_type, + bool v4to6) +{ + void *data = (void *) (unsigned long long) skb->data; + int flags = BPF_F_PSEUDO_HDR; + __u16 offset; + __u32 csum; + + if (v4to6) { + csum = bpf_csum_diff((__be32 *) &iph->saddr, + 2 * sizeof(__u32), + (__be32 *) &ip6h->saddr, + 2 * sizeof(struct in6_addr), + 0); + offset = (void *) (iph + 1) - data; + } else { + csum = bpf_csum_diff((__be32 *) &ip6h->saddr, + 2 * sizeof(struct in6_addr), + (__be32 *) &iph->saddr, + 2 * sizeof(__u32), + 0); + offset = (void *) (ip6h + 1) - data; + } + + switch (ip_type) { + case IPPROTO_TCP: + offset += offsetof(struct tcphdr, check); + break; + case IPPROTO_UDP: + offset += offsetof(struct udphdr, check); + flags |= BPF_F_MARK_MANGLED_0; + break; + default: + return; + } + + bpf_l4_csum_replace(skb, offset, 0, csum, flags); +} + +static __always_inline void +update_icmp_checksum(struct __sk_buff *skb, + struct ipv6hdr *ip6h, + void *icmp_before, + void *icmp_after, + bool add) +{ + void *data = (void *) (unsigned long long) skb->data; + struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, + .saddr = ip6h->saddr, + .daddr = ip6h->daddr, + .len = ip6h->payload_len}; + __u16 h_before, h_after, offset; + __u32 csum, u_before, u_after; + + /* Do checksum update in two passes: first compute the incremental + * checksum update of the ICMPv6 pseudo header, update the checksum + * using bpf_l4_csum_replace(), and then do a separate update for the + * ICMP type and code (which is two consecutive bytes, so cast them to + * u16). The bpf_csum_diff() helper can be used to compute the + * incremental update of the full block, whereas the + * bpf_l4_csum_replace() helper can do the two-byte diff and update by + * itself. + */ + csum = bpf_csum_diff((__be32 *) &ph, + add ? 0 : sizeof(ph), + (__be32 *) &ph, + add ? sizeof(ph) : 0, + 0); + + offset = ((void *) icmp_after - data) + 2; + /* first two bytes of ICMP header, type and code */ + h_before = *(__u16 *) icmp_before; + h_after = *(__u16 *) icmp_after; + + /* last four bytes of ICMP header, the data union */ + u_before = *(__u32 *) (icmp_before + 4); + u_after = *(__u32 *) (icmp_after + 4); + + bpf_l4_csum_replace(skb, offset, 0, csum, BPF_F_PSEUDO_HDR); + bpf_l4_csum_replace(skb, offset, h_before, h_after, 2); + + if (u_before != u_after) + bpf_l4_csum_replace(skb, offset, u_before, u_after, 4); +} + +static int +rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) +{ + void *data_end = (void *) (unsigned long long) skb->data_end; + + struct icmphdr old_icmp, *icmp = (void *) (iph + 1); + struct icmp6hdr icmp6, *new_icmp6; + __u32 mtu; + + if ((void *) (icmp + 1) > data_end) + return -1; + + old_icmp = *icmp; + new_icmp6 = (void *) icmp; + icmp6 = *new_icmp6; + + /* These translations are defined in RFC6145 section 4.2 */ + switch (icmp->type) { + case ICMP_ECHO: + icmp6.icmp6_type = ICMPV6_ECHO_REQUEST; + break; + case ICMP_ECHOREPLY: + icmp6.icmp6_type = ICMPV6_ECHO_REPLY; + break; + case ICMP_DEST_UNREACH: + icmp6.icmp6_type = ICMPV6_DEST_UNREACH; + switch (icmp->code) { + case ICMP_NET_UNREACH: + case ICMP_HOST_UNREACH: + case ICMP_SR_FAILED: + case ICMP_NET_UNKNOWN: + case ICMP_HOST_UNKNOWN: + case ICMP_HOST_ISOLATED: + case ICMP_NET_UNR_TOS: + case ICMP_HOST_UNR_TOS: + icmp6.icmp6_code = ICMPV6_NOROUTE; + break; + case ICMP_PROT_UNREACH: + icmp6.icmp6_type = ICMPV6_PARAMPROB; + icmp6.icmp6_code = ICMPV6_UNK_NEXTHDR; + icmp6.icmp6_pointer = bpf_htonl(offsetof(struct ipv6hdr, nexthdr)); + case ICMP_PORT_UNREACH: + icmp6.icmp6_code = ICMPV6_PORT_UNREACH; + break; + case ICMP_FRAG_NEEDED: + icmp6.icmp6_type = ICMPV6_PKT_TOOBIG; + icmp6.icmp6_code = 0; + mtu = bpf_ntohs(icmp->un.frag.mtu) + 20; + /* RFC6145 section 6, "second approach" - should not be + * necessary, but might as well do this + */ + if (mtu < 1280) + mtu = 1280; + icmp6.icmp6_mtu = bpf_htonl(mtu); + case ICMP_NET_ANO: + case ICMP_HOST_ANO: + case ICMP_PKT_FILTERED: + case ICMP_PREC_CUTOFF: + icmp6.icmp6_code = ICMPV6_ADM_PROHIBITED; + default: + return -1; + } + break; + case ICMP_PARAMETERPROB: + if (icmp->code == 1) + return -1; + icmp6.icmp6_type = ICMPV6_PARAMPROB; + icmp6.icmp6_code = ICMPV6_HDR_FIELD; + /* The pointer field not defined in the Linux header. This + * translation is from Figure 3 of RFC6145. + */ + switch (icmp->un.reserved[0]) { + case 0: /* version/IHL */ + icmp6.icmp6_pointer = 0; + break; + case 1: /* Type of Service */ + icmp6.icmp6_pointer = bpf_htonl(1); + break; + case 2: /* Total length */ + case 3: + icmp6.icmp6_pointer = bpf_htonl(4); + break; + case 8: /* Time to Live */ + icmp6.icmp6_pointer = bpf_htonl(7); + break; + case 9: /* Protocol */ + icmp6.icmp6_pointer = bpf_htonl(6); + break; + case 12: /* Source address */ + case 13: + case 14: + case 15: + icmp6.icmp6_pointer = bpf_htonl(8); + break; + case 16: /* Destination address */ + case 17: + case 18: + case 19: + icmp6.icmp6_pointer = bpf_htonl(24); + break; + default: + return -1; + } + default: + return -1; + } + + *new_icmp6 = icmp6; + update_icmp_checksum(skb, ip6h, &old_icmp, new_icmp6, true); + + /* FIXME: also need to rewrite IP header embedded in ICMP error */ + + return 0; +} + +/* ipv4 traffic in from application on this device, needs to be translated to v6 and sent to PLAT */ +static __attribute__((always_inline)) inline int +clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) +{ + int ret = TC_ACT_OK; + void *data_end = (void *) (unsigned long long) skb->data_end; + void *data = (void *) (unsigned long long) skb->data; + int ip_type, iphdr_len, ip_offset; + + struct in6_addr *dst_v6; + struct ipv6hdr *ip6h; + struct ipv6hdr dst_hdr = { + .version = 6, + }; + struct iphdr *iph; + struct ethhdr *eth; + struct in_addr src_v4; + + struct clat_v4_config_value *v4_config; + struct clat_v4_config_key v4_config_key; + + ip_offset = (nh->pos - data) & 0x1fff; + + ip_type = parse_iphdr(nh, data_end, &iph); + if (ip_type < 0) + goto out; + + src_v4.s_addr = iph->saddr; + v4_config_key.ifindex = skb->ifindex; + v4_config_key.local_v4 = src_v4; + + v4_config = bpf_map_lookup_elem(&v4_config_map, &v4_config_key); + if (!v4_config) { + DBG("-> v4: config for src_v4=%pI4 not found!\n", &v4_config_key.local_v4); + goto out; + } + + /* At this point we know the destination IP is within the configured + * subnet, so if we can't rewrite the packet it should be dropped (so as + * not to leak traffic in that subnet). + */ + ret = TC_ACT_SHOT; + + /* we don't bother dealing with IP options or fragmented packets. The + * latter are identified by the 'frag_off' field having a value (either + * the MF bit, or the fragmet offset, or both). However, this field also + * contains the "don't fragment" (DF) bit, which we ignore, so mask that + * out. The DF is the second-most-significant bit (as bit 0 is + * reserved). + */ + iphdr_len = iph->ihl * 4; + if (iphdr_len != sizeof(struct iphdr) || (iph->frag_off & ~bpf_htons(1 << 14))) { + DBG("v4: pkt src/dst %pI4/%pI4 has IP options or is fragmented, dropping\n", + &iph->daddr, + &iph->saddr); + goto out; + } + + dst_v6 = &v4_config->pref64; + dst_v6->s6_addr32[3] = iph->daddr; + + DBG("v4: Found mapping for dst %pI4 to %pI6c\n", &iph->daddr, dst_v6); + + /* src v4 as last octet of clat address */ + dst_hdr.saddr = v4_config->local_v6; + dst_hdr.daddr = *dst_v6; + dst_hdr.nexthdr = iph->protocol; + dst_hdr.hop_limit = iph->ttl; + /* weird definition in ipv6hdr */ + dst_hdr.priority = (iph->tos & 0x70) >> 4; + dst_hdr.flow_lbl[0] = iph->tos << 4; + dst_hdr.payload_len = bpf_htons(bpf_ntohs(iph->tot_len) - iphdr_len); + + switch (dst_hdr.nexthdr) { + case IPPROTO_ICMP: + if (rewrite_icmp(iph, &dst_hdr, skb)) + goto out; + dst_hdr.nexthdr = IPPROTO_ICMPV6; + break; + case IPPROTO_TCP: + case IPPROTO_UDP: + update_l4_checksum(skb, &dst_hdr, iph, dst_hdr.nexthdr, true); + break; + default: + break; + } + + if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IPV6), 0)) + goto out; + + data = (void *) (unsigned long long) skb->data; + data_end = (void *) (unsigned long long) skb->data_end; + + eth = data; + ip6h = data + ip_offset; + if ((void *) (eth + 1) > data_end || (void *) (ip6h + 1) > data_end) + goto out; + + eth->h_proto = bpf_htons(ETH_P_IPV6); + *ip6h = dst_hdr; + + ret = bpf_redirect_neigh(skb->ifindex, NULL, 0, 0); +out: + return ret; +} + +static __always_inline __u16 +csum_fold_helper(__u32 csum) +{ + __u32 sum; + sum = (csum >> 16) + (csum & 0xffff); + sum += (sum >> 16); + return ~sum; +} + +static __attribute__((always_inline)) inline int clat_translate_v6(struct __sk_buff *skb, + struct hdr_cursor *nh, + void *data_end, + struct iphdr *dst_hdr_out, + bool depth); + +static __attribute__((always_inline)) inline int +rewrite_icmpv6(struct ipv6hdr *ip6h, + struct __sk_buff *skb, + struct icmphdr **new_icmp_out, + struct hdr_cursor *nh) +{ + void *data_end = (void *) (unsigned long long) skb->data_end; + + struct icmp6hdr old_icmp6, *icmp6 = (void *) (ip6h + 1); + struct icmphdr icmp, *new_icmp; + __u32 mtu, ptr; + struct iphdr dst_hdr; + void *inner_packet; + + if ((void *) (icmp6 + 1) > data_end) + return -1; + + old_icmp6 = *icmp6; + new_icmp = (void *) icmp6; + icmp = *new_icmp; + + /* These translations are defined in RFC6145 section 5.2 */ + switch (icmp6->icmp6_type) { + case ICMPV6_ECHO_REQUEST: + icmp.type = ICMP_ECHO; + break; + case ICMPV6_ECHO_REPLY: + icmp.type = ICMP_ECHOREPLY; + break; + case ICMPV6_DEST_UNREACH: + icmp.type = ICMP_DEST_UNREACH; + switch (icmp6->icmp6_code) { + case ICMPV6_NOROUTE: + case ICMPV6_NOT_NEIGHBOUR: + case ICMPV6_ADDR_UNREACH: + icmp.code = ICMP_HOST_UNREACH; + break; + case ICMPV6_ADM_PROHIBITED: + icmp.code = ICMP_HOST_ANO; + break; + case ICMPV6_PORT_UNREACH: + icmp.code = ICMP_PORT_UNREACH; + break; + default: + return -1; + } + break; + case ICMPV6_PKT_TOOBIG: + icmp.type = ICMP_DEST_UNREACH; + icmp.code = ICMP_FRAG_NEEDED; + + mtu = bpf_htonl(icmp6->icmp6_mtu) - 20; + if (mtu > 0xffff) + return -1; + icmp.un.frag.mtu = bpf_htons(mtu); + break; + case ICMPV6_TIME_EXCEED: + icmp.type = ICMP_TIME_EXCEEDED; + break; + case ICMPV6_PARAMPROB: + switch (icmp6->icmp6_code) { + case 0: + icmp.type = ICMP_PARAMETERPROB; + icmp.code = 0; + break; + case 1: + icmp.type = ICMP_DEST_UNREACH; + icmp.code = ICMP_PROT_UNREACH; + ptr = bpf_ntohl(icmp6->icmp6_pointer); + /* Figure 6 in RFC6145 - using if statements b/c of + * range at the bottom + */ + if (ptr == 0 || ptr == 1) + icmp.un.reserved[0] = ptr; + else if (ptr == 4 || ptr == 5) + icmp.un.reserved[0] = 2; + else if (ptr == 6) + icmp.un.reserved[0] = 9; + else if (ptr == 7) + icmp.un.reserved[0] = 8; + else if (ptr >= 8 && ptr <= 23) + icmp.un.reserved[0] = 12; + else if (ptr >= 24 && ptr <= 39) + icmp.un.reserved[0] = 16; + else + return -1; + break; + default: + return -1; + } + break; + default: + return -1; + } + + *new_icmp = icmp; +out: + *new_icmp_out = new_icmp; + return 0; +} + +static __attribute__((always_inline)) inline int +clat_translate_v6(struct __sk_buff *skb, + struct hdr_cursor *nh, + void *data_end, + struct iphdr *dst_hdr_out, + bool depth) +{ + struct in6_addr subnet_v6 = {}; + struct in_addr src_v4; + int ip_type; + struct ipv6hdr *ip6h; + int ret = TC_ACT_OK; + struct icmphdr *new_icmp; + struct icmp6hdr old_icmp6; + struct iphdr dst_hdr_icmp; + int type; + + struct clat_v6_config_value *v6_config; + struct clat_v6_config_key v6_config_key; + + struct iphdr dst_hdr = { + .version = 4, + .ihl = 5, + .frag_off = bpf_htons(1 << 14), /* set Don't Fragment bit */ + }; + + ip_type = parse_ip6hdr(nh, data_end, &ip6h); + if (ip_type < 0) + goto out; + + src_v4.s_addr = ip6h->saddr.s6_addr32[3]; + + v6_config_key.local_v6 = ip6h->daddr; + v6_config_key.pref64 = ip6h->saddr; + /* v6 pxlen is always 96 */ + v6_config_key.pref64.s6_addr32[3] = 0; + v6_config_key.ifindex = skb->ifindex; + + v6_config = bpf_map_lookup_elem(&v6_config_map, &v6_config_key); + if (!v6_config) { + DBG("<- v6: config for pref64=%pI6c, local_v6=%pI6c not found!\n", + &v6_config_key.pref64, + &v6_config_key.local_v6); + goto out; + } + + /* At this point we know the destination IP is within the configured + * subnet, so if we can't rewrite the packet it should be dropped (so as + * not to leak traffic in that subnet). + */ + ret = TC_ACT_SHOT; + + /* drop packets with IP options - parser skips options */ + if (ip_type != ip6h->nexthdr) { + DBG("v6: dropping packet with IP options from %pI6c\n", &ip6h->saddr); + goto out; + } + + dst_hdr.daddr = v6_config->local_v4.s_addr; + dst_hdr.saddr = src_v4.s_addr; + dst_hdr.protocol = ip6h->nexthdr; + dst_hdr.ttl = ip6h->hop_limit; + dst_hdr.tos = ip6h->priority << 4 | (ip6h->flow_lbl[0] >> 4); + dst_hdr.tot_len = bpf_htons(bpf_ntohs(ip6h->payload_len) + sizeof(dst_hdr)); + + switch (dst_hdr.protocol) { + case IPPROTO_ICMPV6: + + new_icmp = (void *) (ip6h + 1); + old_icmp6 = *((struct icmp6hdr *) (void *) new_icmp); + if (rewrite_icmpv6(ip6h, skb, &new_icmp, nh)) + goto out; + + /* FIXME: also need to rewrite IP header embedded in ICMP error */ + if (depth) + goto icmp_out; + if (!new_icmp) + goto icmp_out; + if ((void *) (new_icmp + 1) > data_end) + goto icmp_out; + + /* int type = (*new_icmp).type; */ + /* switch (type) { */ + /* case ICMP_TIME_EXCEEDED: */ + /* case ICMP_DEST_UNREACH: */ + + /* nh->pos = new_icmp + 1; */ + /* if (clat_translate_v6(skb, nh, data_end, &dst_hdr_icmp, 1)) { */ + /* DBG("Bad embedded v6?"); */ + /* goto out; */ + /* } */ + /* if (((__u8 *)(new_icmp + 1)) + sizeof(dst_hdr_icmp) >= data_end) { */ + /* DBG("ICMP header is out of bounds"); */ + /* goto out; */ + /* } */ + /* memcpy(new_icmp + 1, &dst_hdr_icmp, sizeof(dst_hdr_icmp)); // dst_hdr.ihl * 4 */ + + /* /\* Scoot the payload up against the v4 header *\/ */ + /* /\* (Note: We can't use a normal memmove here because clang only supports */ + /* constexpr lengths!) *\/ */ + + /* clat_memmove(((__u8 *)(new_icmp + 1)) + sizeof(dst_hdr), */ + /* ((__u8 *)(new_icmp + 1)) + sizeof(struct ipv6hdr), */ + /* skb, */ + /* dst_hdr.tot_len - (dst_hdr.ihl * 4)); */ + /* /\* TODO: Translate ICMP Extension length *\/ */ + /* break; */ + /* } */ + + update_icmp_checksum(skb, ip6h, &old_icmp6, new_icmp, false); + +icmp_out: + dst_hdr.protocol = IPPROTO_ICMP; + break; + case IPPROTO_TCP: + case IPPROTO_UDP: + update_l4_checksum(skb, ip6h, &dst_hdr, dst_hdr.protocol, false); + break; + default: + break; + } + + dst_hdr.check = csum_fold_helper( + bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(dst_hdr), 0)); + + *dst_hdr_out = dst_hdr; + +out: + return ret; +} + +/* ipv6 traffic from the PLAT, to be translated into ipv4 and sent to an application */ +static __attribute__((always_inline)) inline int +clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) +{ + int ret = TC_ACT_OK; + void *data_end = (void *) (unsigned long long) skb->data_end; + void *data = (void *) (unsigned long long) skb->data; + + struct ethhdr *eth; + struct iphdr *iph; + struct iphdr dst_hdr; + + int ip_offset = (nh->pos - data) & 0x1fff; + + ret = clat_translate_v6(skb, nh, data_end, &dst_hdr, 0); + if (ret != TC_ACT_SHOT) { + goto out; + } + + if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) + goto out; + + data = (void *) (unsigned long long) skb->data; + data_end = (void *) (unsigned long long) skb->data_end; + + eth = data; + iph = data + ip_offset; + if ((void *) (eth + 1) > data_end || (void *) (iph + 1) > data_end) + goto out; + + eth->h_proto = bpf_htons(ETH_P_IP); + *iph = dst_hdr; + + ret = bpf_redirect(skb->ifindex, BPF_F_INGRESS); +out: + return ret; +} + +static __attribute__((always_inline)) inline int +clat_handler(struct __sk_buff *skb, bool egress) +{ + void *data_end = (void *) (unsigned long long) skb->data_end; + void *data = (void *) (unsigned long long) skb->data; + struct hdr_cursor nh = {.pos = data}; + struct ethhdr *eth; + int eth_type; + + /* Parse Ethernet and IP/IPv6 headers */ + eth_type = parse_ethhdr(&nh, data_end, ð); + if (eth_type == bpf_htons(ETH_P_IP) && egress) + return clat_handle_v4(skb, &nh); + else if (eth_type == bpf_htons(ETH_P_IPV6) && !egress) + return clat_handle_v6(skb, &nh); + + return TC_ACT_OK; +} +SEC("tcx/egress") +int +clat_egress(struct __sk_buff *skb) +{ + return clat_handler(skb, true); +} + +SEC("tcx/ingress") +int +clat_ingress(struct __sk_buff *skb) +{ + return clat_handler(skb, false); +} diff --git a/src/core/bpf/clat.h b/src/core/bpf/clat.h new file mode 100644 index 0000000000..ee4763d5c7 --- /dev/null +++ b/src/core/bpf/clat.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __NAT64_H__ +#define __NAT64_H__ + +#include + +struct clat_v6_config_key { + struct in6_addr local_v6; + struct in6_addr pref64; + __u32 ifindex; +}; + +struct clat_v6_config_value { + struct in_addr local_v4; +}; + +struct clat_v4_config_key { + struct in_addr local_v4; + __u32 ifindex; +}; + +struct clat_v4_config_value { + struct in6_addr local_v6; + struct in6_addr pref64; +}; + +#endif diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build new file mode 100644 index 0000000000..0899f418d4 --- /dev/null +++ b/src/core/bpf/meson.build @@ -0,0 +1,236 @@ +# SPDX-License-Identifier: LGPL-2.1+ + +# Ripped from systemd: https://github.com/systemd/systemd/pull/20429 + +if not enable_clat + subdir_done() +endif + +bpf_compiler = get_option('bpf-compiler') +clang_found = false +clang_supports_bpf = false +bpf_gcc_found = false +bpftool_strip = false + +if bpf_compiler == 'clang' or bpf_compiler == 'auto' + # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu + # (like clang-10/llvm-strip-10) + if meson.is_cross_build() or cc.get_id() != 'clang' or cc.cmd_array()[0].contains('afl-clang') or cc.cmd_array()[0].contains('hfuzz-clang') + r = find_program('clang', + version : '>= 10.0.0') + clang_found = r.found() + if clang_found + if meson.version().version_compare('>= 0.55') + clang = r.full_path() + else + clang = r.path() + endif + endif + else + clang_found = true + clang = cc.cmd_array() + endif + + if clang_found + # Check if 'clang -target bpf' is supported. + clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', check : false).returncode() == 0 + endif +elif bpf_compiler == 'gcc' or bpf_compiler == 'auto' + bpf_gcc = find_program('bpf-gcc', + 'bpf-none-gcc', + 'bpf-unknown-none-gcc', + version : '>= 13.1.0') + bpf_gcc_found = bpf_gcc.found() +endif + +if bpf_compiler == 'auto' + if clang_supports_bpf and bpf_gcc_found + # Both supported, prefer the one matching our compiler: + if cc.get_id() == 'gcc' + bpf_compiler = 'gcc' + else + # Default to clang if we don't know this compiler + bpf_compiler = 'clang' + endif + elif clang_supports_bpf + bpf_compiler = 'clang' + elif bpf_gcc_found + bpf_compiler = 'clang' + endif +endif + +if clang_supports_bpf or bpf_gcc_found + # Debian installs this in /usr/sbin/ which is not in $PATH. + # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian. + # We use 'bpftool gen object' subcommand for bpftool strip, it was added by d80b2fcbe0a023619e0fc73112f2a02c2662f6ab (v5.13). + bpftool = find_program('bpftool', + '/usr/sbin/bpftool', + required : bpf_compiler == 'gcc', + version : bpf_compiler == 'gcc' ? '>= 7.0.0' : '>= 5.13.0') + + if bpftool.found() + bpftool_strip = true + elif bpf_compiler == 'clang' + # We require the 'bpftool gen skeleton' subcommand, it was added by 985ead416df39d6fe8e89580cc1db6aa273e0175 (v5.6). + bpftool = find_program('bpftool', + '/usr/sbin/bpftool', + required : true, + version : '>= 5.6.0') + endif + + # We use `llvm-strip` as a fallback if `bpftool gen object` strip support is not available. + if not bpftool_strip and bpftool.found() and clang_supports_bpf + if not meson.is_cross_build() + llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip', + check : true).stdout().strip() + else + llvm_strip_bin = 'llvm-strip' + endif + llvm_strip = find_program(llvm_strip_bin, + required : true, + version : '>= 10.0.0') + endif +else + error('clat support was enabled but couldn\'t find a suitable BPF compiler!') +endif + +bpf_clang_flags = [ + '-std=gnu17', + '-Wno-compare-distinct-pointer-types', + '-fno-stack-protector', + '-O2', + '-target', + 'bpf', + '-g', + '-c', +] + +bpf_gcc_flags = [ + '-std=gnu17', + '-fno-stack-protector', + '-fno-ssa-phiopt', + '-O2', + '-mcpu=v3', + '-mco-re', + '-gbtf', + '-c', +] + +clang_arch_flag = '-D__@0@__'.format(host_machine.cpu_family()) + +libbpf_include_dir = dependency('libbpf').get_variable(pkgconfig : 'includedir') +libxdp_include_dir = dependency('libxdp').get_variable(pkgconfig : 'includedir') + +# Generate defines that are appropriate to tell the compiler what architecture +# we're compiling for. By default we just map meson's cpu_family to ____. +# This dictionary contains the exceptions where this doesn't work. +# +# C.f. https://mesonbuild.com/Reference-tables.html#cpu-families +# and src/basic/missing_syscall_def.h. +cpu_arch_defines = { + 'ppc' : ['-D__powerpc__', '-D__TARGET_ARCH_powerpc'], + 'ppc64' : ['-D__powerpc64__', '-D__TARGET_ARCH_powerpc', '-D_CALL_ELF=2'], + 'riscv32' : ['-D__riscv', '-D__riscv_xlen=32', '-D__TARGET_ARCH_riscv'], + 'riscv64' : ['-D__riscv', '-D__riscv_xlen=64', '-D__TARGET_ARCH_riscv'], + 'x86' : ['-D__i386__', '-D__TARGET_ARCH_x86'], + 's390x' : ['-D__s390__', '-D__s390x__', '-D__TARGET_ARCH_s390'], + + # For arm, assume hardware fp is available. + 'arm' : ['-D__arm__', '-D__ARM_PCS_VFP', '-D__TARGET_ARCH_arm'], + 'loongarch64' : ['-D__loongarch__', '-D__loongarch_grlen=64', '-D__TARGET_ARCH_loongarch'] +} + +bpf_arch_flags = cpu_arch_defines.get(host_machine.cpu_family(), + ['-D__@0@__'.format(host_machine.cpu_family())]) +if bpf_compiler == 'gcc' + bpf_arch_flags += ['-m' + host_machine.endian() + '-endian'] +endif + +bpf_o_unstripped_cmd = [] +if bpf_compiler == 'clang' + bpf_o_unstripped_cmd += [ + clang, + bpf_clang_flags, + bpf_arch_flags, + ] +elif bpf_compiler == 'gcc' + bpf_o_unstripped_cmd += [ + bpf_gcc, + bpf_gcc_flags, + bpf_arch_flags, + ] +endif + +bpf_o_unstripped_cmd += ['-I.'] + +if cc.get_id() == 'gcc' or meson.is_cross_build() + if cc.get_id() != 'gcc' + warning('Cross compiler is not gcc. Guessing the target triplet for bpf likely fails.') + endif + target_triplet_cmd = run_command(cc.cmd_array(), '-print-multiarch', check: false) +else + # clang does not support -print-multiarch (D133170) and its -dump-machine + # does not match multiarch. Query gcc instead. + target_triplet_cmd = run_command('gcc', '-print-multiarch', check: false) +endif + +if target_triplet_cmd.returncode() == 0 + target_triplet = target_triplet_cmd.stdout().strip() + bpf_o_unstripped_cmd += [ + '-isystem', + '/usr/include/@0@'.format(target_triplet) + ] +endif + +bpf_o_unstripped_cmd += [ + '-idirafter', + libbpf_include_dir, + '@INPUT@', + '-o', + '@OUTPUT@' +] + +if bpftool_strip + bpf_o_cmd = [ + bpftool, + 'gen', + 'object', + '@OUTPUT@', + '@INPUT@' + ] +elif bpf_compiler == 'clang' + bpf_o_cmd = [ + llvm_strip, + '-g', + '@INPUT@', + '-o', + '@OUTPUT@' + ] +endif + +skel_h_cmd = [ + bpftool, + 'g', + 's', + '@INPUT@' +] + +clat_bpf_o_unstripped = custom_target( + 'clat.bpf.unstripped.o', + input : 'clat.bpf.c', + output : 'clat.bpf.unstripped.o', + command : bpf_o_unstripped_cmd) + +clat_bpf_o = custom_target( + 'clat.bpf.o', + input : clat_bpf_o_unstripped, + output : 'clat.bpf.o', + command : bpf_o_cmd) + +clat_skel_h = custom_target( + 'clat.skel.h', + input : clat_bpf_o, + output : 'clat.skel.h', + command : skel_h_cmd, + capture : true) + diff --git a/src/core/meson.build b/src/core/meson.build index 6cf891ee7e..09f276bda7 100644 --- a/src/core/meson.build +++ b/src/core/meson.build @@ -32,6 +32,15 @@ install_data( core_plugins = [] +subdir('bpf') + +base_sources_addon = [] +base_deps_addon = [] +if enable_clat + base_sources_addon += [clat_skel_h] + base_deps_addon += [libbpf, libxdp] +endif + libNetworkManagerBase = static_library( 'NetworkManagerBase', sources: files( @@ -55,13 +64,13 @@ libNetworkManagerBase = static_library( 'nm-l3cfg.c', 'nm-bond-manager.c', 'nm-ip-config.c', - ), + ) + base_sources_addon, dependencies: [ core_default_dep, libnm_core_public_dep, libsystemd_dep, libudev_dep, - ], + ] + base_deps_addon, ) nm_deps = [ From 3919f06e9824ec32d122615c31d0f1acbbcfaeba Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 29 Sep 2025 23:11:19 +0200 Subject: [PATCH 06/31] Add CLAT BPF program and build machinery (fixes) --- src/core/bpf/meson.build | 1 - src/core/meson.build | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build index 0899f418d4..200d0c670e 100644 --- a/src/core/bpf/meson.build +++ b/src/core/bpf/meson.build @@ -119,7 +119,6 @@ bpf_gcc_flags = [ clang_arch_flag = '-D__@0@__'.format(host_machine.cpu_family()) libbpf_include_dir = dependency('libbpf').get_variable(pkgconfig : 'includedir') -libxdp_include_dir = dependency('libxdp').get_variable(pkgconfig : 'includedir') # Generate defines that are appropriate to tell the compiler what architecture # we're compiling for. By default we just map meson's cpu_family to ____. diff --git a/src/core/meson.build b/src/core/meson.build index 09f276bda7..26d27f96e2 100644 --- a/src/core/meson.build +++ b/src/core/meson.build @@ -38,7 +38,7 @@ base_sources_addon = [] base_deps_addon = [] if enable_clat base_sources_addon += [clat_skel_h] - base_deps_addon += [libbpf, libxdp] + base_deps_addon += [libbpf] endif libNetworkManagerBase = static_library( From e262c8403292eda20c087bc1ef871fb65024dcd7 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 15:59:57 -0500 Subject: [PATCH 07/31] Add support for CLAT to l3cfg --- src/core/nm-l3-config-data.c | 73 ++++++ src/core/nm-l3-config-data.h | 10 + src/core/nm-l3cfg.c | 471 +++++++++++++++++++++++++++++++++++ src/libnm-base/nm-base.h | 1 + 4 files changed, 555 insertions(+) diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 4eeefe9b06..d4905e1dad 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -50,6 +50,9 @@ struct _NML3ConfigData { const NMPObject *best_default_route_x[2]; }; + struct in6_addr pref64_prefix; + guint32 pref64_plen; + GArray *wins; GArray *nis_servers; @@ -168,6 +171,8 @@ struct _NML3ConfigData { bool routed_dns_4 : 1; bool routed_dns_6 : 1; + + bool pref64_valid : 1; }; /*****************************************************************************/ @@ -520,6 +525,12 @@ nm_l3_config_data_log(const NML3ConfigData *self, _L("nis-domain: %s", self->nis_domain->str); } + if (!IS_IPv4 && self->pref64_valid) { + _L("pref64_prefix: %s/%d", + nm_utils_inet6_ntop(&self->pref64_prefix, sbuf_addr), + self->pref64_plen); + } + if (self->dhcp_lease_x[IS_IPv4]) { gs_free NMUtilsNamedValue *options_free = NULL; NMUtilsNamedValue options_buffer[30]; @@ -727,6 +738,7 @@ nm_l3_config_data_new(NMDedupMultiIndex *multi_idx, int ifindex, NMIPConfigSourc .ndisc_retrans_timer_msec_set = FALSE, .allow_routes_without_address_4 = TRUE, .allow_routes_without_address_6 = TRUE, + .pref64_valid = FALSE, }; _idx_type_init(&self->idx_addresses_4, NMP_OBJECT_TYPE_IP4_ADDRESS); @@ -1979,6 +1991,54 @@ nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *value) return nm_ref_string_reset_str(&self->network_id, value); } +gboolean +nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val) +{ + if (self->pref64_valid == val) + return FALSE; + self->pref64_valid = val; + return TRUE; +} + +gboolean +nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self, gboolean *out_val) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + NM_SET_OUT(out_val, self->pref64_valid); + return TRUE; +} + +gboolean +nm_l3_config_data_get_pref64(const NML3ConfigData *self, + struct in6_addr *out_prefix, + guint32 *out_plen) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + if (!self->pref64_valid) + return FALSE; + NM_SET_OUT(out_prefix, self->pref64_prefix); + NM_SET_OUT(out_plen, self->pref64_plen); + return TRUE; +} + +gboolean +nm_l3_config_data_set_pref64(NML3ConfigData *self, struct in6_addr prefix, guint32 plen) +{ + if (self->pref64_valid) { + if (self->pref64_plen == plen + && nm_ip6_addr_same_prefix(&self->pref64_prefix, &prefix, plen)) { + return FALSE; + } + } else { + self->pref64_valid = TRUE; + } + self->pref64_prefix = prefix; + self->pref64_plen = plen; + return TRUE; +} + NMMptcpFlags nm_l3_config_data_get_mptcp_flags(const NML3ConfigData *self) { @@ -2532,6 +2592,13 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, NM_CMP_DIRECT_UNSAFE(a->routed_dns_4, b->routed_dns_4); NM_CMP_DIRECT_UNSAFE(a->routed_dns_6, b->routed_dns_6); + NM_CMP_DIRECT(!!a->pref64_valid, !!b->pref64_valid); + if (a->pref64_valid) { + NM_CMP_DIRECT(a->pref64_plen, b->pref64_plen); + NM_CMP_RETURN_DIRECT( + nm_ip6_addr_same_prefix_cmp(&a->pref64_prefix, &b->pref64_prefix, a->pref64_plen)); + } + NM_CMP_FIELD(a, b, source); } @@ -3595,6 +3662,12 @@ nm_l3_config_data_merge(NML3ConfigData *self, self->routed_dns_4 = TRUE; if (src->routed_dns_6) self->routed_dns_6 = TRUE; + + if (src->pref64_valid) { + self->pref64_prefix = src->pref64_prefix; + self->pref64_plen = src->pref64_plen; + self->pref64_valid = src->pref64_valid; + } } NML3ConfigData * diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index b35f23c3e1..69ac3ff976 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -498,6 +498,16 @@ gboolean nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *netw const char *nm_l3_config_data_get_network_id(const NML3ConfigData *self); +gboolean nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val); + +gboolean nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self, gboolean *out_val); + +gboolean nm_l3_config_data_get_pref64(const NML3ConfigData *self, + struct in6_addr *out_prefix, + guint32 *out_plen); + +gboolean nm_l3_config_data_set_pref64(NML3ConfigData *self, struct in6_addr prefix, guint32 plen); + NMMptcpFlags nm_l3_config_data_get_mptcp_flags(const NML3ConfigData *self); gboolean nm_l3_config_data_set_mptcp_flags(NML3ConfigData *self, NMMptcpFlags mptcp_flags); diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 0d93f76bc2..9e8fcdc5d1 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -11,6 +11,10 @@ #include #include #include +#ifdef HAVE_CLAT +#include +#include +#endif /* HAVE_CLAT */ #include "libnm-core-aux-intern/nm-libnm-core-utils.h" #include "libnm-glib-aux/nm-prioq.h" @@ -22,6 +26,13 @@ #include "n-acd/src/n-acd.h" #include "nm-l3-ipv4ll.h" #include "nm-ip-config.h" +#include "nm-core-utils.h" +#ifdef HAVE_CLAT +#include "bpf/clat.h" +NM_PRAGMA_WARNING_DISABLE("-Wcast-align") +#include "bpf/clat.skel.h" +NM_PRAGMA_WARNING_REENABLE +#endif /* HAVE_CLAT */ /*****************************************************************************/ @@ -289,6 +300,19 @@ typedef struct _NML3CfgPrivate { NMIPConfig *ipconfig_x[2]; }; +#ifdef HAVE_CLAT + NMNetnsIPRange *clat_address_4_commited; + NMPlatformIP6Address clat_address_6_commited; + NMNetnsIPRange *clat_address_4; + NMPlatformIP6Address clat_address_6; + struct in6_addr clat_pref64; + /* If NULL, the BPF program hasn't been loaded or attached */ + struct clat_bpf *clat_bpf; + int clat_socket; + struct bpf_tc_opts clat_attach_ingress; + struct bpf_tc_opts clat_attach_egress; +#endif /* HAVE_CLAT */ + /* Whether we earlier configured MPTCP endpoints for the interface. */ union { struct { @@ -353,6 +377,10 @@ typedef struct _NML3CfgPrivate { bool rp_filter_handled : 1; bool rp_filter_set : 1; + + bool clat_address_6_valid : 1; + bool clat_address_6_commited_valid : 1; + bool clat_pref64_valid : 1; } NML3CfgPrivate; struct _NML3CfgClass { @@ -4123,6 +4151,9 @@ _l3cfg_update_combined_config(NML3Cfg *self, guint i; gboolean merged_changed = FALSE; gboolean commited_changed = FALSE; + gboolean pref64_valid = FALSE; + struct in6_addr pref64; + guint32 pref64_plen; nm_assert(NM_IS_L3CFG(self)); nm_assert(!out_old || !*out_old); @@ -4220,6 +4251,120 @@ _l3cfg_update_combined_config(NML3Cfg *self, &hook_data); } +#if HAVE_CLAT + nm_assert(nm_l3_config_data_get_pref64_valid(l3cd, &pref64_valid)); + if (pref64_valid) { + nm_assert(nm_l3_config_data_get_pref64(l3cd, &pref64, &pref64_plen)); + } + + if (pref64_valid) { + NMPlatformIPXRoute rx; + NMIPAddrTyped best_v6_gateway; + struct in6_addr ip6; + NMDedupMultiIter iter; + + const NMPlatformIP6Route *best_v6_route; + const NMPlatformIP6Address *ip6_entry; + + /* We need to assign an additional v6 /64 address for ourselves, according + to the spec: https://www.rfc-editor.org/rfc/rfc6877#section-6.3 */ + if (!self->priv.p->clat_address_6_valid) { + nm_l3_config_data_iter_ip6_address_for_each (&iter, l3cd, &ip6_entry) { + if (ip6_entry->addr_source == NM_IP_CONFIG_SOURCE_NDISC + && ip6_entry->plen == 64) { + ip6 = ip6_entry->address; + + nm_utils_ipv6_addr_set_stable_privacy(NM_UTILS_STABLE_TYPE_RANDOM, + &ip6, + nm_l3cfg_get_ifname(self, TRUE), + "TODO: Mary fixme", + 0); + self->priv.p->clat_address_6 = (NMPlatformIP6Address) { + .ifindex = self->priv.ifindex, + .address = ip6, + .peer_address = ip6, + .addr_source = NM_IP_CONFIG_SOURCE_CLAT, + .plen = ip6_entry->plen, + }; + self->priv.p->clat_address_6_valid = TRUE; + break; + } + } + } + + /* Don't get a v4 address if we have no v6 address (otherwise, we could + potentially create broken v4 connectivity) */ + if (!self->priv.p->clat_address_6_valid) { + _LOGW("CLAT is currently only supported when SLAAC is in use."); + /* Deallocate the v4 address unless it's the commited one */ + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + } else { + self->priv.p->clat_address_4 = NULL; + } + } else if (!self->priv.p->clat_address_4) { + /* We need a v4 /32 */ + self->priv.p->clat_address_4 = + nm_netns_ip_range_allocate(self->priv.netns, NM_NETNS_IP_RANGE_TYPE_CLAT); + } + + if (self->priv.p->clat_address_4) { + best_v6_route = NMP_OBJECT_CAST_IP6_ROUTE( + nm_l3_config_data_get_direct_route_for_host(l3cd, AF_INET6, &pref64)); + if (!best_v6_route) { + best_v6_route = NMP_OBJECT_CAST_IP6_ROUTE( + nm_l3_config_data_get_best_default_route(l3cd, AF_INET6)); + } + if (best_v6_route) { + int mtu; + NMPlatformIP4Address addr = { + .ifindex = self->priv.ifindex, + .address = self->priv.p->clat_address_4->addr, + .peer_address = self->priv.p->clat_address_4->addr, + .addr_source = NM_IP_CONFIG_SOURCE_CLAT, + .plen = 32, + }; + + best_v6_gateway.addr_family = AF_INET6; + best_v6_gateway.addr.addr6 = best_v6_route->gateway; + + mtu = best_v6_route->mtu; + + if (!mtu || mtu > 1500) { + /* v4 Internet MTU */ + mtu = 1500; + } + /* 20 for the ipv6 vs ipv4 header plus 8 for a potential + fragmentation extension header */ + mtu -= 28; + + rx.r4 = (NMPlatformIP4Route) { + .ifindex = self->priv.ifindex, + .rt_source = NM_IP_CONFIG_SOURCE_CLAT, + .network = 0, /* default route */ + .plen = 0, + .table_coerced = nm_platform_route_table_coerce(RT_TABLE_MAIN), + .scope_inv = nm_platform_route_scope_inv(RT_SCOPE_UNIVERSE), + .type_coerced = nm_platform_route_type_coerce(RTN_UNICAST), + .pref_src = self->priv.p->clat_address_4->addr, + .via = best_v6_gateway, + /* If real v4 connectivity is available from another interface, + that should probably be preferred */ + .metric = best_v6_route->metric + 50, + .mtu = mtu, + }; + nm_platform_ip_route_normalize(AF_INET, &rx.rx); + if (!nm_l3_config_data_lookup_route(l3cd, AF_INET, &rx.rx)) { + nm_l3_config_data_add_route_4(l3cd, &rx.r4); + } + nm_l3_config_data_add_address_4(l3cd, &addr); + } else { + _LOGW("Couldn't find a good ipv6 route! Unable to set up CLAT!"); + } + } + } +#endif /* HAVE_CLAT */ + if (self->priv.ifindex == NM_LOOPBACK_IFINDEX) { NMPlatformIPXAddress ax; NMPlatformIPXRoute rx; @@ -4280,6 +4425,16 @@ _l3cfg_update_combined_config(NML3Cfg *self, if (nm_l3_config_data_equal(l3cd, self->priv.p->combined_l3cd_merged)) goto out; + if (!l3cd) { + self->priv.p->clat_address_6_valid = FALSE; + /* Deallocate the v4 address unless it's the commited one */ + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + } else { + self->priv.p->clat_address_4 = NULL; + } + } + l3cd_old = g_steal_pointer(&self->priv.p->combined_l3cd_merged); self->priv.p->combined_l3cd_merged = nm_l3_config_data_seal(g_steal_pointer(&l3cd)); merged_changed = TRUE; @@ -5379,6 +5534,305 @@ _l3_commit_one(NML3Cfg *self, _failedobj_handle_routes(self, addr_family, routes_failed); } +#ifdef HAVE_CLAT +static void +_l3_get_pref64_config(NML3Cfg *self, + struct clat_v4_config_key *v4_key, + struct clat_v4_config_value *v4_value, + struct clat_v6_config_key *v6_key, + struct clat_v6_config_value *v6_value, + gboolean commited) +{ + const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; + struct in6_addr pref64; + guint32 pref64_plen; + + memset(v4_key, 0, sizeof(*v4_key)); + memset(v6_key, 0, sizeof(*v6_key)); + memset(v4_value, 0, sizeof(*v4_value)); + memset(v6_value, 0, sizeof(*v6_value)); + + v4_key->ifindex = v6_key->ifindex = self->priv.ifindex; + + if (commited) { + if (self->priv.p->clat_address_4_commited) { + v6_value->local_v4.s_addr = v4_key->local_v4.s_addr = + self->priv.p->clat_address_4_commited->addr; + } + if (self->priv.p->clat_address_6_commited_valid) { + v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6_commited.address; + } + if (self->priv.p->clat_pref64_valid) { + v6_key->pref64 = v4_value->pref64 = self->priv.p->clat_pref64; + } + } else { + if (self->priv.p->clat_address_4) { + v6_value->local_v4.s_addr = v4_key->local_v4.s_addr = + self->priv.p->clat_address_4->addr; + } + if (self->priv.p->clat_address_6_valid) { + v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6.address; + } + if (nm_l3_config_data_get_pref64(l3cd, &pref64, &pref64_plen)) { + v6_key->pref64 = v4_value->pref64 = pref64; + } + } +} + +static void +_l3_clat_destroy(NML3Cfg *self) +{ + DECLARE_LIBBPF_OPTS(bpf_tc_hook, + hook, + .attach_point = BPF_TC_INGRESS | BPF_TC_EGRESS, + .ifindex = self->priv.ifindex); + int err = 0; + char buf[100]; + + hook.attach_point = BPF_TC_INGRESS; + self->priv.p->clat_attach_ingress.prog_fd = 0; + self->priv.p->clat_attach_ingress.prog_id = 0; + err = bpf_tc_detach(&hook, &self->priv.p->clat_attach_ingress); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to tear down CLAT BPF ingress hook: %s", buf); + } + hook.attach_point = BPF_TC_EGRESS; + self->priv.p->clat_attach_egress.prog_fd = 0; + self->priv.p->clat_attach_egress.prog_id = 0; + err = bpf_tc_detach(&hook, &self->priv.p->clat_attach_egress); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to tear down CLAT BPF egress hook: %s", buf); + } + nm_clear_pointer(&self->priv.p->clat_bpf, clat_bpf__destroy); +} + +static void +_l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) +{ + int err = 0; + const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; + struct in6_addr _l3cd_pref64_inner; + const struct in6_addr *l3cd_pref64 = NULL; + guint32 l3cd_pref64_plen; + char buf[100]; + struct clat_v6_config_key v6_key_commited, v6_key_new; + struct clat_v4_config_key v4_key_commited, v4_key_new; + struct clat_v6_config_value v6_value_commited, v6_value_new; + struct clat_v4_config_value v4_value_commited, v4_value_new; + gboolean v6_changed; + DECLARE_LIBBPF_OPTS(bpf_tc_hook, + hook, + .attach_point = BPF_TC_INGRESS | BPF_TC_EGRESS, + .ifindex = self->priv.ifindex); + DECLARE_LIBBPF_OPTS(bpf_tc_opts, attach_egress); + DECLARE_LIBBPF_OPTS(bpf_tc_opts, attach_ingress); + + if (l3cd && nm_l3_config_data_get_pref64(l3cd, &_l3cd_pref64_inner, &l3cd_pref64_plen)) { + l3cd_pref64 = &_l3cd_pref64_inner; + } + + if (l3cd_pref64 && self->priv.p->clat_address_4 && self->priv.p->clat_address_6_valid) { + if (!self->priv.p->clat_bpf) { + /* Bring up the CLAT */ + self->priv.p->clat_bpf = clat_bpf__open(); + err = libbpf_get_error(self->priv.p->clat_bpf); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to load CLAT BPF: %s", buf); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + + /* Set up maps */ + bpf_map__set_max_entries(self->priv.p->clat_bpf->maps.v4_config_map, 16); + bpf_map__set_max_entries(self->priv.p->clat_bpf->maps.v6_config_map, 16); + + err = clat_bpf__load(self->priv.p->clat_bpf); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to open CLAT BPF: %s", buf); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + + err = bpf_tc_hook_create(&hook); + if (err && err != -EEXIST) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to create CLAT BPF hook: %s", buf); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + + attach_ingress.prog_fd = bpf_program__fd(self->priv.p->clat_bpf->progs.clat_ingress); + if (attach_ingress.prog_fd < 0) { + _LOGW("couldn't find CLAT BPF ingress!"); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + + attach_egress.prog_fd = bpf_program__fd(self->priv.p->clat_bpf->progs.clat_egress); + if (attach_egress.prog_fd < 0) { + _LOGW("couldn't find CLAT BPF egress!"); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + + hook.attach_point = BPF_TC_INGRESS; + err = bpf_tc_attach(&hook, &attach_ingress); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to attach ingress to CLAT BPF hook: %s", buf); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + self->priv.p->clat_attach_ingress = attach_ingress; + + hook.attach_point = BPF_TC_EGRESS; + err = bpf_tc_attach(&hook, &attach_egress); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGW("failed to attach ingress to CLAT BPF hook: %s", buf); + clat_bpf__destroy(self->priv.p->clat_bpf); + self->priv.p->clat_bpf = NULL; + return; + } + self->priv.p->clat_attach_egress = attach_egress; + } + + _l3_get_pref64_config(self, + &v4_key_commited, + &v4_value_commited, + &v6_key_commited, + &v6_value_commited, + TRUE); + _l3_get_pref64_config(self, &v4_key_new, &v4_value_new, &v6_key_new, &v6_value_new, FALSE); + + if (memcmp(&v4_key_commited, &v4_key_new, sizeof(v4_key_new))) { + bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), + &v4_key_commited); + } + if (memcmp(&v6_key_commited, &v6_key_new, sizeof(v6_key_new))) { + bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), + &v6_key_commited); + } + if (memcmp(&v4_value_commited, &v4_value_new, sizeof(v4_value_new))) { + bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), + &v4_key_new, + &v4_value_new, + BPF_ANY); + } + if (memcmp(&v6_value_commited, &v6_value_new, sizeof(v6_value_new))) { + bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), + &v6_key_new, + &v6_value_new, + BPF_ANY); + } + + if (l3cd_pref64) { + self->priv.p->clat_pref64_valid = TRUE; + self->priv.p->clat_pref64 = *l3cd_pref64; + } else { + self->priv.p->clat_pref64_valid = FALSE; + } + + if (self->priv.p->clat_socket < 0) { + self->priv.p->clat_socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); + if (self->priv.p->clat_socket < 0) { + _LOGW("Couldn't create CLAT socket for %d! %s", + self->priv.ifindex, + nm_strerror_native(errno)); + } + } + if (self->priv.p->clat_socket >= 0) { + err = setsockopt(self->priv.p->clat_socket, + SOL_SOCKET, + SO_BINDTOIFINDEX, + &self->priv.ifindex, + sizeof(self->priv.ifindex)); + if (err) { + _LOGW("Couldn't bind CLAT socket to interface %d! %s", + self->priv.ifindex, + nm_strerror_native(errno)); + } + } + + v6_changed = + (self->priv.p->clat_address_6_valid != self->priv.p->clat_address_6_commited_valid) + || (self->priv.p->clat_address_6_valid && self->priv.p->clat_address_6_commited_valid + && memcmp(&self->priv.p->clat_address_6.address, + &self->priv.p->clat_address_6_commited.address, + sizeof(self->priv.p->clat_address_6_commited.address))); + + if (self->priv.p->clat_socket > 0 && v6_changed) { + struct ipv6_mreq mreq = {.ipv6mr_interface = self->priv.ifindex}; + + if (self->priv.p->clat_address_6_commited_valid) { + mreq.ipv6mr_multiaddr = self->priv.p->clat_address_6_commited.address; + + err = setsockopt(self->priv.p->clat_socket, + SOL_IPV6, + IPV6_LEAVE_ANYCAST, + &mreq, + sizeof(mreq)); + if (err) { + _LOGW("Couldn't leave CLAT anycast group on interface %d! %s", + self->priv.ifindex, + nm_strerror_native(errno)); + } + } + + if (self->priv.p->clat_address_6_valid) { + mreq.ipv6mr_multiaddr = self->priv.p->clat_address_6.address; + + err = setsockopt(self->priv.p->clat_socket, + SOL_IPV6, + IPV6_JOIN_ANYCAST, + &mreq, + sizeof(mreq)); + if (err) { + _LOGW("Couldn't join CLAT anycast group on interface %d! %s", + self->priv.ifindex, + nm_strerror_native(errno)); + } + } + } + } else { + if (self->priv.p->clat_bpf) { + _l3_clat_destroy(self); + } + + /* Commited will get cleaned up below */ + self->priv.p->clat_address_6_valid = FALSE; + + nm_clear_fd(&self->priv.p->clat_socket); + + /* Deallocate the v4 address. Commited address will get cleaned up below, + but we need to make sure there's no double-free */ + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + } else { + self->priv.p->clat_address_4 = NULL; + } + } + + /* Record the new state */ + if (self->priv.p->clat_address_4_commited != self->priv.p->clat_address_4) { + nm_clear_pointer(&self->priv.p->clat_address_4_commited, nm_netns_ip_range_release); + self->priv.p->clat_address_4_commited = self->priv.p->clat_address_4; + } + self->priv.p->clat_address_6_commited = self->priv.p->clat_address_6; + self->priv.p->clat_address_6_commited_valid = self->priv.p->clat_address_6_valid; +} +#endif /* HAVE_CLAT */ + static void _l3_commit(NML3Cfg *self, NML3CfgCommitType commit_type, gboolean is_idle) { @@ -5461,6 +5915,10 @@ _l3_commit(NML3Cfg *self, NML3CfgCommitType commit_type, gboolean is_idle) _l3_acd_data_process_changes(self); +#ifdef HAVE_CLAT + _l3_commit_pref64(self, commit_type); +#endif /* HAVE_CLAT */ + nm_assert(self->priv.p->commit_reentrant_count == 1); self->priv.p->commit_reentrant_count--; @@ -5842,6 +6300,8 @@ nm_l3cfg_init(NML3Cfg *self) { self->priv.p = G_TYPE_INSTANCE_GET_PRIVATE(self, NM_TYPE_L3CFG, NML3CfgPrivate); + self->priv.p->clat_socket = -1; + c_list_init(&self->priv.p->acd_lst_head); c_list_init(&self->priv.p->acd_event_notify_lst_head); c_list_init(&self->priv.p->commit_type_lst_head); @@ -5896,6 +6356,9 @@ finalize(GObject *object) { NML3Cfg *self = NM_L3CFG(object); gboolean changed; +#ifdef HAVE_CLAT + DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook, .attach_point = BPF_TC_INGRESS | BPF_TC_EGRESS); +#endif /* HAVE_CLAT */ if (self->priv.netns) { nm_netns_watcher_remove_all(self->priv.netns, _NETNS_WATCHER_IP_ADDR_TAG(self, AF_INET)); @@ -5950,6 +6413,14 @@ finalize(GObject *object) if (changed) nmp_global_tracker_sync_mptcp_addrs(self->priv.global_tracker, FALSE); +#ifdef HAVE_CLAT + self->priv.p->clat_address_4_commited = NULL; + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + nm_clear_fd(&self->priv.p->clat_socket); + if (self->priv.p->clat_bpf) { + _l3_clat_destroy(self); + } +#endif g_clear_object(&self->priv.netns); g_clear_object(&self->priv.platform); nm_clear_pointer(&self->priv.global_tracker, nmp_global_tracker_unref); diff --git a/src/libnm-base/nm-base.h b/src/libnm-base/nm-base.h index 048c02416f..7806f7e750 100644 --- a/src/libnm-base/nm-base.h +++ b/src/libnm-base/nm-base.h @@ -345,6 +345,7 @@ typedef enum { NM_IP_CONFIG_SOURCE_VPN, NM_IP_CONFIG_SOURCE_DHCP, NM_IP_CONFIG_SOURCE_NDISC, + NM_IP_CONFIG_SOURCE_CLAT, NM_IP_CONFIG_SOURCE_USER, } NMIPConfigSource; From 6395de653cffadc86ed815e53946d2b350dfeb36 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 8 Sep 2025 21:51:40 +0200 Subject: [PATCH 08/31] Add support for CLAT to l3cfg (fixes) --- src/core/nm-core-utils.h | 1 + src/core/nm-l3-config-data.c | 5 +- src/core/nm-l3-config-data.h | 2 +- src/core/nm-l3cfg.c | 221 +++++++++++++++++++---------------- 4 files changed, 126 insertions(+), 103 deletions(-) diff --git a/src/core/nm-core-utils.h b/src/core/nm-core-utils.h index cccccae636..ac337d54e8 100644 --- a/src/core/nm-core-utils.h +++ b/src/core/nm-core-utils.h @@ -304,6 +304,7 @@ typedef enum { NM_UTILS_STABLE_TYPE_STABLE_ID = 1, NM_UTILS_STABLE_TYPE_GENERATED = 2, NM_UTILS_STABLE_TYPE_RANDOM = 3, + NM_UTILS_STABLE_TYPE_CLAT = 4, } NMUtilsStableType; #define NM_UTILS_STABLE_TYPE_NONE ((NMUtilsStableType) - 1) diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index d4905e1dad..92a91844c2 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -2001,12 +2001,11 @@ nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val) } gboolean -nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self, gboolean *out_val) +nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self) { nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); - NM_SET_OUT(out_val, self->pref64_valid); - return TRUE; + return self->pref64_valid; } gboolean diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index 69ac3ff976..b1b2c5c711 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -500,7 +500,7 @@ const char *nm_l3_config_data_get_network_id(const NML3ConfigData *self); gboolean nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val); -gboolean nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self, gboolean *out_val); +gboolean nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self); gboolean nm_l3_config_data_get_pref64(const NML3ConfigData *self, struct in6_addr *out_prefix, diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 9e8fcdc5d1..2533a44cfd 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -11,7 +11,7 @@ #include #include #include -#ifdef HAVE_CLAT +#if HAVE_CLAT #include #include #endif /* HAVE_CLAT */ @@ -27,7 +27,7 @@ #include "nm-l3-ipv4ll.h" #include "nm-ip-config.h" #include "nm-core-utils.h" -#ifdef HAVE_CLAT +#if HAVE_CLAT #include "bpf/clat.h" NM_PRAGMA_WARNING_DISABLE("-Wcast-align") #include "bpf/clat.skel.h" @@ -300,12 +300,19 @@ typedef struct _NML3CfgPrivate { NMIPConfig *ipconfig_x[2]; }; -#ifdef HAVE_CLAT - NMNetnsIPRange *clat_address_4_commited; - NMPlatformIP6Address clat_address_6_commited; - NMNetnsIPRange *clat_address_4; +#if HAVE_CLAT + /* The reserved IPv4 address for CLAT in the 192.0.0.0/28 range */ + NMNetnsIPReservation *clat_address_4; + /* The IPv6 address for sending and receiving translated packets */ NMPlatformIP6Address clat_address_6; - struct in6_addr clat_pref64; + + /* The same addresses as above, but already committed previously */ + NMNetnsIPReservation *clat_address_4_committed; + NMPlatformIP6Address clat_address_6_committed; + + /* The NAT64 prefix discovered via RA */ + struct in6_addr clat_pref64; + /* If NULL, the BPF program hasn't been loaded or attached */ struct clat_bpf *clat_bpf; int clat_socket; @@ -379,7 +386,7 @@ typedef struct _NML3CfgPrivate { bool rp_filter_set : 1; bool clat_address_6_valid : 1; - bool clat_address_6_commited_valid : 1; + bool clat_address_6_committed_valid : 1; bool clat_pref64_valid : 1; } NML3CfgPrivate; @@ -4151,9 +4158,10 @@ _l3cfg_update_combined_config(NML3Cfg *self, guint i; gboolean merged_changed = FALSE; gboolean commited_changed = FALSE; - gboolean pref64_valid = FALSE; - struct in6_addr pref64; - guint32 pref64_plen; +#if HAVE_CLAT + struct in6_addr pref64; + guint32 pref64_plen; +#endif nm_assert(NM_IS_L3CFG(self)); nm_assert(!out_old || !*out_old); @@ -4252,32 +4260,42 @@ _l3cfg_update_combined_config(NML3Cfg *self, } #if HAVE_CLAT - nm_assert(nm_l3_config_data_get_pref64_valid(l3cd, &pref64_valid)); - if (pref64_valid) { - nm_assert(nm_l3_config_data_get_pref64(l3cd, &pref64, &pref64_plen)); - } - - if (pref64_valid) { - NMPlatformIPXRoute rx; - NMIPAddrTyped best_v6_gateway; - struct in6_addr ip6; - NMDedupMultiIter iter; - + if (nm_l3_config_data_get_pref64_valid(l3cd)) { + NMPlatformIPXRoute rx; + NMIPAddrTyped best_v6_gateway; + NMDedupMultiIter iter; const NMPlatformIP6Route *best_v6_route; const NMPlatformIP6Address *ip6_entry; + struct in6_addr ip6; + const char *network_id; + char buf[512]; - /* We need to assign an additional v6 /64 address for ourselves, according - to the spec: https://www.rfc-editor.org/rfc/rfc6877#section-6.3 */ - if (!self->priv.p->clat_address_6_valid) { + /* If we have a valid NAT64 prefix, configure in kernel: + * + * - a CLAT IPv4 address (192.0.0.x) + * - a IPv4 default route via the best IPv6 gateway + * + * We also set clat_address_6 as an additional /64 IPv6 address + * determined according to https://www.rfc-editor.org/rfc/rfc6877#section-6.3 . + * This address is used for sending and receiving translated packets, + * but is not configured in kernel to avoid that it gets used by applications. + * Later in _l3_commit_pref64() we use IPV6_JOIN_ANYCAST to let the kernel + * handle ND for the address. + */ + + nm_l3_config_data_get_pref64(l3cd, &pref64, &pref64_plen); + network_id = nm_l3_config_data_get_network_id(l3cd); + + if (!self->priv.p->clat_address_6_valid && network_id) { nm_l3_config_data_iter_ip6_address_for_each (&iter, l3cd, &ip6_entry) { if (ip6_entry->addr_source == NM_IP_CONFIG_SOURCE_NDISC && ip6_entry->plen == 64) { ip6 = ip6_entry->address; - nm_utils_ipv6_addr_set_stable_privacy(NM_UTILS_STABLE_TYPE_RANDOM, + nm_utils_ipv6_addr_set_stable_privacy(NM_UTILS_STABLE_TYPE_CLAT, &ip6, nm_l3cfg_get_ifname(self, TRUE), - "TODO: Mary fixme", + network_id, 0); self->priv.p->clat_address_6 = (NMPlatformIP6Address) { .ifindex = self->priv.ifindex, @@ -4286,6 +4304,9 @@ _l3cfg_update_combined_config(NML3Cfg *self, .addr_source = NM_IP_CONFIG_SOURCE_CLAT, .plen = ip6_entry->plen, }; + + _LOGT("clat: using IPv6 address %s", nm_inet6_ntop(&ip6, buf)); + self->priv.p->clat_address_6_valid = TRUE; break; } @@ -4296,16 +4317,18 @@ _l3cfg_update_combined_config(NML3Cfg *self, potentially create broken v4 connectivity) */ if (!self->priv.p->clat_address_6_valid) { _LOGW("CLAT is currently only supported when SLAAC is in use."); - /* Deallocate the v4 address unless it's the commited one */ - if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { - nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + /* Deallocate the v4 address unless it's the committed one */ + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_committed) { + nm_clear_pointer(&self->priv.p->clat_address_4, + nm_netns_ip_reservation_release); } else { self->priv.p->clat_address_4 = NULL; } } else if (!self->priv.p->clat_address_4) { /* We need a v4 /32 */ self->priv.p->clat_address_4 = - nm_netns_ip_range_allocate(self->priv.netns, NM_NETNS_IP_RANGE_TYPE_CLAT); + nm_netns_ip_reservation_get(self->priv.netns, + NM_NETNS_IP_RESERVATION_TYPE_CLAT); } if (self->priv.p->clat_address_4) { @@ -4357,6 +4380,10 @@ _l3cfg_update_combined_config(NML3Cfg *self, if (!nm_l3_config_data_lookup_route(l3cd, AF_INET, &rx.rx)) { nm_l3_config_data_add_route_4(l3cd, &rx.r4); } + + _LOGT("clat: route %s", + nm_platform_ip4_route_to_string(&rx.r4, buf, sizeof(buf))); + nm_l3_config_data_add_address_4(l3cd, &addr); } else { _LOGW("Couldn't find a good ipv6 route! Unable to set up CLAT!"); @@ -4425,15 +4452,17 @@ _l3cfg_update_combined_config(NML3Cfg *self, if (nm_l3_config_data_equal(l3cd, self->priv.p->combined_l3cd_merged)) goto out; +#if HAVE_CLAT if (!l3cd) { self->priv.p->clat_address_6_valid = FALSE; /* Deallocate the v4 address unless it's the commited one */ - if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { - nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_committed) { + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_reservation_release); } else { self->priv.p->clat_address_4 = NULL; } } +#endif /* HAVE_CLAT */ l3cd_old = g_steal_pointer(&self->priv.p->combined_l3cd_merged); self->priv.p->combined_l3cd_merged = nm_l3_config_data_seal(g_steal_pointer(&l3cd)); @@ -5534,14 +5563,14 @@ _l3_commit_one(NML3Cfg *self, _failedobj_handle_routes(self, addr_family, routes_failed); } -#ifdef HAVE_CLAT +#if HAVE_CLAT static void _l3_get_pref64_config(NML3Cfg *self, struct clat_v4_config_key *v4_key, struct clat_v4_config_value *v4_value, struct clat_v6_config_key *v6_key, struct clat_v6_config_value *v6_value, - gboolean commited) + gboolean committed) { const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; struct in6_addr pref64; @@ -5554,13 +5583,13 @@ _l3_get_pref64_config(NML3Cfg *self, v4_key->ifindex = v6_key->ifindex = self->priv.ifindex; - if (commited) { - if (self->priv.p->clat_address_4_commited) { + if (committed) { + if (self->priv.p->clat_address_4_committed) { v6_value->local_v4.s_addr = v4_key->local_v4.s_addr = - self->priv.p->clat_address_4_commited->addr; + self->priv.p->clat_address_4_committed->addr; } - if (self->priv.p->clat_address_6_commited_valid) { - v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6_commited.address; + if (self->priv.p->clat_address_6_committed_valid) { + v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6_committed.address; } if (self->priv.p->clat_pref64_valid) { v6_key->pref64 = v4_value->pref64 = self->priv.p->clat_pref64; @@ -5605,6 +5634,9 @@ _l3_clat_destroy(NML3Cfg *self) libbpf_strerror(err, buf, sizeof(buf)); _LOGW("failed to tear down CLAT BPF egress hook: %s", buf); } + + bpf_tc_hook_destroy(&hook); + nm_clear_pointer(&self->priv.p->clat_bpf, clat_bpf__destroy); } @@ -5617,10 +5649,10 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) const struct in6_addr *l3cd_pref64 = NULL; guint32 l3cd_pref64_plen; char buf[100]; - struct clat_v6_config_key v6_key_commited, v6_key_new; - struct clat_v4_config_key v4_key_commited, v4_key_new; - struct clat_v6_config_value v6_value_commited, v6_value_new; - struct clat_v4_config_value v4_value_commited, v4_value_new; + struct clat_v6_config_key v6_key_committed, v6_key_new; + struct clat_v4_config_key v4_key_committed, v4_key_new; + struct clat_v6_config_value v6_value_committed, v6_value_new; + struct clat_v4_config_value v4_value_committed, v4_value_new; gboolean v6_changed; DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook, @@ -5635,12 +5667,12 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) if (l3cd_pref64 && self->priv.p->clat_address_4 && self->priv.p->clat_address_6_valid) { if (!self->priv.p->clat_bpf) { - /* Bring up the CLAT */ + _LOGT("clat: attaching the BPF program"); self->priv.p->clat_bpf = clat_bpf__open(); err = libbpf_get_error(self->priv.p->clat_bpf); if (err) { libbpf_strerror(err, buf, sizeof(buf)); - _LOGW("failed to load CLAT BPF: %s", buf); + _LOGW("clat: failed to open the BPF program: %s", buf); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5653,7 +5685,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) err = clat_bpf__load(self->priv.p->clat_bpf); if (err) { libbpf_strerror(err, buf, sizeof(buf)); - _LOGW("failed to open CLAT BPF: %s", buf); + _LOGW("clat: failed to load the BPF program: %s", buf); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5662,7 +5694,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) err = bpf_tc_hook_create(&hook); if (err && err != -EEXIST) { libbpf_strerror(err, buf, sizeof(buf)); - _LOGW("failed to create CLAT BPF hook: %s", buf); + _LOGW("clat: failed to create the BPF hook: %s", buf); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5670,7 +5702,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) attach_ingress.prog_fd = bpf_program__fd(self->priv.p->clat_bpf->progs.clat_ingress); if (attach_ingress.prog_fd < 0) { - _LOGW("couldn't find CLAT BPF ingress!"); + _LOGW("clat: couldn't find the BPF ingress"); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5678,7 +5710,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) attach_egress.prog_fd = bpf_program__fd(self->priv.p->clat_bpf->progs.clat_egress); if (attach_egress.prog_fd < 0) { - _LOGW("couldn't find CLAT BPF egress!"); + _LOGW("clat: couldn't find the BPF egress"); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5688,7 +5720,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) err = bpf_tc_attach(&hook, &attach_ingress); if (err) { libbpf_strerror(err, buf, sizeof(buf)); - _LOGW("failed to attach ingress to CLAT BPF hook: %s", buf); + _LOGW("clat: failed to attach ingress to BPF hook: %s", buf); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5699,7 +5731,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) err = bpf_tc_attach(&hook, &attach_egress); if (err) { libbpf_strerror(err, buf, sizeof(buf)); - _LOGW("failed to attach ingress to CLAT BPF hook: %s", buf); + _LOGW("clat: failed to attach ingress to BPF hook: %s", buf); clat_bpf__destroy(self->priv.p->clat_bpf); self->priv.p->clat_bpf = NULL; return; @@ -5708,28 +5740,28 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) } _l3_get_pref64_config(self, - &v4_key_commited, - &v4_value_commited, - &v6_key_commited, - &v6_value_commited, + &v4_key_committed, + &v4_value_committed, + &v6_key_committed, + &v6_value_committed, TRUE); _l3_get_pref64_config(self, &v4_key_new, &v4_value_new, &v6_key_new, &v6_value_new, FALSE); - if (memcmp(&v4_key_commited, &v4_key_new, sizeof(v4_key_new))) { + if (memcmp(&v4_key_committed, &v4_key_new, sizeof(v4_key_new))) { bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), - &v4_key_commited); + &v4_key_committed); } - if (memcmp(&v6_key_commited, &v6_key_new, sizeof(v6_key_new))) { + if (memcmp(&v6_key_committed, &v6_key_new, sizeof(v6_key_new))) { bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), - &v6_key_commited); + &v6_key_committed); } - if (memcmp(&v4_value_commited, &v4_value_new, sizeof(v4_value_new))) { + if (memcmp(&v4_value_committed, &v4_value_new, sizeof(v4_value_new))) { bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), &v4_key_new, &v4_value_new, BPF_ANY); } - if (memcmp(&v6_value_commited, &v6_value_new, sizeof(v6_value_new))) { + if (memcmp(&v6_value_committed, &v6_value_new, sizeof(v6_value_new))) { bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), &v6_key_new, &v6_value_new, @@ -5746,9 +5778,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) if (self->priv.p->clat_socket < 0) { self->priv.p->clat_socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); if (self->priv.p->clat_socket < 0) { - _LOGW("Couldn't create CLAT socket for %d! %s", - self->priv.ifindex, - nm_strerror_native(errno)); + _LOGW("clat: couldn't create the socket: %s", nm_strerror_native(errno)); } } if (self->priv.p->clat_socket >= 0) { @@ -5757,35 +5787,31 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) SO_BINDTOIFINDEX, &self->priv.ifindex, sizeof(self->priv.ifindex)); - if (err) { - _LOGW("Couldn't bind CLAT socket to interface %d! %s", - self->priv.ifindex, - nm_strerror_native(errno)); + if (err < 0) { + _LOGW("clat: couldn't bind the socket: %s", nm_strerror_native(errno)); } } v6_changed = - (self->priv.p->clat_address_6_valid != self->priv.p->clat_address_6_commited_valid) - || (self->priv.p->clat_address_6_valid && self->priv.p->clat_address_6_commited_valid + (self->priv.p->clat_address_6_valid != self->priv.p->clat_address_6_committed_valid) + || (self->priv.p->clat_address_6_valid && self->priv.p->clat_address_6_committed_valid && memcmp(&self->priv.p->clat_address_6.address, - &self->priv.p->clat_address_6_commited.address, - sizeof(self->priv.p->clat_address_6_commited.address))); + &self->priv.p->clat_address_6_committed.address, + sizeof(self->priv.p->clat_address_6_committed.address))); if (self->priv.p->clat_socket > 0 && v6_changed) { struct ipv6_mreq mreq = {.ipv6mr_interface = self->priv.ifindex}; - if (self->priv.p->clat_address_6_commited_valid) { - mreq.ipv6mr_multiaddr = self->priv.p->clat_address_6_commited.address; + if (self->priv.p->clat_address_6_committed_valid) { + mreq.ipv6mr_multiaddr = self->priv.p->clat_address_6_committed.address; err = setsockopt(self->priv.p->clat_socket, SOL_IPV6, IPV6_LEAVE_ANYCAST, &mreq, sizeof(mreq)); - if (err) { - _LOGW("Couldn't leave CLAT anycast group on interface %d! %s", - self->priv.ifindex, - nm_strerror_native(errno)); + if (err < 0) { + _LOGW("clat: couldn't leave the anycast group: %s", nm_strerror_native(errno)); } } @@ -5797,10 +5823,8 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) IPV6_JOIN_ANYCAST, &mreq, sizeof(mreq)); - if (err) { - _LOGW("Couldn't join CLAT anycast group on interface %d! %s", - self->priv.ifindex, - nm_strerror_native(errno)); + if (err < 0) { + _LOGW("clat: couldn't join the anycast group: %s", nm_strerror_native(errno)); } } } @@ -5809,27 +5833,27 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) _l3_clat_destroy(self); } - /* Commited will get cleaned up below */ + /* Committed will get cleaned up below */ self->priv.p->clat_address_6_valid = FALSE; nm_clear_fd(&self->priv.p->clat_socket); - /* Deallocate the v4 address. Commited address will get cleaned up below, + /* Deallocate the v4 address. Committed address will get cleaned up below, but we need to make sure there's no double-free */ - if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_commited) { - nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); + if (self->priv.p->clat_address_4 != self->priv.p->clat_address_4_committed) { + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_reservation_release); } else { self->priv.p->clat_address_4 = NULL; } } /* Record the new state */ - if (self->priv.p->clat_address_4_commited != self->priv.p->clat_address_4) { - nm_clear_pointer(&self->priv.p->clat_address_4_commited, nm_netns_ip_range_release); - self->priv.p->clat_address_4_commited = self->priv.p->clat_address_4; + if (self->priv.p->clat_address_4_committed != self->priv.p->clat_address_4) { + nm_clear_pointer(&self->priv.p->clat_address_4_committed, nm_netns_ip_reservation_release); + self->priv.p->clat_address_4_committed = self->priv.p->clat_address_4; } - self->priv.p->clat_address_6_commited = self->priv.p->clat_address_6; - self->priv.p->clat_address_6_commited_valid = self->priv.p->clat_address_6_valid; + self->priv.p->clat_address_6_committed = self->priv.p->clat_address_6; + self->priv.p->clat_address_6_committed_valid = self->priv.p->clat_address_6_valid; } #endif /* HAVE_CLAT */ @@ -5915,7 +5939,7 @@ _l3_commit(NML3Cfg *self, NML3CfgCommitType commit_type, gboolean is_idle) _l3_acd_data_process_changes(self); -#ifdef HAVE_CLAT +#if HAVE_CLAT _l3_commit_pref64(self, commit_type); #endif /* HAVE_CLAT */ @@ -6300,7 +6324,9 @@ nm_l3cfg_init(NML3Cfg *self) { self->priv.p = G_TYPE_INSTANCE_GET_PRIVATE(self, NM_TYPE_L3CFG, NML3CfgPrivate); +#if HAVE_CLAT self->priv.p->clat_socket = -1; +#endif /* HAVE_CLAT */ c_list_init(&self->priv.p->acd_lst_head); c_list_init(&self->priv.p->acd_event_notify_lst_head); @@ -6356,9 +6382,6 @@ finalize(GObject *object) { NML3Cfg *self = NM_L3CFG(object); gboolean changed; -#ifdef HAVE_CLAT - DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook, .attach_point = BPF_TC_INGRESS | BPF_TC_EGRESS); -#endif /* HAVE_CLAT */ if (self->priv.netns) { nm_netns_watcher_remove_all(self->priv.netns, _NETNS_WATCHER_IP_ADDR_TAG(self, AF_INET)); @@ -6413,9 +6436,9 @@ finalize(GObject *object) if (changed) nmp_global_tracker_sync_mptcp_addrs(self->priv.global_tracker, FALSE); -#ifdef HAVE_CLAT - self->priv.p->clat_address_4_commited = NULL; - nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_range_release); +#if HAVE_CLAT + self->priv.p->clat_address_4_committed = NULL; + nm_clear_pointer(&self->priv.p->clat_address_4, nm_netns_ip_reservation_release); nm_clear_fd(&self->priv.p->clat_socket); if (self->priv.p->clat_bpf) { _l3_clat_destroy(self); From 1c72b3f2527505392e4845c176511e0c648f3b12 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 16:00:20 -0500 Subject: [PATCH 09/31] ndisc: add support for PREF64 option --- src/core/ndisc/nm-lndp-ndisc.c | 30 ++++++++++++++++++++++++++++++ src/core/ndisc/nm-ndisc-private.h | 1 + src/core/ndisc/nm-ndisc.c | 18 ++++++++++++++++++ src/core/ndisc/nm-ndisc.h | 10 ++++++++++ 4 files changed, 59 insertions(+) diff --git a/src/core/ndisc/nm-lndp-ndisc.c b/src/core/ndisc/nm-lndp-ndisc.c index c19dcc910b..980bc597bb 100644 --- a/src/core/ndisc/nm-lndp-ndisc.c +++ b/src/core/ndisc/nm-lndp-ndisc.c @@ -162,6 +162,7 @@ receive_ra(struct ndp *ndp, struct ndp_msg *msg, gpointer user_data) int offset; int hop_limit; guint32 val; + gboolean pref64_found = FALSE; /* Router discovery is subject to the following RFC documents: * @@ -401,6 +402,35 @@ receive_ra(struct ndp *ndp, struct ndp_msg *msg, gpointer user_data) } } + /* PREF64 */ + ndp_msg_opt_for_each_offset (offset, msg, NDP_MSG_OPT_PREF64) { + struct in6_addr pref64_prefix = *ndp_msg_opt_pref64_prefix(msg, offset); + guint8 pref64_length = ndp_msg_opt_pref64_prefix_length(msg, offset); + gint64 expiry_msec = + _nm_ndisc_lifetime_to_expiry(now_msec, ndp_msg_opt_pref64_lifetime(msg, offset)); + + /* Currently, only /96 is supported */ + if (pref64_length != 96) { + _LOGW("Ignored PREF64 for unsupported prefix length: %d (only /96 is supported)", + pref64_length); + continue; + } + + /* Newer RA has more up to date information, prefer it: */ + if (!pref64_found) { + pref64_found = TRUE; + rdata->public.pref64.expiry_msec = 0; + } + + if (expiry_msec >= rdata->public.pref64.expiry_msec) { + rdata->public.pref64.network = pref64_prefix; + rdata->public.pref64.expiry_msec = expiry_msec; + rdata->public.pref64.plen = pref64_length; + rdata->public.pref64.valid = TRUE; + changed |= NM_NDISC_CONFIG_PREF64; + } + } + nm_ndisc_ra_received(ndisc, now_msec, changed); return 0; } diff --git a/src/core/ndisc/nm-ndisc-private.h b/src/core/ndisc/nm-ndisc-private.h index 1479e5666e..697700eb26 100644 --- a/src/core/ndisc/nm-ndisc-private.h +++ b/src/core/ndisc/nm-ndisc-private.h @@ -14,6 +14,7 @@ struct _NMNDiscDataInternal { NMNDiscData public; GArray *gateways; GArray *addresses; + GArray *clat_addresses; GArray *routes; GArray *dns_servers; GArray *dns_domains; diff --git a/src/core/ndisc/nm-ndisc.c b/src/core/ndisc/nm-ndisc.c index 758ce0a05c..dfe190e572 100644 --- a/src/core/ndisc/nm-ndisc.c +++ b/src/core/ndisc/nm-ndisc.c @@ -212,6 +212,12 @@ nm_ndisc_data_to_l3cd(NMDedupMultiIndex *multi_idx, for (i = 0; i < rdata->dns_domains_n; i++) nm_l3_config_data_add_search(l3cd, AF_INET6, rdata->dns_domains[i].domain); + if (rdata->pref64.valid) { + nm_l3_config_data_set_pref64(l3cd, rdata->pref64.network, rdata->pref64.plen); + } else { + nm_l3_config_data_set_pref64_valid(l3cd, FALSE); + } + nm_l3_config_data_set_ndisc_hop_limit(l3cd, rdata->hop_limit); nm_l3_config_data_set_ndisc_reachable_time_msec(l3cd, rdata->reachable_time_ms); nm_l3_config_data_set_ndisc_retrans_timer_msec(l3cd, rdata->retrans_timer_ms); @@ -1528,6 +1534,17 @@ clean_routes(NMNDisc *ndisc, gint64 now_msec, NMNDiscConfigMap *changed, gint64 *changed |= NM_NDISC_CONFIG_ROUTES; } +static void +clean_pref64(NMNDisc *ndisc, gint64 now_msec, NMNDiscConfigMap *changed, gint64 *next_msec) +{ + NMNDiscDataInternal *rdata = &NM_NDISC_GET_PRIVATE(ndisc)->rdata; + + if (!rdata->public.pref64.valid) + return; + if (!expiry_next(now_msec, rdata->public.pref64.expiry_msec, next_msec)) + *changed |= NM_NDISC_CONFIG_PREF64; +} + static void clean_dns_servers(NMNDisc *ndisc, gint64 now_msec, NMNDiscConfigMap *changed, gint64 *next_msec) { @@ -1604,6 +1621,7 @@ check_timestamps(NMNDisc *ndisc, gint64 now_msec, NMNDiscConfigMap changed) clean_gateways(ndisc, now_msec, &changed, &next_msec); clean_addresses(ndisc, now_msec, &changed, &next_msec); clean_routes(ndisc, now_msec, &changed, &next_msec); + clean_pref64(ndisc, now_msec, &changed, &next_msec); clean_dns_servers(ndisc, now_msec, &changed, &next_msec); clean_dns_domains(ndisc, now_msec, &changed, &next_msec); diff --git a/src/core/ndisc/nm-ndisc.h b/src/core/ndisc/nm-ndisc.h index eda1e696d9..416c319117 100644 --- a/src/core/ndisc/nm-ndisc.h +++ b/src/core/ndisc/nm-ndisc.h @@ -119,6 +119,13 @@ typedef struct _NMNDiscRoute { bool duplicate : 1; } NMNDiscRoute; +typedef struct _NMNDiscPref64 { + struct in6_addr network; + gint64 expiry_msec; + guint8 plen; + bool valid : 1; +} NMNDiscPref64; + typedef struct { struct in6_addr address; gint64 expiry_msec; @@ -141,6 +148,7 @@ typedef enum { NM_NDISC_CONFIG_MTU = 1 << 7, NM_NDISC_CONFIG_REACHABLE_TIME = 1 << 8, NM_NDISC_CONFIG_RETRANS_TIMER = 1 << 9, + NM_NDISC_CONFIG_PREF64 = 1 << 10, } NMNDiscConfigMap; typedef enum { @@ -196,6 +204,8 @@ typedef struct { const NMNDiscRoute *routes; const NMNDiscDNSServer *dns_servers; const NMNDiscDNSDomain *dns_domains; + + NMNDiscPref64 pref64; } NMNDiscData; /** From 0551f38b831c86a7e7d09ea1c9fcfbd8ad6566d1 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Sep 2025 17:50:44 +0200 Subject: [PATCH 10/31] ndisc: add support for PREF64 option (fixes) --- meson.build | 2 +- src/core/ndisc/nm-ndisc.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index d7b0745885..9b538052af 100644 --- a/meson.build +++ b/meson.build @@ -263,7 +263,7 @@ uuid_dep = dependency('uuid') libelogind_dep = dependency('libelogind', version: '>= 219', required: false) libudev_dep = dependency('libudev', version: '>= 175') dbus_dep = dependency('dbus-1', version: '>= 1.1') -libndp_dep = dependency('libndp') +libndp_dep = dependency('libndp', version: '>= 1.9') jansson_dep = dependency('jansson', version: '>= 2.7', required: false) config_h.set10('WITH_JANSSON', jansson_dep.found()) diff --git a/src/core/ndisc/nm-ndisc.c b/src/core/ndisc/nm-ndisc.c index dfe190e572..311c76eb61 100644 --- a/src/core/ndisc/nm-ndisc.c +++ b/src/core/ndisc/nm-ndisc.c @@ -1541,8 +1541,10 @@ clean_pref64(NMNDisc *ndisc, gint64 now_msec, NMNDiscConfigMap *changed, gint64 if (!rdata->public.pref64.valid) return; - if (!expiry_next(now_msec, rdata->public.pref64.expiry_msec, next_msec)) + if (!expiry_next(now_msec, rdata->public.pref64.expiry_msec, next_msec)) { + rdata->public.pref64.valid = FALSE; *changed |= NM_NDISC_CONFIG_PREF64; + } } static void From e097b33e222a917718de813317d87d29eff6a528 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Sep 2025 19:16:58 +0200 Subject: [PATCH 11/31] libnm,nmcli: add a ipv6.clat property --- .../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 12 + src/libnm-client-impl/libnm.ver | 8 + ...gen-metadata-nm-settings-libnm-core.xml.in | 4 + src/libnm-core-impl/nm-setting-ip6-config.c | 51 +- src/libnm-core-public/nm-setting-ip6-config.h | 23 + src/libnmc-setting/nm-meta-setting-desc.c | 3 + src/libnmc-setting/settings-docs.h.in | 1 + .../gen-metadata-nm-settings-nmcli.xml.in | 4 + .../test_003.expected | 538 ++++++++------ .../test_004.expected | 678 ++++++++++-------- 10 files changed, 783 insertions(+), 539 deletions(-) diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index 21908090f7..5604df62f5 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 @@ -3598,6 +3598,7 @@ do_write_construct(NMConnection *connection, } else route_ignore = FALSE; + /* Unsupported properties */ if ((s_ip4 = nm_connection_get_setting_ip4_config(connection))) { if (nm_setting_ip_config_get_dhcp_dscp(s_ip4)) { set_error_unsupported(error, @@ -3618,6 +3619,17 @@ do_write_construct(NMConnection *connection, } } + if ((s_ip6 = nm_connection_get_setting_ip6_config(connection))) { + if (nm_setting_ip6_config_get_clat(NM_SETTING_IP6_CONFIG(s_ip6)) + != NM_SETTING_IP6_CONFIG_CLAT_DEFAULT) { + set_error_unsupported(error, + connection, + NM_SETTING_IP6_CONFIG_SETTING_NAME "." NM_SETTING_IP6_CONFIG_CLAT, + FALSE); + return FALSE; + } + } + write_ip4_setting(connection, ifcfg, !route_ignore && route_path_is_svformat ? &route_content_svformat : NULL, diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver index ed5901d79f..aac8afa5f4 100644 --- a/src/libnm-client-impl/libnm.ver +++ b/src/libnm-client-impl/libnm.ver @@ -2087,9 +2087,17 @@ global: libnm_1_56_0 { global: nm_dns_server_validate; + nm_setting_connection_dnssec_get_type; + nm_setting_connection_get_dnssec; nm_setting_gsm_get_device_uid; nm_setting_connection_get_dnssec; nm_setting_connection_dnssec_get_type; nm_utils_copy_cert_as_user; nm_vpn_plugin_info_supports_safe_private_file_access; } libnm_1_54_0; + +libnm_1_58_0 { +global: + nm_setting_ip6_config_clat_get_type; + nm_setting_ip6_config_get_clat; +} libnm_1_56_0; diff --git a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in index c83deea9c1..99b2b98ebf 100644 --- a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in +++ b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in @@ -1819,6 +1819,10 @@ dbus-type="i" gprop-type="NMTernary" /> + mtu; } +/** + * nm_setting_ip6_config_get_clat: + * @setting: the #NMSettingIP6Config + * + * Returns the value in the #NMSettingIP6Config:clat property. + * + * Returns: the CLAT property value + * + * Since: 1.58 + */ +NMSettingIp6ConfigClat +nm_setting_ip6_config_get_clat(NMSettingIP6Config *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_IP6_CONFIG(setting), NM_SETTING_IP6_CONFIG_CLAT_DEFAULT); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE(setting)->clat; +} + static gboolean verify(NMSetting *setting, NMConnection *connection, GError **error) { @@ -1339,6 +1359,35 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) _set_string_fcn_dhcp_pd_hint, .direct_string_allow_empty = TRUE); + /** + * NMSettingIP6Config:clat + * + * Controls the CLAT (Customer-side translator) functionality. CLAT is used to implement the + * client part of 464XLAT (RFC 6877), an architecture that provides IPv4 connectivity to hosts + * on IPv6-only networks. + * + * Setting %NM_SETTING_IP6_CONFIG_CLAT_YES or %NM_SETTING_IP6_CONFIG_CLAT_NO respectively enables + * or disables CLAT. When enabled, NetworkManager discovers the NAT64 prefix via Router + * Advertisement; if the prefix is found, it installs a BPF program to perform the stateless + * translation of packets betweeen IPv4 and IPv6. + * + * When set to %NM_SETTING_IP6_CONFIG_CLAT_DEFAULT, the actual value is looked up in the global + * configuration; if not specified it defaults to %NM_SETTING_IP6_CONFIG_CLAT_NO. In the future + * the fallback value may change to %NM_SETTING_IP6_CONFIG_CLAT_YES. + * + * Since: 1.56 + */ + _nm_setting_property_define_direct_enum(properties_override, + obj_properties, + NM_SETTING_IP6_CONFIG_CLAT, + PROP_CLAT, + NM_TYPE_SETTING_IP6_CONFIG_CLAT, + NM_SETTING_IP6_CONFIG_CLAT_DEFAULT, + NM_SETTING_PARAM_NONE, + NULL, + NMSettingIP6ConfigPrivate, + clat); + /* IP6-specific property overrides */ /* ---dbus--- diff --git a/src/libnm-core-public/nm-setting-ip6-config.h b/src/libnm-core-public/nm-setting-ip6-config.h index b17fc465fd..953dfeac62 100644 --- a/src/libnm-core-public/nm-setting-ip6-config.h +++ b/src/libnm-core-public/nm-setting-ip6-config.h @@ -46,6 +46,8 @@ G_BEGIN_DECLS #define NM_SETTING_IP6_CONFIG_DHCP_PD_HINT "dhcp-pd-hint" +#define NM_SETTING_IP6_CONFIG_CLAT "clat" + /** * NM_SETTING_IP6_CONFIG_METHOD_IGNORE: * @@ -153,6 +155,25 @@ typedef enum { NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT = 3, } NMSettingIP6ConfigAddrGenMode; +/** + * NMSettingIp6ConfigClat: + * @NM_SETTING_IP6_CONFIG_CLAT_DEFAULT: use the global default value + * @NM_SETTING_IP6_CONFIG_CLAT_NO: disable CLAT + * @NM_SETTING_IP6_CONFIG_CLAT_YES: enable CLAT + * + * #NMSettingIP6ConfigClat values specify if CLAT (Customer-side translator) + * is enabled or not. CLAT is used to implement the client part of 464XLAT + * (RFC 6877), an architecture that provides IPv4 connectivity to hosts on + * IPv6-only networks. + * + * Since: 1.58 + */ +typedef enum { + NM_SETTING_IP6_CONFIG_CLAT_DEFAULT = -1, + NM_SETTING_IP6_CONFIG_CLAT_NO = 0, + NM_SETTING_IP6_CONFIG_CLAT_YES = 1, +} NMSettingIp6ConfigClat; + typedef struct _NMSettingIP6ConfigClass NMSettingIP6ConfigClass; GType nm_setting_ip6_config_get_type(void); @@ -176,6 +197,8 @@ NM_AVAILABLE_IN_1_40 guint32 nm_setting_ip6_config_get_mtu(NMSettingIP6Config *setting); NM_AVAILABLE_IN_1_44 const char *nm_setting_ip6_config_get_dhcp_pd_hint(NMSettingIP6Config *setting); +NM_AVAILABLE_IN_1_58 +NMSettingIp6ConfigClat nm_setting_ip6_config_get_clat(NMSettingIP6Config *setting); G_END_DECLS diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c index e2ab8dfafe..8642315c4c 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.c +++ b/src/libnmc-setting/nm-meta-setting-desc.c @@ -6913,6 +6913,9 @@ static const NMMetaPropertyInfo *const property_infos_IP6_CONFIG[] = { PROPERTY_INFO (NM_SETTING_IP6_CONFIG_DHCP_PD_HINT, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DHCP_PD_HINT, .property_type = &_pt_gobject_string, ), + PROPERTY_INFO (NM_SETTING_IP6_CONFIG_CLAT, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_CLAT, + .property_type = &_pt_gobject_enum, + ), PROPERTY_INFO (NM_SETTING_IP6_CONFIG_DHCP_DUID, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DHCP_DUID, .property_type = &_pt_gobject_string, ), diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 89f8c6d178..baf325bf90 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -224,6 +224,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE N_("Configure method for creating the IPv6 interface identifier of addresses with RFC4862 IPv6 Stateless Address Autoconfiguration and Link Local addresses. The permitted values are: \"eui64\" (0), \"stable-privacy\" (1), \"default\" (3) or \"default-or-eui64\" (2). If the property is set to \"eui64\", the addresses will be generated using the interface token derived from hardware address. This makes the host part of the address to stay constant, making it possible to track the host's presence when it changes networks. The address changes when the interface hardware is replaced. If a duplicate address is detected, there is also no fallback to generate another address. When configured, the \"ipv6.token\" is used instead of the MAC address to generate addresses for stateless autoconfiguration. If the property is set to \"stable-privacy\", the interface identifier is generated as specified by RFC7217. This works by hashing a host specific key (see NetworkManager(8) manual), the interface name, the connection's \"connection.stable-id\" property and the address prefix. This improves privacy by making it harder to use the address to track the host's presence and the address is stable when the network interface hardware is replaced. The special values \"default\" and \"default-or-eui64\" will fallback to the global connection default as documented in the NetworkManager.conf(5) manual. If the global default is not specified, the fallback value is \"stable-privacy\" or \"eui64\", respectively. If not specified, when creating a new profile the default is \"default\". Note that this setting is distinct from the Privacy Extensions as configured by \"ip6-privacy\" property and it does not affect the temporary addresses configured with this option.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ADDRESSES N_("A list of IPv6 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"2001:db8:85a3::8a2e:370:7334/64, 2001:db8:85a3::5/64\". The addresses are listed in decreasing priority, meaning the first address will be the primary address. This can make a difference with IPv6 source address selection (RFC 6724, section 5).") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_AUTO_ROUTE_EXT_GW N_("VPN connections will default to add the route automatically unless this setting is set to FALSE. For other connection types, adding such an automatic route is currently not supported and setting this to TRUE has no effect.") +#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_CLAT N_("Controls the CLAT (Customer-side translator) functionality. CLAT is used to implement the client part of 464XLAT (RFC 6877), an architecture that provides IPv4 connectivity to hosts on IPv6-only networks. Setting \"yes\" (1) or \"no\" (0) respectively enables or disables CLAT. When enabled, NetworkManager discovers the NAT64 prefix via Router Advertisement; if the prefix is found, it installs a BPF program to perform the stateless translation of packets betweeen IPv4 and IPv6. When set to \"default\" (-1), the actual value is looked up in the global configuration; if not specified it defaults to \"no\" (0). In the future the fallback value may change to \"yes\" (1).") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DAD_TIMEOUT N_("Maximum 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. The property is currently implemented only for IPv4. A zero value means that no duplicate address detection is performed, -1 means the default value (either the value configured globally in NetworkManger.conf or 200ms). A value greater than zero is a timeout in milliseconds. Note that the time intervals are subject to randomization as per RFC 5227 and so the actual duration can be between half and the full time specified in this property.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DHCP_DSCP N_("Specifies the value for the DSCP field (traffic class) of the IP header. When empty, the global default value is used; if no global default is specified, it is assumed to be \"CS0\". Allowed values are: \"CS0\", \"CS4\" and \"CS6\". The property is currently valid only for IPv4, and it is supported only by the \"internal\" DHCP plugin.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DHCP_DUID N_("A string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried in the Client Identifier option. If the property is a hex string ('aa:bb:cc') it is interpreted as a binary DUID and filled as an opaque value in the Client Identifier option. The special value \"lease\" will retrieve the DUID previously used from the lease file belonging to the connection. If no DUID is found and \"dhclient\" is the configured dhcp client, the DUID is searched in the system-wide dhclient lease file. If still no DUID is found, or another dhcp client is used, a global and permanent DUID-UUID (RFC 6355) will be generated based on the machine-id. The special values \"llt\" and \"ll\" will generate a DUID of type LLT or LL (see RFC 3315) based on the current MAC address of the device. In order to try providing a stable DUID-LLT, the time field will contain a constant timestamp that is used globally (for all profiles) and persisted to disk. The special values \"stable-llt\", \"stable-ll\" and \"stable-uuid\" will generate a DUID of the corresponding type, derived from the connection's stable-id and a per-host unique key. You may want to include the \"${DEVICE}\" or \"${MAC}\" specifier in the stable-id, in case this profile gets activated on multiple devices. So, the link-layer address of \"stable-ll\" and \"stable-llt\" will be a generated address derived from the stable id. The DUID-LLT time value in the \"stable-llt\" option will be picked among a static timespan of three years (the upper bound of the interval is the same constant timestamp used in \"llt\"). When the property is unset, the global value provided for \"ipv6.dhcp-duid\" is used. If no global value is provided, the default \"lease\" value is assumed.") diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index 881c41cac8..80d5da04ee 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -1578,6 +1578,10 @@ + diff --git a/src/tests/client/test-client.check-on-disk/test_003.expected b/src/tests/client/test-client.check-on-disk/test_003.expected index 809b55799d..fd99b8f780 100644 --- a/src/tests/client/test-client.check-on-disk/test_003.expected +++ b/src/tests/client/test-client.check-on-disk/test_003.expected @@ -182,12 +182,12 @@ id path uuid <<< -size: 6675 +size: 6728 location: src/tests/client/test-client.py:test_003()/14 cmd: $NMCLI con s con-gsm1 lang: C returncode: 0 -stdout: 6542 bytes +stdout: 6595 bytes >>> connection.id: con-gsm1 connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL @@ -286,6 +286,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -332,12 +333,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6718 +size: 6771 location: src/tests/client/test-client.py:test_003()/15 cmd: $NMCLI con s con-gsm1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6575 bytes +stdout: 6628 bytes >>> connection.id: con-gsm1 connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL @@ -436,6 +437,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -482,42 +484,42 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 588 +size: 591 location: src/tests/client/test-client.py:test_003()/16 cmd: $NMCLI -g all con s con-gsm1 lang: C returncode: 0 -stdout: 449 bytes +stdout: 452 bytes >>> connection:con-gsm1:UUID-con-gsm1-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0:xyz.con-gsm1:::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: <<< -size: 598 +size: 601 location: src/tests/client/test-client.py:test_003()/17 cmd: $NMCLI -g all con s con-gsm1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 449 bytes +stdout: 452 bytes >>> connection:con-gsm1:UUID-con-gsm1-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0:xyz.con-gsm1:::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: <<< -size: 6663 +size: 6716 location: src/tests/client/test-client.py:test_003()/18 cmd: $NMCLI con s con-gsm2 lang: C returncode: 0 -stdout: 6530 bytes +stdout: 6583 bytes >>> connection.id: con-gsm2 connection.uuid: UUID-con-gsm2-REPLACED-REPLACED-REPL @@ -616,6 +618,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -662,12 +665,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6706 +size: 6759 location: src/tests/client/test-client.py:test_003()/19 cmd: $NMCLI con s con-gsm2 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6563 bytes +stdout: 6616 bytes >>> connection.id: con-gsm2 connection.uuid: UUID-con-gsm2-REPLACED-REPLACED-REPL @@ -766,6 +769,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -812,42 +816,42 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 576 +size: 579 location: src/tests/client/test-client.py:test_003()/20 cmd: $NMCLI -g all con s con-gsm2 lang: C returncode: 0 -stdout: 437 bytes +stdout: 440 bytes >>> connection:con-gsm2:UUID-con-gsm2-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0::::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: <<< -size: 586 +size: 589 location: src/tests/client/test-client.py:test_003()/21 cmd: $NMCLI -g all con s con-gsm2 lang: pl_PL.UTF-8 returncode: 0 -stdout: 437 bytes +stdout: 440 bytes >>> connection:con-gsm2:UUID-con-gsm2-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0::::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: <<< -size: 6663 +size: 6716 location: src/tests/client/test-client.py:test_003()/22 cmd: $NMCLI con s con-gsm3 lang: C returncode: 0 -stdout: 6530 bytes +stdout: 6583 bytes >>> connection.id: con-gsm3 connection.uuid: UUID-con-gsm3-REPLACED-REPLACED-REPL @@ -946,6 +950,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -992,12 +997,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6706 +size: 6759 location: src/tests/client/test-client.py:test_003()/23 cmd: $NMCLI con s con-gsm3 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6563 bytes +stdout: 6616 bytes >>> connection.id: con-gsm3 connection.uuid: UUID-con-gsm3-REPLACED-REPLACED-REPL @@ -1096,6 +1101,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1142,31 +1148,31 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 577 +size: 580 location: src/tests/client/test-client.py:test_003()/24 cmd: $NMCLI -g all con s con-gsm3 lang: C returncode: 0 -stdout: 438 bytes +stdout: 441 bytes >>> connection:con-gsm3:UUID-con-gsm3-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0: :::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: <<< -size: 587 +size: 590 location: src/tests/client/test-client.py:test_003()/25 cmd: $NMCLI -g all con s con-gsm3 lang: pl_PL.UTF-8 returncode: 0 -stdout: 438 bytes +stdout: 441 bytes >>> connection:con-gsm3:UUID-con-gsm3-REPLACED-REPLACED-REPL::gsm::no:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: serial:5:8:even:1:100 gsm:no::::0: :::0:no::::auto:no::::0:yes:no:no:no:no:no: proxy:none:no:: @@ -1312,12 +1318,12 @@ UUID NAME UUID-ethernet-REPLACED-REPLACED-REPL ethernet <<< -size: 5972 +size: 6025 location: src/tests/client/test-client.py:test_003()/37 cmd: $NMCLI -f ALL con s ethernet lang: C returncode: 0 -stdout: 5832 bytes +stdout: 5885 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1431,6 +1437,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1446,12 +1453,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6007 +size: 6060 location: src/tests/client/test-client.py:test_003()/38 cmd: $NMCLI -f ALL con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5857 bytes +stdout: 5910 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1565,6 +1572,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1600,12 +1608,12 @@ stdout: 51 bytes GENERAL.STATE: aktywowano <<< -size: 6674 +size: 6727 location: src/tests/client/test-client.py:test_003()/41 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 6541 bytes +stdout: 6594 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1719,6 +1727,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1747,12 +1756,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6713 +size: 6766 location: src/tests/client/test-client.py:test_003()/42 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 6570 bytes +stdout: 6623 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1866,6 +1875,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -2380,12 +2390,12 @@ UUID NAME UUID-ethernet-REPLACED-REPLACED-REPL ethernet <<< -size: 5972 +size: 6025 location: src/tests/client/test-client.py:test_003()/62 cmd: $NMCLI -f ALL con s ethernet lang: C returncode: 0 -stdout: 5832 bytes +stdout: 5885 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2499,6 +2509,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -2514,12 +2525,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6007 +size: 6060 location: src/tests/client/test-client.py:test_003()/63 cmd: $NMCLI -f ALL con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5857 bytes +stdout: 5910 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2633,6 +2644,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -2672,12 +2684,12 @@ GENERAL.STATE: aktywowano GENERAL.STATE: aktywowano <<< -size: 7384 +size: 7437 location: src/tests/client/test-client.py:test_003()/66 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 7251 bytes +stdout: 7304 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2791,6 +2803,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -2833,12 +2846,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 7427 +size: 7480 location: src/tests/client/test-client.py:test_003()/67 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 7284 bytes +stdout: 7337 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2952,6 +2965,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -3502,12 +3516,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 7387 +size: 7440 location: src/tests/client/test-client.py:test_003()/84 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 7254 bytes +stdout: 7307 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -3621,6 +3635,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -3663,12 +3678,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 7431 +size: 7484 location: src/tests/client/test-client.py:test_003()/85 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 7288 bytes +stdout: 7341 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -3782,6 +3797,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -3824,12 +3840,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6717 +size: 6770 location: src/tests/client/test-client.py:test_003()/86 cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6544 bytes +stdout: 6597 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -3943,6 +3959,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -3971,12 +3988,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6757 +size: 6810 location: src/tests/client/test-client.py:test_003()/87 cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6574 bytes +stdout: 6627 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -4090,6 +4107,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4328,12 +4346,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 7399 +size: 7452 location: src/tests/client/test-client.py:test_003()/94 cmd: $NMCLI --color yes con s ethernet lang: C returncode: 0 -stdout: 7254 bytes +stdout: 7307 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -4447,6 +4465,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4489,12 +4508,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 7443 +size: 7496 location: src/tests/client/test-client.py:test_003()/95 cmd: $NMCLI --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 7288 bytes +stdout: 7341 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -4608,6 +4627,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4650,12 +4670,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6729 +size: 6782 location: src/tests/client/test-client.py:test_003()/96 cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6544 bytes +stdout: 6597 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -4769,6 +4789,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4797,12 +4818,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6769 +size: 6822 location: src/tests/client/test-client.py:test_003()/97 cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6574 bytes +stdout: 6627 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -4916,6 +4937,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5170,12 +5192,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 8640 +size: 8693 location: src/tests/client/test-client.py:test_003()/104 cmd: $NMCLI --pretty con s ethernet lang: C returncode: 0 -stdout: 8497 bytes +stdout: 8550 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -5295,6 +5317,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5347,12 +5370,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 8705 +size: 8758 location: src/tests/client/test-client.py:test_003()/105 cmd: $NMCLI --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8552 bytes +stdout: 8605 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -5472,6 +5495,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5524,12 +5548,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7658 +size: 7711 location: src/tests/client/test-client.py:test_003()/106 cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 7475 bytes +stdout: 7528 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -5649,6 +5673,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5683,12 +5708,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7711 +size: 7764 location: src/tests/client/test-client.py:test_003()/107 cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7518 bytes +stdout: 7571 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -5808,6 +5833,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -6092,12 +6118,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 8652 +size: 8705 location: src/tests/client/test-client.py:test_003()/114 cmd: $NMCLI --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 8497 bytes +stdout: 8550 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -6217,6 +6243,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -6269,12 +6296,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 8717 +size: 8770 location: src/tests/client/test-client.py:test_003()/115 cmd: $NMCLI --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8552 bytes +stdout: 8605 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -6394,6 +6421,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -6446,12 +6474,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7670 +size: 7723 location: src/tests/client/test-client.py:test_003()/116 cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 7475 bytes +stdout: 7528 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -6571,6 +6599,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -6605,12 +6634,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7723 +size: 7776 location: src/tests/client/test-client.py:test_003()/117 cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7518 bytes +stdout: 7571 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -6730,6 +6759,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -6994,12 +7024,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 3959 +size: 3972 location: src/tests/client/test-client.py:test_003()/124 cmd: $NMCLI --terse con s ethernet lang: C returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -7113,6 +7143,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -7155,12 +7186,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3969 +size: 3982 location: src/tests/client/test-client.py:test_003()/125 cmd: $NMCLI --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -7274,6 +7305,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -7316,12 +7348,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3609 +size: 3622 location: src/tests/client/test-client.py:test_003()/126 cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -7435,6 +7467,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -7463,12 +7496,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3619 +size: 3632 location: src/tests/client/test-client.py:test_003()/127 cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -7582,6 +7615,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -7816,12 +7850,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 3971 +size: 3984 location: src/tests/client/test-client.py:test_003()/134 cmd: $NMCLI --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -7935,6 +7969,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -7977,12 +8012,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3981 +size: 3994 location: src/tests/client/test-client.py:test_003()/135 cmd: $NMCLI --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -8096,6 +8131,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -8138,12 +8174,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3621 +size: 3634 location: src/tests/client/test-client.py:test_003()/136 cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -8257,6 +8293,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -8285,12 +8322,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3631 +size: 3644 location: src/tests/client/test-client.py:test_003()/137 cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -8404,6 +8441,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -8642,12 +8680,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5083 +size: 5111 location: src/tests/client/test-client.py:test_003()/144 cmd: $NMCLI --mode tabular con s ethernet lang: C returncode: 0 -stdout: 4934 bytes +stdout: 4962 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8658,8 +8696,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none no -- -- @@ -8673,12 +8711,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 5133 +size: 5161 location: src/tests/client/test-client.py:test_003()/145 cmd: $NMCLI --mode tabular con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 4974 bytes +stdout: 5002 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8689,8 +8727,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -8704,12 +8742,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza <<< -size: 4621 +size: 4649 location: src/tests/client/test-client.py:test_003()/146 cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4432 bytes +stdout: 4460 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8720,8 +8758,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none no -- -- @@ -8731,12 +8769,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 4669 +size: 4697 location: src/tests/client/test-client.py:test_003()/147 cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4470 bytes +stdout: 4498 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8747,8 +8785,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -8894,12 +8932,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5095 +size: 5123 location: src/tests/client/test-client.py:test_003()/154 cmd: $NMCLI --mode tabular --color yes con s ethernet lang: C returncode: 0 -stdout: 4934 bytes +stdout: 4962 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8910,8 +8948,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none no -- -- @@ -8925,12 +8963,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 5145 +size: 5173 location: src/tests/client/test-client.py:test_003()/155 cmd: $NMCLI --mode tabular --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 4974 bytes +stdout: 5002 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8941,8 +8979,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -8956,12 +8994,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza <<< -size: 4633 +size: 4661 location: src/tests/client/test-client.py:test_003()/156 cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4432 bytes +stdout: 4460 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8972,8 +9010,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none no -- -- @@ -8983,12 +9021,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 4681 +size: 4709 location: src/tests/client/test-client.py:test_003()/157 cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4470 bytes +stdout: 4498 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -8999,8 +9037,8 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -9162,12 +9200,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 8096 +size: 8138 location: src/tests/client/test-client.py:test_003()/164 cmd: $NMCLI --mode tabular --pretty con s ethernet lang: C returncode: 0 -stdout: 7938 bytes +stdout: 7980 bytes >>> ========================================= Connection profile details (ethernet) @@ -9184,9 +9222,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9209,12 +9247,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 8226 +size: 8268 location: src/tests/client/test-client.py:test_003()/165 cmd: $NMCLI --mode tabular --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8058 bytes +stdout: 8100 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -9231,9 +9269,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9256,12 +9294,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza <<< -size: 7178 +size: 7220 location: src/tests/client/test-client.py:test_003()/166 cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6980 bytes +stdout: 7022 bytes >>> ========================================= Connection profile details (ethernet) @@ -9278,9 +9316,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9295,12 +9333,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 7280 +size: 7322 location: src/tests/client/test-client.py:test_003()/167 cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7072 bytes +stdout: 7114 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -9317,9 +9355,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9510,12 +9548,12 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 8108 +size: 8150 location: src/tests/client/test-client.py:test_003()/174 cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 7938 bytes +stdout: 7980 bytes >>> ========================================= Connection profile details (ethernet) @@ -9532,9 +9570,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9557,12 +9595,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 8238 +size: 8280 location: src/tests/client/test-client.py:test_003()/175 cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8058 bytes +stdout: 8100 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -9579,9 +9617,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9604,12 +9642,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deza <<< -size: 7190 +size: 7232 location: src/tests/client/test-client.py:test_003()/176 cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6980 bytes +stdout: 7022 bytes >>> ========================================= Connection profile details (ethernet) @@ -9626,9 +9664,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9643,12 +9681,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 eth0 deac <<< -size: 7292 +size: 7334 location: src/tests/client/test-client.py:test_003()/177 cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7072 bytes +stdout: 7114 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -9665,9 +9703,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -9838,66 +9876,66 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 934 +size: 937 location: src/tests/client/test-client.py:test_003()/184 cmd: $NMCLI --mode tabular --terse con s ethernet lang: C returncode: 0 -stdout: 778 bytes +stdout: 781 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/6:: <<< -size: 944 +size: 947 location: src/tests/client/test-client.py:test_003()/185 cmd: $NMCLI --mode tabular --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 778 bytes +stdout: 781 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/6:: <<< -size: 782 +size: 785 location: src/tests/client/test-client.py:test_003()/186 cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 586 bytes +stdout: 589 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: <<< -size: 792 +size: 795 location: src/tests/client/test-client.py:test_003()/187 cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 586 bytes +stdout: 589 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: @@ -10000,66 +10038,66 @@ UUID-con-gsm3-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 946 +size: 949 location: src/tests/client/test-client.py:test_003()/194 cmd: $NMCLI --mode tabular --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 778 bytes +stdout: 781 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/6:: <<< -size: 956 +size: 959 location: src/tests/client/test-client.py:test_003()/195 cmd: $NMCLI --mode tabular --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 778 bytes +stdout: 781 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/6:: <<< -size: 794 +size: 797 location: src/tests/client/test-client.py:test_003()/196 cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 586 bytes +stdout: 589 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: <<< -size: 804 +size: 807 location: src/tests/client/test-client.py:test_003()/197 cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 586 bytes +stdout: 589 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 802-3-ethernet::0::no:::::auto::::default::-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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/6:: @@ -10370,12 +10408,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE: ethernet <<< -size: 7405 +size: 7458 location: src/tests/client/test-client.py:test_003()/204 cmd: $NMCLI --mode multiline con s ethernet lang: C returncode: 0 -stdout: 7254 bytes +stdout: 7307 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -10489,6 +10527,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -10531,12 +10570,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 7449 +size: 7502 location: src/tests/client/test-client.py:test_003()/205 cmd: $NMCLI --mode multiline con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 7288 bytes +stdout: 7341 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -10650,6 +10689,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -10692,12 +10732,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6735 +size: 6788 location: src/tests/client/test-client.py:test_003()/206 cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6544 bytes +stdout: 6597 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -10811,6 +10851,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -10839,12 +10880,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6775 +size: 6828 location: src/tests/client/test-client.py:test_003()/207 cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6574 bytes +stdout: 6627 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -10958,6 +10999,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -11400,12 +11442,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE: ethernet <<< -size: 7417 +size: 7470 location: src/tests/client/test-client.py:test_003()/214 cmd: $NMCLI --mode multiline --color yes con s ethernet lang: C returncode: 0 -stdout: 7254 bytes +stdout: 7307 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -11519,6 +11561,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -11561,12 +11604,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 7461 +size: 7514 location: src/tests/client/test-client.py:test_003()/215 cmd: $NMCLI --mode multiline --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 7288 bytes +stdout: 7341 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -11680,6 +11723,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -11722,12 +11766,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6747 +size: 6800 location: src/tests/client/test-client.py:test_003()/216 cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 6544 bytes +stdout: 6597 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -11841,6 +11885,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -11869,12 +11914,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 6787 +size: 6840 location: src/tests/client/test-client.py:test_003()/217 cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6574 bytes +stdout: 6627 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -11988,6 +12033,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12468,12 +12514,12 @@ TYPE: ethernet ------------------------------------------------------------------------------- <<< -size: 8657 +size: 8710 location: src/tests/client/test-client.py:test_003()/224 cmd: $NMCLI --mode multiline --pretty con s ethernet lang: C returncode: 0 -stdout: 8497 bytes +stdout: 8550 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -12593,6 +12639,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12645,12 +12692,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 8722 +size: 8775 location: src/tests/client/test-client.py:test_003()/225 cmd: $NMCLI --mode multiline --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8552 bytes +stdout: 8605 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -12770,6 +12817,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12822,12 +12870,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7675 +size: 7728 location: src/tests/client/test-client.py:test_003()/226 cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 7475 bytes +stdout: 7528 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -12947,6 +12995,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12981,12 +13030,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7728 +size: 7781 location: src/tests/client/test-client.py:test_003()/227 cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7518 bytes +stdout: 7571 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -13106,6 +13155,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -13616,12 +13666,12 @@ TYPE: ethernet ------------------------------------------------------------------------------- <<< -size: 8669 +size: 8722 location: src/tests/client/test-client.py:test_003()/234 cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 8497 bytes +stdout: 8550 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -13741,6 +13791,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -13793,12 +13844,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 8734 +size: 8787 location: src/tests/client/test-client.py:test_003()/235 cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 8552 bytes +stdout: 8605 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -13918,6 +13969,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -13970,12 +14022,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7687 +size: 7740 location: src/tests/client/test-client.py:test_003()/236 cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 7475 bytes +stdout: 7528 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -14095,6 +14147,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -14129,12 +14182,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 7740 +size: 7793 location: src/tests/client/test-client.py:test_003()/237 cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7518 bytes +stdout: 7571 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -14254,6 +14307,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -14726,12 +14780,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE:802-3-ethernet <<< -size: 3976 +size: 3989 location: src/tests/client/test-client.py:test_003()/244 cmd: $NMCLI --mode multiline --terse con s ethernet lang: C returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -14845,6 +14899,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -14887,12 +14942,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3986 +size: 3999 location: src/tests/client/test-client.py:test_003()/245 cmd: $NMCLI --mode multiline --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -15006,6 +15061,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -15048,12 +15104,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3626 +size: 3639 location: src/tests/client/test-client.py:test_003()/246 cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -15167,6 +15223,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -15195,12 +15252,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3636 +size: 3649 location: src/tests/client/test-client.py:test_003()/247 cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -15314,6 +15371,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -15756,12 +15814,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE:802-3-ethernet <<< -size: 3988 +size: 4001 location: src/tests/client/test-client.py:test_003()/254 cmd: $NMCLI --mode multiline --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -15875,6 +15933,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -15917,12 +15976,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3998 +size: 4011 location: src/tests/client/test-client.py:test_003()/255 cmd: $NMCLI --mode multiline --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3817 bytes +stdout: 3830 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -16036,6 +16095,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16078,12 +16138,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3638 +size: 3651 location: src/tests/client/test-client.py:test_003()/256 cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -16197,6 +16257,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16225,12 +16286,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 3648 +size: 3661 location: src/tests/client/test-client.py:test_003()/257 cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3427 bytes +stdout: 3440 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -16344,6 +16405,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 diff --git a/src/tests/client/test-client.check-on-disk/test_004.expected b/src/tests/client/test-client.check-on-disk/test_004.expected index 11ef755673..297d07af04 100644 --- a/src/tests/client/test-client.check-on-disk/test_004.expected +++ b/src/tests/client/test-client.check-on-disk/test_004.expected @@ -58,12 +58,12 @@ location: src/tests/client/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: 6252 +size: 6305 location: src/tests/client/test-client.py:test_004()/8 cmd: $NMCLI con s con-xx1 lang: C returncode: 0 -stdout: 6121 bytes +stdout: 6174 bytes >>> connection.id: con-xx1 connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA @@ -180,6 +180,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -195,12 +196,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 6287 +size: 6340 location: src/tests/client/test-client.py:test_004()/9 cmd: $NMCLI con s con-xx1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6146 bytes +stdout: 6199 bytes >>> connection.id: con-xx1 connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA @@ -317,6 +318,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -368,12 +370,12 @@ con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP vpn -- con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi -- <<< -size: 5628 +size: 5681 location: src/tests/client/test-client.py:test_004()/13 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 5494 bytes +stdout: 5547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -472,6 +474,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -493,12 +496,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 5655 +size: 5708 location: src/tests/client/test-client.py:test_004()/14 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5564 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -597,6 +600,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -690,12 +694,12 @@ con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi wlan0 con-1 5fcfd6d7-1e63-3332-8826-a7eda103792d ethernet -- <<< -size: 6756 +size: 6809 location: src/tests/client/test-client.py:test_004()/21 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 6622 bytes +stdout: 6675 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -794,6 +798,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -836,12 +841,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6789 +size: 6842 location: src/tests/client/test-client.py:test_004()/22 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6645 bytes +stdout: 6698 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -940,6 +945,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1098,12 +1104,12 @@ con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi 0 never con-1 5fcfd6d7-1e63-3332-8826-a7eda103792d ethernet 0 never yes 0 no /org/freedesktop/NetworkManager/Settings/Connection/1 no -- -- -- -- /etc/NetworkManager/system-connections/con-1 <<< -size: 6762 +size: 6815 location: src/tests/client/test-client.py:test_004()/27 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1202,6 +1208,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1244,12 +1251,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6799 +size: 6852 location: src/tests/client/test-client.py:test_004()/28 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1348,6 +1355,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1390,12 +1398,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6762 +size: 6815 location: src/tests/client/test-client.py:test_004()/29 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1494,6 +1502,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1536,12 +1545,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6799 +size: 6852 location: src/tests/client/test-client.py:test_004()/30 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1640,6 +1649,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1682,12 +1692,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 5635 +size: 5688 location: src/tests/client/test-client.py:test_004()/31 cmd: $NMCLI -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5494 bytes +stdout: 5547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1786,6 +1796,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -1807,12 +1818,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 5662 +size: 5715 location: src/tests/client/test-client.py:test_004()/32 cmd: $NMCLI -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5564 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1911,6 +1922,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4542,12 +4554,12 @@ connection.type: 802-11-wireless connection.interface-name: -- <<< -size: 6774 +size: 6827 location: src/tests/client/test-client.py:test_004()/77 cmd: $NMCLI --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4646,6 +4658,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4688,12 +4701,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6811 +size: 6864 location: src/tests/client/test-client.py:test_004()/78 cmd: $NMCLI --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4792,6 +4805,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4834,12 +4848,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6774 +size: 6827 location: src/tests/client/test-client.py:test_004()/79 cmd: $NMCLI --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4938,6 +4952,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -4980,12 +4995,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6811 +size: 6864 location: src/tests/client/test-client.py:test_004()/80 cmd: $NMCLI --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -5084,6 +5099,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5126,12 +5142,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 5647 +size: 5700 location: src/tests/client/test-client.py:test_004()/81 cmd: $NMCLI --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5494 bytes +stdout: 5547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -5230,6 +5246,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -5251,12 +5268,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 5674 +size: 5727 location: src/tests/client/test-client.py:test_004()/82 cmd: $NMCLI --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5564 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -5355,6 +5372,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -7986,12 +8004,12 @@ connection.type: 802-11-wireless connection.interface-name: -- <<< -size: 7783 +size: 7836 location: src/tests/client/test-client.py:test_004()/127 cmd: $NMCLI --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -8095,6 +8113,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -8145,12 +8164,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7833 +size: 7886 location: src/tests/client/test-client.py:test_004()/128 cmd: $NMCLI --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -8254,6 +8273,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -8304,12 +8324,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7783 +size: 7836 location: src/tests/client/test-client.py:test_004()/129 cmd: $NMCLI --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -8413,6 +8433,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -8463,12 +8484,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7833 +size: 7886 location: src/tests/client/test-client.py:test_004()/130 cmd: $NMCLI --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -8572,6 +8593,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -8622,12 +8644,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 6264 +size: 6317 location: src/tests/client/test-client.py:test_004()/131 cmd: $NMCLI --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 6113 bytes +stdout: 6166 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -8731,6 +8753,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -8755,12 +8778,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 6296 +size: 6349 location: src/tests/client/test-client.py:test_004()/132 cmd: $NMCLI --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6135 bytes +stdout: 6188 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -8864,6 +8887,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12102,12 +12126,12 @@ connection.interface-name: -- ------------------------------------------------------------------------------- <<< -size: 7795 +size: 7848 location: src/tests/client/test-client.py:test_004()/177 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -12211,6 +12235,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12261,12 +12286,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7845 +size: 7898 location: src/tests/client/test-client.py:test_004()/178 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -12370,6 +12395,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12420,12 +12446,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7795 +size: 7848 location: src/tests/client/test-client.py:test_004()/179 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -12529,6 +12555,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12579,12 +12606,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7845 +size: 7898 location: src/tests/client/test-client.py:test_004()/180 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -12688,6 +12715,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12738,12 +12766,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 6276 +size: 6329 location: src/tests/client/test-client.py:test_004()/181 cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 6113 bytes +stdout: 6166 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -12847,6 +12875,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -12871,12 +12900,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 6308 +size: 6361 location: src/tests/client/test-client.py:test_004()/182 cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6135 bytes +stdout: 6188 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -12980,6 +13009,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -16218,12 +16248,12 @@ connection.interface-name: -- ------------------------------------------------------------------------------- <<< -size: 3449 +size: 3462 location: src/tests/client/test-client.py:test_004()/227 cmd: $NMCLI --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16322,6 +16352,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16364,12 +16395,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3459 +size: 3472 location: src/tests/client/test-client.py:test_004()/228 cmd: $NMCLI --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16468,6 +16499,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16510,12 +16542,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3449 +size: 3462 location: src/tests/client/test-client.py:test_004()/229 cmd: $NMCLI --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16614,6 +16646,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16656,12 +16689,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3459 +size: 3472 location: src/tests/client/test-client.py:test_004()/230 cmd: $NMCLI --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16760,6 +16793,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16802,12 +16836,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2874 +size: 2887 location: src/tests/client/test-client.py:test_004()/231 cmd: $NMCLI --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16906,6 +16940,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -16927,12 +16962,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 2884 +size: 2897 location: src/tests/client/test-client.py:test_004()/232 cmd: $NMCLI --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -17031,6 +17066,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -19632,12 +19668,12 @@ connection.type:802-11-wireless connection.interface-name: <<< -size: 3461 +size: 3474 location: src/tests/client/test-client.py:test_004()/277 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -19736,6 +19772,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -19778,12 +19815,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3471 +size: 3484 location: src/tests/client/test-client.py:test_004()/278 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -19882,6 +19919,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -19924,12 +19962,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3461 +size: 3474 location: src/tests/client/test-client.py:test_004()/279 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -20028,6 +20066,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -20070,12 +20109,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3471 +size: 3484 location: src/tests/client/test-client.py:test_004()/280 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -20174,6 +20213,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -20216,12 +20256,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2886 +size: 2899 location: src/tests/client/test-client.py:test_004()/281 cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -20320,6 +20360,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -20341,12 +20382,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 2896 +size: 2909 location: src/tests/client/test-client.py:test_004()/282 cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -20445,6 +20486,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -23046,12 +23088,12 @@ connection.type:802-11-wireless connection.interface-name: <<< -size: 4574 +size: 4602 location: src/tests/client/test-client.py:test_004()/327 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: C returncode: 0 -stdout: 4424 bytes +stdout: 4452 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23059,8 +23101,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -23075,12 +23117,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: 4613 +size: 4641 location: src/tests/client/test-client.py:test_004()/328 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4453 bytes +stdout: 4481 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23088,8 +23130,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -23104,12 +23146,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: 4574 +size: 4602 location: src/tests/client/test-client.py:test_004()/329 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: C returncode: 0 -stdout: 4424 bytes +stdout: 4452 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23117,8 +23159,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -23133,12 +23175,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: 4613 +size: 4641 location: src/tests/client/test-client.py:test_004()/330 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4453 bytes +stdout: 4481 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23146,8 +23188,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -23162,12 +23204,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: 3822 +size: 3850 location: src/tests/client/test-client.py:test_004()/331 cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3665 bytes +stdout: 3693 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23175,8 +23217,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -23186,12 +23228,12 @@ proxy none no -- -- <<< -size: 3850 +size: 3878 location: src/tests/client/test-client.py:test_004()/332 cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3683 bytes +stdout: 3711 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -23199,8 +23241,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -24700,12 +24742,12 @@ interface-name <<< -size: 4586 +size: 4614 location: src/tests/client/test-client.py:test_004()/377 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4424 bytes +stdout: 4452 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24713,8 +24755,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -24729,12 +24771,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: 4625 +size: 4653 location: src/tests/client/test-client.py:test_004()/378 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4453 bytes +stdout: 4481 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24742,8 +24784,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -24758,12 +24800,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: 4586 +size: 4614 location: src/tests/client/test-client.py:test_004()/379 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4424 bytes +stdout: 4452 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24771,8 +24813,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -24787,12 +24829,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: 4625 +size: 4653 location: src/tests/client/test-client.py:test_004()/380 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4453 bytes +stdout: 4481 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24800,8 +24842,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -24816,12 +24858,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: 3834 +size: 3862 location: src/tests/client/test-client.py:test_004()/381 cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3665 bytes +stdout: 3693 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24829,8 +24871,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 no 0 @@ -24840,12 +24882,12 @@ proxy none no -- -- <<< -size: 3862 +size: 3890 location: src/tests/client/test-client.py:test_004()/382 cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3683 bytes +stdout: 3711 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp permissions zone controller master slave-type port-type autoconnect-slaves autoconnect-ports down-on-poweroff secondaries gateway-ping-timeout ip-ping-timeout ip-ping-addresses ip-ping-addresses-require-all metered lldp mdns llmnr dns-over-tls dnssec mptcp-flags wait-device-timeout wait-activation-delay connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 @@ -24853,8 +24895,8 @@ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-iaid dhcp-dscp dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname forwarding dhcp-hostname dhcp-fqdn dhcp-hostname-flags never-default may-fail required-timeout dad-timeout dhcp-vendor-class-identifier dhcp-ipv6-only-preferred link-local dhcp-reject-servers auto-route-ext-gw shared-dhcp-range shared-dhcp-lease-time ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 nie 0 @@ -26354,12 +26396,12 @@ interface-name <<< -size: 7131 +size: 7173 location: src/tests/client/test-client.py:test_004()/427 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 6972 bytes +stdout: 7014 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -26372,9 +26414,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26396,12 +26438,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: 7217 +size: 7259 location: src/tests/client/test-client.py:test_004()/428 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7048 bytes +stdout: 7090 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -26414,9 +26456,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26438,12 +26480,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: 7131 +size: 7173 location: src/tests/client/test-client.py:test_004()/429 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 6972 bytes +stdout: 7014 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -26456,9 +26498,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26480,12 +26522,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: 7217 +size: 7259 location: src/tests/client/test-client.py:test_004()/430 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7048 bytes +stdout: 7090 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -26498,9 +26540,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26522,12 +26564,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: 5793 +size: 5835 location: src/tests/client/test-client.py:test_004()/431 cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5627 bytes +stdout: 5669 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -26540,9 +26582,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26554,12 +26596,12 @@ proxy none no -- -- <<< -size: 5840 +size: 5882 location: src/tests/client/test-client.py:test_004()/432 cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5664 bytes +stdout: 5706 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -26572,9 +26614,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28662,12 +28704,12 @@ interface-name <<< -size: 7143 +size: 7185 location: src/tests/client/test-client.py:test_004()/477 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6972 bytes +stdout: 7014 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -28680,9 +28722,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28704,12 +28746,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: 7229 +size: 7271 location: src/tests/client/test-client.py:test_004()/478 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7048 bytes +stdout: 7090 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -28722,9 +28764,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28746,12 +28788,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: 7143 +size: 7185 location: src/tests/client/test-client.py:test_004()/479 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6972 bytes +stdout: 7014 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -28764,9 +28806,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28788,12 +28830,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: 7229 +size: 7271 location: src/tests/client/test-client.py:test_004()/480 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7048 bytes +stdout: 7090 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -28806,9 +28848,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28830,12 +28872,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: 5805 +size: 5847 location: src/tests/client/test-client.py:test_004()/481 cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5627 bytes +stdout: 5669 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -28848,9 +28890,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no -- -- -- 0 (default) yes -1 (default) -1 (default) -- -- 0x0 (none) no yes -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) no no no yes -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) auto -- -1 (default) -- -- 0 (default) yes -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -28862,12 +28904,12 @@ proxy none no -- -- <<< -size: 5852 +size: 5894 location: src/tests/client/test-client.py:test_004()/482 cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5664 bytes +stdout: 5706 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -28880,9 +28922,9 @@ name method dns dns-search dns-options dns-priority addresses gateway ro --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ipv4 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie -- -- -- 0 (default) tak -1 (default) -1 (default) -- -- 0x0 (none) nie tak -1 (default) -1 (default) -- -1 (default) 0 (default) -- -1 (default) -- 0 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules replace-local-rule dhcp-send-release routed-dns ignore-auto-routes ignore-auto-dns never-default may-fail required-timeout ip6-privacy temp-valid-lifetime temp-preferred-lifetime addr-gen-mode ra-timeout mtu dhcp-pd-hint clat dhcp-duid dhcp-iaid dhcp-timeout dhcp-send-hostname-deprecated dhcp-send-hostname dhcp-hostname dhcp-hostname-flags auto-route-ext-gw token +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ipv6 auto -- -- -- 0 -- -- -- -1 0 (unspec) -- -1 (default) -1 (default) -1 (default) nie nie nie tak -1 (default) -1 (default) 0 (default) 0 (default) default 0 (default) automatyczne -- -1 (default) -- -- 0 (default) tak -1 (default) -- 0x0 (none) -1 (default) -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -30970,94 +31012,94 @@ interface-name <<< -size: 889 +size: 892 location: src/tests/client/test-client.py:test_004()/527 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 899 +size: 902 location: src/tests/client/test-client.py:test_004()/528 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 889 +size: 892 location: src/tests/client/test-client.py:test_004()/529 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 899 +size: 902 location: src/tests/client/test-client.py:test_004()/530 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 596 +size: 599 location: src/tests/client/test-client.py:test_004()/531 cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 432 bytes +stdout: 435 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: <<< -size: 606 +size: 609 location: src/tests/client/test-client.py:test_004()/532 cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 432 bytes +stdout: 435 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -31908,94 +31950,94 @@ UUID-con-xx1-REPLACED-REPLACED-REPLA <<< -size: 901 +size: 904 location: src/tests/client/test-client.py:test_004()/577 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 911 +size: 914 location: src/tests/client/test-client.py:test_004()/578 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 901 +size: 904 location: src/tests/client/test-client.py:test_004()/579 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 911 +size: 914 location: src/tests/client/test-client.py:test_004()/580 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 732 bytes +stdout: 735 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: 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: 608 +size: 611 location: src/tests/client/test-client.py:test_004()/581 cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 432 bytes +stdout: 435 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: <<< -size: 618 +size: 621 location: src/tests/client/test-client.py:test_004()/582 cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 432 bytes +stdout: 435 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:::::::-1:-1:-1::0:0::-1:unknown:default:-1:-1:-1:-1:0x0:-1:-1 ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-1::-1:0::-1::0 -ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::::0:yes:-1::0x0:-1: +ipv6:auto::::0::::-1:0::-1:-1:-1:no:no:no:yes:-1:-1:0:0:default:0:auto::-1:::0:yes:-1::0x0:-1: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32846,12 +32888,12 @@ UUID-con-xx1-REPLACED-REPLACED-REPLA <<< -size: 6780 +size: 6833 location: src/tests/client/test-client.py:test_004()/627 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32950,6 +32992,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -32992,12 +33035,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6817 +size: 6870 location: src/tests/client/test-client.py:test_004()/628 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -33096,6 +33139,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -33138,12 +33182,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6780 +size: 6833 location: src/tests/client/test-client.py:test_004()/629 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -33242,6 +33286,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -33284,12 +33329,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6817 +size: 6870 location: src/tests/client/test-client.py:test_004()/630 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -33388,6 +33433,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -33430,12 +33476,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 5653 +size: 5706 location: src/tests/client/test-client.py:test_004()/631 cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5494 bytes +stdout: 5547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -33534,6 +33580,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -33555,12 +33602,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 5680 +size: 5733 location: src/tests/client/test-client.py:test_004()/632 cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5564 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -33659,6 +33706,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -36800,12 +36848,12 @@ connection.type: 802-11-wireless connection.interface-name: -- <<< -size: 6792 +size: 6845 location: src/tests/client/test-client.py:test_004()/677 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -36904,6 +36952,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -36946,12 +36995,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6829 +size: 6882 location: src/tests/client/test-client.py:test_004()/678 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -37050,6 +37099,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -37092,12 +37142,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6792 +size: 6845 location: src/tests/client/test-client.py:test_004()/679 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 6628 bytes +stdout: 6681 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -37196,6 +37246,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -37238,12 +37289,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 6829 +size: 6882 location: src/tests/client/test-client.py:test_004()/680 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6655 bytes +stdout: 6708 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -37342,6 +37393,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -37384,12 +37436,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 5665 +size: 5718 location: src/tests/client/test-client.py:test_004()/681 cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 5494 bytes +stdout: 5547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -37488,6 +37540,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -37509,12 +37562,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 5692 +size: 5745 location: src/tests/client/test-client.py:test_004()/682 cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5564 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -37613,6 +37666,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -40754,12 +40808,12 @@ connection.type: 802-11-wireless connection.interface-name: -- <<< -size: 7800 +size: 7853 location: src/tests/client/test-client.py:test_004()/727 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -40863,6 +40917,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -40913,12 +40968,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7850 +size: 7903 location: src/tests/client/test-client.py:test_004()/728 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -41022,6 +41077,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -41072,12 +41128,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7800 +size: 7853 location: src/tests/client/test-client.py:test_004()/729 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -41181,6 +41237,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -41231,12 +41288,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7850 +size: 7903 location: src/tests/client/test-client.py:test_004()/730 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -41340,6 +41397,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -41390,12 +41448,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 6281 +size: 6334 location: src/tests/client/test-client.py:test_004()/731 cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 6113 bytes +stdout: 6166 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -41499,6 +41557,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -41523,12 +41582,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 6313 +size: 6366 location: src/tests/client/test-client.py:test_004()/732 cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6135 bytes +stdout: 6188 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -41632,6 +41691,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -45410,12 +45470,12 @@ connection.interface-name: -- ------------------------------------------------------------------------------- <<< -size: 7812 +size: 7865 location: src/tests/client/test-client.py:test_004()/777 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -45519,6 +45579,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -45569,12 +45630,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7862 +size: 7915 location: src/tests/client/test-client.py:test_004()/778 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -45678,6 +45739,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -45728,12 +45790,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7812 +size: 7865 location: src/tests/client/test-client.py:test_004()/779 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 7639 bytes +stdout: 7692 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -45837,6 +45899,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -45887,12 +45950,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 7862 +size: 7915 location: src/tests/client/test-client.py:test_004()/780 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 7679 bytes +stdout: 7732 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -45996,6 +46059,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -46046,12 +46110,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 6293 +size: 6346 location: src/tests/client/test-client.py:test_004()/781 cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 6113 bytes +stdout: 6166 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -46155,6 +46219,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: auto ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -46179,12 +46244,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 6325 +size: 6378 location: src/tests/client/test-client.py:test_004()/782 cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 6135 bytes +stdout: 6188 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -46288,6 +46353,7 @@ ipv6.addr-gen-mode: default ipv6.ra-timeout: 0 (default) ipv6.mtu: automatyczne ipv6.dhcp-pd-hint: -- +ipv6.clat: -1 (default) ipv6.dhcp-duid: -- ipv6.dhcp-iaid: -- ipv6.dhcp-timeout: 0 (default) @@ -50066,12 +50132,12 @@ connection.interface-name: -- ------------------------------------------------------------------------------- <<< -size: 3466 +size: 3479 location: src/tests/client/test-client.py:test_004()/827 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50170,6 +50236,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -50212,12 +50279,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3476 +size: 3489 location: src/tests/client/test-client.py:test_004()/828 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50316,6 +50383,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -50358,12 +50426,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3466 +size: 3479 location: src/tests/client/test-client.py:test_004()/829 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50462,6 +50530,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -50504,12 +50573,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3476 +size: 3489 location: src/tests/client/test-client.py:test_004()/830 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50608,6 +50677,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -50650,12 +50720,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2891 +size: 2904 location: src/tests/client/test-client.py:test_004()/831 cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50754,6 +50824,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -50775,12 +50846,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 2901 +size: 2914 location: src/tests/client/test-client.py:test_004()/832 cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -50879,6 +50950,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54020,12 +54092,12 @@ connection.type:802-11-wireless connection.interface-name: <<< -size: 3478 +size: 3491 location: src/tests/client/test-client.py:test_004()/877 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54124,6 +54196,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54166,12 +54239,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3488 +size: 3501 location: src/tests/client/test-client.py:test_004()/878 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54270,6 +54343,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54312,12 +54386,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3478 +size: 3491 location: src/tests/client/test-client.py:test_004()/879 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54416,6 +54490,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54458,12 +54533,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 3488 +size: 3501 location: src/tests/client/test-client.py:test_004()/880 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3306 bytes +stdout: 3319 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54562,6 +54637,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54604,12 +54680,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2903 +size: 2916 location: src/tests/client/test-client.py:test_004()/881 cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54708,6 +54784,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 @@ -54729,12 +54806,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 2913 +size: 2926 location: src/tests/client/test-client.py:test_004()/882 cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2724 bytes +stdout: 2737 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -54833,6 +54910,7 @@ ipv6.addr-gen-mode:default ipv6.ra-timeout:0 ipv6.mtu:auto ipv6.dhcp-pd-hint: +ipv6.clat:-1 ipv6.dhcp-duid: ipv6.dhcp-iaid: ipv6.dhcp-timeout:0 From 32d17d4ce69b27bc8d5ef304afe9f4e34d3fef73 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 11 Sep 2025 06:08:57 +0200 Subject: [PATCH 12/31] core: honor the ipv6.clat property --- man/NetworkManager.conf.xml | 4 ++++ src/core/devices/nm-device.c | 25 +++++++++++++++++++++++++ src/core/nm-l3-config-data.c | 27 +++++++++++++++++++++++++++ src/core/nm-l3-config-data.h | 4 ++++ src/core/nm-l3cfg.c | 2 +- 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 2832982f3f..50ae6d4fd7 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -1026,6 +1026,10 @@ ipv6.ip6-privacy=0 global default is used. If the default is unspecified, the fallback value is either "stable-privacy" or "eui64", depending on whether the per-profile setting is "default" or "default-or-eui64, respectively. + + ipv6.clat + If left unspecified, CLAT is disabled. + ipv6.ra-timeout If left unspecified, the default value depends on the sysctl solicitation settings. diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index f51aea53ae..72d6b2e491 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1524,6 +1524,29 @@ _prop_get_connection_dnssec(NMDevice *self, NMConnection *connection) NM_SETTING_CONNECTION_DNSSEC_DEFAULT); } +static NMSettingIp6ConfigClat +_prop_get_ipv6_clat(NMDevice *self, NMConnection *connection) +{ + NMSettingIP6Config *s_ip6 = NULL; + NMSettingIp6ConfigClat clat; + + if (connection) + s_ip6 = (NMSettingIP6Config *) nm_connection_get_setting_ip6_config(connection); + if (!s_ip6) + return NM_SETTING_IP6_CONFIG_CLAT_NO; + + clat = nm_setting_ip6_config_get_clat(s_ip6); + if (clat != NM_SETTING_IP6_CONFIG_CLAT_DEFAULT) + return clat; + + return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA, + NM_CON_DEFAULT("ipv6.clat"), + self, + NM_SETTING_IP6_CONFIG_CLAT_NO, + NM_SETTING_IP6_CONFIG_CLAT_YES, + NM_SETTING_IP6_CONFIG_CLAT_NO); +} + static NMMptcpFlags _prop_get_connection_mptcp_flags(NMDevice *self, NMConnection *connection) { @@ -3642,6 +3665,8 @@ nm_device_create_l3_config_data_from_connection(NMDevice *self, NMConnection *co nm_l3_config_data_set_dnssec(l3cd, _prop_get_connection_dnssec(self, connection)); nm_l3_config_data_set_ip6_privacy(l3cd, _prop_get_ipv6_ip6_privacy(self, connection)); nm_l3_config_data_set_mptcp_flags(l3cd, _prop_get_connection_mptcp_flags(self, connection)); + nm_l3_config_data_set_clat(l3cd, _prop_get_ipv6_clat(self, connection)); + return l3cd; } diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 92a91844c2..bfececb6eb 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -172,6 +172,7 @@ struct _NML3ConfigData { bool routed_dns_4 : 1; bool routed_dns_6 : 1; + bool clat : 1; bool pref64_valid : 1; }; @@ -525,6 +526,10 @@ nm_l3_config_data_log(const NML3ConfigData *self, _L("nis-domain: %s", self->nis_domain->str); } + if (!IS_IPv4 && self->clat) { + _L("clat: yes"); + } + if (!IS_IPv4 && self->pref64_valid) { _L("pref64_prefix: %s/%d", nm_utils_inet6_ntop(&self->pref64_prefix, sbuf_addr), @@ -1991,6 +1996,23 @@ nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *value) return nm_ref_string_reset_str(&self->network_id, value); } +gboolean +nm_l3_config_data_set_clat(NML3ConfigData *self, gboolean val) +{ + if (self->clat == val) + return FALSE; + self->clat = val; + return TRUE; +} + +gboolean +nm_l3_config_data_get_clat(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return self->clat; +} + gboolean nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val) { @@ -2591,6 +2613,8 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, NM_CMP_DIRECT_UNSAFE(a->routed_dns_4, b->routed_dns_4); NM_CMP_DIRECT_UNSAFE(a->routed_dns_6, b->routed_dns_6); + NM_CMP_DIRECT_UNSAFE(a->clat, b->clat); + NM_CMP_DIRECT(!!a->pref64_valid, !!b->pref64_valid); if (a->pref64_valid) { NM_CMP_DIRECT(a->pref64_plen, b->pref64_plen); @@ -3662,6 +3686,9 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (src->routed_dns_6) self->routed_dns_6 = TRUE; + if (src->clat) + self->clat = TRUE; + if (src->pref64_valid) { self->pref64_prefix = src->pref64_prefix; self->pref64_plen = src->pref64_plen; diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index b1b2c5c711..5998ed427a 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -498,6 +498,10 @@ gboolean nm_l3_config_data_set_network_id(NML3ConfigData *self, const char *netw const char *nm_l3_config_data_get_network_id(const NML3ConfigData *self); +gboolean nm_l3_config_data_set_clat(NML3ConfigData *self, gboolean val); + +gboolean nm_l3_config_data_get_clat(const NML3ConfigData *self); + gboolean nm_l3_config_data_set_pref64_valid(NML3ConfigData *self, gboolean val); gboolean nm_l3_config_data_get_pref64_valid(const NML3ConfigData *self); diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 2533a44cfd..6da877a976 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -4260,7 +4260,7 @@ _l3cfg_update_combined_config(NML3Cfg *self, } #if HAVE_CLAT - if (nm_l3_config_data_get_pref64_valid(l3cd)) { + if (nm_l3_config_data_get_clat(l3cd) && nm_l3_config_data_get_pref64_valid(l3cd)) { NMPlatformIPXRoute rx; NMIPAddrTyped best_v6_gateway; NMDedupMultiIter iter; From d44e21c62cb875ab7ae1197aa53364c06d241905 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 17:48:01 +0200 Subject: [PATCH 13/31] bpf: clat: avoid 32-bit register spills when access skb->data The verifier reports this error when accessing skb->data: ; void *data = (void *)(unsigned long long)skb->data; @ clat.bpf.c:625 (61) r2 = *(u32 *)(r1 +76) ; frame1: R1=ctx() R2_w=pkt(r=0) (63) *(u32 *)(r10 -120) = r2 invalid size of register spill Apparently it's trying to spill only 32 bits from the register to the stack, which is invalid. A similar problem was reported here: https://github.com/cilium/cilium/pull/25336 Add some macros using inline asm to fix the problem. With this change now the compiler properly generates 64-bit spills. ; src/core/bpf/clat.bpf.c:625 -; void *data = (void *)(unsigned long long)skb->data; +; void *data = SKB_DATA(skb); 137: 61 12 4c 00 00 00 00 00 w2 = *(u32 *)(r1 + 0x4c) - 138: 63 2a 88 ff 00 00 00 00 *(u32 *)(r10 - 0x78) = w2 + 138: 7b 2a 88 ff 00 00 00 00 *(u64 *)(r10 - 0x78) = r2 --- src/core/bpf/clat.bpf.c | 46 +++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 6dd16a48a8..2ff73c6d8b 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -61,6 +61,22 @@ struct { #define DBG(fmt, ...) #endif +/* Macros to read the sk_buff data* pointers, preventing the compiler + * from generating a 32-bit register spill. */ +#define SKB_ACCESS_MEMBER_32(_skb, member) \ + ({ \ + void *ptr; \ + \ + asm volatile("%0 = *(u32 *)(%1 + %2)" \ + : "=r"(ptr) \ + : "r"(_skb), "i"(offsetof(struct __sk_buff, member))); \ + \ + ptr; \ + }) + +#define SKB_DATA(_skb) SKB_ACCESS_MEMBER_32(_skb, data) +#define SKB_DATA_END(_skb) SKB_ACCESS_MEMBER_32(_skb, data_end) + struct icmpv6_pseudo { struct in6_addr saddr; struct in6_addr daddr; @@ -76,7 +92,7 @@ update_l4_checksum(struct __sk_buff *skb, int ip_type, bool v4to6) { - void *data = (void *) (unsigned long long) skb->data; + void *data = SKB_DATA(skb); int flags = BPF_F_PSEUDO_HDR; __u16 offset; __u32 csum; @@ -119,7 +135,7 @@ update_icmp_checksum(struct __sk_buff *skb, void *icmp_after, bool add) { - void *data = (void *) (unsigned long long) skb->data; + void *data = SKB_DATA(skb); struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .saddr = ip6h->saddr, .daddr = ip6h->daddr, @@ -161,8 +177,7 @@ update_icmp_checksum(struct __sk_buff *skb, static int rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) { - void *data_end = (void *) (unsigned long long) skb->data_end; - + void *data_end = SKB_DATA_END(skb); struct icmphdr old_icmp, *icmp = (void *) (iph + 1); struct icmp6hdr icmp6, *new_icmp6; __u32 mtu; @@ -278,8 +293,8 @@ static __attribute__((always_inline)) inline int clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) { int ret = TC_ACT_OK; - void *data_end = (void *) (unsigned long long) skb->data_end; - void *data = (void *) (unsigned long long) skb->data; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); int ip_type, iphdr_len, ip_offset; struct in6_addr *dst_v6; @@ -363,8 +378,8 @@ clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IPV6), 0)) goto out; - data = (void *) (unsigned long long) skb->data; - data_end = (void *) (unsigned long long) skb->data_end; + data = SKB_DATA(skb); + data_end = SKB_DATA_END(skb); eth = data; ip6h = data + ip_offset; @@ -400,8 +415,7 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, struct icmphdr **new_icmp_out, struct hdr_cursor *nh) { - void *data_end = (void *) (unsigned long long) skb->data_end; - + void *data_end = SKB_DATA_END(skb); struct icmp6hdr old_icmp6, *icmp6 = (void *) (ip6h + 1); struct icmphdr icmp, *new_icmp; __u32 mtu, ptr; @@ -631,8 +645,8 @@ static __attribute__((always_inline)) inline int clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) { int ret = TC_ACT_OK; - void *data_end = (void *) (unsigned long long) skb->data_end; - void *data = (void *) (unsigned long long) skb->data; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); struct ethhdr *eth; struct iphdr *iph; @@ -648,8 +662,8 @@ clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) goto out; - data = (void *) (unsigned long long) skb->data; - data_end = (void *) (unsigned long long) skb->data_end; + data = SKB_DATA(skb); + data_end = SKB_DATA_END(skb); eth = data; iph = data + ip_offset; @@ -667,8 +681,8 @@ out: static __attribute__((always_inline)) inline int clat_handler(struct __sk_buff *skb, bool egress) { - void *data_end = (void *) (unsigned long long) skb->data_end; - void *data = (void *) (unsigned long long) skb->data; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); struct hdr_cursor nh = {.pos = data}; struct ethhdr *eth; int eth_type; From acfa0ab3a3a0010b7ef71766236d0d49eb24c323 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 18:01:05 +0200 Subject: [PATCH 14/31] bpf: clat: fix other verifier errors --- src/core/bpf/clat.bpf.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 2ff73c6d8b..478751c8ce 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -98,18 +98,16 @@ update_l4_checksum(struct __sk_buff *skb, __u32 csum; if (v4to6) { - csum = bpf_csum_diff((__be32 *) &iph->saddr, - 2 * sizeof(__u32), - (__be32 *) &ip6h->saddr, - 2 * sizeof(struct in6_addr), - 0); + void *from_ptr = &iph->saddr; + void *to_ptr = &ip6h->saddr; + + csum = bpf_csum_diff(from_ptr, 2 * sizeof(__u32), to_ptr, 2 * sizeof(struct in6_addr), 0); offset = (void *) (iph + 1) - data; } else { - csum = bpf_csum_diff((__be32 *) &ip6h->saddr, - 2 * sizeof(struct in6_addr), - (__be32 *) &iph->saddr, - 2 * sizeof(__u32), - 0); + void *from_ptr = &ip6h->saddr; + void *to_ptr = &iph->saddr; + + csum = bpf_csum_diff(from_ptr, 2 * sizeof(struct in6_addr), to_ptr, 2 * sizeof(__u32), 0); offset = (void *) (ip6h + 1) - data; } @@ -136,13 +134,13 @@ update_icmp_checksum(struct __sk_buff *skb, bool add) { void *data = SKB_DATA(skb); - struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, - .saddr = ip6h->saddr, - .daddr = ip6h->daddr, - .len = ip6h->payload_len}; + struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; __u16 h_before, h_after, offset; __u32 csum, u_before, u_after; + __builtin_memcpy(&ph.saddr, &ip6h->saddr, sizeof(struct in6_addr)); + __builtin_memcpy(&ph.daddr, &ip6h->daddr, sizeof(struct in6_addr)); + /* Do checksum update in two passes: first compute the incremental * checksum update of the ICMPv6 pseudo header, update the checksum * using bpf_l4_csum_replace(), and then do a separate update for the @@ -577,7 +575,10 @@ clat_translate_v6(struct __sk_buff *skb, switch (dst_hdr.protocol) { case IPPROTO_ICMPV6: - new_icmp = (void *) (ip6h + 1); + new_icmp = (void *) (ip6h + 1); + if ((void *) (new_icmp + 1) > data_end) + goto out; + old_icmp6 = *((struct icmp6hdr *) (void *) new_icmp); if (rewrite_icmpv6(ip6h, skb, &new_icmp, nh)) goto out; From 25158ac7e6cd0b813516f04d27066347d5bde78b Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 16:55:34 +0200 Subject: [PATCH 15/31] bpf: clat: don't explicitly inline functions BPF handles function calls fine these days. --- src/core/bpf/clat.bpf.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 478751c8ce..8dc86a45f1 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -85,7 +85,7 @@ struct icmpv6_pseudo { __u8 nh; } __attribute__((packed)); -static __always_inline void +static void update_l4_checksum(struct __sk_buff *skb, struct ipv6hdr *ip6h, struct iphdr *iph, @@ -126,7 +126,7 @@ update_l4_checksum(struct __sk_buff *skb, bpf_l4_csum_replace(skb, offset, 0, csum, flags); } -static __always_inline void +static void update_icmp_checksum(struct __sk_buff *skb, struct ipv6hdr *ip6h, void *icmp_before, @@ -287,7 +287,7 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) } /* ipv4 traffic in from application on this device, needs to be translated to v6 and sent to PLAT */ -static __attribute__((always_inline)) inline int +static int clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) { int ret = TC_ACT_OK; @@ -392,7 +392,7 @@ out: return ret; } -static __always_inline __u16 +static __u16 csum_fold_helper(__u32 csum) { __u32 sum; @@ -401,13 +401,13 @@ csum_fold_helper(__u32 csum) return ~sum; } -static __attribute__((always_inline)) inline int clat_translate_v6(struct __sk_buff *skb, - struct hdr_cursor *nh, - void *data_end, - struct iphdr *dst_hdr_out, - bool depth); +static int clat_translate_v6(struct __sk_buff *skb, + struct hdr_cursor *nh, + void *data_end, + struct iphdr *dst_hdr_out, + bool depth); -static __attribute__((always_inline)) inline int +static int rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb, struct icmphdr **new_icmp_out, @@ -507,7 +507,7 @@ out: return 0; } -static __attribute__((always_inline)) inline int +static int clat_translate_v6(struct __sk_buff *skb, struct hdr_cursor *nh, void *data_end, @@ -642,7 +642,7 @@ out: } /* ipv6 traffic from the PLAT, to be translated into ipv4 and sent to an application */ -static __attribute__((always_inline)) inline int +static int clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) { int ret = TC_ACT_OK; @@ -679,7 +679,7 @@ out: return ret; } -static __attribute__((always_inline)) inline int +static int clat_handler(struct __sk_buff *skb, bool egress) { void *data_end = SKB_DATA_END(skb); From 1aa9bc1f5e4d27b2b91fed74b9eb2e545e90065d Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 16:58:39 +0200 Subject: [PATCH 16/31] bpf: clat: fix error handling for IPv6 packets There are 3 possible results from clat_translate_v6(): 1. the packet didn't match the CLAT IPv6 address and must be accepted; 2. the packet matches but it is invalid and so it must be dropped; 3. the packet matches and it is valid; clat_handle_v6() should translate the packet to IPv4; Before, the function returned TC_ACT_SHOT for both 2 and 3. Therefore, clat_handle_v6() tried to rewrite also invalid packets. Fix that by returning TC_ACT_UNSPEC for valid packets, meaning that there isn't a final verdict yet. --- src/core/bpf/clat.bpf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 8dc86a45f1..39349b4efb 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -637,6 +637,7 @@ icmp_out: *dst_hdr_out = dst_hdr; + ret = TC_ACT_UNSPEC; out: return ret; } @@ -656,10 +657,12 @@ clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) int ip_offset = (nh->pos - data) & 0x1fff; ret = clat_translate_v6(skb, nh, data_end, &dst_hdr, 0); - if (ret != TC_ACT_SHOT) { + if (ret != TC_ACT_UNSPEC) { goto out; } + ret = TC_ACT_SHOT; + if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) goto out; From 930b035118686d62c6202921a1bab4a2a1ef67f3 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 17:05:12 +0200 Subject: [PATCH 17/31] bpf: clat: remove commented code The rewrite of IPv6 header inside a ICMP error needs to be implemented. Remove the unused comments for now. --- src/core/bpf/clat.bpf.c | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 39349b4efb..5a5348a6bc 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -591,34 +591,6 @@ clat_translate_v6(struct __sk_buff *skb, if ((void *) (new_icmp + 1) > data_end) goto icmp_out; - /* int type = (*new_icmp).type; */ - /* switch (type) { */ - /* case ICMP_TIME_EXCEEDED: */ - /* case ICMP_DEST_UNREACH: */ - - /* nh->pos = new_icmp + 1; */ - /* if (clat_translate_v6(skb, nh, data_end, &dst_hdr_icmp, 1)) { */ - /* DBG("Bad embedded v6?"); */ - /* goto out; */ - /* } */ - /* if (((__u8 *)(new_icmp + 1)) + sizeof(dst_hdr_icmp) >= data_end) { */ - /* DBG("ICMP header is out of bounds"); */ - /* goto out; */ - /* } */ - /* memcpy(new_icmp + 1, &dst_hdr_icmp, sizeof(dst_hdr_icmp)); // dst_hdr.ihl * 4 */ - - /* /\* Scoot the payload up against the v4 header *\/ */ - /* /\* (Note: We can't use a normal memmove here because clang only supports */ - /* constexpr lengths!) *\/ */ - - /* clat_memmove(((__u8 *)(new_icmp + 1)) + sizeof(dst_hdr), */ - /* ((__u8 *)(new_icmp + 1)) + sizeof(struct ipv6hdr), */ - /* skb, */ - /* dst_hdr.tot_len - (dst_hdr.ihl * 4)); */ - /* /\* TODO: Translate ICMP Extension length *\/ */ - /* break; */ - /* } */ - update_icmp_checksum(skb, ip6h, &old_icmp6, new_icmp, false); icmp_out: From 3d400e35929f5a37cf3cf07cfbdc7d6ded2a1750 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 16:00:45 -0500 Subject: [PATCH 18/31] NEWS: Note CLAT support --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index f720a1bda6..b0d6a4a4f8 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,7 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! the 802.1X certificates and keys set in the connection. * Introduce a libnm function that can be used by VPN plugins to check user permissions on certificate and keys. +* Add support for CLAT (464XLAT) using a BPF program. ============================================= NetworkManager-1.56 From bf8c9551b81e0caa2f320cfbbf5a2aa6e025f714 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 5 Oct 2025 12:02:51 +0200 Subject: [PATCH 19/31] ipv4: enable by default ipv4.dhcp-ipv6-only-preferred when CLAT is on --- NEWS | 3 ++ man/NetworkManager.conf.xml | 2 +- src/core/devices/nm-device.c | 34 ++++++++++++++----- src/libnm-core-impl/nm-setting-ip4-config.c | 13 +++++-- src/libnm-core-public/nm-setting-ip4-config.h | 3 ++ src/libnmc-setting/settings-docs.h.in | 2 +- .../gen-metadata-nm-settings-nmcli.xml.in | 4 +-- 7 files changed, 46 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index b0d6a4a4f8..98aafecd5d 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,9 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! * Introduce a libnm function that can be used by VPN plugins to check user permissions on certificate and keys. * Add support for CLAT (464XLAT) using a BPF program. +* Change the default value of the ipv4.dhcp-ipv6-only-preferred property + to a new value "auto" which automatically enables the option when CLAT + is enabled for the connection. ============================================= NetworkManager-1.56 diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 50ae6d4fd7..e662c4a428 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -972,7 +972,7 @@ ipv6.ip6-privacy=0 ipv4.dhcp-ipv6-only-preferred - If left unspecified, the "IPv6-only preferred" DHCPv4 option is disabled. + If left unspecified, it defaults to "auto". ipv4.dhcp-hostname-flags diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 72d6b2e491..d0a0ef2621 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1947,6 +1947,7 @@ _prop_get_ipvx_may_fail_cached(NMDevice *self, int addr_family, NMTernary *cache static gboolean _prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self) { + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); NMSettingIP4Config *s_ip4; NMSettingIP4DhcpIpv6OnlyPreferred ipv6_only; @@ -1955,16 +1956,33 @@ _prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self) return FALSE; ipv6_only = nm_setting_ip4_config_get_dhcp_ipv6_only_preferred(s_ip4); - if (ipv6_only != NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_DEFAULT) + if (NM_IN_SET(ipv6_only, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO)) return ipv6_only; - return nm_config_data_get_connection_default_int64( - NM_CONFIG_GET_DATA, - NM_CON_DEFAULT("ipv4.dhcp-ipv6-only-preferred"), - self, - NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO, - NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES, - NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO); + if (ipv6_only == NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_DEFAULT) { + ipv6_only = nm_config_data_get_connection_default_int64( + NM_CONFIG_GET_DATA, + NM_CON_DEFAULT("ipv4.dhcp-ipv6-only-preferred"), + self, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO); + } + + if (NM_IN_SET(ipv6_only, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO)) + return ipv6_only; + + /* auto */ + if (nm_streq0(priv->ipv6_method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) + && _prop_get_ipv6_clat(self, nm_device_get_applied_connection(self))) { + return NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES; + } + + return NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES; } /** diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index a4fccc6d85..65d90fe03e 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -1353,18 +1353,25 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) /** * NMSettingIP4Config:dhcp-ipv6-only-preferred * - * Controls the "IPv6-Only Preferred" DHCPv4 option (RFC 8925). + * Controls the "IPv6-Only Preferred" DHCPv4 option (option 108 - RFC 8925). * * When set to %NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES, the host adds the * option to the parameter request list; if the DHCP server sends the option back, * the host stops the DHCP client for the time interval specified in the option. * * Enable this feature if the host supports an IPv6-only mode, i.e. either all - * applications are IPv6-only capable or there is a form of 464XLAT deployed. + * applications are IPv6-only capable or there is a form of CLAT (464XLAT) + * deployed. + * + * If set to %NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO, the option is + * automatically turned on when the IPv6 method is "auto" and the connection + * enables CLAT. If these two conditions are met, the host can operate in + * IPv6-only mode and therefore it is safe to disable DHCPv4 if the network + * also supports it. * * When set to %NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_DEFAULT, the actual value * is looked up in the global configuration; if not specified, it defaults to - * %NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO. + * %NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO. * * If the connection has IPv6 method set to "disabled", this property does not * have effect and the "IPv6-Only Preferred" option is always disabled. diff --git a/src/libnm-core-public/nm-setting-ip4-config.h b/src/libnm-core-public/nm-setting-ip4-config.h index c40a7603f9..21457ab8f0 100644 --- a/src/libnm-core-public/nm-setting-ip4-config.h +++ b/src/libnm-core-public/nm-setting-ip4-config.h @@ -109,6 +109,8 @@ typedef enum { * @NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_DEFAULT: use the global default value * @NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO: the option is disabled * @NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES: the option is enabled + * @NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO: the option is enabled when + * the IPv6 method is "auto" and CLAT is enabled. Since: 1.58 * * #NMSettingIP4DhcpIpv6OnlyPreferred values specify if the "IPv6-Only Preferred" * option (RFC 8925) for DHCPv4 is enabled. @@ -119,6 +121,7 @@ typedef enum { NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_DEFAULT = -1, NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO = 0, NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES = 1, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_AUTO = 2, } NMSettingIP4DhcpIpv6OnlyPreferred; typedef struct _NMSettingIP4ConfigClass NMSettingIP4ConfigClass; diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index baf325bf90..7a10b7fb02 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -193,7 +193,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME N_("If the \"dhcp-send-hostname\" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and \"dhcp-fqdn\" are mutually exclusive and cannot be set at the same time.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME_FLAGS N_("Flags for the DHCP hostname and FQDN. Currently, this property only includes flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN flags are \"fqdn-serv-update\" (0x1), \"fqdn-encoded\" (0x2) and \"fqdn-no-update\" (0x4). When no FQDN flag is set and \"fqdn-clear-flags\" (0x8) is set, the DHCP FQDN option will contain no flag. Otherwise, if no FQDN flag is set and \"fqdn-clear-flags\" (0x8) is not set, the standard FQDN flags are set in the request: \"fqdn-serv-update\" (0x1), \"fqdn-encoded\" (0x2) for IPv4 and \"fqdn-serv-update\" (0x1) for IPv6. When this property is set to the default value \"none\" (0x0), a global default is looked up in NetworkManager configuration. If that value is unset or also \"none\" (0x0), then the standard FQDN flags described above are sent in the DHCP requests.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_IAID N_("A string containing the \"Identity Association Identifier\" (IAID) used by the DHCP client. The string can be a 32-bit number (either decimal, hexadecimal or as colon separated hexadecimal numbers). Alternatively it can be set to the special values \"mac\", \"perm-mac\", \"ifname\" or \"stable\". When set to \"mac\" (or \"perm-mac\"), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to \"ifname\", the IAID is computed by hashing the interface name. The special value \"stable\" can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be \"ifname\". For DHCPv4, the IAID is only used with \"ipv4.dhcp-client-id\" values \"duid\" and \"ipv6-duid\" to generate the client-id. For DHCPv6, note that at the moment this property is only supported by the \"internal\" DHCPv6 plugin. The \"dhclient\" DHCPv6 plugin always derives the IAID from the MAC address. The actually used DHCPv6 IAID for a currently activated interface is exposed in the lease information of the device.") -#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_IPV6_ONLY_PREFERRED N_("Controls the \"IPv6-Only Preferred\" DHCPv4 option (RFC 8925). When set to \"yes\" (1), the host adds the option to the parameter request list; if the DHCP server sends the option back, the host stops the DHCP client for the time interval specified in the option. Enable this feature if the host supports an IPv6-only mode, i.e. either all applications are IPv6-only capable or there is a form of 464XLAT deployed. When set to \"default\" (-1), the actual value is looked up in the global configuration; if not specified, it defaults to \"no\" (0). If the connection has IPv6 method set to \"disabled\", this property does not have effect and the \"IPv6-Only Preferred\" option is always disabled.") +#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_IPV6_ONLY_PREFERRED N_("Controls the \"IPv6-Only Preferred\" DHCPv4 option (option 108 - RFC 8925). When set to \"yes\" (1), the host adds the option to the parameter request list; if the DHCP server sends the option back, the host stops the DHCP client for the time interval specified in the option. Enable this feature if the host supports an IPv6-only mode, i.e. either all applications are IPv6-only capable or there is a form of CLAT (464XLAT) deployed. If set to \"auto\" (2), the option is automatically turned on when the IPv6 method is \"auto\" and the connection enables CLAT. If these two conditions are met, the host can operate in IPv6-only mode and therefore it is safe to disable DHCPv4 if the network also supports it. When set to \"default\" (-1), the actual value is looked up in the global configuration; if not specified, it defaults to \"auto\" (2). If the connection has IPv6 method set to \"disabled\", this property does not have effect and the \"IPv6-Only Preferred\" option is always disabled.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_REJECT_SERVERS N_("Array of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. \"192.168.122.0/24\"). This property is currently not implemented for DHCPv6.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME N_("Since 1.52 this property is deprecated and is only used as fallback value for dhcp-send-hostname if it's set to 'default'. This is only done to avoid breaking existing configurations, the new property should be used from now on.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME_V2 N_("If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer. If the dhcp-hostname property is NULL and this property is TRUE, the current persistent hostname of the computer is sent. The default value is default (-1). In this case the global value from NetworkManager configuration is looked up. If it's not set, the value from dhcp-send-hostname-deprecated, which defaults to TRUE, is used for backwards compatibility. In the future this will change and, in absence of a global default, it will always fallback to TRUE.") diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index 80d5da04ee..bc7687f1d4 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -1452,9 +1452,9 @@ nmcli-description="The Vendor Class Identifier DHCP option (60). Special characters in the data string may be escaped using C-style escapes, nevertheless this property cannot contain nul bytes. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the DHCP option is not sent to the server." format="string" /> + values="default (-1), no (0), yes (1), auto (2)" /> Date: Sun, 5 Oct 2025 12:03:08 +0200 Subject: [PATCH 20/31] ipv4: improve logging for ipv4.dhcp-ipv6-only-preferred --- src/core/devices/nm-device.c | 17 ++++++++++++----- src/core/dhcp/nm-dhcp-client.c | 4 +++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index d0a0ef2621..4852b74823 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1945,12 +1945,14 @@ _prop_get_ipvx_may_fail_cached(NMDevice *self, int addr_family, NMTernary *cache } static gboolean -_prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self) +_prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self, gboolean *out_is_auto) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); NMSettingIP4Config *s_ip4; NMSettingIP4DhcpIpv6OnlyPreferred ipv6_only; + NM_SET_OUT(out_is_auto, FALSE); + s_ip4 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP4_CONFIG); if (!s_ip4) return FALSE; @@ -1977,6 +1979,8 @@ _prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self) return ipv6_only; /* auto */ + NM_SET_OUT(out_is_auto, TRUE); + if (nm_streq0(priv->ipv6_method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) && _prop_get_ipv6_clat(self, nm_device_get_applied_connection(self))) { return NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES; @@ -11819,8 +11823,9 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family) gboolean hostname_is_fqdn; gboolean send_client_id; guint8 dscp; - gboolean dscp_explicit = FALSE; - gboolean ipv6_only_pref = FALSE; + gboolean dscp_explicit = FALSE; + gboolean ipv6_only_pref = FALSE; + gboolean ipv6_only_pref_auto = FALSE; client_id = _prop_get_ipv4_dhcp_client_id(self, connection, hwaddr, &send_client_id); dscp = _prop_get_ipv4_dhcp_dscp(self, &dscp_explicit); @@ -11839,13 +11844,15 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family) hostname = nm_setting_ip_config_get_dhcp_hostname(s_ip); } - if (_prop_get_ipv4_dhcp_ipv6_only_preferred(self)) { + if (_prop_get_ipv4_dhcp_ipv6_only_preferred(self, &ipv6_only_pref_auto)) { if (nm_streq0(priv->ipv6_method, NM_SETTING_IP6_CONFIG_METHOD_DISABLED)) { _LOGI_ipdhcp( addr_family, "not requesting the \"IPv6-only preferred\" option because IPv6 is disabled"); } else { - _LOGD_ipdhcp(addr_family, "requesting the \"IPv6-only preferred\" option"); + _LOGD_ipdhcp(addr_family, + "requesting the \"IPv6-only preferred\" option (%s enabled)", + ipv6_only_pref_auto ? "automatically" : "explicitly"); ipv6_only_pref = TRUE; } } diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c index 18ad4024b4..cc6dccdfa4 100644 --- a/src/core/dhcp/nm-dhcp-client.c +++ b/src/core/dhcp/nm-dhcp-client.c @@ -1460,7 +1460,9 @@ nm_dhcp_client_schedule_ipv6_only_restart(NMDhcpClient *self, guint timeout) nm_assert(!priv->is_stopped); timeout = NM_MAX(priv->v4.ipv6_only_min_wait, timeout); - _LOGI("received option \"ipv6-only-preferred\": stopping DHCPv4 for %u seconds", timeout); + _LOGI("received option \"ipv6-only-preferred\": stopping DHCPv4 for %u seconds. Set " + "ipv4.dhcp-ipv6-only-preferred=no to force the use of IPv4 on this IPv6-mostly network", + timeout); nm_dhcp_client_stop(self, FALSE); nm_clear_g_source_inst(&priv->no_lease_timeout_source); From 608509510129a9ab2c5d3d9cfffd2279ddc362c0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sat, 25 Oct 2025 10:45:46 +0200 Subject: [PATCH 21/31] bpf: clat: rework to avoid pointer arithmetic Avoid using pointer arithmetic in the BPF program, so that it requires only CAP_BPF and not CAP_PERFMON. In this context "pointer arithmetic" means adding a variable value to a packet pointer. This means that the program no longer tries to parse variable-size headers (IPv4 options, IPv6 extension headers). Those were already not supported before. It also doesn't parse VLAN tags, but there should be no need for that. If we use fixed offset, we can avoid using the parsing helpers from libxdp. --- src/core/bpf/clat.bpf.c | 240 ++++++++++++++++++---------------------- 1 file changed, 105 insertions(+), 135 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 5a5348a6bc..3d2edc44ab 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -29,7 +29,6 @@ #include #include -#include #include "clat.h" @@ -102,13 +101,13 @@ update_l4_checksum(struct __sk_buff *skb, void *to_ptr = &ip6h->saddr; csum = bpf_csum_diff(from_ptr, 2 * sizeof(__u32), to_ptr, 2 * sizeof(struct in6_addr), 0); - offset = (void *) (iph + 1) - data; + offset = sizeof(struct ethhdr) + sizeof(struct iphdr); } else { void *from_ptr = &ip6h->saddr; void *to_ptr = &iph->saddr; csum = bpf_csum_diff(from_ptr, 2 * sizeof(struct in6_addr), to_ptr, 2 * sizeof(__u32), 0); - offset = (void *) (ip6h + 1) - data; + offset = sizeof(struct ethhdr) + sizeof(struct ipv6hdr); } switch (ip_type) { @@ -135,8 +134,10 @@ update_icmp_checksum(struct __sk_buff *skb, { void *data = SKB_DATA(skb); struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; - __u16 h_before, h_after, offset; - __u32 csum, u_before, u_after; + __u16 h_before, h_after; + __u32 u_before, u_after; + __u16 offset; + __u32 csum; __builtin_memcpy(&ph.saddr, &ip6h->saddr, sizeof(struct in6_addr)); __builtin_memcpy(&ph.daddr, &ip6h->daddr, sizeof(struct in6_addr)); @@ -156,7 +157,8 @@ update_icmp_checksum(struct __sk_buff *skb, add ? sizeof(ph) : 0, 0); - offset = ((void *) icmp_after - data) + 2; + offset = sizeof(struct ethhdr) + (add ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) + 2; + /* first two bytes of ICMP header, type and code */ h_before = *(__u16 *) icmp_before; h_after = *(__u16 *) icmp_after; @@ -175,12 +177,14 @@ update_icmp_checksum(struct __sk_buff *skb, static int rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) { - void *data_end = SKB_DATA_END(skb); - struct icmphdr old_icmp, *icmp = (void *) (iph + 1); - struct icmp6hdr icmp6, *new_icmp6; - __u32 mtu; + void *data_end = SKB_DATA_END(skb); + struct icmphdr old_icmp; + struct icmp6hdr icmp6; + struct icmphdr *icmp = (void *) (iph + 1); + struct icmp6hdr *new_icmp6; + __u32 mtu; - if ((void *) (icmp + 1) > data_end) + if ((icmp + 1) > data_end) return -1; old_icmp = *icmp; @@ -288,13 +292,11 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) /* ipv4 traffic in from application on this device, needs to be translated to v6 and sent to PLAT */ static int -clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) +clat_handle_v4(struct __sk_buff *skb) { - int ret = TC_ACT_OK; - void *data_end = SKB_DATA_END(skb); - void *data = SKB_DATA(skb); - int ip_type, iphdr_len, ip_offset; - + int ret = TC_ACT_OK; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); struct in6_addr *dst_v6; struct ipv6hdr *ip6h; struct ipv6hdr dst_hdr = { @@ -302,20 +304,16 @@ clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) }; struct iphdr *iph; struct ethhdr *eth; - struct in_addr src_v4; struct clat_v4_config_value *v4_config; struct clat_v4_config_key v4_config_key; - ip_offset = (nh->pos - data) & 0x1fff; - - ip_type = parse_iphdr(nh, data_end, &iph); - if (ip_type < 0) + iph = data + sizeof(struct ethhdr); + if (iph + 1 > data_end) goto out; - src_v4.s_addr = iph->saddr; - v4_config_key.ifindex = skb->ifindex; - v4_config_key.local_v4 = src_v4; + v4_config_key.ifindex = skb->ifindex; + v4_config_key.local_v4.s_addr = iph->saddr; v4_config = bpf_map_lookup_elem(&v4_config_map, &v4_config_key); if (!v4_config) { @@ -336,28 +334,26 @@ clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) * out. The DF is the second-most-significant bit (as bit 0 is * reserved). */ - iphdr_len = iph->ihl * 4; - if (iphdr_len != sizeof(struct iphdr) || (iph->frag_off & ~bpf_htons(1 << 14))) { + + if (iph->ihl != 5 || (iph->frag_off & ~bpf_htons(1 << 14))) { DBG("v4: pkt src/dst %pI4/%pI4 has IP options or is fragmented, dropping\n", &iph->daddr, &iph->saddr); goto out; } - dst_v6 = &v4_config->pref64; - dst_v6->s6_addr32[3] = iph->daddr; - - DBG("v4: Found mapping for dst %pI4 to %pI6c\n", &iph->daddr, dst_v6); - /* src v4 as last octet of clat address */ - dst_hdr.saddr = v4_config->local_v6; - dst_hdr.daddr = *dst_v6; - dst_hdr.nexthdr = iph->protocol; - dst_hdr.hop_limit = iph->ttl; + dst_hdr.saddr = v4_config->local_v6; + dst_hdr.daddr = v4_config->pref64; + dst_hdr.daddr.s6_addr32[3] = iph->daddr; + dst_hdr.nexthdr = iph->protocol; + dst_hdr.hop_limit = iph->ttl; /* weird definition in ipv6hdr */ dst_hdr.priority = (iph->tos & 0x70) >> 4; dst_hdr.flow_lbl[0] = iph->tos << 4; - dst_hdr.payload_len = bpf_htons(bpf_ntohs(iph->tot_len) - iphdr_len); + dst_hdr.payload_len = bpf_htons(bpf_ntohs(iph->tot_len) - sizeof(struct iphdr)); + + DBG("v4: Found mapping for dst %pI4 to %pI6c\n", &iph->daddr, &dst_hdr.daddr); switch (dst_hdr.nexthdr) { case IPPROTO_ICMP: @@ -379,9 +375,12 @@ clat_handle_v4(struct __sk_buff *skb, struct hdr_cursor *nh) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - eth = data; - ip6h = data + ip_offset; - if ((void *) (eth + 1) > data_end || (void *) (ip6h + 1) > data_end) + eth = data; + if (eth + 1 > data_end) + goto out; + + ip6h = (void *) (eth + 1); + if (ip6h + 1 > data_end) goto out; eth->h_proto = bpf_htons(ETH_P_IPV6); @@ -401,31 +400,26 @@ csum_fold_helper(__u32 csum) return ~sum; } -static int clat_translate_v6(struct __sk_buff *skb, - struct hdr_cursor *nh, - void *data_end, - struct iphdr *dst_hdr_out, - bool depth); - static int -rewrite_icmpv6(struct ipv6hdr *ip6h, - struct __sk_buff *skb, - struct icmphdr **new_icmp_out, - struct hdr_cursor *nh) +rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb) { - void *data_end = SKB_DATA_END(skb); - struct icmp6hdr old_icmp6, *icmp6 = (void *) (ip6h + 1); - struct icmphdr icmp, *new_icmp; - __u32 mtu, ptr; - struct iphdr dst_hdr; - void *inner_packet; + void *data_end = SKB_DATA_END(skb); + struct icmp6hdr old_icmp6; + struct icmp6hdr *icmp6; + struct icmphdr icmp; + struct icmphdr *new_icmp; + struct iphdr dst_hdr; + __u32 mtu; + __u32 ptr; + void *inner_packet; - if ((void *) (icmp6 + 1) > data_end) + icmp6 = (void *) (ip6h + 1); + if (icmp6 + 1 > data_end) return -1; old_icmp6 = *icmp6; new_icmp = (void *) icmp6; - icmp = *new_icmp; + icmp = *new_icmp; // TODO avoid these copies? /* These translations are defined in RFC6145 section 5.2 */ switch (icmp6->icmp6_type) { @@ -502,43 +496,32 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, } *new_icmp = icmp; -out: - *new_icmp_out = new_icmp; return 0; } +/* ipv6 traffic from the PLAT, to be translated into ipv4 and sent to an application */ static int -clat_translate_v6(struct __sk_buff *skb, - struct hdr_cursor *nh, - void *data_end, - struct iphdr *dst_hdr_out, - bool depth) +clat_handle_v6(struct __sk_buff *skb) { - struct in6_addr subnet_v6 = {}; - struct in_addr src_v4; - int ip_type; + int ret = TC_ACT_OK; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); + struct ethhdr *eth; + struct iphdr *iph; struct ipv6hdr *ip6h; - int ret = TC_ACT_OK; - struct icmphdr *new_icmp; - struct icmp6hdr old_icmp6; - struct iphdr dst_hdr_icmp; - int type; + struct iphdr dst_hdr = { + .version = 4, + .ihl = 5, + .frag_off = bpf_htons(1 << 14), /* set Don't Fragment bit */ + }; struct clat_v6_config_value *v6_config; struct clat_v6_config_key v6_config_key; - struct iphdr dst_hdr = { - .version = 4, - .ihl = 5, - .frag_off = bpf_htons(1 << 14), /* set Don't Fragment bit */ - }; - - ip_type = parse_ip6hdr(nh, data_end, &ip6h); - if (ip_type < 0) + ip6h = data + sizeof(struct ethhdr); + if (ip6h + 1 > data_end) goto out; - src_v4.s_addr = ip6h->saddr.s6_addr32[3]; - v6_config_key.local_v6 = ip6h->daddr; v6_config_key.pref64 = ip6h->saddr; /* v6 pxlen is always 96 */ @@ -559,35 +542,35 @@ clat_translate_v6(struct __sk_buff *skb, */ ret = TC_ACT_SHOT; - /* drop packets with IP options - parser skips options */ - if (ip_type != ip6h->nexthdr) { - DBG("v6: dropping packet with IP options from %pI6c\n", &ip6h->saddr); + /* drop packets with extension headers */ + if (ip6h->nexthdr != IPPROTO_TCP && ip6h->nexthdr != IPPROTO_UDP + && ip6h->nexthdr != IPPROTO_ICMPV6) goto out; - } dst_hdr.daddr = v6_config->local_v4.s_addr; - dst_hdr.saddr = src_v4.s_addr; + dst_hdr.saddr = ip6h->saddr.s6_addr32[3]; dst_hdr.protocol = ip6h->nexthdr; dst_hdr.ttl = ip6h->hop_limit; dst_hdr.tos = ip6h->priority << 4 | (ip6h->flow_lbl[0] >> 4); - dst_hdr.tot_len = bpf_htons(bpf_ntohs(ip6h->payload_len) + sizeof(dst_hdr)); + dst_hdr.tot_len = bpf_htons(bpf_ntohs(ip6h->payload_len) + sizeof(struct iphdr)); switch (dst_hdr.protocol) { case IPPROTO_ICMPV6: + { + struct icmphdr *new_icmp; + struct icmp6hdr old_icmp6; + struct iphdr dst_hdr_icmp; new_icmp = (void *) (ip6h + 1); - if ((void *) (new_icmp + 1) > data_end) + if (new_icmp + 1 > data_end) goto out; old_icmp6 = *((struct icmp6hdr *) (void *) new_icmp); - if (rewrite_icmpv6(ip6h, skb, &new_icmp, nh)) + if (rewrite_icmpv6(ip6h, skb)) goto out; - /* FIXME: also need to rewrite IP header embedded in ICMP error */ - if (depth) - goto icmp_out; - if (!new_icmp) - goto icmp_out; + /* TODO: also need to rewrite IP header embedded in ICMP error */ + if ((void *) (new_icmp + 1) > data_end) goto icmp_out; @@ -596,6 +579,7 @@ clat_translate_v6(struct __sk_buff *skb, icmp_out: dst_hdr.protocol = IPPROTO_ICMP; break; + } case IPPROTO_TCP: case IPPROTO_UDP: update_l4_checksum(skb, ip6h, &dst_hdr, dst_hdr.protocol, false); @@ -607,34 +591,6 @@ icmp_out: dst_hdr.check = csum_fold_helper( bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(dst_hdr), 0)); - *dst_hdr_out = dst_hdr; - - ret = TC_ACT_UNSPEC; -out: - return ret; -} - -/* ipv6 traffic from the PLAT, to be translated into ipv4 and sent to an application */ -static int -clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) -{ - int ret = TC_ACT_OK; - void *data_end = SKB_DATA_END(skb); - void *data = SKB_DATA(skb); - - struct ethhdr *eth; - struct iphdr *iph; - struct iphdr dst_hdr; - - int ip_offset = (nh->pos - data) & 0x1fff; - - ret = clat_translate_v6(skb, nh, data_end, &dst_hdr, 0); - if (ret != TC_ACT_UNSPEC) { - goto out; - } - - ret = TC_ACT_SHOT; - if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) goto out; @@ -642,8 +598,11 @@ clat_handle_v6(struct __sk_buff *skb, struct hdr_cursor *nh) data_end = SKB_DATA_END(skb); eth = data; - iph = data + ip_offset; - if ((void *) (eth + 1) > data_end || (void *) (iph + 1) > data_end) + if (eth + 1 > data_end) + goto out; + + iph = (void *) (eth + 1); + if (iph + 1 > data_end) goto out; eth->h_proto = bpf_htons(ETH_P_IP); @@ -654,21 +613,32 @@ out: return ret; } +static __always_inline int +_proto_is_vlan(__u16 h_proto) +{ + return !!(h_proto == bpf_htons(ETH_P_8021Q) || h_proto == bpf_htons(ETH_P_8021AD)); +} + static int clat_handler(struct __sk_buff *skb, bool egress) { - void *data_end = SKB_DATA_END(skb); - void *data = SKB_DATA(skb); - struct hdr_cursor nh = {.pos = data}; - struct ethhdr *eth; - int eth_type; + void *data = SKB_DATA(skb); + void *data_end = SKB_DATA_END(skb); + struct ethhdr *eth; + int eth_type; + + eth = data; + if (eth + 1 > data_end) + return TC_ACT_OK; + + eth_type = eth->h_proto; + if (_proto_is_vlan(eth_type)) + return TC_ACT_OK; - /* Parse Ethernet and IP/IPv6 headers */ - eth_type = parse_ethhdr(&nh, data_end, ð); if (eth_type == bpf_htons(ETH_P_IP) && egress) - return clat_handle_v4(skb, &nh); + return clat_handle_v4(skb); else if (eth_type == bpf_htons(ETH_P_IPV6) && !egress) - return clat_handle_v6(skb, &nh); + return clat_handle_v6(skb); return TC_ACT_OK; } From 195d6e55611f7c3ba127a0fa7af241046a9d1a97 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 22:47:35 +0100 Subject: [PATCH 22/31] clat: remove the libxdp dependency It's no longer required --- .gitlab-ci.yml | 10 +++++----- contrib/alpine/REQUIRED_PACKAGES | 1 - contrib/debian/REQUIRED_PACKAGES | 1 - contrib/fedora/REQUIRED_PACKAGES | 1 - contrib/fedora/rpm/NetworkManager.spec | 1 - meson.build | 1 - 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc8509071c..bc1e874f95 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -60,11 +60,11 @@ variables: # # This is done by running `ci-fairy generate-template` and possibly bumping # ".default_tag". - ALPINE_TAG: 'tag-9048a8c683b9' - CENTOS_TAG: 'tag-026f017b5a4a' - DEBIAN_TAG: 'tag-27883e6c662f' - FEDORA_TAG: 'tag-026f017b5a4a' - UBUNTU_TAG: 'tag-27883e6c662f' + ALPINE_TAG: 'tag-8e4bbc59695b' + CENTOS_TAG: 'tag-caf6673db1a7' + DEBIAN_TAG: 'tag-e394e8e726e1' + FEDORA_TAG: 'tag-caf6673db1a7' + UBUNTU_TAG: 'tag-e394e8e726e1' ALPINE_EXEC: 'bash .gitlab-ci/alpine-install.sh' CENTOS_EXEC: 'bash .gitlab-ci/fedora-install.sh' diff --git a/contrib/alpine/REQUIRED_PACKAGES b/contrib/alpine/REQUIRED_PACKAGES index a429c1c733..c6ae3a4edd 100755 --- a/contrib/alpine/REQUIRED_PACKAGES +++ b/contrib/alpine/REQUIRED_PACKAGES @@ -32,7 +32,6 @@ apk add \ 'libpsl-dev' \ 'libsoup-dev' \ 'libteam-dev' \ - 'libxdp-dev' \ 'linux-headers' \ 'meson' \ 'mobile-broadband-provider-info' \ diff --git a/contrib/debian/REQUIRED_PACKAGES b/contrib/debian/REQUIRED_PACKAGES index a61ec0d184..c2e409fa7f 100755 --- a/contrib/debian/REQUIRED_PACKAGES +++ b/contrib/debian/REQUIRED_PACKAGES @@ -65,7 +65,6 @@ install \ libsystemd-dev \ libteam-dev \ libudev-dev \ - libxdp-dev \ locales \ meson \ mobile-broadband-provider-info \ diff --git a/contrib/fedora/REQUIRED_PACKAGES b/contrib/fedora/REQUIRED_PACKAGES index 6d37d8280f..557c6c73a7 100755 --- a/contrib/fedora/REQUIRED_PACKAGES +++ b/contrib/fedora/REQUIRED_PACKAGES @@ -71,7 +71,6 @@ install \ libnvme-devel \ libselinux-devel \ libuuid-devel \ - libxdp-devel \ meson \ mobile-broadband-provider-info-devel \ newt-devel \ diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec index 23d89b8717..e21348ffe9 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -305,7 +305,6 @@ BuildRequires: iproute BuildRequires: iproute-tc BuildRequires: libnvme-devel >= 1.5 BuildRequires: libbpf-devel -BuildRequires: libxdp-devel BuildRequires: bpftool Provides: %{name}-dispatcher%{?_isa} = %{epoch}:%{version}-%{release} diff --git a/meson.build b/meson.build index 9b538052af..46cd6e9f40 100644 --- a/meson.build +++ b/meson.build @@ -490,7 +490,6 @@ enable_clat = get_option('clat') if enable_clat libbpf = dependency('libbpf', version: '>= 0.1.0', required: false) assert(libbpf.found(), 'You must have libbpf installed to build. Use -Dclat=false to disable use of it') - libxdp = dependency('libxdp', version: '>= 0.1.0', required: false) endif config_h.set10('HAVE_CLAT', enable_clat) From 6e9c6e166966c624f7894f649ae7b5da82828b0e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 26 Oct 2025 17:44:12 +0100 Subject: [PATCH 23/31] clat: pass the configuration as struct The program only needs to know the local IPv4 address, the local IPv6 address and the PREF64. There is no need to create multiple maps for that, just pass a configuration struct containing those 3 fields. --- src/core/bpf/clat.bpf.c | 78 +++++++++++----------------- src/core/bpf/clat.h | 16 +----- src/core/nm-l3cfg.c | 112 +++++----------------------------------- 3 files changed, 44 insertions(+), 162 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 3d2edc44ab..c2df1dd97d 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -34,21 +34,7 @@ char _license[] SEC("license") = "GPL"; -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, struct clat_v4_config_key); - __type(value, struct clat_v4_config_value); - __uint(max_entries, 16); - __uint(map_flags, BPF_F_NO_PREALLOC); -} v4_config_map SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, struct clat_v6_config_key); - __type(value, struct clat_v6_config_value); - __uint(max_entries, 16); - __uint(map_flags, BPF_F_NO_PREALLOC); -} v6_config_map SEC(".maps"); +struct clat_config config; #ifdef DEBUG #define DBG(fmt, ...) \ @@ -305,25 +291,15 @@ clat_handle_v4(struct __sk_buff *skb) struct iphdr *iph; struct ethhdr *eth; - struct clat_v4_config_value *v4_config; - struct clat_v4_config_key v4_config_key; - iph = data + sizeof(struct ethhdr); if (iph + 1 > data_end) goto out; - v4_config_key.ifindex = skb->ifindex; - v4_config_key.local_v4.s_addr = iph->saddr; - - v4_config = bpf_map_lookup_elem(&v4_config_map, &v4_config_key); - if (!v4_config) { - DBG("-> v4: config for src_v4=%pI4 not found!\n", &v4_config_key.local_v4); + if (iph->saddr != config.local_v4.s_addr) goto out; - } - /* At this point we know the destination IP is within the configured - * subnet, so if we can't rewrite the packet it should be dropped (so as - * not to leak traffic in that subnet). + /* At this point we know the packet needs translation. If we can't + * rewrite it, it should be dropped. */ ret = TC_ACT_SHOT; @@ -343,8 +319,8 @@ clat_handle_v4(struct __sk_buff *skb) } /* src v4 as last octet of clat address */ - dst_hdr.saddr = v4_config->local_v6; - dst_hdr.daddr = v4_config->pref64; + dst_hdr.saddr = config.local_v6; + dst_hdr.daddr = config.pref64; dst_hdr.daddr.s6_addr32[3] = iph->daddr; dst_hdr.nexthdr = iph->protocol; dst_hdr.hop_limit = iph->ttl; @@ -499,6 +475,18 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb) return 0; } +static __always_inline bool +v6addr_equal(struct in6_addr *a, struct in6_addr *b) +{ + int i; + + for (i = 0; i < 4; i++) { + if (a->s6_addr32[i] != b->s6_addr32[i]) + return false; + } + return true; +} + /* ipv6 traffic from the PLAT, to be translated into ipv4 and sent to an application */ static int clat_handle_v6(struct __sk_buff *skb) @@ -506,6 +494,7 @@ clat_handle_v6(struct __sk_buff *skb) int ret = TC_ACT_OK; void *data_end = SKB_DATA_END(skb); void *data = SKB_DATA(skb); + struct in6_addr subnet_v6; struct ethhdr *eth; struct iphdr *iph; struct ipv6hdr *ip6h; @@ -515,30 +504,21 @@ clat_handle_v6(struct __sk_buff *skb) .frag_off = bpf_htons(1 << 14), /* set Don't Fragment bit */ }; - struct clat_v6_config_value *v6_config; - struct clat_v6_config_key v6_config_key; - ip6h = data + sizeof(struct ethhdr); if (ip6h + 1 > data_end) goto out; - v6_config_key.local_v6 = ip6h->daddr; - v6_config_key.pref64 = ip6h->saddr; - /* v6 pxlen is always 96 */ - v6_config_key.pref64.s6_addr32[3] = 0; - v6_config_key.ifindex = skb->ifindex; - - v6_config = bpf_map_lookup_elem(&v6_config_map, &v6_config_key); - if (!v6_config) { - DBG("<- v6: config for pref64=%pI6c, local_v6=%pI6c not found!\n", - &v6_config_key.pref64, - &v6_config_key.local_v6); + if (!v6addr_equal(&ip6h->daddr, &config.local_v6)) goto out; - } - /* At this point we know the destination IP is within the configured - * subnet, so if we can't rewrite the packet it should be dropped (so as - * not to leak traffic in that subnet). + subnet_v6 = ip6h->saddr; + subnet_v6.s6_addr32[3] = 0; /* prefix len is always 96 for now */ + + if (!v6addr_equal(&subnet_v6, &config.pref64)) + goto out; + + /* At this point we know the packet needs translation. If we can't + * rewrite it, it should be dropped. */ ret = TC_ACT_SHOT; @@ -547,7 +527,7 @@ clat_handle_v6(struct __sk_buff *skb) && ip6h->nexthdr != IPPROTO_ICMPV6) goto out; - dst_hdr.daddr = v6_config->local_v4.s_addr; + dst_hdr.daddr = config.local_v4.s_addr; dst_hdr.saddr = ip6h->saddr.s6_addr32[3]; dst_hdr.protocol = ip6h->nexthdr; dst_hdr.ttl = ip6h->hop_limit; diff --git a/src/core/bpf/clat.h b/src/core/bpf/clat.h index ee4763d5c7..2748946392 100644 --- a/src/core/bpf/clat.h +++ b/src/core/bpf/clat.h @@ -4,24 +4,10 @@ #include -struct clat_v6_config_key { +struct clat_config { struct in6_addr local_v6; struct in6_addr pref64; - __u32 ifindex; -}; - -struct clat_v6_config_value { struct in_addr local_v4; }; -struct clat_v4_config_key { - struct in_addr local_v4; - __u32 ifindex; -}; - -struct clat_v4_config_value { - struct in6_addr local_v6; - struct in6_addr pref64; -}; - #endif diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 6da877a976..5c3f92080f 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -310,9 +310,6 @@ typedef struct _NML3CfgPrivate { NMNetnsIPReservation *clat_address_4_committed; NMPlatformIP6Address clat_address_6_committed; - /* The NAT64 prefix discovered via RA */ - struct in6_addr clat_pref64; - /* If NULL, the BPF program hasn't been loaded or attached */ struct clat_bpf *clat_bpf; int clat_socket; @@ -387,7 +384,6 @@ typedef struct _NML3CfgPrivate { bool clat_address_6_valid : 1; bool clat_address_6_committed_valid : 1; - bool clat_pref64_valid : 1; } NML3CfgPrivate; struct _NML3CfgClass { @@ -5564,50 +5560,6 @@ _l3_commit_one(NML3Cfg *self, } #if HAVE_CLAT -static void -_l3_get_pref64_config(NML3Cfg *self, - struct clat_v4_config_key *v4_key, - struct clat_v4_config_value *v4_value, - struct clat_v6_config_key *v6_key, - struct clat_v6_config_value *v6_value, - gboolean committed) -{ - const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; - struct in6_addr pref64; - guint32 pref64_plen; - - memset(v4_key, 0, sizeof(*v4_key)); - memset(v6_key, 0, sizeof(*v6_key)); - memset(v4_value, 0, sizeof(*v4_value)); - memset(v6_value, 0, sizeof(*v6_value)); - - v4_key->ifindex = v6_key->ifindex = self->priv.ifindex; - - if (committed) { - if (self->priv.p->clat_address_4_committed) { - v6_value->local_v4.s_addr = v4_key->local_v4.s_addr = - self->priv.p->clat_address_4_committed->addr; - } - if (self->priv.p->clat_address_6_committed_valid) { - v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6_committed.address; - } - if (self->priv.p->clat_pref64_valid) { - v6_key->pref64 = v4_value->pref64 = self->priv.p->clat_pref64; - } - } else { - if (self->priv.p->clat_address_4) { - v6_value->local_v4.s_addr = v4_key->local_v4.s_addr = - self->priv.p->clat_address_4->addr; - } - if (self->priv.p->clat_address_6_valid) { - v4_value->local_v6 = v6_key->local_v6 = self->priv.p->clat_address_6.address; - } - if (nm_l3_config_data_get_pref64(l3cd, &pref64, &pref64_plen)) { - v6_key->pref64 = v4_value->pref64 = pref64; - } - } -} - static void _l3_clat_destroy(NML3Cfg *self) { @@ -5643,17 +5595,14 @@ _l3_clat_destroy(NML3Cfg *self) static void _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) { - int err = 0; - const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; - struct in6_addr _l3cd_pref64_inner; - const struct in6_addr *l3cd_pref64 = NULL; - guint32 l3cd_pref64_plen; - char buf[100]; - struct clat_v6_config_key v6_key_committed, v6_key_new; - struct clat_v4_config_key v4_key_committed, v4_key_new; - struct clat_v6_config_value v6_value_committed, v6_value_new; - struct clat_v4_config_value v4_value_committed, v4_value_new; - gboolean v6_changed; + int err = 0; + const NML3ConfigData *l3cd = self->priv.p->combined_l3cd_commited; + struct in6_addr _l3cd_pref64_inner; + const struct in6_addr *l3cd_pref64 = NULL; + guint32 l3cd_pref64_plen; + char buf[100]; + struct clat_config clat_config; + gboolean v6_changed; DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook, .attach_point = BPF_TC_INGRESS | BPF_TC_EGRESS, @@ -5678,10 +5627,6 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) return; } - /* Set up maps */ - bpf_map__set_max_entries(self->priv.p->clat_bpf->maps.v4_config_map, 16); - bpf_map__set_max_entries(self->priv.p->clat_bpf->maps.v6_config_map, 16); - err = clat_bpf__load(self->priv.p->clat_bpf); if (err) { libbpf_strerror(err, buf, sizeof(buf)); @@ -5739,41 +5684,12 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) self->priv.p->clat_attach_egress = attach_egress; } - _l3_get_pref64_config(self, - &v4_key_committed, - &v4_value_committed, - &v6_key_committed, - &v6_value_committed, - TRUE); - _l3_get_pref64_config(self, &v4_key_new, &v4_value_new, &v6_key_new, &v6_value_new, FALSE); - - if (memcmp(&v4_key_committed, &v4_key_new, sizeof(v4_key_new))) { - bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), - &v4_key_committed); - } - if (memcmp(&v6_key_committed, &v6_key_new, sizeof(v6_key_new))) { - bpf_map_delete_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), - &v6_key_committed); - } - if (memcmp(&v4_value_committed, &v4_value_new, sizeof(v4_value_new))) { - bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v4_config_map), - &v4_key_new, - &v4_value_new, - BPF_ANY); - } - if (memcmp(&v6_value_committed, &v6_value_new, sizeof(v6_value_new))) { - bpf_map_update_elem(bpf_map__fd(self->priv.p->clat_bpf->maps.v6_config_map), - &v6_key_new, - &v6_value_new, - BPF_ANY); - } - - if (l3cd_pref64) { - self->priv.p->clat_pref64_valid = TRUE; - self->priv.p->clat_pref64 = *l3cd_pref64; - } else { - self->priv.p->clat_pref64_valid = FALSE; - } + /* Pass configuration to the BPF program */ + memset(&clat_config, 0, sizeof(clat_config)); + clat_config.local_v4.s_addr = self->priv.p->clat_address_4->addr; + clat_config.local_v6 = self->priv.p->clat_address_6.address; + clat_config.pref64 = *l3cd_pref64; + self->priv.p->clat_bpf->bss->config = clat_config; if (self->priv.p->clat_socket < 0) { self->priv.p->clat_socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); From 6a1f5a764e42b6360bbb27a4b94f46f0c4871aec Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 21:31:55 +0100 Subject: [PATCH 24/31] bpf: clat: remove unused variables --- src/core/bpf/clat.bpf.c | 26 +++++++++----------------- src/core/bpf/meson.build | 2 ++ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index c2df1dd97d..1bef70421a 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -77,7 +77,6 @@ update_l4_checksum(struct __sk_buff *skb, int ip_type, bool v4to6) { - void *data = SKB_DATA(skb); int flags = BPF_F_PSEUDO_HDR; __u16 offset; __u32 csum; @@ -118,8 +117,7 @@ update_icmp_checksum(struct __sk_buff *skb, void *icmp_after, bool add) { - void *data = SKB_DATA(skb); - struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; + struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; __u16 h_before, h_after; __u32 u_before, u_after; __u16 offset; @@ -280,13 +278,12 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) static int clat_handle_v4(struct __sk_buff *skb) { - int ret = TC_ACT_OK; - void *data_end = SKB_DATA_END(skb); - void *data = SKB_DATA(skb); - struct in6_addr *dst_v6; - struct ipv6hdr *ip6h; - struct ipv6hdr dst_hdr = { - .version = 6, + int ret = TC_ACT_OK; + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); + struct ipv6hdr *ip6h; + struct ipv6hdr dst_hdr = { + .version = 6, }; struct iphdr *iph; struct ethhdr *eth; @@ -380,22 +377,18 @@ static int rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb) { void *data_end = SKB_DATA_END(skb); - struct icmp6hdr old_icmp6; struct icmp6hdr *icmp6; struct icmphdr icmp; struct icmphdr *new_icmp; - struct iphdr dst_hdr; __u32 mtu; __u32 ptr; - void *inner_packet; icmp6 = (void *) (ip6h + 1); if (icmp6 + 1 > data_end) return -1; - old_icmp6 = *icmp6; - new_icmp = (void *) icmp6; - icmp = *new_icmp; // TODO avoid these copies? + new_icmp = (void *) icmp6; + icmp = *new_icmp; // TODO avoid these copies? /* These translations are defined in RFC6145 section 5.2 */ switch (icmp6->icmp6_type) { @@ -539,7 +532,6 @@ clat_handle_v6(struct __sk_buff *skb) { struct icmphdr *new_icmp; struct icmp6hdr old_icmp6; - struct iphdr dst_hdr_icmp; new_icmp = (void *) (ip6h + 1); if (new_icmp + 1 > data_end) diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build index 200d0c670e..ee30f4fe38 100644 --- a/src/core/bpf/meson.build +++ b/src/core/bpf/meson.build @@ -97,6 +97,7 @@ endif bpf_clang_flags = [ '-std=gnu17', '-Wno-compare-distinct-pointer-types', + '-Wunused', '-fno-stack-protector', '-O2', '-target', @@ -107,6 +108,7 @@ bpf_clang_flags = [ bpf_gcc_flags = [ '-std=gnu17', + '-Wunused', '-fno-stack-protector', '-fno-ssa-phiopt', '-O2', From c0d5e9ab91e9724f9952b36dbe414e32804953cc Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 21:57:02 +0100 Subject: [PATCH 25/31] bpf: clat: change the signature of update_icmp_checksum() - rename argument 'add' to 'v4to6' - make argument 'ip6h' const since it's not modified by the function --- src/core/bpf/clat.bpf.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 1bef70421a..de90874c70 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -111,11 +111,11 @@ update_l4_checksum(struct __sk_buff *skb, } static void -update_icmp_checksum(struct __sk_buff *skb, - struct ipv6hdr *ip6h, - void *icmp_before, - void *icmp_after, - bool add) +update_icmp_checksum(struct __sk_buff *skb, + const struct ipv6hdr *ip6h, + void *icmp_before, + void *icmp_after, + bool v4to6) { struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; __u16 h_before, h_after; @@ -136,12 +136,12 @@ update_icmp_checksum(struct __sk_buff *skb, * itself. */ csum = bpf_csum_diff((__be32 *) &ph, - add ? 0 : sizeof(ph), + v4to6 ? 0 : sizeof(ph), (__be32 *) &ph, - add ? sizeof(ph) : 0, + v4to6 ? sizeof(ph) : 0, 0); - offset = sizeof(struct ethhdr) + (add ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) + 2; + offset = sizeof(struct ethhdr) + (v4to6 ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) + 2; /* first two bytes of ICMP header, type and code */ h_before = *(__u16 *) icmp_before; From 97cd4def6988dbad8999e24820f6d0f5543171e0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 21:54:26 +0100 Subject: [PATCH 26/31] bpf: clat: rework rewrite_icmp() --- src/core/bpf/clat.bpf.c | 68 +++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index de90874c70..65207abb6d 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -159,32 +159,34 @@ update_icmp_checksum(struct __sk_buff *skb, } static int -rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) +rewrite_icmp(struct __sk_buff *skb, const struct ipv6hdr *ip6h) { void *data_end = SKB_DATA_END(skb); - struct icmphdr old_icmp; - struct icmp6hdr icmp6; - struct icmphdr *icmp = (void *) (iph + 1); - struct icmp6hdr *new_icmp6; + void *data = SKB_DATA(skb); + struct icmphdr icmp_buf; /* copy of the old ICMPv4 header */ + struct icmp6hdr icmp6_buf; /* buffer for the new ICMPv6 header */ + struct icmphdr *icmp; + struct icmp6hdr *icmp6; __u32 mtu; + icmp = data + sizeof(struct ethhdr) + sizeof(struct iphdr); if ((icmp + 1) > data_end) return -1; - old_icmp = *icmp; - new_icmp6 = (void *) icmp; - icmp6 = *new_icmp6; + icmp_buf = *icmp; + icmp6 = (void *) icmp; + icmp6_buf = *icmp6; /* These translations are defined in RFC6145 section 4.2 */ switch (icmp->type) { case ICMP_ECHO: - icmp6.icmp6_type = ICMPV6_ECHO_REQUEST; + icmp6_buf.icmp6_type = ICMPV6_ECHO_REQUEST; break; case ICMP_ECHOREPLY: - icmp6.icmp6_type = ICMPV6_ECHO_REPLY; + icmp6_buf.icmp6_type = ICMPV6_ECHO_REPLY; break; case ICMP_DEST_UNREACH: - icmp6.icmp6_type = ICMPV6_DEST_UNREACH; + icmp6_buf.icmp6_type = ICMPV6_DEST_UNREACH; switch (icmp->code) { case ICMP_NET_UNREACH: case ICMP_HOST_UNREACH: @@ -194,30 +196,30 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) case ICMP_HOST_ISOLATED: case ICMP_NET_UNR_TOS: case ICMP_HOST_UNR_TOS: - icmp6.icmp6_code = ICMPV6_NOROUTE; + icmp6_buf.icmp6_code = ICMPV6_NOROUTE; break; case ICMP_PROT_UNREACH: - icmp6.icmp6_type = ICMPV6_PARAMPROB; - icmp6.icmp6_code = ICMPV6_UNK_NEXTHDR; - icmp6.icmp6_pointer = bpf_htonl(offsetof(struct ipv6hdr, nexthdr)); + icmp6_buf.icmp6_type = ICMPV6_PARAMPROB; + icmp6_buf.icmp6_code = ICMPV6_UNK_NEXTHDR; + icmp6_buf.icmp6_pointer = bpf_htonl(offsetof(struct ipv6hdr, nexthdr)); case ICMP_PORT_UNREACH: - icmp6.icmp6_code = ICMPV6_PORT_UNREACH; + icmp6_buf.icmp6_code = ICMPV6_PORT_UNREACH; break; case ICMP_FRAG_NEEDED: - icmp6.icmp6_type = ICMPV6_PKT_TOOBIG; - icmp6.icmp6_code = 0; - mtu = bpf_ntohs(icmp->un.frag.mtu) + 20; + icmp6_buf.icmp6_type = ICMPV6_PKT_TOOBIG; + icmp6_buf.icmp6_code = 0; + mtu = bpf_ntohs(icmp->un.frag.mtu) + 20; /* RFC6145 section 6, "second approach" - should not be * necessary, but might as well do this */ if (mtu < 1280) mtu = 1280; - icmp6.icmp6_mtu = bpf_htonl(mtu); + icmp6_buf.icmp6_mtu = bpf_htonl(mtu); case ICMP_NET_ANO: case ICMP_HOST_ANO: case ICMP_PKT_FILTERED: case ICMP_PREC_CUTOFF: - icmp6.icmp6_code = ICMPV6_ADM_PROHIBITED; + icmp6_buf.icmp6_code = ICMPV6_ADM_PROHIBITED; default: return -1; } @@ -225,39 +227,39 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) case ICMP_PARAMETERPROB: if (icmp->code == 1) return -1; - icmp6.icmp6_type = ICMPV6_PARAMPROB; - icmp6.icmp6_code = ICMPV6_HDR_FIELD; + icmp6_buf.icmp6_type = ICMPV6_PARAMPROB; + icmp6_buf.icmp6_code = ICMPV6_HDR_FIELD; /* The pointer field not defined in the Linux header. This * translation is from Figure 3 of RFC6145. */ switch (icmp->un.reserved[0]) { case 0: /* version/IHL */ - icmp6.icmp6_pointer = 0; + icmp6_buf.icmp6_pointer = 0; break; case 1: /* Type of Service */ - icmp6.icmp6_pointer = bpf_htonl(1); + icmp6_buf.icmp6_pointer = bpf_htonl(1); break; case 2: /* Total length */ case 3: - icmp6.icmp6_pointer = bpf_htonl(4); + icmp6_buf.icmp6_pointer = bpf_htonl(4); break; case 8: /* Time to Live */ - icmp6.icmp6_pointer = bpf_htonl(7); + icmp6_buf.icmp6_pointer = bpf_htonl(7); break; case 9: /* Protocol */ - icmp6.icmp6_pointer = bpf_htonl(6); + icmp6_buf.icmp6_pointer = bpf_htonl(6); break; case 12: /* Source address */ case 13: case 14: case 15: - icmp6.icmp6_pointer = bpf_htonl(8); + icmp6_buf.icmp6_pointer = bpf_htonl(8); break; case 16: /* Destination address */ case 17: case 18: case 19: - icmp6.icmp6_pointer = bpf_htonl(24); + icmp6_buf.icmp6_pointer = bpf_htonl(24); break; default: return -1; @@ -266,8 +268,8 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) return -1; } - *new_icmp6 = icmp6; - update_icmp_checksum(skb, ip6h, &old_icmp, new_icmp6, true); + *icmp6 = icmp6_buf; + update_icmp_checksum(skb, ip6h, &icmp_buf, icmp6, true); /* FIXME: also need to rewrite IP header embedded in ICMP error */ @@ -330,7 +332,7 @@ clat_handle_v4(struct __sk_buff *skb) switch (dst_hdr.nexthdr) { case IPPROTO_ICMP: - if (rewrite_icmp(iph, &dst_hdr, skb)) + if (rewrite_icmp(skb, &dst_hdr)) goto out; dst_hdr.nexthdr = IPPROTO_ICMPV6; break; From 6d47e6acf496fe1164ddb24d8a0e160ba2782154 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 22:12:02 +0100 Subject: [PATCH 27/31] bpf: clat: rework rewrite_icmpv6() --- src/core/bpf/clat.bpf.c | 86 ++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 48 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 65207abb6d..a7947c5d5a 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -376,85 +376,89 @@ csum_fold_helper(__u32 csum) } static int -rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb) +rewrite_icmpv6(struct __sk_buff *skb) { void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); struct icmp6hdr *icmp6; - struct icmphdr icmp; - struct icmphdr *new_icmp; + struct icmphdr *icmp; + struct icmphdr icmp_buf; /* buffer for the new ICMPv4 header */ + struct icmp6hdr icmp6_buf; /* copy of the old ICMPv6 header */ + struct ipv6hdr *ip6h; __u32 mtu; __u32 ptr; - icmp6 = (void *) (ip6h + 1); + icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); if (icmp6 + 1 > data_end) return -1; - new_icmp = (void *) icmp6; - icmp = *new_icmp; // TODO avoid these copies? + icmp6_buf = *icmp6; + icmp = (void *) icmp6; + icmp_buf = *icmp; /* These translations are defined in RFC6145 section 5.2 */ switch (icmp6->icmp6_type) { case ICMPV6_ECHO_REQUEST: - icmp.type = ICMP_ECHO; + icmp_buf.type = ICMP_ECHO; break; case ICMPV6_ECHO_REPLY: - icmp.type = ICMP_ECHOREPLY; + icmp_buf.type = ICMP_ECHOREPLY; break; case ICMPV6_DEST_UNREACH: - icmp.type = ICMP_DEST_UNREACH; + icmp_buf.type = ICMP_DEST_UNREACH; switch (icmp6->icmp6_code) { case ICMPV6_NOROUTE: case ICMPV6_NOT_NEIGHBOUR: case ICMPV6_ADDR_UNREACH: - icmp.code = ICMP_HOST_UNREACH; + icmp_buf.code = ICMP_HOST_UNREACH; break; case ICMPV6_ADM_PROHIBITED: - icmp.code = ICMP_HOST_ANO; + icmp_buf.code = ICMP_HOST_ANO; break; case ICMPV6_PORT_UNREACH: - icmp.code = ICMP_PORT_UNREACH; + icmp_buf.code = ICMP_PORT_UNREACH; break; default: return -1; } break; case ICMPV6_PKT_TOOBIG: - icmp.type = ICMP_DEST_UNREACH; - icmp.code = ICMP_FRAG_NEEDED; + icmp_buf.type = ICMP_DEST_UNREACH; + icmp_buf.code = ICMP_FRAG_NEEDED; mtu = bpf_htonl(icmp6->icmp6_mtu) - 20; if (mtu > 0xffff) return -1; - icmp.un.frag.mtu = bpf_htons(mtu); + icmp_buf.un.frag.mtu = bpf_htons(mtu); break; case ICMPV6_TIME_EXCEED: - icmp.type = ICMP_TIME_EXCEEDED; + icmp_buf.type = ICMP_TIME_EXCEEDED; break; case ICMPV6_PARAMPROB: switch (icmp6->icmp6_code) { case 0: - icmp.type = ICMP_PARAMETERPROB; - icmp.code = 0; + icmp_buf.type = ICMP_PARAMETERPROB; + icmp_buf.code = 0; break; case 1: - icmp.type = ICMP_DEST_UNREACH; - icmp.code = ICMP_PROT_UNREACH; - ptr = bpf_ntohl(icmp6->icmp6_pointer); + icmp_buf.type = ICMP_DEST_UNREACH; + icmp_buf.code = ICMP_PROT_UNREACH; + ptr = bpf_ntohl(icmp6->icmp6_pointer); /* Figure 6 in RFC6145 - using if statements b/c of * range at the bottom */ if (ptr == 0 || ptr == 1) - icmp.un.reserved[0] = ptr; + icmp_buf.un.reserved[0] = ptr; else if (ptr == 4 || ptr == 5) - icmp.un.reserved[0] = 2; + icmp_buf.un.reserved[0] = 2; else if (ptr == 6) - icmp.un.reserved[0] = 9; + icmp_buf.un.reserved[0] = 9; else if (ptr == 7) - icmp.un.reserved[0] = 8; + icmp_buf.un.reserved[0] = 8; else if (ptr >= 8 && ptr <= 23) - icmp.un.reserved[0] = 12; + icmp_buf.un.reserved[0] = 12; else if (ptr >= 24 && ptr <= 39) - icmp.un.reserved[0] = 16; + icmp_buf.un.reserved[0] = 16; else return -1; break; @@ -466,7 +470,12 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, struct __sk_buff *skb) return -1; } - *new_icmp = icmp; + *icmp = icmp_buf; + ip6h = data + sizeof(struct ethhdr); + update_icmp_checksum(skb, ip6h, &icmp6_buf, icmp, false); + + /* FIXME: also need to rewrite IP header embedded in ICMP error */ + return 0; } @@ -531,29 +540,10 @@ clat_handle_v6(struct __sk_buff *skb) switch (dst_hdr.protocol) { case IPPROTO_ICMPV6: - { - struct icmphdr *new_icmp; - struct icmp6hdr old_icmp6; - - new_icmp = (void *) (ip6h + 1); - if (new_icmp + 1 > data_end) + if (rewrite_icmpv6(skb)) goto out; - - old_icmp6 = *((struct icmp6hdr *) (void *) new_icmp); - if (rewrite_icmpv6(ip6h, skb)) - goto out; - - /* TODO: also need to rewrite IP header embedded in ICMP error */ - - if ((void *) (new_icmp + 1) > data_end) - goto icmp_out; - - update_icmp_checksum(skb, ip6h, &old_icmp6, new_icmp, false); - -icmp_out: dst_hdr.protocol = IPPROTO_ICMP; break; - } case IPPROTO_TCP: case IPPROTO_UDP: update_l4_checksum(skb, ip6h, &dst_hdr, dst_hdr.protocol, false); From 057c8c200e39608bc264e923dd529dd77767bbfc Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 22:44:00 +0100 Subject: [PATCH 28/31] bpf: clat: remove unused includes --- src/core/bpf/clat.bpf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index a7947c5d5a..69f116b911 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -19,13 +19,10 @@ #include #include #include -#include #include #include #include #include -#include -#include #include #include From 5dba386055cafc56c832c0c116c1dcefabe108e0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 15 Dec 2025 18:35:52 +0100 Subject: [PATCH 29/31] core: export IPv6 next-hop for IPv4 routes --- src/core/NetworkManagerUtils.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 32df3d6dfd..0c269caa14 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -1753,6 +1753,13 @@ nm_utils_ip_routes_to_dbus(int addr_family, "{sv}", "next-hop", g_variant_new_string(nm_inet_ntop(addr_family, gateway, addr_str))); + } else if (addr_family == AF_INET && r->r4.via.addr_family == AF_INET6) { + g_variant_builder_add( + &route_builder, + "{sv}", + "next-hop-v6", + g_variant_new_string( + nm_inet_ntop(AF_INET6, r->r4.via.addr.addr_ptr, addr_str))); } g_variant_builder_add(&route_builder, From 131ef566ef05d0c1f76ee0c52bb62116f943c767 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 15 Dec 2025 19:21:22 +0100 Subject: [PATCH 30/31] clat: support all pref64 lengths Support all the prefix lengths defined in RFC 6052. --- src/core/bpf/clat.bpf.c | 183 +++++++++++++++++++++++++++++++-- src/core/bpf/clat.h | 3 +- src/core/ndisc/nm-lndp-ndisc.c | 8 +- src/core/nm-l3cfg.c | 1 + 4 files changed, 179 insertions(+), 16 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 69f116b911..4f96e1e256 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -273,6 +273,170 @@ rewrite_icmp(struct __sk_buff *skb, const struct ipv6hdr *ip6h) return 0; } +/* + * Convert an IPv4 address to the corresponding "IPv4-Embedded IPv6 Address" + * according to RFC 6052 2.2. + * + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |PL| 0-------------32--40--48--56--64--72--80--88--96--104---------| + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |32| prefix |v4(32) | u | suffix | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |40| prefix |v4(24) | u |(8)| suffix | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |48| prefix |v4(16) | u | (16) | suffix | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |56| prefix |(8)| u | v4(24) | suffix | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |64| prefix | u | v4(32) | suffix | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * |96| prefix | v4(32) | + * +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + * + */ +static __always_inline bool +v4addr_to_v6(__be32 addr4, struct in6_addr *addr6, const struct in6_addr *pref64, int pref64_len) +{ + union { + __be32 a32; + __u8 a8[4]; + } u; + + u.a32 = addr4; + + addr6->s6_addr32[0] = 0; + addr6->s6_addr32[1] = 0; + addr6->s6_addr32[2] = 0; + addr6->s6_addr32[3] = 0; + + switch (pref64_len) { + case 96: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr32[1] = pref64->s6_addr32[1]; + addr6->s6_addr32[2] = pref64->s6_addr32[2]; + addr6->s6_addr32[3] = addr4; + break; + case 64: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr32[1] = pref64->s6_addr32[1]; + addr6->s6_addr[9] = u.a8[0]; + addr6->s6_addr[10] = u.a8[1]; + addr6->s6_addr[11] = u.a8[2]; + addr6->s6_addr[12] = u.a8[3]; + break; + case 56: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr32[1] = pref64->s6_addr32[1]; + addr6->s6_addr[7] = u.a8[0]; + addr6->s6_addr[9] = u.a8[1]; + addr6->s6_addr[10] = u.a8[2]; + addr6->s6_addr[11] = u.a8[3]; + break; + case 48: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr16[2] = pref64->s6_addr16[2]; + addr6->s6_addr[6] = u.a8[0]; + addr6->s6_addr[7] = u.a8[1]; + addr6->s6_addr[9] = u.a8[2]; + addr6->s6_addr[10] = u.a8[3]; + break; + case 40: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr[4] = pref64->s6_addr[4]; + addr6->s6_addr[5] = u.a8[0]; + addr6->s6_addr[6] = u.a8[1]; + addr6->s6_addr[7] = u.a8[2]; + addr6->s6_addr[9] = u.a8[3]; + break; + case 32: + addr6->s6_addr32[0] = pref64->s6_addr32[0]; + addr6->s6_addr32[1] = addr4; + break; + default: + return false; + } + return true; +} + +/* + * Extract the IPv4 address @addr4 and the NAT64 prefix @pref64 from an IPv6 address, + * given the known prefix length @pref64_len. See the table above. + */ +static __always_inline bool +v6addr_to_v4(const struct in6_addr *addr6, int pref64_len, __be32 *addr4, struct in6_addr *pref64) +{ + union { + __be32 a32; + __u8 a8[4]; + } u; + + pref64->s6_addr32[0] = 0; + pref64->s6_addr32[1] = 0; + pref64->s6_addr32[2] = 0; + pref64->s6_addr32[3] = 0; + + switch (pref64_len) { + case 96: + u.a32 = addr6->s6_addr32[3]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + pref64->s6_addr32[1] = addr6->s6_addr32[1]; + pref64->s6_addr32[2] = addr6->s6_addr32[2]; + break; + case 64: + u.a8[0] = addr6->s6_addr[9]; + u.a8[1] = addr6->s6_addr[10]; + u.a8[2] = addr6->s6_addr[11]; + u.a8[3] = addr6->s6_addr[12]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + pref64->s6_addr32[1] = addr6->s6_addr32[1]; + break; + case 56: + u.a8[0] = addr6->s6_addr[7]; + u.a8[1] = addr6->s6_addr[9]; + u.a8[2] = addr6->s6_addr[10]; + u.a8[3] = addr6->s6_addr[11]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + pref64->s6_addr32[1] = addr6->s6_addr32[1]; + pref64->s6_addr[7] = 0; + break; + case 48: + u.a8[0] = addr6->s6_addr[6]; + u.a8[1] = addr6->s6_addr[7]; + u.a8[2] = addr6->s6_addr[9]; + u.a8[3] = addr6->s6_addr[10]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + pref64->s6_addr32[1] = addr6->s6_addr32[1]; + pref64->s6_addr16[3] = 0; + break; + case 40: + u.a8[0] = addr6->s6_addr[5]; + u.a8[1] = addr6->s6_addr[6]; + u.a8[2] = addr6->s6_addr[7]; + u.a8[3] = addr6->s6_addr[9]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + pref64->s6_addr32[1] = addr6->s6_addr32[1]; + pref64->s6_addr16[3] = 0; + pref64->s6_addr[5] = 0; + + break; + case 32: + u.a32 = addr6->s6_addr32[1]; + + pref64->s6_addr32[0] = addr6->s6_addr32[0]; + break; + default: + return false; + } + + *addr4 = u.a32; + return true; +} + /* ipv4 traffic in from application on this device, needs to be translated to v6 and sent to PLAT */ static int clat_handle_v4(struct __sk_buff *skb) @@ -314,12 +478,12 @@ clat_handle_v4(struct __sk_buff *skb) goto out; } - /* src v4 as last octet of clat address */ - dst_hdr.saddr = config.local_v6; - dst_hdr.daddr = config.pref64; - dst_hdr.daddr.s6_addr32[3] = iph->daddr; - dst_hdr.nexthdr = iph->protocol; - dst_hdr.hop_limit = iph->ttl; + if (!v4addr_to_v6(iph->daddr, &dst_hdr.daddr, &config.pref64, config.pref64_len)) + goto out; + + dst_hdr.saddr = config.local_v6; + dst_hdr.nexthdr = iph->protocol; + dst_hdr.hop_limit = iph->ttl; /* weird definition in ipv6hdr */ dst_hdr.priority = (iph->tos & 0x70) >> 4; dst_hdr.flow_lbl[0] = iph->tos << 4; @@ -495,6 +659,7 @@ clat_handle_v6(struct __sk_buff *skb) int ret = TC_ACT_OK; void *data_end = SKB_DATA_END(skb); void *data = SKB_DATA(skb); + __be32 saddr4; struct in6_addr subnet_v6; struct ethhdr *eth; struct iphdr *iph; @@ -512,8 +677,8 @@ clat_handle_v6(struct __sk_buff *skb) if (!v6addr_equal(&ip6h->daddr, &config.local_v6)) goto out; - subnet_v6 = ip6h->saddr; - subnet_v6.s6_addr32[3] = 0; /* prefix len is always 96 for now */ + if (!v6addr_to_v4(&ip6h->saddr, config.pref64_len, &saddr4, &subnet_v6)) + goto out; if (!v6addr_equal(&subnet_v6, &config.pref64)) goto out; @@ -529,7 +694,7 @@ clat_handle_v6(struct __sk_buff *skb) goto out; dst_hdr.daddr = config.local_v4.s_addr; - dst_hdr.saddr = ip6h->saddr.s6_addr32[3]; + dst_hdr.saddr = saddr4; dst_hdr.protocol = ip6h->nexthdr; dst_hdr.ttl = ip6h->hop_limit; dst_hdr.tos = ip6h->priority << 4 | (ip6h->flow_lbl[0] >> 4); diff --git a/src/core/bpf/clat.h b/src/core/bpf/clat.h index 2748946392..3d926b527f 100644 --- a/src/core/bpf/clat.h +++ b/src/core/bpf/clat.h @@ -7,7 +7,8 @@ struct clat_config { struct in6_addr local_v6; struct in6_addr pref64; - struct in_addr local_v4; + struct in_addr local_v4; + unsigned pref64_len; }; #endif diff --git a/src/core/ndisc/nm-lndp-ndisc.c b/src/core/ndisc/nm-lndp-ndisc.c index 980bc597bb..69cb733a77 100644 --- a/src/core/ndisc/nm-lndp-ndisc.c +++ b/src/core/ndisc/nm-lndp-ndisc.c @@ -409,12 +409,8 @@ receive_ra(struct ndp *ndp, struct ndp_msg *msg, gpointer user_data) gint64 expiry_msec = _nm_ndisc_lifetime_to_expiry(now_msec, ndp_msg_opt_pref64_lifetime(msg, offset)); - /* Currently, only /96 is supported */ - if (pref64_length != 96) { - _LOGW("Ignored PREF64 for unsupported prefix length: %d (only /96 is supported)", - pref64_length); - continue; - } + /* libndp should only return lengths defined in RFC 8781 */ + nm_assert(NM_IN_SET(pref64_length, 96, 64, 56, 48, 40, 32)); /* Newer RA has more up to date information, prefer it: */ if (!pref64_found) { diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 5c3f92080f..21e196c6d0 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -5689,6 +5689,7 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) clat_config.local_v4.s_addr = self->priv.p->clat_address_4->addr; clat_config.local_v6 = self->priv.p->clat_address_6.address; clat_config.pref64 = *l3cd_pref64; + clat_config.pref64_len = l3cd_pref64_plen; self->priv.p->clat_bpf->bss->config = clat_config; if (self->priv.p->clat_socket < 0) { From b993f1e0d2e92b2c747b635b8d39d8daa612f900 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 17 Dec 2025 18:25:12 +0100 Subject: [PATCH 31/31] bpf: clat: add comment about debugging --- src/core/bpf/clat.bpf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 4f96e1e256..3db57c4204 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -34,6 +34,9 @@ char _license[] SEC("license") = "GPL"; struct clat_config config; #ifdef DEBUG +/* Note: when enabling debugging, you also need to add CAP_PERFMON + * to the CapabilityBoundingSet of the NM systemd unit. The messages + * will be printed to /sys/kernel/debug/tracing/trace_pipe */ #define DBG(fmt, ...) \ ({ \ char ____fmt[] = "clat: " fmt; \