From 22a9493f07ee93ecceebb308c91ccdf4676df704 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 14 Jan 2026 18:42:48 +0100 Subject: [PATCH] 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 143ac587c5..a9458566d0 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -4985,7 +4985,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 29b3744974..e5647b5e91 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 0c3664a923..1c4bb2c5a8 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -486,9 +486,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);