diff options
author | Christian Breunig <christian@breunig.cc> | 2024-07-26 12:51:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-26 12:51:49 +0200 |
commit | 6b96def0e8760f6ff6a90cae5179600d674bbcbd (patch) | |
tree | 75d0be0397a65892640c2d6032658cffaa8abe11 /src | |
parent | 609f4b9c1bb7f3144a997f76e74e86bef0559b23 (diff) | |
parent | ce5460f0380a60eb07f70dfed29d1b011636448a (diff) | |
download | vyos-1x-6b96def0e8760f6ff6a90cae5179600d674bbcbd.tar.gz vyos-1x-6b96def0e8760f6ff6a90cae5179600d674bbcbd.zip |
Merge pull request #3881 from vyos/mergify/bp/circinus/pr-3756
vxlan: T6505: Support VXLAN VLAN-VNI range mapping in CLI (backport #3756)
Diffstat (limited to 'src')
-rwxr-xr-x | src/conf_mode/interfaces_vxlan.py | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/conf_mode/interfaces_vxlan.py b/src/conf_mode/interfaces_vxlan.py index bc4918a52..68646e8ff 100755 --- a/src/conf_mode/interfaces_vxlan.py +++ b/src/conf_mode/interfaces_vxlan.py @@ -179,13 +179,36 @@ def verify(vxlan): 'is member of a bridge interface!') vnis_used = [] + vlans_used = [] for vif, vif_config in vxlan['vlan_to_vni'].items(): if 'vni' not in vif_config: raise ConfigError(f'Must define VNI for VLAN "{vif}"!') vni = vif_config['vni'] - if vni in vnis_used: - raise ConfigError(f'VNI "{vni}" is already assigned to a different VLAN!') - vnis_used.append(vni) + + err_msg = f'VLAN range "{vif}" does not match VNI range "{vni}"!' + vif_range, vni_range = list(map(int, vif.split('-'))), list(map(int, vni.split('-'))) + + if len(vif_range) != len(vni_range): + raise ConfigError(err_msg) + + if len(vif_range) > 1: + if vni_range[0] > vni_range[-1] or vif_range[0] > vif_range[-1]: + raise ConfigError('The upper bound of the range must be greater than the lower bound!') + vni_range = range(vni_range[0], vni_range[1] + 1) + vif_range = range(vif_range[0], vif_range[1] + 1) + + if len(vif_range) != len(vni_range): + raise ConfigError(err_msg) + + for vni_id in vni_range: + if vni_id in vnis_used: + raise ConfigError(f'VNI "{vni_id}" is already assigned to a different VLAN!') + vnis_used.append(vni_id) + + for vif_id in vif_range: + if vif_id in vlans_used: + raise ConfigError(f'VLAN "{vif_id}" is already in use!') + vlans_used.append(vif_id) if dict_search('parameters.neighbor_suppress', vxlan) != None: if 'is_bridge_member' not in vxlan: |