diff options
| author | Cheeze_It <none@none.com> | 2022-10-06 21:51:31 -0700 | 
|---|---|---|
| committer | Cheeze_It <none@none.com> | 2022-10-06 21:51:31 -0700 | 
| commit | b6e690f0f72e5ecba0fc9be1c16caf2788e6b29e (patch) | |
| tree | d606dd01f19460e3138803aa4f506c5a12cc7ee7 /src | |
| parent | 067cc12d0e6e52044df48f6f612cb4db1d4ad80c (diff) | |
| download | vyos-1x-b6e690f0f72e5ecba0fc9be1c16caf2788e6b29e.tar.gz vyos-1x-b6e690f0f72e5ecba0fc9be1c16caf2788e6b29e.zip | |
ospf: T4707: Add OSPF segment routing for FRR
In this commit we add OSPF segment routing, smoke tests, handlers,
FRR template changes, and CLI commands.
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/protocols_ospf.py | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/src/conf_mode/protocols_ospf.py b/src/conf_mode/protocols_ospf.py index 5b4874ba2..0582d32be 100755 --- a/src/conf_mode/protocols_ospf.py +++ b/src/conf_mode/protocols_ospf.py @@ -198,6 +198,58 @@ def verify(ospf):                  if 'master' not in tmp or tmp['master'] != vrf:                      raise ConfigError(f'Interface {interface} is not a member of VRF {vrf}!') +    # Segment routing checks +    if dict_search('segment_routing.global_block', ospf): +        g_high_label_value = dict_search('segment_routing.global_block.high_label_value', ospf) +        g_low_label_value = dict_search('segment_routing.global_block.low_label_value', ospf) + +        # If segment routing global block high or low value is blank, throw error +        if not (g_low_label_value or g_high_label_value): +            raise ConfigError('Segment routing global-block requires both low and high value!') + +        # If segment routing global block low value is higher than the high value, throw error +        if int(g_low_label_value) > int(g_high_label_value): +            raise ConfigError('Segment routing global-block low value must be lower than high value') + +    if dict_search('segment_routing.local_block', ospf): +        if dict_search('segment_routing.global_block', ospf) == None: +            raise ConfigError('Segment routing local-block requires global-block to be configured!') + +        l_high_label_value = dict_search('segment_routing.local_block.high_label_value', ospf) +        l_low_label_value = dict_search('segment_routing.local_block.low_label_value', ospf) + +        # If segment routing local-block high or low value is blank, throw error +        if not (l_low_label_value or l_high_label_value): +            raise ConfigError('Segment routing local-block requires both high and low value!') + +        # If segment routing local-block low value is higher than the high value, throw error +        if int(l_low_label_value) > int(l_high_label_value): +            raise ConfigError('Segment routing local-block low value must be lower than high value') + +        # local-block most live outside global block +        global_range = range(int(g_low_label_value), int(g_high_label_value) +1) +        local_range  = range(int(l_low_label_value), int(l_high_label_value) +1) + +        # Check for overlapping ranges +        if list(set(global_range) & set(local_range)): +            raise ConfigError(f'Segment-Routing Global Block ({g_low_label_value}/{g_high_label_value}) '\ +                              f'conflicts with Local Block ({l_low_label_value}/{l_high_label_value})!') +         +    # Check for a blank or invalid value per prefix +    if dict_search('segment_routing.prefix', ospf): +        for prefix, prefix_config in ospf['segment_routing']['prefix'].items(): +            if 'index' in prefix_config: +                if prefix_config['index'].get('value') is None: +                    raise ConfigError(f'Segment routing prefix {prefix} index value cannot be blank.') + +    # Check for explicit-null and no-php-flag configured at the same time per prefix +    if dict_search('segment_routing.prefix', ospf): +        for prefix, prefix_config in ospf['segment_routing']['prefix'].items(): +            if 'index' in prefix_config: +                if ("explicit_null" in prefix_config['index']) and ("no_php_flag" in prefix_config['index']): +                    raise ConfigError(f'Segment routing prefix {prefix} cannot have both explicit-null '\ +                                      f'and no-php-flag configured at the same time.') +      return None  def generate(ospf): | 
