From c4cc1f86f12673a6b3679650f18601aebc077b84 Mon Sep 17 00:00:00 2001 From: Julien Fortin Date: Mon, 9 Jul 2018 12:10:17 +0200 Subject: [PATCH] addons: addressvirtual: flush macvlan addr cache when setting addrgenmode 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. [10:12:10] root:~ # ifquery vlan1000 auto vlan1000 iface vlan1000 address 192.168.10.1/24 address fc00:10::1/64 address-virtual 00:00:5e:00:01:01 192.168.10.1/24 fc00:10::1/64 fe80::1/64 vlan-id 1000 vlan-raw-device bridge [10:12:15] root:~ # ifup -a [10:12:24] root:~ # echo $? 0 [10:12:26] root:~ # ifquery vlan1000 -c auto vlan1000 iface vlan1000 [pass] vlan-raw-device bridge [pass] vlan-id 1000 [pass] address 192.168.10.1/24 [pass] address fc00:10::1/64 [pass] address-virtual 00:00:5e:00:01:01 192.168.10.1/24 fc00:10::1/64 fe80::1/64 [pass] [10:12:30] root:~ # ip -6 -o addr show vlan1000-v0 48: vlan1000-v0 inet6 fc00:10::1/64 scope global \ valid_lft forever preferred_lft forever 48: vlan1000-v0 inet6 fe80::200:5eff:fe00:101/64 scope link \ valid_lft forever preferred_lft forever 48: vlan1000-v0 inet6 fe80::1/64 scope link \ valid_lft forever preferred_lft forever [10:12:33] root:~ # [10:12:34] root:~ # [10:12:34] root:~ # ifquery vlan1000 auto vlan1000 iface vlan1000 address 192.168.10.1/24 address fc00:10::1/64 address-virtual 00:00:5e:00:01:01 192.168.10.1/24 fc00:10::1/64 fe80::1/64 address-virtual-ipv6-addrgen off vlan-id 1000 vlan-raw-device bridge [10:12:39] root:~ # [10:12:41] root:~ # ifreload -a -d ... debug: vlan1000: up : running module addressvirtual debug: vlan1000-v0: reset address cache <<<<<<<<<<<<<<<<<<<<<< without this reset ifupdown2 would be in a broken state info: vlan1000: checking route entry ... info: executing /bin/ip route get 192.168.10.0/24 info: netlink: ip link show dev vlan1000 info: netlink: ip link show dev vlan1000-v0 info: vlan1000-v0: netlink: ip link set dev vlan1000-v0 up info: executing /bin/ip -force -batch - [link set dev vlan1000-v0 down link set dev vlan1000-v0 addrgenmode none link set dev vlan1000-v0 up addr add 192.168.10.1/24 dev vlan1000-v0 addr add fc00:10::1/64 dev vlan1000-v0 addr add fe80::1/64 dev vlan1000-v0 ] ... [10:12:50] root:~ # [10:12:51] root:~ # ip -6 -o addr show vlan1000-v0 48: vlan1000-v0 inet6 fc00:10::1/64 scope global \ valid_lft forever preferred_lft forever 48: vlan1000-v0 inet6 fe80::1/64 scope link \ valid_lft forever preferred_lft forever [10:12:53] root:~ # ifquery vlan1000 -c auto vlan1000 iface vlan1000 [pass] vlan-raw-device bridge [pass] vlan-id 1000 [pass] address 192.168.10.1/24 [pass] address fc00:10::1/64 [pass] address-virtual 00:00:5e:00:01:01 192.168.10.1/24 fc00:10::1/64 fe80::1/64 [pass] [10:13:03] root:~ # echo $? 0 [10:13:04] root:~ # Reviewed-by: Roopa Prabhu Signed-off-by: Julien Fortin --- ifupdown2/addons/addressvirtual.py | 7 +++++++ ifupdown2/ifupdownaddons/LinkUtils.py | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/ifupdown2/addons/addressvirtual.py b/ifupdown2/addons/addressvirtual.py index 9c0cb7d..c5a7c2f 100644 --- a/ifupdown2/addons/addressvirtual.py +++ b/ifupdown2/addons/addressvirtual.py @@ -243,6 +243,13 @@ class addressvirtual(moduleBase): except: self.ipcmd.link_add_macvlan(ifaceobj.name, macvlan_ifacename) link_created = True + else: + if should_configure_ipv6_addrgen: + # 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.ipcmd.reset_addr_cache(macvlan_ifacename) # first thing we need to handle vrf enslavement if (ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE): diff --git a/ifupdown2/ifupdownaddons/LinkUtils.py b/ifupdown2/ifupdownaddons/LinkUtils.py index 4c63d0d..6fb42e2 100644 --- a/ifupdown2/ifupdownaddons/LinkUtils.py +++ b/ifupdown2/ifupdownaddons/LinkUtils.py @@ -2638,6 +2638,13 @@ class LinkUtils(utilsBase): except: return [] + def reset_addr_cache(self, ifname): + try: + linkCache.links[ifname]['addrs'] = {} + self.logger.debug('%s: reset address cache' % ifname) + except: + pass + def ipv6_addrgen(self, ifname, addrgen): cmd = 'link set dev %s addrgenmode %s' % (ifname, 'eui64' if addrgen else 'none') -- 2.39.5