device: use subnet when the applied connection has IPv6 method shared

We should use the IPv6 subnet when we have an applied connection
stored on the downlink device, and the IPv6 method should be "shared"
for that applied connection. It does not make sense to register l3cd
and set router config for ndisc instance when the downlink device is
already deactivated.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1880
Resolves: https://issues.redhat.com/browse/RHEL-17350

Signed-off-by: Wen Liang <liangwen12year@gmail.com>
(cherry picked from commit 15901a7489)
(cherry picked from commit 86fbfb3806)
(cherry picked from commit 546dd70178)
(cherry picked from commit 74f2c591ec)
This commit is contained in:
Wen Liang 2024-03-05 13:26:57 -05:00 committed by Beniamino Galvani
parent f407868ee2
commit a4b997b2ec
2 changed files with 22 additions and 15 deletions

View file

@ -224,7 +224,7 @@ controller_update_port_connection(NMDevice *self,
GError **error)
{
NMSettingBondPort *s_port;
int ifindex_port = nm_device_get_ifindex(port);
int ifindex_port = nm_device_get_ifindex(port);
const NMPlatformLink *pllink;
g_return_val_if_fail(ifindex_port > 0, FALSE);

View file

@ -10713,25 +10713,32 @@ nm_device_needs_ip6_subnet(NMDevice *self)
void
nm_device_use_ip6_subnet(NMDevice *self, const NMPlatformIP6Address *subnet)
{
nm_auto_unref_l3cd_init NML3ConfigData *l3cd = NULL;
char sbuf[NM_UTILS_TO_STRING_BUFFER_SIZE];
NMPlatformIP6Address address;
NMConnection *connection = nm_device_get_applied_connection(self);
l3cd = nm_device_create_l3_config_data(self, NM_IP_CONFIG_SOURCE_SHARED);
if (connection) {
NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config(connection);
/* Assign a ::1 address in the subnet for us. */
address = *subnet;
address.address.s6_addr32[3] |= htonl(1);
if (nm_streq(nm_setting_ip_config_get_method(s_ip6), NM_SETTING_IP6_CONFIG_METHOD_SHARED)) {
nm_auto_unref_l3cd_init NML3ConfigData *l3cd = NULL;
char sbuf[NM_UTILS_TO_STRING_BUFFER_SIZE];
NMPlatformIP6Address address;
l3cd = nm_device_create_l3_config_data(self, NM_IP_CONFIG_SOURCE_SHARED);
nm_l3_config_data_add_address_6(l3cd, &address);
/* Assign a ::1 address in the subnet for us. */
address = *subnet;
address.address.s6_addr32[3] |= htonl(1);
_LOGD(LOGD_IP6,
"ipv6-pd: using %s",
nm_platform_ip6_address_to_string(&address, sbuf, sizeof(sbuf)));
nm_l3_config_data_add_address_6(l3cd, &address);
_dev_l3_register_l3cds_set_one(self, L3_CONFIG_DATA_TYPE_PD_6, l3cd, FALSE);
_dev_l3_cfg_commit(self, TRUE);
_dev_ipac6_ndisc_set_router_config(self);
_LOGD(LOGD_IP6,
"ipv6-pd: using %s",
nm_platform_ip6_address_to_string(&address, sbuf, sizeof(sbuf)));
_dev_l3_register_l3cds_set_one(self, L3_CONFIG_DATA_TYPE_PD_6, l3cd, FALSE);
_dev_l3_cfg_commit(self, TRUE);
_dev_ipac6_ndisc_set_router_config(self);
}
}
}
/*