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
This commit is contained in:
Beniamino Galvani 2021-11-05 15:19:09 +01:00
parent bd7b5aa707
commit cd65351d29

View file

@ -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");