diff options
| author | Christian Poessinger <christian@poessinger.com> | 2022-02-21 18:23:55 +0100 | 
|---|---|---|
| committer | Christian Poessinger <christian@poessinger.com> | 2022-02-21 18:23:55 +0100 | 
| commit | 3a605ad020d8d20b08a72cb1284f6e590d1fd7b5 (patch) | |
| tree | 74120735fc8ff725ce7be7a5b086730fc688a09f | |
| parent | 25b2f2a8057260ad0d2c59823618d7c9f0fba707 (diff) | |
| download | vyos-1x-3a605ad020d8d20b08a72cb1284f6e590d1fd7b5.tar.gz vyos-1x-3a605ad020d8d20b08a72cb1284f6e590d1fd7b5.zip | |
vxlan: T4120: code cleanup for multiple remotes
| -rw-r--r-- | python/vyos/ifconfig/vxlan.py | 24 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-vxlan.py | 38 | 
2 files changed, 27 insertions, 35 deletions
| diff --git a/python/vyos/ifconfig/vxlan.py b/python/vyos/ifconfig/vxlan.py index 87b5e40b8..516a19f24 100644 --- a/python/vyos/ifconfig/vxlan.py +++ b/python/vyos/ifconfig/vxlan.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2019-2022 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 @@ -68,6 +68,16 @@ class VXLANIf(Interface):              'vni'                        : 'id',          } +        # IPv6 flowlabels can only be used on IPv6 tunnels, thus we need to +        # ensure that at least the first remote IP address is passed to the +        # tunnel creation command. Subsequent tunnel remote addresses can later +        # be added to the FDB +        remote_list = None +        if 'remote' in self.config: +            # skip first element as this is already configured as remote +            remote_list = self.config['remote'][1:] +            self.config['remote'] = self.config['remote'][0] +          cmd = 'ip link add {ifname} type {type} dstport {port}'          for vyos_key, iproute2_key in mapping.items():              # dict_search will return an empty dict "{}" for valueless nodes like @@ -83,9 +93,9 @@ class VXLANIf(Interface):          # interface is always A/D down. It needs to be enabled explicitly          self.set_admin_state('down') -        other_remotes = self.config.get('other_remotes') -        if other_remotes: -            for rem in other_remotes: -                self.config['rem'] = rem -                cmd2 = 'bridge fdb append to 00:00:00:00:00:00 dst {rem} port {port} dev {ifname}' -                self._cmd(cmd2.format(**self.config)) +        # VXLAN tunnel is always recreated on any change - see interfaces-vxlan.py +        if remote_list: +            for remote in remote_list: +                cmd = f'bridge fdb append to 00:00:00:00:00:00 dst {remote} ' \ +                       'port {port} dev {ifname}' +                self._cmd(cmd.format(**self.config)) diff --git a/src/conf_mode/interfaces-vxlan.py b/src/conf_mode/interfaces-vxlan.py index 092f249df..85604508e 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-2020 VyOS maintainers and contributors +# Copyright (C) 2019-2022 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 @@ -34,8 +34,8 @@ airbag.enable()  def get_config(config=None):      """ -    Retrive CLI config as dictionary. Dictionary can never be empty, as at least the -    interface name will be added or a deleted flag +    Retrive CLI config as dictionary. Dictionary can never be empty, as at least +    the interface name will be added or a deleted flag      """      if config:          conf = config @@ -58,13 +58,6 @@ def get_config(config=None):      if len(vxlan['other_tunnels']) == 0:          del vxlan['other_tunnels'] -    # leave first remote in dict and put the other ones (if they exists) to "other_remotes" -    remotes = vxlan.get('remote') -    if remotes: -        vxlan['remote'] = remotes[0] -        if len(remotes) > 1: -            del remotes[0] -            vxlan['other_remotes'] = remotes      return vxlan  def verify(vxlan): @@ -77,8 +70,7 @@ def verify(vxlan):      if 'group' in vxlan:          if 'source_interface' not in vxlan: -            raise ConfigError('Multicast VXLAN requires an underlaying interface ') - +            raise ConfigError('Multicast VXLAN requires an underlaying interface')          verify_source_interface(vxlan)      if not any(tmp in ['group', 'remote', 'source_address'] for tmp in vxlan): @@ -122,35 +114,26 @@ def verify(vxlan):              protocol = 'ipv6'          else:              protocol = 'ipv4' +      if 'remote' in vxlan: -        if is_ipv6(vxlan['remote']): -            if protocol == 'ipv4': -                raise ConfigError('IPv4 and IPV6 cannot be mixed') -            protocol = 'ipv6' -        else: -            if protocol == 'ipv6': -                raise ConfigError('IPv4 and IPV6 cannot be mixed') -            protocol = 'ipv4' -    if 'other_remotes' in vxlan: -        for rem in vxlan['other_remotes']: -            if is_ipv6(rem): +        error_msg = 'Can not mix both IPv4 and IPv6 for VXLAN underlay' +        for remote in vxlan['remote']: +            if is_ipv6(remote):                  if protocol == 'ipv4': -                    raise ConfigError('IPv4 and IPV6 cannot be mixed') +                    raise ConfigError(error_msg)                  protocol = 'ipv6'              else:                  if protocol == 'ipv6': -                    raise ConfigError('IPv4 and IPV6 cannot be mixed') +                    raise ConfigError(error_msg)                  protocol = 'ipv4'      verify_mtu_ipv6(vxlan)      verify_address(vxlan)      return None -  def generate(vxlan):      return None -  def apply(vxlan):      # Check if the VXLAN interface already exists      if vxlan['ifname'] in interfaces(): @@ -166,7 +149,6 @@ def apply(vxlan):      return None -  if __name__ == '__main__':      try:          c = get_config() | 
