+ def reset_addr_cache(self, ifname):
+ try:
+ linkCache.links[ifname]['addrs'] = {}
+ self.logger.debug('%s: reset address cache' % ifname)
+ except:
+ pass
+
+ def get_ipv6_addrgen_mode(self, ifname):
+ try:
+ return self._cache_get('link', [ifname, 'af_spec', socket.AF_INET6])[Link.IFLA_INET6_ADDR_GEN_MODE]
+ except:
+ # default to 0 (eui64)
+ return 0
+
+ def ipv6_addrgen(self, ifname, addrgen, link_created):
+ try:
+ # IFLA_INET6_ADDR_GEN_MODE values:
+ # 0 = eui64
+ # 1 = none
+ if self._link_cache_get([ifname, 'af_spec', socket.AF_INET6])[Link.IFLA_INET6_ADDR_GEN_MODE] == addrgen:
+ self.logger.debug('%s: ipv6 addrgen already %s' % (ifname, 'off' if addrgen else 'on'))
+ return
+
+ disabled_ipv6 = self.read_file_oneline('/proc/sys/net/ipv6/conf/%s/disable_ipv6' % ifname)
+ if not disabled_ipv6 or int(disabled_ipv6) == 1:
+ self.logger.info('%s: cannot set addrgen: ipv6 is disabled on this device' % ifname)
+ return
+
+ if int(self._link_cache_get([ifname, 'mtu'])) < 1280:
+ self.logger.info('%s: ipv6 addrgen is disabled on device with MTU '
+ 'lower than 1280: cannot set addrgen %s' % (ifname, 'off' if addrgen else 'on'))
+ return
+ except (KeyError, TypeError):
+ self.logger.debug('%s: ipv6 addrgen probably not supported or disabled on this device' % ifname)
+ return
+ except Exception:
+ pass
+
+ if not link_created:
+ # When setting addrgenmode it is necessary to flap the macvlan
+ # device. After flapping the device we also need to re-add all
+ # the user configuration. The best way to add the user config
+ # is to flush our internal address cache
+ self.reset_addr_cache(ifname)
+
+ cmd = 'link set dev %s addrgenmode %s' % (ifname, 'none' if addrgen else 'eui64')