From c228427ae242ae4a9c3c95a3aecaa7c165c8e0c0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 8 Jan 2026 19:09:41 +0100 Subject: [PATCH 01/43] netns: allow defining a ip reservation that wraps around The current implementation returns IP addresses obtained by adding a counter to a base address. For CLAT we want to return all the 8 addresses in the 192.0.0.0/29 range, but not starting from 192.0.0.0 because that looks more like a network address. Slightly tweak the algorithm so that addresses can wrap around. --- src/core/nm-netns.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c index f55d1132d0..2fc1b58eb3 100644 --- a/src/core/nm-netns.c +++ b/src/core/nm-netns.c @@ -574,8 +574,8 @@ notify_watcher: typedef struct { const char *name; guint32 start_addr; /* host byte order */ - guint prefix_len; - guint num_addrs; + guint range_plen; + guint addr_plen; gboolean allow_reuse; } IPReservationTypeDesc; @@ -583,9 +583,9 @@ static const IPReservationTypeDesc ip_reservation_types[_NM_NETNS_IP_RESERVATION [NM_NETNS_IP_RESERVATION_TYPE_SHARED4] = { .name = "shared-ip4", - .start_addr = 0x0a2a0001, /* 10.42.0.1 */ - .prefix_len = 24, - .num_addrs = 256, + .start_addr = 0x0a2a0001, /* 10.42.{0-255}.1/24 */ + .range_plen = 16, + .addr_plen = 24, .allow_reuse = TRUE, }, }; @@ -613,13 +613,23 @@ nm_netns_ip_reservation_get(NMNetns *self, NMNetnsIPReservationType type) g_object_ref(self); } else { guint32 count; + guint32 base_network; + guint32 host_mask; + guint32 increment; nm_assert(g_hash_table_size(*table) > 0); - nm_assert(desc->prefix_len > 0 && desc->prefix_len <= 32); + nm_assert(desc->range_plen < 32); + nm_assert(desc->addr_plen > 0 && desc->addr_plen <= 32); + nm_assert(desc->addr_plen > desc->range_plen); + + base_network = desc->start_addr & ~(0xFFFFFFFFu >> desc->range_plen); + host_mask = 0xFFFFFFFFu >> desc->range_plen; + increment = 1 << (32 - desc->addr_plen); count = 0u; for (;;) { - addr = htonl(desc->start_addr + (count << (32 - desc->prefix_len))); + addr = htonl(base_network + + ((base_network + (desc->start_addr + count * increment)) & host_mask)); res = g_hash_table_lookup(*table, &addr); if (!res) @@ -627,7 +637,7 @@ nm_netns_ip_reservation_get(NMNetns *self, NMNetnsIPReservationType type) count++; - if (count >= desc->num_addrs) { + if (count >= 1 << (desc->addr_plen - desc->range_plen)) { if (!desc->allow_reuse) { _LOGE("%s: ran out of IP addresses", desc->name); return NULL; @@ -637,12 +647,12 @@ nm_netns_ip_reservation_get(NMNetns *self, NMNetnsIPReservationType type) _LOGE("%s: ran out of IP addresses. Reuse %s/%u", desc->name, nm_inet4_ntop(res->addr, buf), - desc->prefix_len); + desc->addr_plen); } else { _LOGD("%s: reserved IP address %s/%u (duplicate)", desc->name, nm_inet4_ntop(res->addr, buf), - desc->prefix_len); + desc->addr_plen); } res->_ref_count++; return res; @@ -663,7 +673,7 @@ nm_netns_ip_reservation_get(NMNetns *self, NMNetnsIPReservationType type) _LOGD("%s: reserved IP address %s/%u", desc->name, nm_inet4_ntop(res->addr, buf), - desc->prefix_len); + desc->addr_plen); return res; } @@ -695,7 +705,7 @@ nm_netns_ip_reservation_release(NMNetnsIPReservation *res) _LOGD("%s: release IP address reservation %s/%u (%d more references held)", desc->name, nm_inet4_ntop(res->addr, buf), - desc->prefix_len, + desc->addr_plen, res->_ref_count); return; } @@ -706,7 +716,7 @@ nm_netns_ip_reservation_release(NMNetnsIPReservation *res) _LOGD("%s: release IP address reservation %s/%u", desc->name, nm_inet4_ntop(res->addr, buf), - desc->prefix_len); + desc->addr_plen); if (g_hash_table_size(*table) == 0) { nm_clear_pointer(table, g_hash_table_unref); From 5150a666cd1947b8481368a985b289180ef63f6c Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 7 Sep 2025 08:41:31 +0200 Subject: [PATCH 02/43] 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 2fc1b58eb3..faae72670d 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 .addr_plen = 24, .allow_reuse = TRUE, }, + [NM_NETNS_IP_RESERVATION_TYPE_CLAT] = + { + .name = "clat", + .start_addr = 0xc0000005, /* 192.0.0.{5-7,0-4}/32 */ + .range_plen = 29, + .addr_plen = 32, + .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..7bcd380927 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 192.0.0.{5,6,7,0,1,2,3,4} */ + 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 + 5) % 8); + 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.7"); + + /* 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 afae4ddaf47f7996ba226199fca813ad40bc9984 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Tue, 4 Feb 2025 22:40:17 -0500 Subject: [PATCH 03/43] 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 83317fed4ebcca58ed781e937d7ad7ec0cff6ca0 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 6 Feb 2025 14:31:33 -0500 Subject: [PATCH 04/43] 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 dd3758dd80828a5b1b66caebb4fb014b19169b1d Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Sun, 12 Jan 2025 14:03:24 -0500 Subject: [PATCH 05/43] 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 b5e7b0651e..940b9f2736 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -182,6 +182,7 @@ Requires(postun): systemd Requires: dbus >= %{dbus_version} Requires: glib2 >= %{glib2_version} Requires: %{name}-libnm%{?_isa} = %{epoch}:%{version}-%{release} +Requires: libbpf %if 0%{?rhel} == 8 # Older libndp versions use select() (rh#1933041). On well known distros, @@ -230,6 +231,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 @@ -284,6 +286,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 fa9c00b595ccd5f1089e2a0ca89eff2847a23eb7 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 15:59:30 -0500 Subject: [PATCH 06/43] 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 6aafd8b138..db06efc936 100644 --- a/meson.build +++ b/meson.build @@ -514,6 +514,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') @@ -1181,5 +1190,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 c015538705..531db6b73c 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 ebb86ed2ddecc7ae6c693ddb2b2d12a840596b98 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 29 Sep 2025 23:11:19 +0200 Subject: [PATCH 07/43] 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 f0e77a43542ced0a3b3a21f7713db1cbf501a566 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 15:59:57 -0500 Subject: [PATCH 08/43] 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 76c18081d6559e19087e0cd9a2e08247b335b9c8 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 8 Sep 2025 21:51:40 +0200 Subject: [PATCH 09/43] 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 7ba5c3801e..b288ed2b6e 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 4409c3d99a2af6579b291770824dd0c1f665f8bf Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 16:00:20 -0500 Subject: [PATCH 10/43] 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 ee1c91bbc819e2d4dafcc89e58e6647f6107a987 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Sep 2025 17:50:44 +0200 Subject: [PATCH 11/43] 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 db06efc936..cb604a5ad4 100644 --- a/meson.build +++ b/meson.build @@ -288,7 +288,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 f11fb6dafcfd97d538febfbc61f3ce41cd6b5c63 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Sep 2025 19:16:58 +0200 Subject: [PATCH 12/43] libnm,nmcli: add a new ipv4.clat property --- .../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 9 + src/libnm-client-impl/libnm.ver | 2 + ...gen-metadata-nm-settings-libnm-core.xml.in | 4 + src/libnm-core-impl/nm-setting-ip4-config.c | 70 +- src/libnm-core-impl/tests/test-general.c | 1 + src/libnm-core-public/nm-setting-ip4-config.h | 27 + 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 ++++++++++-------- 11 files changed, 792 insertions(+), 545 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 b71c6faeda..dc60fdf1f3 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 @@ -3600,6 +3600,7 @@ do_write_construct(NMConnection *connection, } else route_ignore = FALSE; + /* Unsupported properties */ if ((s_ip4 = nm_connection_get_setting_ip4_config(connection))) { if (nm_setting_ip_config_get_dhcp_dscp(s_ip4)) { set_error_unsupported(error, @@ -3618,6 +3619,14 @@ do_write_construct(NMConnection *connection, FALSE); return FALSE; } + if (nm_setting_ip4_config_get_clat(NM_SETTING_IP4_CONFIG(s_ip4)) + != NM_SETTING_IP4_CONFIG_CLAT_DEFAULT) { + set_error_unsupported(error, + connection, + NM_SETTING_IP4_CONFIG_SETTING_NAME "." NM_SETTING_IP4_CONFIG_CLAT, + FALSE); + return FALSE; + } } write_ip4_setting(connection, diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver index 0b01e2e84c..64e2155d60 100644 --- a/src/libnm-client-impl/libnm.ver +++ b/src/libnm-client-impl/libnm.ver @@ -2106,6 +2106,8 @@ global: libnm_1_58_0 { global: + nm_setting_ip4_config_clat_get_type; + nm_setting_ip4_config_get_clat; nm_utils_wifi_6ghz_freqs; nm_utils_wifi_freq_to_band; nm_wifi_band_get_type; 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..0131ba76bf 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 @@ -1652,6 +1652,10 @@ dbus-type="i" gprop-type="NMTernary" /> + dhcp_ipv6_only_preferred; } +/** + * nm_setting_ip4_config_get_clat: + * @setting: the #NMSettingIP4Config + * + * Returns the value in the #NMSettingIP4Config:clat property. + * + * Returns: the CLAT property value + * + * Since: 1.58 + */ +NMSettingIp4ConfigClat +nm_setting_ip4_config_get_clat(NMSettingIP4Config *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_IP4_CONFIG(setting), NM_SETTING_IP4_CONFIG_CLAT_DEFAULT); + + return NM_SETTING_IP4_CONFIG_GET_PRIVATE(setting)->clat; +} + static gboolean verify(NMSetting *setting, NMConnection *connection, GError **error) { @@ -186,12 +206,15 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) if (!strcmp(method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL)) { if (nm_setting_ip_config_get_num_addresses(s_ip) == 0 - && nm_setting_ip_config_get_num_routes(s_ip) == 0) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_MISSING_PROPERTY, - _("method '%s' requires at least an address or a route"), - method); + && nm_setting_ip_config_get_num_routes(s_ip) == 0 + && nm_setting_ip4_config_get_clat(NM_SETTING_IP4_CONFIG(s_ip)) + != NM_SETTING_IP4_CONFIG_CLAT_FORCE) { + g_set_error( + error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("method '%s' requires at least an address, a route, or CLAT set to 'force'"), + method); g_prefix_error(error, "%s.%s: ", NM_SETTING_IP4_CONFIG_SETTING_NAME, @@ -1382,6 +1405,39 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) NMSettingIP4ConfigPrivate, dhcp_ipv6_only_preferred); + /** + * NMSettingIP4Config: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. + * + * When CLAT is enabled, NetworkManager discovers the NAT64 prefix from IPv6 Router Advertisements; + * if a NAT64 prefix is announced, NetworkManager installs a BPF program to perform the stateless + * translation of packets between IPv4 and IPv6. + * + * Setting %NM_SETTING_IP4_CONFIG_CLAT_NO completely disables CLAT. %NM_SETTING_IP4_CONFIG_CLAT_AUTO + * enables CLAT only when the IPv4 method is 'auto' and the device doesn't have a native IPv4 gateway. + * %NM_SETTING_IP4_CONFIG_CLAT_FORCE enables CLAT even if the IPv4 method is not 'auto' and even if + * the device has a native IPv4 gateway. + * + * When set to %NM_SETTING_IP4_CONFIG_CLAT_DEFAULT, the actual value is looked up in the global + * configuration; if not specified it defaults to %NM_SETTING_IP4_CONFIG_CLAT_NO. In the future the + * default fall back value will change to %NM_SETTING_IP4_CONFIG_CLAT_AUTO. + * + * Since: 1.58 + */ + _nm_setting_property_define_direct_enum(properties_override, + obj_properties, + NM_SETTING_IP4_CONFIG_CLAT, + PROP_CLAT, + NM_TYPE_SETTING_IP4_CONFIG_CLAT, + NM_SETTING_IP4_CONFIG_CLAT_DEFAULT, + NM_SETTING_PARAM_NONE, + NULL, + NMSettingIP4ConfigPrivate, + clat); + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); _nm_setting_class_commit(setting_class, diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index d6c991cabb..9143da0435 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -4094,6 +4094,7 @@ test_connection_diff_a_only(void) {NM_SETTING_IP_CONFIG_DHCP_REJECT_SERVERS, NM_SETTING_DIFF_RESULT_IN_A}, {NM_SETTING_IP4_CONFIG_LINK_LOCAL, NM_SETTING_DIFF_RESULT_IN_A}, {NM_SETTING_IP4_CONFIG_DHCP_IPV6_ONLY_PREFERRED, NM_SETTING_DIFF_RESULT_IN_A}, + {NM_SETTING_IP4_CONFIG_CLAT, NM_SETTING_DIFF_RESULT_IN_A}, {NM_SETTING_IP_CONFIG_AUTO_ROUTE_EXT_GW, NM_SETTING_DIFF_RESULT_IN_A}, {NM_SETTING_IP_CONFIG_REPLACE_LOCAL_RULE, NM_SETTING_DIFF_RESULT_IN_A}, {NM_SETTING_IP_CONFIG_DHCP_SEND_RELEASE, NM_SETTING_DIFF_RESULT_IN_A}, diff --git a/src/libnm-core-public/nm-setting-ip4-config.h b/src/libnm-core-public/nm-setting-ip4-config.h index c40a7603f9..941f4e74f6 100644 --- a/src/libnm-core-public/nm-setting-ip4-config.h +++ b/src/libnm-core-public/nm-setting-ip4-config.h @@ -34,6 +34,7 @@ G_BEGIN_DECLS #define NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER "dhcp-vendor-class-identifier" #define NM_SETTING_IP4_CONFIG_DHCP_IPV6_ONLY_PREFERRED "dhcp-ipv6-only-preferred" #define NM_SETTING_IP4_CONFIG_LINK_LOCAL "link-local" +#define NM_SETTING_IP4_CONFIG_CLAT "clat" /** * NM_SETTING_IP4_CONFIG_METHOD_AUTO: @@ -121,6 +122,29 @@ typedef enum { NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES = 1, } NMSettingIP4DhcpIpv6OnlyPreferred; +/** + * NMSettingIp4ConfigClat: + * @NM_SETTING_IP4_CONFIG_CLAT_DEFAULT: use the global default value + * @NM_SETTING_IP4_CONFIG_CLAT_NO: disable CLAT + * @NM_SETTING_IP4_CONFIG_CLAT_AUTO: enable CLAT only when the IPv4 method + * is 'auto' and the device doesn't have a native IPv4 gateway. + * @NM_SETTING_IP4_CONFIG_CLAT_FORCE: enable CLAT even with IPv4 methods + * other than 'auto' and even if the device has a native IPv4 gateway. + * + * #NMSettingIP4ConfigClat 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_IP4_CONFIG_CLAT_DEFAULT = -1, + NM_SETTING_IP4_CONFIG_CLAT_NO = 0, + NM_SETTING_IP4_CONFIG_CLAT_AUTO = 1, + NM_SETTING_IP4_CONFIG_CLAT_FORCE = 2, +} NMSettingIp4ConfigClat; + typedef struct _NMSettingIP4ConfigClass NMSettingIP4ConfigClass; GType nm_setting_ip4_config_get_type(void); @@ -141,6 +165,9 @@ NM_AVAILABLE_IN_1_52 NMSettingIP4DhcpIpv6OnlyPreferred nm_setting_ip4_config_get_dhcp_ipv6_only_preferred(NMSettingIP4Config *setting); +NM_AVAILABLE_IN_1_58 +NMSettingIp4ConfigClat nm_setting_ip4_config_get_clat(NMSettingIP4Config *setting); + G_END_DECLS #endif /* __NM_SETTING_IP4_CONFIG_H__ */ diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c index 6ff45935bc..5ce86e8bcb 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.c +++ b/src/libnmc-setting/nm-meta-setting-desc.c @@ -6601,6 +6601,9 @@ static const NMMetaPropertyInfo *const property_infos_IP4_CONFIG[] = { PROPERTY_INFO_WITH_DESC (NM_SETTING_IP4_CONFIG_DHCP_IPV6_ONLY_PREFERRED, .property_type = &_pt_gobject_enum, ), + PROPERTY_INFO (NM_SETTING_IP4_CONFIG_CLAT, DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_CLAT, + .property_type = &_pt_gobject_enum, + ), PROPERTY_INFO_WITH_DESC (NM_SETTING_IP4_CONFIG_LINK_LOCAL, .property_type = &_pt_gobject_enum, .property_typ_data = DEFINE_PROPERTY_TYP_DATA ( diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 662718726b..1615b98ab5 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -186,6 +186,7 @@ #define DESCRIBE_DOC_NM_SETTING_INFINIBAND_TRANSPORT_MODE N_("The IP-over-InfiniBand transport mode. Either \"datagram\" or \"connected\".") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ADDRESSES N_("A list of IPv4 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"192.168.1.5/24, 10.1.0.5/24\". The addresses are listed in decreasing priority, meaning the first address will be the primary address.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_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_IP4_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. When CLAT is enabled, NetworkManager discovers the NAT64 prefix from IPv6 Router Advertisements; if a NAT64 prefix is announced, NetworkManager installs a BPF program to perform the stateless translation of packets between IPv4 and IPv6. Setting \"no\" (0) completely disables CLAT. \"auto\" (1) enables CLAT only when the IPv4 method is 'auto' and the device doesn't have a native IPv4 gateway. \"force\" (2) enables CLAT even if the IPv4 method is not 'auto' and even if the device has a native IPv4 gateway. 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 default fall back value will change to \"auto\" (1).") #define DESCRIBE_DOC_NM_SETTING_IP4_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_IP4_CONFIG_DHCP_CLIENT_ID N_("A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values \"mac\" and \"perm-mac\" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value \"ipv6-duid\" uses the DUID from \"ipv6.dhcp-duid\" property as an RFC4361-compliant client identifier. As IAID it uses \"ipv4.dhcp-iaid\" and falls back to \"ipv6.dhcp-iaid\" if unset. The special value \"duid\" generates a RFC4361-compliant client identifier based on \"ipv4.dhcp-iaid\" and uses a DUID generated by hashing /etc/machine-id. The special value \"stable\" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the \"${DEVICE}\" or \"${MAC}\" specifier to get a per-device key. The special value \"none\" prevents any client identifier from being sent. Note that this is normally not recommended. If unset, a globally configured default from NetworkManager.conf is used. If still unset, the default depends on the DHCP plugin. The internal dhcp client will default to \"mac\" and the dhclient plugin will try to use one from its config file if present, or won't sent any client-id otherwise.") #define DESCRIBE_DOC_NM_SETTING_IP4_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.") diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index f4ffcb41f0..d9105bfe88 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -1455,6 +1455,10 @@ nmcli-description="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." format="choice (NMSettingIP4DhcpIpv6OnlyPreferred)" values="default (-1), no (0), yes (1)" /> + >> connection.id: con-gsm1 connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL @@ -255,6 +255,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -405,6 +406,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 @@ -585,6 +587,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -735,6 +738,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 @@ -915,6 +919,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1065,6 +1070,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -1142,30 +1148,30 @@ 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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::: :0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: serial:5:8:even:1:100 gsm:no::::0: :::0:no::::auto:no::::0:yes:no:no:no:no: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 @@ -1400,6 +1406,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1534,6 +1541,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1688,6 +1696,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1835,6 +1844,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -2468,6 +2478,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -2602,6 +2613,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -2760,6 +2772,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -2921,6 +2934,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -3590,6 +3604,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -3751,6 +3766,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -3912,6 +3928,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -4059,6 +4076,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -4416,6 +4434,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -4577,6 +4596,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -4738,6 +4758,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -4885,6 +4906,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -5263,6 +5285,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -5440,6 +5463,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -5617,6 +5641,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -5776,6 +5801,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -6185,6 +6211,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -6362,6 +6389,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -6539,6 +6567,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -6698,6 +6727,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -7082,6 +7112,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -7243,6 +7274,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -7404,6 +7436,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -7551,6 +7584,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -7904,6 +7938,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -8065,6 +8100,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -8226,6 +8262,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -8373,6 +8410,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -8655,8 +8693,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8686,8 +8724,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8717,8 +8755,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8744,8 +8782,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8907,8 +8945,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8938,8 +8976,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8969,8 +9007,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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 @@ -8996,8 +9034,8 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-denylist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password accept-all-mac-addresses 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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) -- @@ -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) @@ -9180,9 +9218,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9227,9 +9265,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9274,9 +9312,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9313,9 +9351,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9528,9 +9566,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9575,9 +9613,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9622,9 +9660,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -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 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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -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) @@ -9661,9 +9699,9 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -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 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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -9838,16 +9876,16 @@ 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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:: @@ -9855,16 +9893,16 @@ GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no: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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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:: @@ -9872,31 +9910,31 @@ GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no: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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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,16 +10038,16 @@ 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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:: @@ -10017,16 +10055,16 @@ GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no: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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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:: @@ -10034,31 +10072,31 @@ GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:eth1:activated:no: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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 @@ -10458,6 +10496,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -10619,6 +10658,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -10780,6 +10820,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -10927,6 +10968,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -11488,6 +11530,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -11649,6 +11692,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -11810,6 +11854,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -11957,6 +12002,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -12561,6 +12607,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -12738,6 +12785,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -12915,6 +12963,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -13074,6 +13123,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -13709,6 +13759,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -13886,6 +13937,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -14063,6 +14115,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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) @@ -14222,6 +14275,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -14814,6 +14868,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -14975,6 +15030,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -15136,6 +15192,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -15283,6 +15340,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -15844,6 +15902,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -16005,6 +16064,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -16166,6 +16226,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -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 @@ -16313,6 +16374,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 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 d962f8ed67..d0270bded5 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 @@ -149,6 +149,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -286,6 +287,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -441,6 +443,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -566,6 +569,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -763,6 +767,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -909,6 +914,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1171,6 +1177,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1317,6 +1324,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1463,6 +1471,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1609,6 +1618,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1755,6 +1765,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (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 @@ -1880,6 +1891,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -4568,12 +4580,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 @@ -4641,6 +4653,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -4714,12 +4727,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 @@ -4787,6 +4800,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -4860,12 +4874,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 @@ -4933,6 +4947,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -5006,12 +5021,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 @@ -5079,6 +5094,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -5152,12 +5168,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 @@ -5225,6 +5241,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -5277,12 +5294,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 @@ -5350,6 +5367,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8038,12 +8056,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) @@ -8115,6 +8133,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8197,12 +8216,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) @@ -8274,6 +8293,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8356,12 +8376,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) @@ -8433,6 +8453,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8515,12 +8536,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) @@ -8592,6 +8613,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8674,12 +8696,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) @@ -8751,6 +8773,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -8807,12 +8830,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) @@ -8884,6 +8907,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12180,12 +12204,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) @@ -12257,6 +12281,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12339,12 +12364,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) @@ -12416,6 +12441,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12498,12 +12524,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) @@ -12575,6 +12601,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12657,12 +12684,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) @@ -12734,6 +12761,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12816,12 +12844,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) @@ -12893,6 +12921,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -12949,12 +12978,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) @@ -13026,6 +13055,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -16322,12 +16352,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 @@ -16395,6 +16425,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -16468,12 +16499,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 @@ -16541,6 +16572,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -16614,12 +16646,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 @@ -16687,6 +16719,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -16760,12 +16793,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 @@ -16833,6 +16866,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -16906,12 +16940,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 @@ -16979,6 +17013,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -17031,12 +17066,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 @@ -17104,6 +17139,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -19762,12 +19798,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 @@ -19835,6 +19871,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -19908,12 +19945,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 @@ -19981,6 +20018,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -20054,12 +20092,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 @@ -20127,6 +20165,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -20200,12 +20239,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 @@ -20273,6 +20312,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -20346,12 +20386,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 @@ -20419,6 +20459,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -20471,12 +20512,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 @@ -20544,6 +20585,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -23202,18 +23244,18 @@ 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 -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 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 clat 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) -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) -- @@ -23231,18 +23273,18 @@ 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 -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 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 clat 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) -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) -- @@ -23260,18 +23302,18 @@ 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 -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 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 clat 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) -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) -- @@ -23289,18 +23331,18 @@ 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 -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 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 clat 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) -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) -- @@ -23318,18 +23360,18 @@ 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 -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 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 clat 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) -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) -- @@ -23342,18 +23384,18 @@ 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 -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 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 clat 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) -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) -- @@ -24856,18 +24898,18 @@ 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 -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 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 clat 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) -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) -- @@ -24885,18 +24927,18 @@ 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 -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 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 clat 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) -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) -- @@ -24914,18 +24956,18 @@ 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 -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 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 clat 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) -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) -- @@ -24943,18 +24985,18 @@ 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 -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 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 clat 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) -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) -- @@ -24972,18 +25014,18 @@ 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 -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 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 clat 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) -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) -- @@ -24996,18 +25038,18 @@ 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 -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 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 clat 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) -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) -- @@ -26510,12 +26552,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) @@ -26524,9 +26566,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -26552,12 +26594,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) @@ -26566,9 +26608,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -26594,12 +26636,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) @@ -26608,9 +26650,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -26636,12 +26678,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) @@ -26650,9 +26692,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -26678,12 +26720,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) @@ -26692,9 +26734,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -26710,12 +26752,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) @@ -26724,9 +26766,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -28818,12 +28860,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) @@ -28832,9 +28874,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -28860,12 +28902,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) @@ -28874,9 +28916,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -28902,12 +28944,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) @@ -28916,9 +28958,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -28944,12 +28986,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) @@ -28958,9 +29000,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -28986,12 +29028,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) @@ -29000,9 +29042,9 @@ name id uuid stable-id type in ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) unknown default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -29018,12 +29060,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) @@ -29032,9 +29074,9 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 -- -- -- -- -- -- -1 (default) -1 (default) -1 (default) -- 0 0 -- -1 (default) nieznane default -1 (default) -1 (default) -1 (default) -1 (default) 0x0 (default) -1 -1 -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 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 clat 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) -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 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -31126,15 +31168,15 @@ 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -31142,15 +31184,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -31158,15 +31200,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -31174,15 +31216,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -31190,29 +31232,29 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32064,15 +32106,15 @@ 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32080,15 +32122,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32096,15 +32138,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32112,15 +32154,15 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -32128,29 +32170,29 @@ GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:wlan0:activated:no: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: 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 +ipv4:auto::::0::::-1:0::-1:-1:-1:no:no::::0:yes:-1:-1:::0x0:no:yes:-1:-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: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3::no:0 proxy:none:no:: @@ -33002,12 +33044,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 @@ -33075,6 +33117,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -33148,12 +33191,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 @@ -33221,6 +33264,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -33294,12 +33338,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 @@ -33367,6 +33411,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -33440,12 +33485,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 @@ -33513,6 +33558,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -33586,12 +33632,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 @@ -33659,6 +33705,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -33711,12 +33758,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 @@ -33784,6 +33831,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37002,12 +37050,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 @@ -37075,6 +37123,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37148,12 +37197,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 @@ -37221,6 +37270,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37294,12 +37344,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 @@ -37367,6 +37417,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37440,12 +37491,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 @@ -37513,6 +37564,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37586,12 +37638,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 @@ -37659,6 +37711,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -37711,12 +37764,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 @@ -37784,6 +37837,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41002,12 +41056,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) @@ -41079,6 +41133,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41161,12 +41216,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) @@ -41238,6 +41293,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41320,12 +41376,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) @@ -41397,6 +41453,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41479,12 +41536,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) @@ -41556,6 +41613,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41638,12 +41696,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) @@ -41715,6 +41773,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -41771,12 +41830,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) @@ -41848,6 +41907,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -45704,12 +45764,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) @@ -45781,6 +45841,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -45863,12 +45924,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) @@ -45940,6 +46001,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -46022,12 +46084,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) @@ -46099,6 +46161,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -46181,12 +46244,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) @@ -46258,6 +46321,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -46340,12 +46404,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) @@ -46417,6 +46481,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -46473,12 +46538,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) @@ -46550,6 +46615,7 @@ ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.dhcp-ipv6-only-preferred: -1 (default) +ipv4.clat: -1 (default) ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) @@ -50406,12 +50472,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 @@ -50479,6 +50545,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -50552,12 +50619,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 @@ -50625,6 +50692,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -50698,12 +50766,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 @@ -50771,6 +50839,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -50844,12 +50913,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 @@ -50917,6 +50986,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -50990,12 +51060,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 @@ -51063,6 +51133,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -51115,12 +51186,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 @@ -51188,6 +51259,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -54406,12 +54478,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 @@ -54479,6 +54551,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -54552,12 +54625,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 @@ -54625,6 +54698,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -54698,12 +54772,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 @@ -54771,6 +54845,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -54844,12 +54919,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 @@ -54917,6 +54992,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -54990,12 +55066,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 @@ -55063,6 +55139,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 @@ -55115,12 +55192,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 @@ -55188,6 +55265,7 @@ ipv4.required-timeout:-1 ipv4.dad-timeout:-1 ipv4.dhcp-vendor-class-identifier: ipv4.dhcp-ipv6-only-preferred:-1 +ipv4.clat:-1 ipv4.link-local:0 ipv4.dhcp-reject-servers: ipv4.auto-route-ext-gw:-1 From 75c423f4c82dcea05180ec3bdacee67cdf57b5ca Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 11 Sep 2025 06:08:57 +0200 Subject: [PATCH 13/43] core: honor the ipv4.clat property --- man/NetworkManager.conf.xml | 4 ++++ src/core/devices/nm-device.c | 46 ++++++++++++++++++++++++++++++++---- src/core/nm-l3-config-data.c | 42 ++++++++++++++++++++++++++++++++ src/core/nm-l3-config-data.h | 5 ++++ src/core/nm-l3cfg.c | 33 ++++++++++++++++++++++---- 5 files changed, 122 insertions(+), 8 deletions(-) diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 2832982f3f..52f09300fb 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -954,6 +954,10 @@ ipv6.ip6-privacy=0 ipv4.forwarding Whether to configure IPv4 sysctl interface-specific forwarding. When enabled, the interface will act as a router to forward the IPv4 packet from one interface to another. If left unspecified, "auto" is used, so NetworkManager sets the IPv4 forwarding if any shared connection is active, or it will use the kernel default value otherwise. The "ipv4.forwarding" property is ignored when "ipv4.method" is set to "shared", because forwarding is always enabled in this case. The accepted values are: 0: disabled, 1: enabled, 2: auto, 3: ignored (leave the forwarding unchanged). + + ipv4.clat + If left unspecified, defaults to "no". + ipv4.routed-dns diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index de8edc8064..96b50f882e 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -906,10 +906,11 @@ static void concheck_update_state(NMDevice *self, static void sriov_op_cb(GError *error, gpointer user_data); static void device_ifindex_changed_cb(NMManager *manager, NMDevice *device_changed, NMDevice *self); -static gboolean device_link_changed(gpointer user_data); -static gboolean _get_maybe_ipv6_disabled(NMDevice *self); -static void deactivate_ready(NMDevice *self, NMDeviceStateReason reason); -static void carrier_disconnected_action_cancel(NMDevice *self); +static gboolean device_link_changed(gpointer user_data); +static gboolean _get_maybe_ipv6_disabled(NMDevice *self); +static void deactivate_ready(NMDevice *self, NMDeviceStateReason reason); +static void carrier_disconnected_action_cancel(NMDevice *self); +static const char *nm_device_get_effective_ip_config_method(NMDevice *self, int addr_family); /*****************************************************************************/ @@ -1523,6 +1524,40 @@ _prop_get_connection_dnssec(NMDevice *self, NMConnection *connection) NM_SETTING_CONNECTION_DNSSEC_DEFAULT); } +static NMSettingIp4ConfigClat +_prop_get_ipv4_clat(NMDevice *self) +{ + NMSettingIP4Config *s_ip4 = NULL; + NMSettingIp4ConfigClat clat; + const char *method; + + s_ip4 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP4_CONFIG); + if (!s_ip4) + return NM_SETTING_IP4_CONFIG_CLAT_NO; + + method = nm_device_get_effective_ip_config_method(self, AF_INET); + if (nm_streq(method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) + return NM_SETTING_IP4_CONFIG_CLAT_NO; + + clat = nm_setting_ip4_config_get_clat(s_ip4); + if (clat == NM_SETTING_IP4_CONFIG_CLAT_DEFAULT) { + clat = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA, + NM_CON_DEFAULT("ipv4.clat"), + self, + NM_SETTING_IP4_CONFIG_CLAT_NO, + NM_SETTING_IP4_CONFIG_CLAT_FORCE, + NM_SETTING_IP4_CONFIG_CLAT_NO); + } + + if (clat == NM_SETTING_IP4_CONFIG_CLAT_AUTO + && !nm_streq(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { + /* clat=auto enables CLAT only with method=auto */ + clat = NM_SETTING_IP4_CONFIG_CLAT_NO; + } + + return clat; +} + static NMMptcpFlags _prop_get_connection_mptcp_flags(NMDevice *self, NMConnection *connection) { @@ -3641,6 +3676,7 @@ 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)); + return l3cd; } @@ -11467,6 +11503,8 @@ _dev_ipmanual_start(NMDevice *self) if (_prop_get_ipvx_routed_dns(self, AF_INET6) == NM_SETTING_IP_CONFIG_ROUTED_DNS_YES) { nm_l3_config_data_set_routed_dns(l3cd, AF_INET6, TRUE); } + + nm_l3_config_data_set_clat(l3cd, _prop_get_ipv4_clat(self)); } if (!l3cd) { diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 92a91844c2..dd7892d417 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -125,6 +125,7 @@ struct _NML3ConfigData { NMSettingConnectionDnsOverTls dns_over_tls; NMSettingConnectionDnssec dnssec; NMUtilsIPv6IfaceId ip6_token; + NMSettingIp4ConfigClat clat; NMRefString *network_id; NML3ConfigDatFlags flags; @@ -525,6 +526,13 @@ nm_l3_config_data_log(const NML3ConfigData *self, _L("nis-domain: %s", self->nis_domain->str); } + if (!IS_IPv4) { + if (self->clat == NM_SETTING_IP4_CONFIG_CLAT_AUTO) + _L("clat: auto"); + else if (self->clat == NM_SETTING_IP4_CONFIG_CLAT_FORCE) + _L("clat: force"); + } + if (!IS_IPv4 && self->pref64_valid) { _L("pref64_prefix: %s/%d", nm_utils_inet6_ntop(&self->pref64_prefix, sbuf_addr), @@ -725,6 +733,7 @@ nm_l3_config_data_new(NMDedupMultiIndex *multi_idx, int ifindex, NMIPConfigSourc .flags = NM_L3_CONFIG_DAT_FLAGS_NONE, .metered = NM_TERNARY_DEFAULT, .proxy_browser_only = NM_TERNARY_DEFAULT, + .clat = NM_SETTING_IP4_CONFIG_CLAT_NO, .proxy_method = NM_PROXY_CONFIG_METHOD_UNKNOWN, .route_table_sync_4 = NM_IP_ROUTE_TABLE_SYNC_MODE_NONE, .route_table_sync_6 = NM_IP_ROUTE_TABLE_SYNC_MODE_NONE, @@ -1991,6 +2000,29 @@ 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, NMSettingIp4ConfigClat val) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); + nm_assert(NM_IN_SET(val, + NM_SETTING_IP4_CONFIG_CLAT_NO, + NM_SETTING_IP4_CONFIG_CLAT_FORCE, + NM_SETTING_IP4_CONFIG_CLAT_AUTO)); + + if (self->clat == val) + return FALSE; + self->clat = val; + return TRUE; +} + +NMSettingIp4ConfigClat +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 +2623,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 +3696,14 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (src->routed_dns_6) self->routed_dns_6 = TRUE; + if (self->clat == NM_SETTING_IP4_CONFIG_CLAT_NO) { + /* 'no' always loses to 'force' and 'auto' */ + self->clat = src->clat; + } else if (src->clat == NM_SETTING_IP4_CONFIG_CLAT_FORCE) { + /* 'force' always takes precedence */ + self->clat = src->clat; + } + 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..750960bd35 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -5,6 +5,7 @@ #include "libnm-glib-aux/nm-dedup-multi.h" #include "nm-setting-connection.h" +#include "nm-setting-ip4-config.h" #include "nm-setting-ip6-config.h" #include "libnm-platform/nm-platform.h" #include "libnm-platform/nmp-object.h" @@ -498,6 +499,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, NMSettingIp4ConfigClat val); + +NMSettingIp4ConfigClat 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..5c132c325b 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -4159,8 +4159,11 @@ _l3cfg_update_combined_config(NML3Cfg *self, gboolean merged_changed = FALSE; gboolean commited_changed = FALSE; #if HAVE_CLAT - struct in6_addr pref64; - guint32 pref64_plen; + struct in6_addr pref64; + guint32 pref64_plen; + gboolean clat_enabled = FALSE; + const NMPlatformIP4Route *ip4_route; + NMDedupMultiIter iter; #endif nm_assert(NM_IS_L3CFG(self)); @@ -4260,10 +4263,32 @@ _l3cfg_update_combined_config(NML3Cfg *self, } #if HAVE_CLAT - if (nm_l3_config_data_get_pref64_valid(l3cd)) { + switch (nm_l3_config_data_get_clat(l3cd)) { + case NM_SETTING_IP4_CONFIG_CLAT_FORCE: + clat_enabled = TRUE; + break; + case NM_SETTING_IP4_CONFIG_CLAT_NO: + clat_enabled = FALSE; + break; + case NM_SETTING_IP4_CONFIG_CLAT_AUTO: + clat_enabled = TRUE; + /* disable if there is a native IPv4 gateway */ + nm_l3_config_data_iter_ip4_route_for_each (&iter, l3cd, &ip4_route) { + if (ip4_route->network == INADDR_ANY && ip4_route->plen == 0 + && ip4_route->gateway != INADDR_ANY) + clat_enabled = FALSE; + break; + } + break; + case NM_SETTING_IP4_CONFIG_CLAT_DEFAULT: + nm_assert_not_reached(); + clat_enabled = TRUE; + break; + } + + if (clat_enabled && 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; From b5f534d31d3b23019c47145d3b3ce94497f5487a Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 30 Jan 2025 16:00:45 -0500 Subject: [PATCH 14/43] NEWS: Note CLAT support --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 48f497c6bd..b2bbbe1d4d 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,7 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! * New button in nmtui that allows users to chose from list of available devices when creating connection profiles for physical interfaces (Ethernet, Wi-Fi, etc.). +* Add support for CLAT (464XLAT) using a BPF program. ============================================= NetworkManager-1.56 From 815a7952031241643d626df65a36ca6fbe3c6e18 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 17:48:01 +0200 Subject: [PATCH 15/43] 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 f9cd6e20a5e6ab657d447204e990400e5d36b879 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 18:01:05 +0200 Subject: [PATCH 16/43] bpf: clat: fix other verifier errors When copying the IPv6 addresses via a direct assignement, the compiler generates 32-bit operations that the verifier doesn't like: > 237: (61) r3 = *(u32 *)(r8 +76) ; frame1: R3_w=pkt(r=0) R8=ctx() > ; .saddr = ip6h->saddr, @ clat.bpf.c:124 > 238: (63) *(u32 *)(r10 -64) = r3 > invalid size of register spill Use explicit memcpy() for those. Also, check the packet length before accessing the ICMPv6 header. --- 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 ade4de22f3f545844d043e53b1d7351dac8a6326 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 2 Jan 2026 16:34:53 +0100 Subject: [PATCH 17/43] bpf: clat: remove unused variables --- src/core/bpf/clat.bpf.c | 21 +++++++-------------- src/core/bpf/meson.build | 2 ++ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 478751c8ce..2c338f988f 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -413,19 +413,16 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, struct icmphdr **new_icmp_out, struct hdr_cursor *nh) { - 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 *icmp6 = (void *) (ip6h + 1); + struct icmphdr icmp, *new_icmp; + __u32 mtu, ptr; if ((void *) (icmp6 + 1) > data_end) return -1; - old_icmp6 = *icmp6; - new_icmp = (void *) icmp6; - icmp = *new_icmp; + new_icmp = (void *) icmp6; + icmp = *new_icmp; /* These translations are defined in RFC6145 section 5.2 */ switch (icmp6->icmp6_type) { @@ -501,8 +498,7 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, return -1; } - *new_icmp = icmp; -out: + *new_icmp = icmp; *new_icmp_out = new_icmp; return 0; } @@ -514,15 +510,12 @@ clat_translate_v6(struct __sk_buff *skb, 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; diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build index 200d0c670e..0ba2af16a9 100644 --- a/src/core/bpf/meson.build +++ b/src/core/bpf/meson.build @@ -96,6 +96,7 @@ endif bpf_clang_flags = [ '-std=gnu17', + '-Wunused', '-Wno-compare-distinct-pointer-types', '-fno-stack-protector', '-O2', @@ -107,6 +108,7 @@ bpf_clang_flags = [ bpf_gcc_flags = [ '-std=gnu17', + '-Wunused', '-fno-stack-protector', '-fno-ssa-phiopt', '-O2', From d1351f12191f7a094c23ae99258674aa7495d736 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 22:44:00 +0100 Subject: [PATCH 18/43] 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 2c338f988f..ed87f81409 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 6273f0afbad75087d6fc1d5c9886d5fa64f74d95 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 2 Jan 2026 16:37:03 +0100 Subject: [PATCH 19/43] bpf: clat: add missing "break" statements --- src/core/bpf/clat.bpf.c | 4 ++++ src/core/bpf/meson.build | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index ed87f81409..e4dd169364 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -209,6 +209,7 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) icmp6.icmp6_type = ICMPV6_PARAMPROB; icmp6.icmp6_code = ICMPV6_UNK_NEXTHDR; icmp6.icmp6_pointer = bpf_htonl(offsetof(struct ipv6hdr, nexthdr)); + break; case ICMP_PORT_UNREACH: icmp6.icmp6_code = ICMPV6_PORT_UNREACH; break; @@ -222,11 +223,13 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) if (mtu < 1280) mtu = 1280; icmp6.icmp6_mtu = bpf_htonl(mtu); + break; case ICMP_NET_ANO: case ICMP_HOST_ANO: case ICMP_PKT_FILTERED: case ICMP_PREC_CUTOFF: icmp6.icmp6_code = ICMPV6_ADM_PROHIBITED; + break; default: return -1; } @@ -271,6 +274,7 @@ rewrite_icmp(struct iphdr *iph, struct ipv6hdr *ip6h, struct __sk_buff *skb) default: return -1; } + break; default: return -1; } diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build index 0ba2af16a9..39b978dd75 100644 --- a/src/core/bpf/meson.build +++ b/src/core/bpf/meson.build @@ -97,6 +97,7 @@ endif bpf_clang_flags = [ '-std=gnu17', '-Wunused', + '-Wimplicit-fallthrough', '-Wno-compare-distinct-pointer-types', '-fno-stack-protector', '-O2', @@ -109,6 +110,7 @@ bpf_clang_flags = [ bpf_gcc_flags = [ '-std=gnu17', '-Wunused', + '-Wimplicit-fallthrough', '-fno-stack-protector', '-fno-ssa-phiopt', '-O2', From 3af67616554d611424b834e4f5a0278f546671c5 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 2 Jan 2026 16:41:50 +0100 Subject: [PATCH 20/43] bpf: clat: fix translation of ICMPv6 Parameter Problem According to RFC 6145 5.2, the pointer should be set for code 0, not 1. --- src/core/bpf/clat.bpf.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index e4dd169364..e65edd0fbe 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -468,14 +468,11 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, 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 */ + ptr = bpf_ntohl(icmp6->icmp6_pointer); if (ptr == 0 || ptr == 1) icmp.un.reserved[0] = ptr; else if (ptr == 4 || ptr == 5) @@ -491,6 +488,10 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, else return -1; break; + case 1: + icmp.type = ICMP_DEST_UNREACH; + icmp.code = ICMP_PROT_UNREACH; + break; default: return -1; } From 213e9e33da11b6cb71975fa9b8be9e9cab4e6aaf Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 23 Dec 2025 22:11:29 +0100 Subject: [PATCH 21/43] bpf: clat: use the right endian-conversion function bpf_ntohl() is more correct because the field is in network byte order; but there is no actual change in behavior. --- src/core/bpf/clat.bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index e65edd0fbe..3bec158b68 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -455,7 +455,7 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, icmp.type = ICMP_DEST_UNREACH; icmp.code = ICMP_FRAG_NEEDED; - mtu = bpf_htonl(icmp6->icmp6_mtu) - 20; + mtu = bpf_ntohl(icmp6->icmp6_mtu) - 20; if (mtu > 0xffff) return -1; icmp.un.frag.mtu = bpf_htons(mtu); From 232da41572e3a3f3f853967c35d4ce8d36b0b680 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 16:55:34 +0200 Subject: [PATCH 22/43] bpf: clat: don't explicitly inline functions BPF handles function calls fine these days. Only leave the inline qualifier on very small functions like csum_fold_helper(). --- src/core/bpf/clat.bpf.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 3bec158b68..2419c50cdc 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -82,7 +82,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, @@ -123,7 +123,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, @@ -288,7 +288,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; @@ -402,13 +402,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, @@ -505,7 +505,7 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, return 0; } -static __attribute__((always_inline)) inline int +static int clat_translate_v6(struct __sk_buff *skb, struct hdr_cursor *nh, void *data_end, @@ -637,7 +637,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; @@ -674,7 +674,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 e99a6452be6e01445c76190c37150f070858111e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 16:58:39 +0200 Subject: [PATCH 23/43] 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 2419c50cdc..3a20a6da3f 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -632,6 +632,7 @@ icmp_out: *dst_hdr_out = dst_hdr; + ret = TC_ACT_UNSPEC; out: return ret; } @@ -651,10 +652,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 173dc154a07ebeb8fd8f5928cdcd898d54952559 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 3 Oct 2025 17:05:12 +0200 Subject: [PATCH 24/43] 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 3a20a6da3f..de02014fe1 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -586,34 +586,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 183d68dcbe68f41507de1cb25c584c8298687634 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sat, 25 Oct 2025 10:45:46 +0200 Subject: [PATCH 25/43] 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. --- .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 - src/core/bpf/clat.bpf.c | 218 ++++++++++--------------- 7 files changed, 93 insertions(+), 140 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 940b9f2736..f37444949f 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -287,7 +287,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 cb604a5ad4..913d7431be 100644 --- a/meson.build +++ b/meson.build @@ -519,7 +519,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) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index de02014fe1..64cb0af228 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -26,7 +26,6 @@ #include #include -#include #include "clat.h" @@ -89,7 +88,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; @@ -99,13 +97,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) { @@ -130,8 +128,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, offset; __u32 csum, u_before, u_after; @@ -153,7 +150,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; @@ -289,34 +287,27 @@ 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; - - 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; - 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) { @@ -337,28 +328,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: @@ -380,9 +369,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); @@ -402,24 +394,18 @@ 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 *icmp6 = (void *) (ip6h + 1); - struct icmphdr icmp, *new_icmp; - __u32 mtu, ptr; + struct icmp6hdr *icmp6; + struct icmphdr icmp; + struct icmphdr *new_icmp; + __u32 mtu; + __u32 ptr; - if ((void *) (icmp6 + 1) > data_end) + icmp6 = (void *) (ip6h + 1); + if (icmp6 + 1 > data_end) return -1; new_icmp = (void *) icmp6; @@ -500,40 +486,33 @@ rewrite_icmpv6(struct ipv6hdr *ip6h, return -1; } - *new_icmp = icmp; - *new_icmp_out = new_icmp; + *new_icmp = 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 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 = { + .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 */ @@ -554,35 +533,34 @@ 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; 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; @@ -591,6 +569,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); @@ -602,34 +581,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; @@ -637,8 +588,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); @@ -652,18 +606,22 @@ out: 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; - /* 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); + eth = data; + if (eth + 1 > data_end) + return TC_ACT_OK; + + /* Don't explicitly handle Ethernet types 8021Q and 8021AD + * because we don't expect to receive VLAN-tagged packets + * on the interface. */ + + if (eth->h_proto == bpf_htons(ETH_P_IP) && egress) + return clat_handle_v4(skb); + else if (eth->h_proto == bpf_htons(ETH_P_IPV6) && !egress) + return clat_handle_v6(skb); return TC_ACT_OK; } From 8c83367a49ed659f6702cd7eb49172d8ad177666 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Oct 2025 21:57:02 +0100 Subject: [PATCH 26/43] bpf: clat: improve the code style and consistency Improve the code style and consistency of some functions: - declare only one variable per line - add "const" keyword to read-only function arguments - remove unneeded function arguments - rename variables holding headers on the stack with the "_buf" suffix --- src/core/bpf/clat.bpf.c | 180 ++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 91 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 64cb0af228..e297094f77 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -122,15 +122,19 @@ 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, offset; - __u32 csum, u_before, u_after; + __u16 h_before; + __u16 h_after; + __u16 offset; + __u32 csum; + __u32 u_before; + __u32 u_after; __builtin_memcpy(&ph.saddr, &ip6h->saddr, sizeof(struct in6_addr)); __builtin_memcpy(&ph.daddr, &ip6h->daddr, sizeof(struct in6_addr)); @@ -145,12 +149,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; @@ -168,30 +172,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, *icmp = (void *) (iph + 1); - struct icmp6hdr icmp6, *new_icmp6; - __u32 mtu; + void *data_end = SKB_DATA_END(skb); + 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; - if ((void *) (icmp + 1) > data_end) + 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: @@ -201,32 +209,32 @@ 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)); break; 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); break; 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; break; default: return -1; @@ -235,39 +243,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; @@ -277,8 +285,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 */ @@ -351,7 +359,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; @@ -395,88 +403,92 @@ 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; + 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_ntohl(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; /* Figure 6 in RFC6145 - using if statements b/c of * range at the bottom */ ptr = bpf_ntohl(icmp6->icmp6_pointer); 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; case 1: - icmp.type = ICMP_DEST_UNREACH; - icmp.code = ICMP_PROT_UNREACH; + icmp_buf.type = ICMP_DEST_UNREACH; + icmp_buf.code = ICMP_PROT_UNREACH; break; default: return -1; @@ -486,7 +498,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; } @@ -547,29 +564,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 8414afd9ae5fab578e45276759f787f8b3e5d1d9 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 26 Oct 2025 17:44:12 +0100 Subject: [PATCH 27/43] clat: pass the configuration as a BPF global variable 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 global 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 e297094f77..46e552583f 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -31,21 +31,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, ...) \ @@ -307,25 +293,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; @@ -345,8 +321,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; @@ -402,6 +378,18 @@ csum_fold_helper(__u32 csum) return ~sum; } +static __always_inline bool +v6addr_equal(const struct in6_addr *a, const 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; +} + static int rewrite_icmpv6(struct __sk_buff *skb) { @@ -514,6 +502,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; @@ -523,30 +512,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; @@ -555,7 +535,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 5c132c325b..005339446e 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 { @@ -5589,50 +5585,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) { @@ -5668,17 +5620,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, @@ -5703,10 +5652,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)); @@ -5764,41 +5709,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 6f293055751d769611feab371f7d078f3e931dab Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 15 Dec 2025 19:21:22 +0100 Subject: [PATCH 28/43] 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 46e552583f..a74310e55b 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -279,6 +279,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) @@ -320,12 +484,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; @@ -502,6 +666,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; @@ -519,8 +684,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; @@ -536,7 +701,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 005339446e..560a4874fa 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -5714,6 +5714,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 c93ce654671c4dadad4acb867e82ee4304b06c9a Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 24 Dec 2025 16:40:53 +0100 Subject: [PATCH 29/43] bpf: clat: translate inner headers of incoming ICMPv6 errors ICMPv6 error messages contain a copy of the original packet that caused the error. In a 464XLAT deployment, this inner packet is an IPv6 packet (as translated by the PLAT), while the local host expects to see the original IPv4 packet it generated. Without translation, the local host can't match the error to an active socket. This breaks functionality like Path MTU Discovery (PMTUD), traceroute, and error reporting for connected UDP sockets. This commit implements the translation of the inner headers from IPv6 to IPv4 for incoming ICMPv6 errors. Some implementation notes: - this only handles incoming ICMPv6; outgoing ICMPv4 is not yet implemented, but it seems less important. - the program uses different functions for rewriting the outer and inner header. I tried using recursion but the verifier didn't seem to like it. - after rewriting the inner headers, the ICMP checksum is incrementally updated based on difference of all the individual modifications done to the inner headers. This has the advantage that all the operations are fixed-size. But probably it would be easier and faster to just calculate the checksum from scratch. --- src/core/bpf/clat.bpf.c | 396 ++++++++++++++++++++++++++++++++-------- 1 file changed, 321 insertions(+), 75 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index a74310e55b..c0fcbd2552 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright 2021 Toke Høiland-Jørgensen */ /* Copyright 2025 Mary Strodl */ +/* Copyright 2026 Beniamino Galvani */ /** * This is an implementation of a CLAT in eBPF. BPF is a different environment @@ -67,16 +68,20 @@ struct icmpv6_pseudo { __u8 nh; } __attribute__((packed)); -static void +/* This function must be declared as inline because the BPF calling + * convention only supports up to 5 function arguments. */ +static __always_inline void update_l4_checksum(struct __sk_buff *skb, struct ipv6hdr *ip6h, struct iphdr *iph, - int ip_type, - bool v4to6) + bool v4to6, + bool is_inner, + __u32 *csum_diff) { int flags = BPF_F_PSEUDO_HDR; __u16 offset; __u32 csum; + int ip_type; if (v4to6) { void *from_ptr = &iph->saddr; @@ -84,12 +89,18 @@ update_l4_checksum(struct __sk_buff *skb, csum = bpf_csum_diff(from_ptr, 2 * sizeof(__u32), to_ptr, 2 * sizeof(struct in6_addr), 0); offset = sizeof(struct ethhdr) + sizeof(struct iphdr); + ip_type = ip6h->nexthdr; } 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 = sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + ip_type = iph->protocol; + + if (is_inner) { + offset = offset + sizeof(struct icmp6hdr) + sizeof(struct ipv6hdr); + } } switch (ip_type) { @@ -105,14 +116,20 @@ update_l4_checksum(struct __sk_buff *skb, } bpf_l4_csum_replace(skb, offset, 0, csum, flags); + + if (csum_diff) { + *csum_diff = bpf_csum_diff((__be32 *) &csum, sizeof(csum), 0, 0, *csum_diff); + } } -static void +static __always_inline void update_icmp_checksum(struct __sk_buff *skb, const struct ipv6hdr *ip6h, void *icmp_before, void *icmp_after, - bool v4to6) + bool v4to6, + bool is_inner, + __u32 seed) { struct icmpv6_pseudo ph = {.nh = IPPROTO_ICMPV6, .len = ip6h->payload_len}; __u16 h_before; @@ -138,9 +155,15 @@ update_icmp_checksum(struct __sk_buff *skb, v4to6 ? 0 : sizeof(ph), (__be32 *) &ph, v4to6 ? sizeof(ph) : 0, - 0); + seed); - offset = sizeof(struct ethhdr) + (v4to6 ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) + 2; + if (v4to6) { + offset = sizeof(struct ethhdr) + sizeof(struct iphdr) + 2; + } else { + offset = sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + 2; + if (is_inner) + offset += sizeof(struct icmp6hdr) + sizeof(struct ipv6hdr); + } /* first two bytes of ICMP header, type and code */ h_before = *(__u16 *) icmp_before; @@ -272,7 +295,7 @@ rewrite_icmp(struct __sk_buff *skb, const struct ipv6hdr *ip6h) } *icmp6 = icmp6_buf; - update_icmp_checksum(skb, ip6h, &icmp_buf, icmp6, true); + update_icmp_checksum(skb, ip6h, &icmp_buf, icmp6, true, false, 0); /* FIXME: also need to rewrite IP header embedded in ICMP error */ @@ -505,7 +528,7 @@ clat_handle_v4(struct __sk_buff *skb) break; case IPPROTO_TCP: case IPPROTO_UDP: - update_l4_checksum(skb, &dst_hdr, iph, dst_hdr.nexthdr, true); + update_l4_checksum(skb, &dst_hdr, iph, true, false, NULL); break; default: break; @@ -554,93 +577,102 @@ v6addr_equal(const struct in6_addr *a, const struct in6_addr *b) return true; } -static int -rewrite_icmpv6(struct __sk_buff *skb) +static __always_inline void +translate_ipv6_header(const struct ipv6hdr *ip6, struct iphdr *ip, __be32 saddr, __be32 daddr) { - void *data_end = SKB_DATA_END(skb); - void *data = SKB_DATA(skb); - struct icmp6hdr *icmp6; - 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; + *ip = (struct iphdr) { + .version = 4, + .ihl = 5, + .tos = ip6->priority << 4 | (ip6->flow_lbl[0] >> 4), + .frag_off = bpf_htons(1 << 14), + .ttl = ip6->hop_limit, + .protocol = ip6->nexthdr == IPPROTO_ICMPV6 ? IPPROTO_ICMP : ip6->nexthdr, + .saddr = saddr, + .daddr = daddr, + .tot_len = bpf_htons(bpf_ntohs(ip6->payload_len) + sizeof(struct iphdr)), + }; - icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); - if (icmp6 + 1 > data_end) - return -1; - - icmp6_buf = *icmp6; - icmp = (void *) icmp6; - icmp_buf = *icmp; + ip->check = + csum_fold_helper(bpf_csum_diff((__be32 *) ip, 0, (__be32 *) ip, sizeof(struct iphdr), 0)); +} +static __always_inline int +translate_icmpv6_header(const struct icmp6hdr *icmp6, struct icmphdr *icmp) +{ /* These translations are defined in RFC6145 section 5.2 */ switch (icmp6->icmp6_type) { case ICMPV6_ECHO_REQUEST: - icmp_buf.type = ICMP_ECHO; + icmp->type = ICMP_ECHO; break; case ICMPV6_ECHO_REPLY: - icmp_buf.type = ICMP_ECHOREPLY; + icmp->type = ICMP_ECHOREPLY; break; case ICMPV6_DEST_UNREACH: - icmp_buf.type = ICMP_DEST_UNREACH; + icmp->type = ICMP_DEST_UNREACH; switch (icmp6->icmp6_code) { case ICMPV6_NOROUTE: case ICMPV6_NOT_NEIGHBOUR: case ICMPV6_ADDR_UNREACH: - icmp_buf.code = ICMP_HOST_UNREACH; + icmp->code = ICMP_HOST_UNREACH; break; case ICMPV6_ADM_PROHIBITED: - icmp_buf.code = ICMP_HOST_ANO; + icmp->code = ICMP_HOST_ANO; break; case ICMPV6_PORT_UNREACH: - icmp_buf.code = ICMP_PORT_UNREACH; + icmp->code = ICMP_PORT_UNREACH; break; default: return -1; } break; case ICMPV6_PKT_TOOBIG: - icmp_buf.type = ICMP_DEST_UNREACH; - icmp_buf.code = ICMP_FRAG_NEEDED; + { + __u32 mtu; + + icmp->type = ICMP_DEST_UNREACH; + icmp->code = ICMP_FRAG_NEEDED; mtu = bpf_ntohl(icmp6->icmp6_mtu) - 20; if (mtu > 0xffff) return -1; - icmp_buf.un.frag.mtu = bpf_htons(mtu); + icmp->un.frag.mtu = bpf_htons(mtu); break; + } case ICMPV6_TIME_EXCEED: - icmp_buf.type = ICMP_TIME_EXCEEDED; + icmp->type = ICMP_TIME_EXCEEDED; break; case ICMPV6_PARAMPROB: switch (icmp6->icmp6_code) { case 0: - icmp_buf.type = ICMP_PARAMETERPROB; - icmp_buf.code = 0; + { + __u32 ptr; + icmp->type = ICMP_PARAMETERPROB; + icmp->code = 0; + + ptr = bpf_ntohl(icmp6->icmp6_pointer); /* Figure 6 in RFC6145 - using if statements b/c of * range at the bottom */ - ptr = bpf_ntohl(icmp6->icmp6_pointer); if (ptr == 0 || ptr == 1) - icmp_buf.un.reserved[0] = ptr; + icmp->un.reserved[0] = ptr; else if (ptr == 4 || ptr == 5) - icmp_buf.un.reserved[0] = 2; + icmp->un.reserved[0] = 2; else if (ptr == 6) - icmp_buf.un.reserved[0] = 9; + icmp->un.reserved[0] = 9; else if (ptr == 7) - icmp_buf.un.reserved[0] = 8; + icmp->un.reserved[0] = 8; else if (ptr >= 8 && ptr <= 23) - icmp_buf.un.reserved[0] = 12; + icmp->un.reserved[0] = 12; else if (ptr >= 24 && ptr <= 39) - icmp_buf.un.reserved[0] = 16; + icmp->un.reserved[0] = 16; else return -1; break; + } case 1: - icmp_buf.type = ICMP_DEST_UNREACH; - icmp_buf.code = ICMP_PROT_UNREACH; + icmp->type = ICMP_DEST_UNREACH; + icmp->code = ICMP_PROT_UNREACH; break; default: return -1; @@ -650,11 +682,214 @@ rewrite_icmpv6(struct __sk_buff *skb) return -1; } - *icmp = icmp_buf; - ip6h = data + sizeof(struct ethhdr); - update_icmp_checksum(skb, ip6h, &icmp6_buf, icmp, false); + return 0; +} - /* FIXME: also need to rewrite IP header embedded in ICMP error */ +static int +rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) +{ + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); + struct icmphdr *icmp; + struct icmp6hdr *icmp6; + struct icmphdr icmp_buf; /* buffer for the new ICMPv4 header */ + struct icmp6hdr icmp6_buf; /* copy of the old ICMPv6 header */ + + /* + * icmp6: v + * ------------------------------------------------------------------------- + * | Ethernet | IPv6 | ICMPv6 | IPv6 | ICMPv6 | ... + * ------------------------------------------------------------------------- + */ + + icmp6 = data + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); + if (icmp6 + 1 > data_end) + return -1; + + icmp6_buf = *icmp6; + icmp = (void *) icmp6; + icmp_buf = *icmp; + + if (translate_icmpv6_header(icmp6, &icmp_buf)) + return -1; + + *icmp = icmp_buf; + update_icmp_checksum(skb, + (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + &icmp6_buf, + icmp, + false, + true, + 0); + + if (csum_diff) { + data_end = SKB_DATA_END(skb); + data = SKB_DATA(skb); + + icmp = data + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); + if (icmp + 1 > data_end) + return -1; + + /* Compute the checksum difference between the old ICMPv6 header and the new ICMPv4 one */ + *csum_diff = bpf_csum_diff((__be32 *) &icmp6_buf, + sizeof(struct icmp6hdr), + (__be32 *) &icmp6_buf, + 0, + *csum_diff); + *csum_diff = + bpf_csum_diff((__be32 *) icmp, 0, (__be32 *) icmp, sizeof(struct icmphdr), *csum_diff); + } + return 0; +} + +static int +rewrite_ipv6_inner(struct __sk_buff *skb, struct iphdr *dst_hdr, __u32 *csum_diff) +{ + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); + struct ipv6hdr *ip6h; + __be32 addr4; + struct in6_addr subnet_v6; + + /* + * ip6h: v + * ---------------------------------------------------------------- + * | Ethernet | IPv6 | ICMPv6 | IPv6 | ... + * ---------------------------------------------------------------- + */ + + ip6h = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); + if (ip6h + 1 > data_end) + return -1; + + if (!v6addr_equal(&ip6h->saddr, &config.local_v6)) + return -1; + if (!v6addr_to_v4(&ip6h->daddr, config.pref64_len, &addr4, &subnet_v6)) + return -1; + if (!v6addr_equal(&subnet_v6, &config.pref64)) + return -1; + + translate_ipv6_header(ip6h, dst_hdr, config.local_v4.s_addr, addr4); + + if (csum_diff) { + /* Checksum difference between the old IPv6 header and the new IPv4 one */ + *csum_diff = + bpf_csum_diff((__be32 *) ip6h, sizeof(struct ipv6hdr), (__be32 *) ip6h, 0, *csum_diff); + + *csum_diff = bpf_csum_diff((__be32 *) dst_hdr, + 0, + (__be32 *) dst_hdr, + sizeof(struct iphdr), + *csum_diff); + } + + switch (dst_hdr->protocol) { + case IPPROTO_ICMP: + if (rewrite_icmpv6_inner(skb, csum_diff)) + return -1; + break; + case IPPROTO_TCP: + case IPPROTO_UDP: + update_l4_checksum(skb, ip6h, dst_hdr, false, true, csum_diff); + break; + default: + break; + } + + return 0; +} + +static int +rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) +{ + void *data_end = SKB_DATA_END(skb); + void *data = SKB_DATA(skb); + struct iphdr *ip; + struct icmp6hdr *icmp6; + struct icmphdr *icmp; + struct icmphdr icmp_buf; /* buffer for the new ICMPv4 header */ + struct icmp6hdr icmp6_buf; /* copy of the old ICMPv6 header */ + struct iphdr ip_in_buf; /* buffer for the new inner IPv4 header */ + __u32 csum_diff = 0; + + /* + * icmp6: v + * --------------------------------------------- + * | Ethernet | IPv6 | ICMPv6 | ... + * --------------------------------------------- + */ + + icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + if (icmp6 + 1 > data_end) + return -1; + + icmp6_buf = *icmp6; + icmp = (void *) icmp6; + icmp_buf = *icmp; + + if (translate_icmpv6_header(icmp6, &icmp_buf)) + return -1; + + if (icmp6->icmp6_type >= 128) { + /* ICMPv6 non-error message: only translate the header */ + *icmp = icmp_buf; + update_icmp_checksum(skb, + (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + &icmp6_buf, + icmp, + false, + false, + 0); + return 0; + } + + /* ICMPv6 error messages: we need to rewrite the headers in the inner packet. + * Track in csum_diff the incremental changes to the checksum for the ICMPv4 + * header. */ + + if (rewrite_ipv6_inner(skb, &ip_in_buf, &csum_diff)) + return -1; + + /* The inner IP header shrinks from 40 (IPv6) to 20 (IPv4) bytes; we need to move + * the L4 header and payload. BPF programs don't have an easy way to move a variable + * amount of packet data; use bpf_skb_adjust_room() which can add or remove data + * inside a packet. It doesn't support arbitrary offsets, but we can use BPF_ADJ_ROOM_NET + * to remove the bytes just after the L3 header, and rewrite the ICMP and the inner + * IP headers. + */ + if (bpf_skb_adjust_room(skb, + (int) sizeof(struct iphdr) - (int) sizeof(struct ipv6hdr), + BPF_ADJ_ROOM_NET, + 0)) + return -1; + + *out_length_diff = (int) sizeof(struct iphdr) - (int) sizeof(struct ipv6hdr); + + data_end = SKB_DATA_END(skb); + data = SKB_DATA(skb); + + /* Rewrite the ICMPv6 header with the translated ICMPv4 one */ + icmp = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + if (icmp + 1 > data_end) + return -1; + + *icmp = icmp_buf; + + /* Rewrite the inner IPv6 header with the translated IPv4 one */ + ip = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmphdr); + if (ip + 1 > data_end) + return -1; + + *ip = ip_in_buf; + + /* Update the ICMPv4 checksum according to all the changes in headers */ + update_icmp_checksum(skb, + (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + &icmp6_buf, + icmp, + false, + false, + csum_diff); return 0; } @@ -666,16 +901,20 @@ 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; struct ipv6hdr *ip6h; - struct iphdr dst_hdr = { - .version = 4, - .ihl = 5, - .frag_off = bpf_htons(1 << 14), /* set Don't Fragment bit */ - }; + struct iphdr *iph; + struct iphdr dst_hdr; + struct in6_addr subnet_v6; + __be32 addr4; + int length_diff = 0; + + /* + * ip6h: v + * ------------------------------------ + * | Ethernet | IPv6 | ... + * ------------------------------------ + */ ip6h = data + sizeof(struct ethhdr); if (ip6h + 1 > data_end) @@ -683,10 +922,8 @@ clat_handle_v6(struct __sk_buff *skb) if (!v6addr_equal(&ip6h->daddr, &config.local_v6)) goto out; - - if (!v6addr_to_v4(&ip6h->saddr, config.pref64_len, &saddr4, &subnet_v6)) + if (!v6addr_to_v4(&ip6h->saddr, config.pref64_len, &addr4, &subnet_v6)) goto out; - if (!v6addr_equal(&subnet_v6, &config.pref64)) goto out; @@ -700,29 +937,38 @@ clat_handle_v6(struct __sk_buff *skb) && ip6h->nexthdr != IPPROTO_ICMPV6) goto out; - dst_hdr.daddr = config.local_v4.s_addr; - 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); - dst_hdr.tot_len = bpf_htons(bpf_ntohs(ip6h->payload_len) + sizeof(struct iphdr)); + translate_ipv6_header(ip6h, &dst_hdr, addr4, config.local_v4.s_addr); switch (dst_hdr.protocol) { - case IPPROTO_ICMPV6: - if (rewrite_icmpv6(skb)) + case IPPROTO_ICMP: + if (rewrite_icmpv6(skb, &length_diff)) goto out; - dst_hdr.protocol = IPPROTO_ICMP; break; case IPPROTO_TCP: case IPPROTO_UDP: - update_l4_checksum(skb, ip6h, &dst_hdr, dst_hdr.protocol, false); + update_l4_checksum(skb, ip6h, &dst_hdr, false, false, NULL); break; default: break; } - dst_hdr.check = csum_fold_helper( - bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(dst_hdr), 0)); + /* rewrite_icmpv6() can change the payload length when it rewrites the content of + * an ICMPv6 error packet. Update the length and the checksum. */ + if (length_diff != 0) { + data = SKB_DATA(skb); + data_end = SKB_DATA_END(skb); + + ip6h = data + sizeof(struct ethhdr); + if (ip6h + 1 > data_end) + goto out; + + dst_hdr.tot_len = + bpf_htons(bpf_ntohs(ip6h->payload_len) + length_diff + sizeof(struct iphdr)); + + dst_hdr.check = 0; + dst_hdr.check = csum_fold_helper( + bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(struct iphdr), 0)); + } if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) goto out; From 193e37b4104721fd214e445a3dfa9a43497b86dd Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 17 Dec 2025 18:25:12 +0100 Subject: [PATCH 30/43] bpf: clat: improve debug messages --- src/core/bpf/clat.bpf.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index c0fcbd2552..add180cb01 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -35,6 +35,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; \ @@ -502,8 +505,8 @@ clat_handle_v4(struct __sk_buff *skb) 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); + &iph->saddr, + &iph->daddr); goto out; } @@ -518,7 +521,7 @@ clat_handle_v4(struct __sk_buff *skb) dst_hdr.flow_lbl[0] = iph->tos << 4; 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); + DBG("v4: outgoing pkt to dst %pI4 (%pI6c)\n", &iph->daddr, &dst_hdr.daddr); switch (dst_hdr.nexthdr) { case IPPROTO_ICMP: @@ -934,8 +937,12 @@ clat_handle_v6(struct __sk_buff *skb) /* drop packets with extension headers */ if (ip6h->nexthdr != IPPROTO_TCP && ip6h->nexthdr != IPPROTO_UDP - && ip6h->nexthdr != IPPROTO_ICMPV6) + && ip6h->nexthdr != IPPROTO_ICMPV6) { + DBG("v6: pkt src/dst %pI6c/%pI6c has nexthdr %u, dropping\n", &ip6h->saddr, &ip6h->daddr); goto out; + } + + DBG("v6: incoming pkt from src %pI6c (%pI4)\n", &ip6h->saddr, &addr4); translate_ipv6_header(ip6h, &dst_hdr, addr4, config.local_v4.s_addr); From 13cf12dd6e2a8230da21e9f889b25c4945a18cbb Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 5 Oct 2025 12:02:51 +0200 Subject: [PATCH 31/43] ipv4: enable by default ipv4.dhcp-ipv6-only-preferred when CLAT is on When CLAT is enabled, we want to also enable and honor by default DHCP option 108 (IPv6-only preferred), so that the host can avoid requesting an IPv4 address and go IPv6-only. --- NEWS | 3 ++ man/NetworkManager.conf.xml | 2 +- src/core/devices/nm-device.c | 31 +++++++++++++------ 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, 42 insertions(+), 16 deletions(-) diff --git a/NEWS b/NEWS index b2bbbe1d4d..e38470b041 100644 --- a/NEWS +++ b/NEWS @@ -41,6 +41,9 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! available devices when creating connection profiles for physical interfaces (Ethernet, Wi-Fi, etc.). * 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 ("yes" or "auto") in the connection profile. ============================================= NetworkManager-1.56 diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 52f09300fb..2a14e160fd 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -976,7 +976,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 96b50f882e..d1869a4bbf 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1966,16 +1966,29 @@ _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) - return ipv6_only; + 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); + } - 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 (NM_IN_SET(ipv6_only, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES, + NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_NO)) + return ipv6_only == NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES; + + /* auto */ + if (nm_streq0(nm_device_get_effective_ip_config_method(self, AF_INET6), + NM_SETTING_IP6_CONFIG_METHOD_AUTO) + && _prop_get_ipv4_clat(self) != NM_SETTING_IP4_CONFIG_CLAT_NO) { + return TRUE; + } + + return FALSE; } /** diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index 5f16d6dae9..e9ae5a5348 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -1376,18 +1376,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 + * profile has ipv4.clat set to "yes" or "auto". If these two conditions are + * met, the host can operate in IPv6-only mode and therefore it is safe to + * disable DHCPv4 when 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 941f4e74f6..f42247479f 100644 --- a/src/libnm-core-public/nm-setting-ip4-config.h +++ b/src/libnm-core-public/nm-setting-ip4-config.h @@ -110,6 +110,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. @@ -120,6 +122,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; /** diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 1615b98ab5..0df43b0794 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -194,7 +194,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 profile has ipv4.clat set to \"yes\" or \"auto\". If these two conditions are met, the host can operate in IPv6-only mode and therefore it is safe to disable DHCPv4 when 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 d9105bfe88..7b718c9e1f 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 32/43] 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 d1869a4bbf..b5fe2b15fd 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1956,11 +1956,13 @@ _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) { 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; @@ -1982,6 +1984,8 @@ _prop_get_ipv4_dhcp_ipv6_only_preferred(NMDevice *self) return ipv6_only == NM_SETTING_IP4_DHCP_IPV6_ONLY_PREFERRED_YES; /* auto */ + NM_SET_OUT(out_is_auto, TRUE); + if (nm_streq0(nm_device_get_effective_ip_config_method(self, AF_INET6), NM_SETTING_IP6_CONFIG_METHOD_AUTO) && _prop_get_ipv4_clat(self) != NM_SETTING_IP4_CONFIG_CLAT_NO) { @@ -11826,8 +11830,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); @@ -11846,13 +11851,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 6ec321d21b9b8a27226e9b110cdd1fd39b4f63f5 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 7 Jan 2026 15:05:21 +0100 Subject: [PATCH 33/43] l3cfg: use the tcx attachment for the clat program The TCX attachment type was added in kernel 6.6 (October 2023) and it replaces the Traffic Control (TC) BPF attachment, providing better usability. Convert the l3cfg code to use it. --- src/core/nm-l3cfg.c | 128 ++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 87 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 560a4874fa..60319a4362 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -311,10 +311,11 @@ typedef struct _NML3CfgPrivate { NMPlatformIP6Address clat_address_6_committed; /* 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; + struct clat_bpf *clat_bpf; + struct bpf_link *clat_ingress_link; + struct bpf_link *clat_egress_link; + + int clat_socket; #endif /* HAVE_CLAT */ /* Whether we earlier configured MPTCP endpoints for the interface. */ @@ -5588,31 +5589,26 @@ _l3_commit_one(NML3Cfg *self, 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]; + int err; - 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); + if (self->priv.p->clat_ingress_link) { + err = bpf_link__destroy(self->priv.p->clat_ingress_link); + if (err != 0) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGD("clat: failed to destroy the ingress link"); + } + self->priv.p->clat_ingress_link = NULL; } - bpf_tc_hook_destroy(&hook); + if (self->priv.p->clat_egress_link) { + err = bpf_link__destroy(self->priv.p->clat_egress_link); + if (err != 0) { + libbpf_strerror(err, buf, sizeof(buf)); + _LOGD("clat: failed to destroy the egress link"); + } + self->priv.p->clat_egress_link = NULL; + } nm_clear_pointer(&self->priv.p->clat_bpf, clat_bpf__destroy); } @@ -5628,12 +5624,6 @@ _l3_commit_pref64(NML3Cfg *self, NML3CfgCommitType commit_type) 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, - .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; @@ -5642,71 +5632,35 @@ _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) { _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("clat: failed to open the BPF program: %s", buf); - clat_bpf__destroy(self->priv.p->clat_bpf); - self->priv.p->clat_bpf = NULL; + + self->priv.p->clat_bpf = clat_bpf__open_and_load(); + if (!self->priv.p->clat_bpf) { + libbpf_strerror(errno, buf, sizeof(buf)); + _LOGW("clat: failed to open and load the BPF program: %s", buf); return; } - err = clat_bpf__load(self->priv.p->clat_bpf); - if (err) { - libbpf_strerror(err, buf, sizeof(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; + self->priv.p->clat_ingress_link = + bpf_program__attach_tcx(self->priv.p->clat_bpf->progs.clat_ingress, + self->priv.ifindex, + NULL); + if (!self->priv.p->clat_ingress_link) { + libbpf_strerror(errno, buf, sizeof(buf)); + _LOGW("clat: failed to attach the ingress program: %s", buf); return; } - err = bpf_tc_hook_create(&hook); - if (err && err != -EEXIST) { - libbpf_strerror(err, buf, sizeof(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; + self->priv.p->clat_egress_link = + bpf_program__attach_tcx(self->priv.p->clat_bpf->progs.clat_egress, + self->priv.ifindex, + NULL); + if (!self->priv.p->clat_egress_link) { + libbpf_strerror(errno, buf, sizeof(buf)); + _LOGW("clat: failed to attach the egress program: %s", buf); return; } - attach_ingress.prog_fd = bpf_program__fd(self->priv.p->clat_bpf->progs.clat_ingress); - if (attach_ingress.prog_fd < 0) { - _LOGW("clat: couldn't find the 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("clat: couldn't find the 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("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; - } - 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("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; - } - self->priv.p->clat_attach_egress = attach_egress; + _LOGT("clat: program attached successfully"); } /* Pass configuration to the BPF program */ From 6ac6d4f14e1eedf606b394c7d723077de408f686 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 9 Jan 2026 14:52:28 +0100 Subject: [PATCH 34/43] rpm: disable CLAT on i686 There is no bpftool compiled for i686. --- contrib/fedora/rpm/NetworkManager.spec | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec index f37444949f..7b5d0ab177 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -105,7 +105,12 @@ Release: __RELEASE_VERSION__%{?dist} %else %bcond_with polkit_noauth_group %endif - +%ifarch %{ix86} +# there is no bpftool in i686 +%bcond_with clat +%else +%bcond_without clat +%endif ############################################################################### %global dbus_version 1.9.18 @@ -182,7 +187,10 @@ Requires(postun): systemd Requires: dbus >= %{dbus_version} Requires: glib2 >= %{glib2_version} Requires: %{name}-libnm%{?_isa} = %{epoch}:%{version}-%{release} + +%if %{with clat} Requires: libbpf +%endif %if 0%{?rhel} == 8 # Older libndp versions use select() (rh#1933041). On well known distros, @@ -286,8 +294,10 @@ BuildRequires: firewalld-filesystem BuildRequires: iproute BuildRequires: iproute-tc BuildRequires: libnvme-devel >= 1.5 +%if %{with clat} BuildRequires: libbpf-devel BuildRequires: bpftool +%endif Provides: %{name}-dispatcher%{?_isa} = %{epoch}:%{version}-%{release} @@ -616,6 +626,11 @@ Preferably use nmcli instead. %else -Diwd=false \ %endif +%if %{with clat} + -Dclat=true \ +%else + -Dclat=false \ +%endif %if %{with bluetooth} -Dbluez5_dun=true \ %else From 2888d4c8005d0c08e686b8c4768ac60b13d446db Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 11 Jan 2026 23:11:48 +0100 Subject: [PATCH 35/43] bpf: clat: fix redirect for outgoing packets bpf_redirect_neigh() looks up the next hop in the routing table and then redirects the packet to the given ifindex. The problem is that the routing table might contain a default route with lower metric on a different device; in that case the FIB lookup returns a next hop on the other device, and the packet can't be delivered. Use bpf_redirect() instead; the IPv4 already has the right L2 destination because the IPv4 default route points to the IPv6 gateway. Reported-by: DasSkelett --- src/core/bpf/clat.bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index add180cb01..5da4d7a27d 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -554,7 +554,7 @@ clat_handle_v4(struct __sk_buff *skb) eth->h_proto = bpf_htons(ETH_P_IPV6); *ip6h = dst_hdr; - ret = bpf_redirect_neigh(skb->ifindex, NULL, 0, 0); + ret = bpf_redirect(skb->ifindex, 0); out: return ret; } From 3699558106a76e60f60669b7ec6cc923eed7ab3d Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 12 Jan 2026 23:33:12 +0100 Subject: [PATCH 36/43] bpf: clat: use IPv4 dummy address for ICMPv6 messages with native source When running a traceroute for an IPv4 address, the nodes before the NAT64 gateway return ICMPv6 Time Exceeded messages with a source IPv6 address not belonging to the NAT64 prefix. Such messages would be normally dropped by the CLAT because the source address can't be translated. This behavior complicates troubleshooting. Follow the recommendation of draft-ietf-v6ops-icmpext-xlat-v6only-source-01 and translate the source address to the dummy IPv4 192.0.0.8. --- src/core/bpf/clat.bpf.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 5da4d7a27d..6e83901edf 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -927,8 +927,35 @@ clat_handle_v6(struct __sk_buff *skb) goto out; if (!v6addr_to_v4(&ip6h->saddr, config.pref64_len, &addr4, &subnet_v6)) goto out; - if (!v6addr_equal(&subnet_v6, &config.pref64)) - goto out; + if (!v6addr_equal(&subnet_v6, &config.pref64)) { + struct icmp6hdr *icmp6; + + /* Follow draft-ietf-v6ops-icmpext-xlat-v6only-source-01: + * + * "Whenever a translator translates an ICMPv6 Destination Unreachable, + * ICMPv6 Time Exceeded or ICMPv6 Packet Too Big ([RFC4443]) to the + * corresponding ICMPv4 ([RFC0792]) message, and the IPv6 source + * address in the outermost IPv6 header is untranslatable, the + * translator SHOULD use the dummy IPv4 address (192.0.0.8) as the IPv4 + * source address for the translated packet." + */ + if (ip6h->nexthdr != IPPROTO_ICMPV6) + goto out; + + icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + if (icmp6 + 1 > data_end) + goto out; + + if (icmp6->icmp6_type != ICMPV6_DEST_UNREACH && icmp6->icmp6_type != ICMPV6_TIME_EXCEED + && icmp6->icmp6_type != ICMPV6_PKT_TOOBIG) + goto out; + + DBG("v6: icmpv6 type %u from native address %pI6c, translating src to dummy ipv4\n", + icmp6->icmp6_type, + &ip6h->saddr); + + addr4 = __cpu_to_be32(INADDR_DUMMY); + } /* At this point we know the packet needs translation. If we can't * rewrite it, it should be dropped. From 5cbd79a9ba1108e39cce0fa97e24d0fe5bba73d2 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 14 Jan 2026 18:42:48 +0100 Subject: [PATCH 37/43] core: introduce separate ipv6 mtu values in l3cd The current "ip6_mtu" field of a l3cd is the IPv6 MTU received via RA. Rename it accordingly and introduce another "ip6_mtu_static" field that contains the value set in the ipv6.mtu connection property. It's not used yet, but it will be in a following commit. --- src/core/devices/nm-device.c | 2 +- src/core/ndisc/nm-ndisc.c | 2 +- src/core/nm-l3-config-data.c | 53 ++++++++++++++++++++++++++++-------- src/core/nm-l3-config-data.h | 8 ++++-- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index b5fe2b15fd..ad6602c05a 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -4976,7 +4976,7 @@ _dev_l3_cfg_notify_cb(NML3Cfg *l3cfg, const NML3ConfigNotifyData *notify_data, N if (state >= NM_DEVICE_STATE_IP_CONFIG && state < NM_DEVICE_STATE_DEACTIVATING) { /* FIXME(l3cfg): MTU handling should be moved to l3cfg. */ if (l3cd) - priv->ip6_mtu = nm_l3_config_data_get_ip6_mtu(l3cd); + priv->ip6_mtu = nm_l3_config_data_get_ip6_mtu_ra(l3cd); _commit_mtu(self); } _dev_ipll4_check_fallback(self, l3cd); diff --git a/src/core/ndisc/nm-ndisc.c b/src/core/ndisc/nm-ndisc.c index 311c76eb61..bbd2a14f9a 100644 --- a/src/core/ndisc/nm-ndisc.c +++ b/src/core/ndisc/nm-ndisc.c @@ -222,7 +222,7 @@ nm_ndisc_data_to_l3cd(NMDedupMultiIndex *multi_idx, 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); - nm_l3_config_data_set_ip6_mtu(l3cd, rdata->mtu); + nm_l3_config_data_set_ip6_mtu_ra(l3cd, rdata->mtu); if (token) nm_l3_config_data_set_ip6_token(l3cd, *token); if (network_id) diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index dd7892d417..8d1d6ec926 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -135,7 +135,8 @@ struct _NML3ConfigData { int ndisc_hop_limit_val; guint32 mtu; - guint32 ip6_mtu; + guint32 ip6_mtu_static; /* IPv6 MTU from the connection profile */ + guint32 ip6_mtu_ra; /* IPv6 MTU from Router Advertisement */ guint32 ndisc_reachable_time_msec_val; guint32 ndisc_retrans_timer_msec_val; @@ -397,8 +398,11 @@ nm_l3_config_data_log(const NML3ConfigData *self, : "", !self->is_sealed ? ", not-sealed" : ""); - if (self->mtu != 0 || self->ip6_mtu != 0) { - _L("mtu: %u, ip6-mtu: %u", self->mtu, self->ip6_mtu); + if (self->mtu != 0 || self->ip6_mtu_static != 0 || self->ip6_mtu_ra != 0) { + _L("mtu: %u, ip6-mtu-static: %u, ip6-mtu-ra %u", + self->mtu, + self->ip6_mtu_static, + self->ip6_mtu_ra); } for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { @@ -1917,22 +1921,42 @@ nm_l3_config_data_set_mtu(NML3ConfigData *self, guint32 mtu) } guint32 -nm_l3_config_data_get_ip6_mtu(const NML3ConfigData *self) +nm_l3_config_data_get_ip6_mtu_static(const NML3ConfigData *self) { nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); - return self->ip6_mtu; + return self->ip6_mtu_static; } gboolean -nm_l3_config_data_set_ip6_mtu(NML3ConfigData *self, guint32 ip6_mtu) +nm_l3_config_data_set_ip6_mtu_static(NML3ConfigData *self, guint32 ip6_mtu) { nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); - if (self->ip6_mtu == ip6_mtu) + if (self->ip6_mtu_static == ip6_mtu) return FALSE; - self->ip6_mtu = ip6_mtu; + self->ip6_mtu_static = ip6_mtu; + return TRUE; +} + +guint32 +nm_l3_config_data_get_ip6_mtu_ra(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return self->ip6_mtu_ra; +} + +gboolean +nm_l3_config_data_set_ip6_mtu_ra(NML3ConfigData *self, guint32 ip6_mtu) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); + + if (self->ip6_mtu_ra == ip6_mtu) + return FALSE; + + self->ip6_mtu_ra = ip6_mtu; return TRUE; } @@ -2599,7 +2623,8 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, 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(a->ip6_mtu_static, b->ip6_mtu_static); + NM_CMP_DIRECT(a->ip6_mtu_ra, b->ip6_mtu_ra); NM_CMP_DIRECT_UNSAFE(a->metered, b->metered); NM_CMP_DIRECT_UNSAFE(a->proxy_browser_only, b->proxy_browser_only); NM_CMP_DIRECT_UNSAFE(a->proxy_method, b->proxy_method); @@ -3155,6 +3180,9 @@ _init_from_connection_ip(NML3ConfigData *self, int addr_family, NMConnection *co nm_l3_config_data_set_ip6_privacy( self, nm_setting_ip6_config_get_ip6_privacy(NM_SETTING_IP6_CONFIG(s_ip))); + nm_l3_config_data_set_ip6_mtu_static( + self, + nm_setting_ip6_config_get_mtu(NM_SETTING_IP6_CONFIG(s_ip))); } } @@ -3672,8 +3700,11 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (self->mtu == 0u) self->mtu = src->mtu; - if (self->ip6_mtu == 0u) - self->ip6_mtu = src->ip6_mtu; + if (self->ip6_mtu_static == 0u) + self->ip6_mtu_static = src->ip6_mtu_static; + + if (self->ip6_mtu_ra == 0u) + self->ip6_mtu_ra = src->ip6_mtu_ra; if (NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_CLONE)) { _nm_unused nm_auto_unref_dhcplease NMDhcpLease *dhcp_lease_6 = diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index 750960bd35..5fbc6c7b03 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -487,9 +487,13 @@ guint32 nm_l3_config_data_get_mtu(const NML3ConfigData *self); gboolean nm_l3_config_data_set_mtu(NML3ConfigData *self, guint32 mtu); -guint32 nm_l3_config_data_get_ip6_mtu(const NML3ConfigData *self); +guint32 nm_l3_config_data_get_ip6_mtu_static(const NML3ConfigData *self); -gboolean nm_l3_config_data_set_ip6_mtu(NML3ConfigData *self, guint32 ip6_mtu); +gboolean nm_l3_config_data_set_ip6_mtu_static(NML3ConfigData *self, guint32 ip6_mtu); + +guint32 nm_l3_config_data_get_ip6_mtu_ra(const NML3ConfigData *self); + +gboolean nm_l3_config_data_set_ip6_mtu_ra(NML3ConfigData *self, guint32 ip6_mtu); NMUtilsIPv6IfaceId nm_l3_config_data_get_ip6_token(const NML3ConfigData *self); From 616e18e61b11f02fe6b1ffb4612d773edffdbccb Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 14 Jan 2026 08:40:44 +0100 Subject: [PATCH 38/43] l3cfg: fix CLAT MTU handling The current code takes the IPv6 MTU value from the IPv6 default route. However, that value is always zero because NM doesn't set it usually. Instead, it should use the IPv6 MTU sysctl value. The problem is that at this point NM hasn't written the sysctl yet, and we need some logic to find the actual value. Reported-by: DasSkelett --- src/core/nm-l3cfg.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 60319a4362..c15ffbec64 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -4361,7 +4361,6 @@ _l3cfg_update_combined_config(NML3Cfg *self, 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, @@ -4369,18 +4368,39 @@ _l3cfg_update_combined_config(NML3Cfg *self, .addr_source = NM_IP_CONFIG_SOURCE_CLAT, .plen = 32, }; + const NMPlatformLink *pllink; + guint mtu = 0; + guint val = 0; best_v6_gateway.addr_family = AF_INET6; best_v6_gateway.addr.addr6 = best_v6_route->gateway; - mtu = best_v6_route->mtu; + /* Determine the IPv6 MTU of the interface. Unfortunately, + * the logic to set the MTU is in NMDevice and here we need + * some duplication to find the actual value. + * TODO: move the MTU handling into l3cfg. */ - if (!mtu || mtu > 1500) { - /* v4 Internet MTU */ + /* Get the link MTU */ + pllink = nm_l3cfg_get_pllink(self, TRUE); + if (pllink) + mtu = pllink->mtu; + if (mtu == 0) mtu = 1500; + + /* Update it with the IPv6 MTU value from the connection + * or from RA */ + val = nm_l3_config_data_get_ip6_mtu_static(l3cd); + if (val == 0) { + val = nm_l3_config_data_get_ip6_mtu_ra(l3cd); } - /* 20 for the ipv6 vs ipv4 header plus 8 for a potential - fragmentation extension header */ + if (val != 0 && val < mtu) { + mtu = val; + } + if (mtu < 1280) + mtu = 1280; + + /* Leave 20 additional bytes for the ipv4 -> ipv6 header translation, + * plus 8 for a potential fragmentation extension header */ mtu -= 28; rx.r4 = (NMPlatformIP4Route) { From 2d4171103347fa4905674b5d98305a724a3a8b2c Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 15 Jan 2026 15:17:46 +0100 Subject: [PATCH 39/43] bpf: clat: support the IPv6 fragment header Convert IPv6 fragments into IPv4. The PLAT fragments IPv4 packets larger than the IPv6 MTU size into smaller IPv6 packets. The safest IPv6 MTU value to configure on a PLAT is the minimum IPv6 MTU, 1280. Therefore, we can expect IPv6 fragments to be quite common. --- src/core/bpf/clat.bpf.c | 90 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 6e83901edf..d10a64bceb 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -71,6 +71,13 @@ struct icmpv6_pseudo { __u8 nh; } __attribute__((packed)); +struct ip6_frag { + __u8 nexthdr; + __u8 reserved; + __u16 offset; + __u32 identification; +} __attribute__((packed)); + /* This function must be declared as inline because the BPF calling * convention only supports up to 5 function arguments. */ static __always_inline void @@ -79,6 +86,7 @@ update_l4_checksum(struct __sk_buff *skb, struct iphdr *iph, bool v4to6, bool is_inner, + bool is_v6_fragment, __u32 *csum_diff) { int flags = BPF_F_PSEUDO_HDR; @@ -106,6 +114,10 @@ update_l4_checksum(struct __sk_buff *skb, } } + if (is_v6_fragment) { + offset += sizeof(struct ip6_frag); + } + switch (ip_type) { case IPPROTO_TCP: offset += offsetof(struct tcphdr, check); @@ -497,7 +509,7 @@ clat_handle_v4(struct __sk_buff *skb) /* 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 + * the MF bit, or the fragment 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). @@ -531,7 +543,7 @@ clat_handle_v4(struct __sk_buff *skb) break; case IPPROTO_TCP: case IPPROTO_UDP: - update_l4_checksum(skb, &dst_hdr, iph, true, false, NULL); + update_l4_checksum(skb, &dst_hdr, iph, true, false, false, NULL); break; default: break; @@ -793,7 +805,7 @@ rewrite_ipv6_inner(struct __sk_buff *skb, struct iphdr *dst_hdr, __u32 *csum_dif break; case IPPROTO_TCP: case IPPROTO_UDP: - update_l4_checksum(skb, ip6h, dst_hdr, false, true, csum_diff); + update_l4_checksum(skb, ip6h, dst_hdr, false, true, false, csum_diff); break; default: break; @@ -911,6 +923,7 @@ clat_handle_v6(struct __sk_buff *skb) struct in6_addr subnet_v6; __be32 addr4; int length_diff = 0; + bool fragmented = false; /* * ip6h: v @@ -962,25 +975,74 @@ clat_handle_v6(struct __sk_buff *skb) */ ret = TC_ACT_SHOT; - /* drop packets with extension headers */ - if (ip6h->nexthdr != IPPROTO_TCP && ip6h->nexthdr != IPPROTO_UDP - && ip6h->nexthdr != IPPROTO_ICMPV6) { + if (ip6h->nexthdr == IPPROTO_TCP || ip6h->nexthdr == IPPROTO_UDP + || ip6h->nexthdr == IPPROTO_ICMPV6) { + translate_ipv6_header(ip6h, &dst_hdr, addr4, config.local_v4.s_addr); + DBG("v6: incoming pkt from src %pI6c (%pI4)\n", &ip6h->saddr, &addr4); + } else if (ip6h->nexthdr == IPPROTO_FRAGMENT) { + struct ip6_frag *frag = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + int tot_len; + __u16 offset; + + if (frag + 1 > data_end) + goto out; + + /* Translate into an IPv4 fragmented packet, RFC 6145 5.1.1 */ + + tot_len = bpf_ntohs(ip6h->payload_len) + sizeof(struct iphdr) - sizeof(struct ip6_frag); + + offset = bpf_ntohs(frag->offset); + offset = ((offset & 1) << 13) | /* More Fragments flag */ + (offset >> 3); /* Offset in 8-octet units */ + + dst_hdr = (struct iphdr) { + .version = 4, + .ihl = 5, + .id = bpf_htons(bpf_ntohl(frag->identification) & 0xffff), + .tos = ip6h->priority << 4 | (ip6h->flow_lbl[0] >> 4), + .frag_off = bpf_htons(offset), + .ttl = ip6h->hop_limit, + .protocol = frag->nexthdr == IPPROTO_ICMPV6 ? IPPROTO_ICMP : frag->nexthdr, + .saddr = addr4, + .daddr = config.local_v4.s_addr, + .tot_len = bpf_htons(tot_len), + }; + + dst_hdr.check = csum_fold_helper( + bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(struct iphdr), 0)); + + fragmented = true; + + DBG("v6: incoming fragmented pkt from src %pI6c (%pI4), id 0x%x\n", + &ip6h->saddr, + &addr4, + bpf_ntohs(dst_hdr.id)); + } else { DBG("v6: pkt src/dst %pI6c/%pI6c has nexthdr %u, dropping\n", &ip6h->saddr, &ip6h->daddr); goto out; } - DBG("v6: incoming pkt from src %pI6c (%pI4)\n", &ip6h->saddr, &addr4); - - translate_ipv6_header(ip6h, &dst_hdr, addr4, config.local_v4.s_addr); - switch (dst_hdr.protocol) { case IPPROTO_ICMP: + /* We can't update the checksum of ICMP fragmented packets: ICMPv4 doesn't use + * a pseudo header, while the ICMPv6 pseudo-header includes the total payload + * length, which is not known when parsing the first fragment. This makes it + * impossible for a stateless translator to compute the checksum delta. TCP and + * UDP don't have this problem because both the v4 and v6 pseudo-headers include + * the total length. */ + if (fragmented) + goto out; + if (rewrite_icmpv6(skb, &length_diff)) goto out; break; case IPPROTO_TCP: case IPPROTO_UDP: - update_l4_checksum(skb, ip6h, &dst_hdr, false, false, NULL); + /* Update the L4 headers only for non-fragmented packets or for the first + * fragment, which contains the L4 header. */ + if (!fragmented || (bpf_ntohs(dst_hdr.frag_off) & 0x1FFF) == 0) { + update_l4_checksum(skb, ip6h, &dst_hdr, false, false, fragmented, NULL); + } break; default: break; @@ -1007,6 +1069,12 @@ clat_handle_v6(struct __sk_buff *skb) if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) goto out; + if (fragmented) { + /* Remove the IPv6 fragment header */ + if (bpf_skb_adjust_room(skb, -(__s32) sizeof(struct ip6_frag), BPF_ADJ_ROOM_NET, 0)) + goto out; + } + data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); From 0731d8f3e02878a3002b14c1a198f1749bd06f7d Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 18 Jan 2026 10:12:16 +0100 Subject: [PATCH 40/43] bpf: clat: drop clat_handler() Avoid the additional function call and perform the needed checks directly in clat_handle_v4() and clat_handle_v6(). It will make easier to check that the packet is linear is the next commit. --- src/core/bpf/clat.bpf.c | 43 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index d10a64bceb..f5bd83514c 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -495,6 +495,12 @@ clat_handle_v4(struct __sk_buff *skb) struct iphdr *iph; struct ethhdr *eth; + eth = data; + if (eth + 1 > data_end) + goto out; + if (eth->h_proto != bpf_htons(ETH_P_IP)) + goto out; + iph = data + sizeof(struct ethhdr); if (iph + 1 > data_end) goto out; @@ -925,12 +931,11 @@ clat_handle_v6(struct __sk_buff *skb) int length_diff = 0; bool fragmented = false; - /* - * ip6h: v - * ------------------------------------ - * | Ethernet | IPv6 | ... - * ------------------------------------ - */ + eth = data; + if (eth + 1 > data_end) + goto out; + if (eth->h_proto != bpf_htons(ETH_P_IPV6)) + goto out; ip6h = data + sizeof(struct ethhdr); if (ip6h + 1 > data_end) @@ -1094,38 +1099,16 @@ out: return ret; } -static int -clat_handler(struct __sk_buff *skb, bool egress) -{ - void *data = SKB_DATA(skb); - void *data_end = SKB_DATA_END(skb); - struct ethhdr *eth; - - eth = data; - if (eth + 1 > data_end) - return TC_ACT_OK; - - /* Don't explicitly handle Ethernet types 8021Q and 8021AD - * because we don't expect to receive VLAN-tagged packets - * on the interface. */ - - if (eth->h_proto == bpf_htons(ETH_P_IP) && egress) - return clat_handle_v4(skb); - else if (eth->h_proto == bpf_htons(ETH_P_IPV6) && !egress) - return clat_handle_v6(skb); - - return TC_ACT_OK; -} SEC("tcx/egress") int clat_egress(struct __sk_buff *skb) { - return clat_handler(skb, true); + return clat_handle_v4(skb); } SEC("tcx/ingress") int clat_ingress(struct __sk_buff *skb) { - return clat_handler(skb, false); + return clat_handle_v6(skb); } From 29eb48d7f918054bf962411c750a2636591c8046 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 18 Jan 2026 10:12:26 +0100 Subject: [PATCH 41/43] bpf: clat: ensure data is pulled for direct packet access There is no guarantee that the part of the packet we want to read or write via direct packet access is linear. From the documentation of bpf_skb_pull_data(): For direct packet access, testing that offsets to access are within packet boundaries (test on skb->data_end) is susceptible to fail if offsets are invalid, or if the requested data is in non-linear parts of the skb. On failure the program can just bail out, or in the case of a non-linear buffer, use a helper to make the data available. The bpf_skb_load_bytes() helper is a first solution to access the data. Another one consists in using bpf_skb_pull_data to pull in once the non-linear parts, then retesting and eventually access the data. See: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2107#note_3288979 Reported-by: DasSkelett --- src/core/bpf/clat.bpf.c | 135 ++++++++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 48 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index f5bd83514c..1e43300fbd 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -78,6 +78,36 @@ struct ip6_frag { __u32 identification; } __attribute__((packed)); +#define ensure_header(header, skb, data, data_end, offset) \ + _ensure_header((void **) header, (skb), (data), (data_end), sizeof(**(header)), (offset)) + +/* + * Verifies that the header at offset @offset and with size @size can + * be accessed, and assigns the pointer to @header. In case the data + * is not available, the function tries to pull it. Note that all packet + * pointers must be refreshed after calling this function. + */ +static __always_inline bool +_ensure_header(void **header, + struct __sk_buff *skb, + void **data, + void **data_end, + unsigned size, + unsigned offset) +{ + if (*data + offset + size > *data_end) { + bpf_skb_pull_data(skb, offset + size); + *data = SKB_DATA(skb); + *data_end = SKB_DATA_END(skb); + } + + if (*data + offset + size > *data_end) + return false; + + *header = *data + offset; + return true; +} + /* This function must be declared as inline because the BPF calling * convention only supports up to 5 function arguments. */ static __always_inline void @@ -206,8 +236,7 @@ rewrite_icmp(struct __sk_buff *skb, const struct ipv6hdr *ip6h) struct icmp6hdr *icmp6; __u32 mtu; - icmp = data + sizeof(struct ethhdr) + sizeof(struct iphdr); - if ((icmp + 1) > data_end) + if (!ensure_header(&icmp, skb, &data, &data_end, sizeof(struct ethhdr) + sizeof(struct iphdr))) return -1; icmp_buf = *icmp; @@ -495,14 +524,11 @@ clat_handle_v4(struct __sk_buff *skb) struct iphdr *iph; struct ethhdr *eth; - eth = data; - if (eth + 1 > data_end) - goto out; - if (eth->h_proto != bpf_htons(ETH_P_IP)) + if (!ensure_header(&iph, skb, &data, &data_end, sizeof(struct ethhdr))) goto out; - iph = data + sizeof(struct ethhdr); - if (iph + 1 > data_end) + eth = data; + if (eth->h_proto != bpf_htons(ETH_P_IP)) goto out; if (iph->saddr != config.local_v4.s_addr) @@ -561,14 +587,10 @@ clat_handle_v4(struct __sk_buff *skb) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - eth = data; - if (eth + 1 > data_end) - goto out; - - ip6h = (void *) (eth + 1); - if (ip6h + 1 > data_end) + if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) goto out; + eth = data; eth->h_proto = bpf_htons(ETH_P_IPV6); *ip6h = dst_hdr; @@ -723,8 +745,12 @@ rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) * ------------------------------------------------------------------------- */ - icmp6 = data + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); - if (icmp6 + 1 > data_end) + if (!ensure_header(&icmp6, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + + sizeof(struct icmp6hdr))) return -1; icmp6_buf = *icmp6; @@ -747,8 +773,12 @@ rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) data_end = SKB_DATA_END(skb); data = SKB_DATA(skb); - icmp = data + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); - if (icmp + 1 > data_end) + if (!ensure_header(&icmp, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) + + sizeof(struct icmp6hdr))) return -1; /* Compute the checksum difference between the old ICMPv6 header and the new ICMPv4 one */ @@ -779,8 +809,11 @@ rewrite_ipv6_inner(struct __sk_buff *skb, struct iphdr *dst_hdr, __u32 *csum_dif * ---------------------------------------------------------------- */ - ip6h = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr); - if (ip6h + 1 > data_end) + if (!ensure_header(&ip6h, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr))) return -1; if (!v6addr_equal(&ip6h->saddr, &config.local_v6)) @@ -840,8 +873,11 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) * --------------------------------------------- */ - icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); - if (icmp6 + 1 > data_end) + if (!ensure_header(&icmp6, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) return -1; icmp6_buf = *icmp6; @@ -889,18 +925,18 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) data_end = SKB_DATA_END(skb); data = SKB_DATA(skb); - /* Rewrite the ICMPv6 header with the translated ICMPv4 one */ + if (!ensure_header(&ip, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmphdr))) + return -1; + icmp = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); - if (icmp + 1 > data_end) - return -1; + /* Rewrite the ICMPv6 header with the translated ICMPv4 one */ *icmp = icmp_buf; - /* Rewrite the inner IPv6 header with the translated IPv4 one */ - ip = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmphdr); - if (ip + 1 > data_end) - return -1; - *ip = ip_in_buf; /* Update the ICMPv4 checksum according to all the changes in headers */ @@ -931,14 +967,11 @@ clat_handle_v6(struct __sk_buff *skb) int length_diff = 0; bool fragmented = false; - eth = data; - if (eth + 1 > data_end) - goto out; - if (eth->h_proto != bpf_htons(ETH_P_IPV6)) + if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) goto out; - ip6h = data + sizeof(struct ethhdr); - if (ip6h + 1 > data_end) + eth = data; + if (eth->h_proto != bpf_htons(ETH_P_IPV6)) goto out; if (!v6addr_equal(&ip6h->daddr, &config.local_v6)) @@ -960,10 +993,15 @@ clat_handle_v6(struct __sk_buff *skb) if (ip6h->nexthdr != IPPROTO_ICMPV6) goto out; - icmp6 = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); - if (icmp6 + 1 > data_end) + if (!ensure_header(&icmp6, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) goto out; + ip6h = data + sizeof(struct ethhdr); + if (icmp6->icmp6_type != ICMPV6_DEST_UNREACH && icmp6->icmp6_type != ICMPV6_TIME_EXCEED && icmp6->icmp6_type != ICMPV6_PKT_TOOBIG) goto out; @@ -985,13 +1023,19 @@ clat_handle_v6(struct __sk_buff *skb) translate_ipv6_header(ip6h, &dst_hdr, addr4, config.local_v4.s_addr); DBG("v6: incoming pkt from src %pI6c (%pI4)\n", &ip6h->saddr, &addr4); } else if (ip6h->nexthdr == IPPROTO_FRAGMENT) { - struct ip6_frag *frag = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + struct ip6_frag *frag; int tot_len; __u16 offset; - if (frag + 1 > data_end) + if (!ensure_header(&frag, + skb, + &data, + &data_end, + sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) goto out; + ip6h = data + sizeof(struct ethhdr); + /* Translate into an IPv4 fragmented packet, RFC 6145 5.1.1 */ tot_len = bpf_ntohs(ip6h->payload_len) + sizeof(struct iphdr) - sizeof(struct ip6_frag); @@ -1059,8 +1103,7 @@ clat_handle_v6(struct __sk_buff *skb) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - ip6h = data + sizeof(struct ethhdr); - if (ip6h + 1 > data_end) + if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) goto out; dst_hdr.tot_len = @@ -1083,14 +1126,10 @@ clat_handle_v6(struct __sk_buff *skb) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - eth = data; - if (eth + 1 > data_end) - goto out; - - iph = (void *) (eth + 1); - if (iph + 1 > data_end) + if (!ensure_header(&iph, skb, &data, &data_end, sizeof(struct ethhdr))) goto out; + eth = data; eth->h_proto = bpf_htons(ETH_P_IP); *iph = dst_hdr; From 2c896713b8b24d94969beefa5e2d6ac29f75c044 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Sun, 18 Jan 2026 10:12:39 +0100 Subject: [PATCH 42/43] bpf: clat: add macros for header sizes They make the code more compact and readable. --- src/core/bpf/clat.bpf.c | 131 ++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 84 deletions(-) diff --git a/src/core/bpf/clat.bpf.c b/src/core/bpf/clat.bpf.c index 1e43300fbd..56d09a7176 100644 --- a/src/core/bpf/clat.bpf.c +++ b/src/core/bpf/clat.bpf.c @@ -78,6 +78,13 @@ struct ip6_frag { __u32 identification; } __attribute__((packed)); +#define ETH_H_LEN (sizeof(struct ethhdr)) +#define IP_H_LEN (sizeof(struct iphdr)) +#define IP6_H_LEN (sizeof(struct ipv6hdr)) +#define IP6_FRAG_H_LEN (sizeof(struct ip6_frag)) +#define ICMP_H_LEN (sizeof(struct icmphdr)) +#define ICMP6_H_LEN (sizeof(struct icmp6hdr)) + #define ensure_header(header, skb, data, data_end, offset) \ _ensure_header((void **) header, (skb), (data), (data_end), sizeof(**(header)), (offset)) @@ -129,23 +136,23 @@ 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 = sizeof(struct ethhdr) + sizeof(struct iphdr); + offset = ETH_H_LEN + IP_H_LEN; ip_type = ip6h->nexthdr; } 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 = sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + offset = ETH_H_LEN + IP6_H_LEN; ip_type = iph->protocol; if (is_inner) { - offset = offset + sizeof(struct icmp6hdr) + sizeof(struct ipv6hdr); + offset = offset + ICMP6_H_LEN + IP6_H_LEN; } } if (is_v6_fragment) { - offset += sizeof(struct ip6_frag); + offset += IP6_FRAG_H_LEN; } switch (ip_type) { @@ -203,11 +210,11 @@ update_icmp_checksum(struct __sk_buff *skb, seed); if (v4to6) { - offset = sizeof(struct ethhdr) + sizeof(struct iphdr) + 2; + offset = ETH_H_LEN + IP_H_LEN + 2; } else { - offset = sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + 2; + offset = ETH_H_LEN + IP6_H_LEN + 2; if (is_inner) - offset += sizeof(struct icmp6hdr) + sizeof(struct ipv6hdr); + offset += ICMP6_H_LEN + IP6_H_LEN; } /* first two bytes of ICMP header, type and code */ @@ -236,7 +243,7 @@ rewrite_icmp(struct __sk_buff *skb, const struct ipv6hdr *ip6h) struct icmp6hdr *icmp6; __u32 mtu; - if (!ensure_header(&icmp, skb, &data, &data_end, sizeof(struct ethhdr) + sizeof(struct iphdr))) + if (!ensure_header(&icmp, skb, &data, &data_end, ETH_H_LEN + IP_H_LEN)) return -1; icmp_buf = *icmp; @@ -524,7 +531,7 @@ clat_handle_v4(struct __sk_buff *skb) struct iphdr *iph; struct ethhdr *eth; - if (!ensure_header(&iph, skb, &data, &data_end, sizeof(struct ethhdr))) + if (!ensure_header(&iph, skb, &data, &data_end, ETH_H_LEN)) goto out; eth = data; @@ -563,7 +570,7 @@ clat_handle_v4(struct __sk_buff *skb) /* 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) - sizeof(struct iphdr)); + dst_hdr.payload_len = bpf_htons(bpf_ntohs(iph->tot_len) - IP_H_LEN); DBG("v4: outgoing pkt to dst %pI4 (%pI6c)\n", &iph->daddr, &dst_hdr.daddr); @@ -587,7 +594,7 @@ clat_handle_v4(struct __sk_buff *skb) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) + if (!ensure_header(&ip6h, skb, &data, &data_end, ETH_H_LEN)) goto out; eth = data; @@ -632,11 +639,10 @@ translate_ipv6_header(const struct ipv6hdr *ip6, struct iphdr *ip, __be32 saddr, .protocol = ip6->nexthdr == IPPROTO_ICMPV6 ? IPPROTO_ICMP : ip6->nexthdr, .saddr = saddr, .daddr = daddr, - .tot_len = bpf_htons(bpf_ntohs(ip6->payload_len) + sizeof(struct iphdr)), + .tot_len = bpf_htons(bpf_ntohs(ip6->payload_len) + IP_H_LEN), }; - ip->check = - csum_fold_helper(bpf_csum_diff((__be32 *) ip, 0, (__be32 *) ip, sizeof(struct iphdr), 0)); + ip->check = csum_fold_helper(bpf_csum_diff((__be32 *) ip, 0, (__be32 *) ip, IP_H_LEN, 0)); } static __always_inline int @@ -745,12 +751,7 @@ rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) * ------------------------------------------------------------------------- */ - if (!ensure_header(&icmp6, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) - + sizeof(struct icmp6hdr))) + if (!ensure_header(&icmp6, skb, &data, &data_end, ETH_H_LEN + 2 * IP6_H_LEN + ICMP6_H_LEN)) return -1; icmp6_buf = *icmp6; @@ -762,7 +763,7 @@ rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) *icmp = icmp_buf; update_icmp_checksum(skb, - (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + (struct ipv6hdr *) (data + ETH_H_LEN), &icmp6_buf, icmp, false, @@ -773,22 +774,13 @@ rewrite_icmpv6_inner(struct __sk_buff *skb, __u32 *csum_diff) data_end = SKB_DATA_END(skb); data = SKB_DATA(skb); - if (!ensure_header(&icmp, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + 2 * sizeof(struct ipv6hdr) - + sizeof(struct icmp6hdr))) + if (!ensure_header(&icmp, skb, &data, &data_end, ETH_H_LEN + 2 * IP6_H_LEN + ICMP6_H_LEN)) return -1; /* Compute the checksum difference between the old ICMPv6 header and the new ICMPv4 one */ - *csum_diff = bpf_csum_diff((__be32 *) &icmp6_buf, - sizeof(struct icmp6hdr), - (__be32 *) &icmp6_buf, - 0, - *csum_diff); *csum_diff = - bpf_csum_diff((__be32 *) icmp, 0, (__be32 *) icmp, sizeof(struct icmphdr), *csum_diff); + bpf_csum_diff((__be32 *) &icmp6_buf, ICMP6_H_LEN, (__be32 *) &icmp6_buf, 0, *csum_diff); + *csum_diff = bpf_csum_diff((__be32 *) icmp, 0, (__be32 *) icmp, ICMP_H_LEN, *csum_diff); } return 0; } @@ -809,11 +801,7 @@ rewrite_ipv6_inner(struct __sk_buff *skb, struct iphdr *dst_hdr, __u32 *csum_dif * ---------------------------------------------------------------- */ - if (!ensure_header(&ip6h, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmp6hdr))) + if (!ensure_header(&ip6h, skb, &data, &data_end, ETH_H_LEN + IP6_H_LEN + ICMP6_H_LEN)) return -1; if (!v6addr_equal(&ip6h->saddr, &config.local_v6)) @@ -827,14 +815,9 @@ rewrite_ipv6_inner(struct __sk_buff *skb, struct iphdr *dst_hdr, __u32 *csum_dif if (csum_diff) { /* Checksum difference between the old IPv6 header and the new IPv4 one */ - *csum_diff = - bpf_csum_diff((__be32 *) ip6h, sizeof(struct ipv6hdr), (__be32 *) ip6h, 0, *csum_diff); + *csum_diff = bpf_csum_diff((__be32 *) ip6h, IP6_H_LEN, (__be32 *) ip6h, 0, *csum_diff); - *csum_diff = bpf_csum_diff((__be32 *) dst_hdr, - 0, - (__be32 *) dst_hdr, - sizeof(struct iphdr), - *csum_diff); + *csum_diff = bpf_csum_diff((__be32 *) dst_hdr, 0, (__be32 *) dst_hdr, IP_H_LEN, *csum_diff); } switch (dst_hdr->protocol) { @@ -873,11 +856,7 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) * --------------------------------------------- */ - if (!ensure_header(&icmp6, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) + if (!ensure_header(&icmp6, skb, &data, &data_end, ETH_H_LEN + IP6_H_LEN)) return -1; icmp6_buf = *icmp6; @@ -891,7 +870,7 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) /* ICMPv6 non-error message: only translate the header */ *icmp = icmp_buf; update_icmp_checksum(skb, - (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + (struct ipv6hdr *) (data + ETH_H_LEN), &icmp6_buf, icmp, false, @@ -914,25 +893,18 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) * to remove the bytes just after the L3 header, and rewrite the ICMP and the inner * IP headers. */ - if (bpf_skb_adjust_room(skb, - (int) sizeof(struct iphdr) - (int) sizeof(struct ipv6hdr), - BPF_ADJ_ROOM_NET, - 0)) + if (bpf_skb_adjust_room(skb, (int) IP_H_LEN - (int) IP6_H_LEN, BPF_ADJ_ROOM_NET, 0)) return -1; - *out_length_diff = (int) sizeof(struct iphdr) - (int) sizeof(struct ipv6hdr); + *out_length_diff = (int) IP_H_LEN - (int) IP6_H_LEN; data_end = SKB_DATA_END(skb); data = SKB_DATA(skb); - if (!ensure_header(&ip, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct icmphdr))) + if (!ensure_header(&ip, skb, &data, &data_end, ETH_H_LEN + IP6_H_LEN + ICMP_H_LEN)) return -1; - icmp = data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr); + icmp = data + ETH_H_LEN + IP6_H_LEN; /* Rewrite the ICMPv6 header with the translated ICMPv4 one */ *icmp = icmp_buf; @@ -941,7 +913,7 @@ rewrite_icmpv6(struct __sk_buff *skb, int *out_length_diff) /* Update the ICMPv4 checksum according to all the changes in headers */ update_icmp_checksum(skb, - (struct ipv6hdr *) (data + sizeof(struct ethhdr)), + (struct ipv6hdr *) (data + ETH_H_LEN), &icmp6_buf, icmp, false, @@ -967,7 +939,7 @@ clat_handle_v6(struct __sk_buff *skb) int length_diff = 0; bool fragmented = false; - if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) + if (!ensure_header(&ip6h, skb, &data, &data_end, ETH_H_LEN)) goto out; eth = data; @@ -993,14 +965,10 @@ clat_handle_v6(struct __sk_buff *skb) if (ip6h->nexthdr != IPPROTO_ICMPV6) goto out; - if (!ensure_header(&icmp6, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) + if (!ensure_header(&icmp6, skb, &data, &data_end, ETH_H_LEN + IP6_H_LEN)) goto out; - ip6h = data + sizeof(struct ethhdr); + ip6h = data + ETH_H_LEN; if (icmp6->icmp6_type != ICMPV6_DEST_UNREACH && icmp6->icmp6_type != ICMPV6_TIME_EXCEED && icmp6->icmp6_type != ICMPV6_PKT_TOOBIG) @@ -1027,18 +995,14 @@ clat_handle_v6(struct __sk_buff *skb) int tot_len; __u16 offset; - if (!ensure_header(&frag, - skb, - &data, - &data_end, - sizeof(struct ethhdr) + sizeof(struct ipv6hdr))) + if (!ensure_header(&frag, skb, &data, &data_end, ETH_H_LEN + IP6_H_LEN)) goto out; - ip6h = data + sizeof(struct ethhdr); + ip6h = data + ETH_H_LEN; /* Translate into an IPv4 fragmented packet, RFC 6145 5.1.1 */ - tot_len = bpf_ntohs(ip6h->payload_len) + sizeof(struct iphdr) - sizeof(struct ip6_frag); + tot_len = bpf_ntohs(ip6h->payload_len) + IP_H_LEN - IP6_FRAG_H_LEN; offset = bpf_ntohs(frag->offset); offset = ((offset & 1) << 13) | /* More Fragments flag */ @@ -1058,7 +1022,7 @@ clat_handle_v6(struct __sk_buff *skb) }; dst_hdr.check = csum_fold_helper( - bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(struct iphdr), 0)); + bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, IP_H_LEN, 0)); fragmented = true; @@ -1103,15 +1067,14 @@ clat_handle_v6(struct __sk_buff *skb) data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - if (!ensure_header(&ip6h, skb, &data, &data_end, sizeof(struct ethhdr))) + if (!ensure_header(&ip6h, skb, &data, &data_end, ETH_H_LEN)) goto out; - dst_hdr.tot_len = - bpf_htons(bpf_ntohs(ip6h->payload_len) + length_diff + sizeof(struct iphdr)); + dst_hdr.tot_len = bpf_htons(bpf_ntohs(ip6h->payload_len) + length_diff + IP_H_LEN); dst_hdr.check = 0; dst_hdr.check = csum_fold_helper( - bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, sizeof(struct iphdr), 0)); + bpf_csum_diff((__be32 *) &dst_hdr, 0, (__be32 *) &dst_hdr, IP_H_LEN, 0)); } if (bpf_skb_change_proto(skb, bpf_htons(ETH_P_IP), 0)) @@ -1119,14 +1082,14 @@ clat_handle_v6(struct __sk_buff *skb) if (fragmented) { /* Remove the IPv6 fragment header */ - if (bpf_skb_adjust_room(skb, -(__s32) sizeof(struct ip6_frag), BPF_ADJ_ROOM_NET, 0)) + if (bpf_skb_adjust_room(skb, -(__s32) IP6_FRAG_H_LEN, BPF_ADJ_ROOM_NET, 0)) goto out; } data = SKB_DATA(skb); data_end = SKB_DATA_END(skb); - if (!ensure_header(&iph, skb, &data, &data_end, sizeof(struct ethhdr))) + if (!ensure_header(&iph, skb, &data, &data_end, ETH_H_LEN)) goto out; eth = data; From c32f0fb71f03e10d2fcfb983b2f2d370c49de042 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Mon, 19 Jan 2026 14:41:00 +0100 Subject: [PATCH 43/43] l3cfg: fix the metric of the CLAT default route Previously the metric of the CLAT default route was set to the IPv6 route metric plus 50. Instead: - If there is another non-CLAT default route on the device, use the same metric plus 1, so that native connectivity is always preferred. - Otherwise, use the metric from the "ipv4.route-metric" property of the connection profile. --- src/core/nm-l3cfg.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index c15ffbec64..1230e620d0 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -4291,6 +4291,7 @@ _l3cfg_update_combined_config(NML3Cfg *self, struct in6_addr ip6; const char *network_id; char buf[512]; + guint32 route4_metric = NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP4; /* If we have a valid NAT64 prefix, configure in kernel: * @@ -4353,6 +4354,38 @@ _l3cfg_update_combined_config(NML3Cfg *self, NM_NETNS_IP_RESERVATION_TYPE_CLAT); } + { + const NMPlatformIP4Route *r4; + guint32 metric = 0; + guint32 penalty = 0; + + /* Find the IPv4 metric for the CLAT default route. + * If there is another non-CLAT default route on the device, use the + * same metric + 1, so that native connectivity is always preferred. + * Otherwise, use the metric from the connection profile. + */ + + r4 = NMP_OBJECT_CAST_IP4_ROUTE( + nm_l3_config_data_get_best_default_route(l3cd, AF_INET)); + + if (r4) { + route4_metric = nm_add_clamped_u32(r4->metric, 1u); + } else { + for (i = 0; i < l3_config_datas_len; i++) { + const L3ConfigData *l3cd_data = l3_config_datas_arr[i]; + + if (l3cd_data->default_route_metric_4 + != NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP4) { + metric = l3cd_data->default_route_metric_4; + } + if (l3cd_data->default_route_penalty_4 != 0) { + penalty = l3cd_data->default_route_penalty_4; + } + } + route4_metric = nm_add_clamped_u32(metric, penalty); + } + } + 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)); @@ -4413,10 +4446,8 @@ _l3cfg_update_combined_config(NML3Cfg *self, .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, + .metric = route4_metric, + .mtu = mtu, }; nm_platform_ip_route_normalize(AF_INET, &rx.rx); if (!nm_l3_config_data_lookup_route(l3cd, AF_INET, &rx.rx)) {