diff options
| author | Jernej Jakob <jernej.jakob@gmail.com> | 2020-04-22 17:08:44 +0200 | 
|---|---|---|
| committer | Jernej Jakob <jernej.jakob@gmail.com> | 2020-04-23 15:01:06 +0200 | 
| commit | 0b6eb4f601dd9717b478ff38e8d4ab4fcd878b15 (patch) | |
| tree | db94632df8dab84d02d3946f60c65afe63a40a3e | |
| parent | 2703915afb9a6bf266adc8834ab01ef721c03424 (diff) | |
| download | vyos-1x-0b6eb4f601dd9717b478ff38e8d4ab4fcd878b15.tar.gz vyos-1x-0b6eb4f601dd9717b478ff38e8d4ab4fcd878b15.zip  | |
interfaces: T2362: split set_ipv6_eui64_address into add and del functions
| -rw-r--r-- | python/vyos/ifconfig/interface.py | 41 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-bonding.py | 23 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-bridge.py | 23 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-ethernet.py | 23 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-l2tpv3.py | 12 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-openvpn.py | 26 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-pseudo-ethernet.py | 23 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-vxlan.py | 12 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-wireless.py | 23 | 
9 files changed, 141 insertions, 65 deletions
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index 62c30dbf7..a156eddd9 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -1,4 +1,4 @@ -# Copyright 2019 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2019-2020 VyOS maintainers and contributors <maintainers@vyos.io>  #  # This library is free software; you can redistribute it and/or  # modify it under the terms of the GNU Lesser General Public @@ -419,39 +419,28 @@ class Interface(Control):          """          return self.set_interface('ipv6_autoconf', autoconf) -    def set_ipv6_eui64_address(self, prefix): +    def add_ipv6_eui64_address(self, prefix):          """          Extended Unique Identifier (EUI), as per RFC2373, allows a host to -        assign iteslf a unique IPv6 address based on a given IPv6 prefix. +        assign itself a unique IPv6 address based on a given IPv6 prefix. -        If prefix is passed address is assigned, if prefix is '' address is -        removed from interface. +        Calculate the EUI64 from the interface's MAC, then assign it +        with the given prefix to the interface.          """ -        # if prefix is an empty string convert it to None so mac2eui64 works -        # as expected -        if not prefix: -            prefix = None          eui64 = mac2eui64(self.get_mac(), prefix) +        prefixlen = prefix.split('/')[1] +        self.add_addr(f'{eui64}/{prefixlen}') -        if not prefix: -            # if prefix is empty - thus removed - we need to walk through all -            # interface IPv6 addresses and find the one with the calculated -            # EUI-64 identifier. The address is then removed -            for addr in self.get_addr(): -                addr_wo_prefix = addr.split('/')[0] -                if is_ipv6(addr_wo_prefix): -                    if eui64 in IPv6Address(addr_wo_prefix).exploded: -                        self.del_addr(addr) - -            return None +    def del_ipv6_eui64_address(self, prefix): +        """ +        Delete the address based on the interface's MAC-based EUI64 +        combined with the prefix address. +        """ +        eui64 = mac2eui64(self.get_mac(), prefix) +        prefixlen = prefix.split('/')[1] +        self.del_addr(f'{eui64}/{prefixlen}') -        # calculate and add EUI-64 IPv6 address -        if IPv6Network(prefix): -            # we also need to take the subnet length into account -            prefix = prefix.split('/')[1] -            eui64 = f'{eui64}/{prefix}' -            self.add_addr(eui64 )      def set_ipv6_forwarding(self, forwarding):          """ diff --git a/src/conf_mode/interfaces-bonding.py b/src/conf_mode/interfaces-bonding.py index 380457772..267a78870 100755 --- a/src/conf_mode/interfaces-bonding.py +++ b/src/conf_mode/interfaces-bonding.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -52,7 +52,8 @@ default_config_data = {      'ip_proxy_arp': 0,      'ip_proxy_arp_pvlan': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'is_bridge_member': False, @@ -204,7 +205,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        bond['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        bond['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in bond['ipv6_eui64_prefix']: +        bond['ipv6_eui64_prefix_remove'].append(eff_addr)      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -434,17 +441,23 @@ def apply(bond):          b.set_proxy_arp_pvlan(bond['ip_proxy_arp_pvlan'])          # IPv6 address autoconfiguration          b.set_ipv6_autoconf(bond['ipv6_autoconf']) -        # IPv6 EUI-based address -        b.set_ipv6_eui64_address(bond['ipv6_eui64_prefix'])          # IPv6 forwarding          b.set_ipv6_forwarding(bond['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries          b.set_ipv6_dad_messages(bond['ipv6_dup_addr_detect']) +        # Delete old IPv6 EUI64 addresses before changing MAC +        for addr in bond['ipv6_eui64_prefix_remove']: +            b.del_ipv6_eui64_address(addr) +          # Change interface MAC address          if bond['mac']:              b.set_mac(bond['mac']) +        # Add IPv6 EUI-based addresses +        for addr in bond['ipv6_eui64_prefix']: +            b.add_ipv6_eui64_address(addr) +          # Maximum Transmission Unit (MTU)          b.set_mtu(bond['mtu']) diff --git a/src/conf_mode/interfaces-bridge.py b/src/conf_mode/interfaces-bridge.py index 93c6db97e..8826c6996 100755 --- a/src/conf_mode/interfaces-bridge.py +++ b/src/conf_mode/interfaces-bridge.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -47,7 +47,8 @@ default_config_data = {      'ip_enable_arp_announce': 0,      'ip_enable_arp_ignore': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'igmp_querier': 0, @@ -162,7 +163,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        bridge['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        bridge['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in bridge['ipv6_eui64_prefix']: +        bridge['ipv6_eui64_prefix_remove'].append(eff_addr)      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -283,8 +290,6 @@ def apply(bridge):          br.set_arp_ignore(bridge['ip_enable_arp_ignore'])          # IPv6 address autoconfiguration          br.set_ipv6_autoconf(bridge['ipv6_autoconf']) -        # IPv6 EUI-based address -        br.set_ipv6_eui64_address(bridge['ipv6_eui64_prefix'])          # IPv6 forwarding          br.set_ipv6_forwarding(bridge['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries @@ -318,10 +323,18 @@ def apply(bridge):          # assign/remove VRF          br.set_vrf(bridge['vrf']) +        # Delete old IPv6 EUI64 addresses before changing MAC +        for addr in bridge['ipv6_eui64_prefix_remove']: +            br.del_ipv6_eui64_address(addr) +          # Change interface MAC address          if bridge['mac']:              br.set_mac(bridge['mac']) +        # Add IPv6 EUI-based addresses +        for addr in bridge['ipv6_eui64_prefix']: +            br.add_ipv6_eui64_address(addr) +          # remove interface from bridge          for intf in bridge['member_remove']:              br.del_port(intf) diff --git a/src/conf_mode/interfaces-ethernet.py b/src/conf_mode/interfaces-ethernet.py index 5a977d797..7f4762e84 100755 --- a/src/conf_mode/interfaces-ethernet.py +++ b/src/conf_mode/interfaces-ethernet.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -49,7 +49,8 @@ default_config_data = {      'ip_proxy_arp': 0,      'ip_proxy_arp_pvlan': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'intf': '', @@ -177,7 +178,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        eth['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        eth['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in eth['ipv6_eui64_prefix']: +        eth['ipv6_eui64_prefix_remove'].append(eff_addr)      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -336,13 +343,15 @@ def apply(eth):          e.set_proxy_arp_pvlan(eth['ip_proxy_arp_pvlan'])          # IPv6 address autoconfiguration          e.set_ipv6_autoconf(eth['ipv6_autoconf']) -        # IPv6 EUI-based address -        e.set_ipv6_eui64_address(eth['ipv6_eui64_prefix'])          # IPv6 forwarding          e.set_ipv6_forwarding(eth['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries          e.set_ipv6_dad_messages(eth['ipv6_dup_addr_detect']) +        # Delete old IPv6 EUI64 addresses before changing MAC +        for addr in eth['ipv6_eui64_prefix_remove']: +            e.del_ipv6_eui64_address(addr) +          # Change interface MAC address - re-set to real hardware address (hw-id)          # if custom mac is removed          if eth['mac']: @@ -350,6 +359,10 @@ def apply(eth):          elif eth['hw_id']:              e.set_mac(eth['hw_id']) +        # Add IPv6 EUI-based addresses +        for addr in eth['ipv6_eui64_prefix']: +            e.add_ipv6_eui64_address(addr) +          # Maximum Transmission Unit (MTU)          e.set_mtu(eth['mtu']) diff --git a/src/conf_mode/interfaces-l2tpv3.py b/src/conf_mode/interfaces-l2tpv3.py index 8312d6f37..3698f3e12 100755 --- a/src/conf_mode/interfaces-l2tpv3.py +++ b/src/conf_mode/interfaces-l2tpv3.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -36,7 +36,7 @@ default_config_data = {      'local_port': 5000,      'intf': '',      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'is_bridge_member': False, @@ -115,7 +115,7 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        l2tpv3['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        l2tpv3['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64'))      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -225,8 +225,6 @@ def apply(l2tpv3):          l.set_mtu(l2tpv3['mtu'])          # IPv6 address autoconfiguration          l.set_ipv6_autoconf(l2tpv3['ipv6_autoconf']) -        # IPv6 EUI-based address -        l.set_ipv6_eui64_address(l2tpv3['ipv6_eui64_prefix'])          # IPv6 forwarding          l.set_ipv6_forwarding(l2tpv3['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries @@ -238,6 +236,10 @@ def apply(l2tpv3):          for addr in l2tpv3['address']:              l.add_addr(addr) +        # IPv6 EUI-based addresses +        for addr in l2tpv3['ipv6_eui64_prefix']: +            l.add_ipv6_eui64_address(addr) +          # As the interface is always disabled first when changing parameters          # we will only re-enable the interface if it is not  administratively          # disabled diff --git a/src/conf_mode/interfaces-openvpn.py b/src/conf_mode/interfaces-openvpn.py index 708ac8f91..99eb8d6ca 100755 --- a/src/conf_mode/interfaces-openvpn.py +++ b/src/conf_mode/interfaces-openvpn.py @@ -50,7 +50,8 @@ default_config_data = {      'hash': '',      'intf': '',      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'ipv6_local_address': [], @@ -316,7 +317,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        openvpn['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        openvpn['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in openvpn['ipv6_eui64_prefix']: +        openvpn['ipv6_eui64_prefix_remove'].append(eff_addr)      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -1043,13 +1050,24 @@ def apply(openvpn):          o.set_alias(openvpn['description'])          # IPv6 address autoconfiguration          o.set_ipv6_autoconf(openvpn['ipv6_autoconf']) -        # IPv6 EUI-based address -        o.set_ipv6_eui64_address(openvpn['ipv6_eui64_prefix'])          # IPv6 forwarding          o.set_ipv6_forwarding(openvpn['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries          o.set_ipv6_dad_messages(openvpn['ipv6_dup_addr_detect']) +        # IPv6 EUI-based addresses - only in TAP mode (TUN's have no MAC) +        # If MAC has changed, old EUI64 addresses won't get deleted, +        # but this isn't easy to solve, so leave them. +        # This is even more difficult as openvpn uses a random MAC for the +        # initial interface creation, unless set by 'lladdr'. +        # NOTE: right now the interface is always deleted. For future +        # compatibility when tap's are not deleted, leave the del_ in +        if openvpn['mode'] == 'tap': +            for addr in openvpn['ipv6_eui64_prefix_remove']: +                o.del_ipv6_eui64_address(addr) +            for addr in openvpn['ipv6_eui64_prefix']: +                o.add_ipv6_eui64_address(addr) +      except:          pass diff --git a/src/conf_mode/interfaces-pseudo-ethernet.py b/src/conf_mode/interfaces-pseudo-ethernet.py index d5f308ed3..6f194f814 100755 --- a/src/conf_mode/interfaces-pseudo-ethernet.py +++ b/src/conf_mode/interfaces-pseudo-ethernet.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -48,7 +48,8 @@ default_config_data = {      'ip_proxy_arp': 0,      'ip_proxy_arp_pvlan': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'is_bridge_member': False, @@ -159,7 +160,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        peth['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        peth['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in peth['ipv6_eui64_prefix']: +        peth['ipv6_eui64_prefix_remove'].append(eff_addr)      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -306,8 +313,6 @@ def apply(peth):      p.set_proxy_arp_pvlan(peth['ip_proxy_arp_pvlan'])      # IPv6 address autoconfiguration      p.set_ipv6_autoconf(peth['ipv6_autoconf']) -    # IPv6 EUI-based address -    p.set_ipv6_eui64_address(peth['ipv6_eui64_prefix'])      # IPv6 forwarding      p.set_ipv6_forwarding(peth['ipv6_forwarding'])      # IPv6 Duplicate Address Detection (DAD) tries @@ -316,10 +321,18 @@ def apply(peth):      # assign/remove VRF      p.set_vrf(peth['vrf']) +    # Delete old IPv6 EUI64 addresses before changing MAC +    for addr in peth['ipv6_eui64_prefix_remove']: +        p.del_ipv6_eui64_address(addr) +      # Change interface MAC address      if peth['mac']:          p.set_mac(peth['mac']) +    # Add IPv6 EUI-based addresses +    for addr in peth['ipv6_eui64_prefix']: +        p.add_ipv6_eui64_address(addr) +      # Change interface mode      p.set_mode(peth['mode']) diff --git a/src/conf_mode/interfaces-vxlan.py b/src/conf_mode/interfaces-vxlan.py index d238ddb57..5ed19ddf2 100755 --- a/src/conf_mode/interfaces-vxlan.py +++ b/src/conf_mode/interfaces-vxlan.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -39,7 +39,7 @@ default_config_data = {      'ip_enable_arp_ignore': 0,      'ip_proxy_arp': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'is_bridge_member': False, @@ -118,7 +118,7 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        vxlan['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        vxlan['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64'))      # Disable IPv6 forwarding on this interface      if conf.exists('ipv6 disable-forwarding'): @@ -238,8 +238,6 @@ def apply(vxlan):          v.set_proxy_arp(vxlan['ip_proxy_arp'])          # IPv6 address autoconfiguration          v.set_ipv6_autoconf(vxlan['ipv6_autoconf']) -        # IPv6 EUI-based address -        v.set_ipv6_eui64_address(vxlan['ipv6_eui64_prefix'])          # IPv6 forwarding          v.set_ipv6_forwarding(vxlan['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries @@ -251,6 +249,10 @@ def apply(vxlan):          for addr in vxlan['address']:              v.add_addr(addr) +        # IPv6 EUI-based addresses +        for addr in vxlan['ipv6_eui64_prefix']: +            v.add_ipv6_eui64_address(addr) +          # As the VXLAN interface is always disabled first when changing          # parameters we will only re-enable the interface if it is not          # administratively disabled diff --git a/src/conf_mode/interfaces-wireless.py b/src/conf_mode/interfaces-wireless.py index 42842f9bd..8f893fa8a 100755 --- a/src/conf_mode/interfaces-wireless.py +++ b/src/conf_mode/interfaces-wireless.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019 VyOS maintainers and contributors +# Copyright (C) 2019-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -88,7 +88,8 @@ default_config_data = {      'ip_enable_arp_announce': 0,      'ip_enable_arp_ignore': 0,      'ipv6_autoconf': 0, -    'ipv6_eui64_prefix': '', +    'ipv6_eui64_prefix': [], +    'ipv6_eui64_prefix_remove': [],      'ipv6_forwarding': 1,      'ipv6_dup_addr_detect': 1,      'is_bridge_member': False, @@ -370,7 +371,13 @@ def get_config():      # Get prefix for IPv6 addressing based on MAC address (EUI-64)      if conf.exists('ipv6 address eui64'): -        wifi['ipv6_eui64_prefix'] = conf.return_value('ipv6 address eui64') +        wifi['ipv6_eui64_prefix'].append(conf.return_value('ipv6 address eui64')) + +    # Determine currently effective EUI64 address - to determine which +    # address is no longer valid and needs to be removed +    eff_addr = conf.return_effective_value('ipv6 address eui64') +    if eff_addr and eff_addr not in wifi['ipv6_eui64_prefix']: +        wifi['ipv6_eui64_prefix_remove'].append(eff_addr)      # ARP enable ignore      if conf.exists('ip enable-arp-ignore'): @@ -696,6 +703,10 @@ def apply(wifi):          # ignore link state changes          w.set_link_detect(wifi['disable_link_detect']) +        # Delete old IPv6 EUI64 addresses before changing MAC +        for addr in wifi['ipv6_eui64_prefix_remove']: +            w.del_ipv6_eui64_address(addr) +          # Change interface MAC address - re-set to real hardware address (hw-id)          # if custom mac is removed          if wifi['mac']: @@ -703,6 +714,10 @@ def apply(wifi):          elif wifi['hw_id']:              w.set_mac(wifi['hw_id']) +        # Add IPv6 EUI-based addresses +        for addr in wifi['ipv6_eui64_prefix']: +            w.add_ipv6_eui64_address(addr) +          # configure ARP filter configuration          w.set_arp_filter(wifi['ip_disable_arp_filter'])          # configure ARP accept @@ -713,8 +728,6 @@ def apply(wifi):          w.set_arp_ignore(wifi['ip_enable_arp_ignore'])          # IPv6 address autoconfiguration          w.set_ipv6_autoconf(wifi['ipv6_autoconf']) -        # IPv6 EUI-based address -        w.set_ipv6_eui64_address(wifi['ipv6_eui64_prefix'])          # IPv6 forwarding          w.set_ipv6_forwarding(wifi['ipv6_forwarding'])          # IPv6 Duplicate Address Detection (DAD) tries  | 
