From cd65351d29c41755c96349ec1435a85f9e56148e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 5 Nov 2021 15:19:09 +0100 Subject: [PATCH] device: fix _dev_addrgenmode6_set() If addrgenmode=0 is already set, the function should still toggle disable_ipv6 if needed, to stop the generation of temporary addresses. Also, it should store the last set value into 'previous_mode_val'. Fixes-test: @ipv6_keep_external_routes --- src/core/devices/nm-device.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 8314a9771a..0392d54b6a 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -11442,24 +11442,26 @@ _dev_addrgenmode6_set(NMDevice *self, guint8 addr_gen_mode) nm_platform_link_inet6_addrgenmode2str(addr_gen_mode, sbuf, sizeof(sbuf)), (cur_addr_gen_mode == addr_gen_mode) ? " (already set)" : ""); - if (cur_addr_gen_mode == addr_gen_mode) - return; - - r = nm_platform_link_set_inet6_addr_gen_mode(nm_device_get_platform(self), - ifindex, - addr_gen_mode); - if (r < 0) { - _NMLOG_ip(NM_IN_SET(r, -NME_PL_NOT_FOUND, -NME_PL_OPNOTSUPP) ? LOGL_DEBUG : LOGL_WARN, - AF_INET6, - "addrgenmode6: failed to set %s: (%s)", - nm_platform_link_inet6_addrgenmode2str(addr_gen_mode, sbuf, sizeof(sbuf)), - nm_strerror(r)); + if (cur_addr_gen_mode != addr_gen_mode) { + r = nm_platform_link_set_inet6_addr_gen_mode(nm_device_get_platform(self), + ifindex, + addr_gen_mode); + if (r < 0) { + _NMLOG_ip(NM_IN_SET(r, -NME_PL_NOT_FOUND, -NME_PL_OPNOTSUPP) ? LOGL_DEBUG : LOGL_WARN, + AF_INET6, + "addrgenmode6: failed to set %s: (%s)", + nm_platform_link_inet6_addrgenmode2str(addr_gen_mode, sbuf, sizeof(sbuf)), + nm_strerror(r)); + } else { + priv->addrgenmode6_data.previous_mode_val = addr_gen_mode; + } } if (addr_gen_mode == NM_IN6_ADDR_GEN_MODE_NONE) { gs_free char *value = NULL; - /* Bounce IPv6 to ensure the kernel stops IPv6LL address generation */ + /* Bounce IPv6 to ensure the kernel stops IPv6LL address and temporary + * address generation */ _LOGD_ip(AF_INET6, "addrgenmode6: toggle disable_ipv6 sysctl after disabling addr-gen-mode"); value = nm_device_sysctl_ip_conf_get(self, AF_INET6, "disable_ipv6");