summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2026-10-19 20:55:55 +0200
committerGitHub <noreply@github.com>2026-10-19 20:55:55 +0200
commit063dbd32777d83635ac1ca82bc25fbb56bebb035 (patch)
tree6dd8d1ffdd9b8ab0ec8812071f2e9da494fe88a2
parent5608c8026f49bdd23b3fe80ca4aa6e6554c921f1 (diff)
parentc33e993f187f20407f2258ca08e0447c78aba885 (diff)
downloadvyos-1x-063dbd32777d83635ac1ca82bc25fbb56bebb035.tar.gz
vyos-1x-063dbd32777d83635ac1ca82bc25fbb56bebb035.zip
Merge pull request #5581 from jvoss/isis-srv6-no-sr-mpls
isis: T9485: only enable SR-MPLS when MPLS segment-routing configured
-rw-r--r--data/templates/frr/isisd.frr.j24
-rwxr-xr-xsmoketest/scripts/cli/test_protocols_isis.py43
2 files changed, 47 insertions, 0 deletions
diff --git a/data/templates/frr/isisd.frr.j2 b/data/templates/frr/isisd.frr.j2
index b385e896b..f94085d33 100644
--- a/data/templates/frr/isisd.frr.j2
+++ b/data/templates/frr/isisd.frr.j2
@@ -202,7 +202,11 @@ advertise-passive-only
{% endif %}
{% endfor %}
{% endif %}
+{# "segment-routing on" enables SR-MPLS only, SRv6 does not need it #}
+{% set sr_mpls_options = ['global_block', 'local_block', 'maximum_label_depth', 'prefix'] %}
+{% if segment_routing | select('in', sr_mpls_options) | list %}
segment-routing on
+{% endif %}
{% endif %}
{% if spf_delay_ietf.init_delay is vyos_defined %}
spf-delay-ietf init-delay {{ spf_delay_ietf.init_delay }} short-delay {{ spf_delay_ietf.short_delay }} long-delay {{ spf_delay_ietf.long_delay }} holddown {{ spf_delay_ietf.holddown }} time-to-learn {{ spf_delay_ietf.time_to_learn }}
diff --git a/smoketest/scripts/cli/test_protocols_isis.py b/smoketest/scripts/cli/test_protocols_isis.py
index 8296e2732..d190c23d4 100755
--- a/smoketest/scripts/cli/test_protocols_isis.py
+++ b/smoketest/scripts/cli/test_protocols_isis.py
@@ -462,6 +462,8 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):
self.assertIn(f' net {net}', tmp)
self.assertIn(f' segment-routing srv6', tmp)
self.assertIn(f' locator {locator}', tmp)
+ # SRv6 alone must not enable SR-MPLS
+ self.assertNotIn(' segment-routing on', tmp)
# Commit for isis
self.cli_commit()
@@ -530,6 +532,8 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):
self.assertIn(' segment-routing srv6', tmp)
self.assertIn(f' locator {locator}', tmp)
self.assertIn(f' interface {dum_iface}', tmp)
+ # SRv6 alone must not enable SR-MPLS
+ self.assertNotIn(' segment-routing on', tmp)
# Test node-msd configuration
self.cli_set(srv6_base_path + ['node-msd', 'max-end-d', '40'])
@@ -544,6 +548,7 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):
self.assertIn(' max-end-pop 50', tmp)
self.assertIn(' max-h-encaps 60', tmp)
self.assertIn(' max-segs-left 70', tmp)
+ self.assertNotIn(' segment-routing on', tmp)
def test_isis_15_distribute_link_state(self):
interface = 'lo'
@@ -603,6 +608,44 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):
self.assertIn(f' mpls-te router-address {te_address}', tmp)
self.assertIn(' mpls-te export', tmp)
+ def test_isis_16_segment_routing_srv6_and_mpls(self):
+ locator = 'TEST'
+ msd = '5'
+ sr_base = ['protocols', 'segment-routing']
+ self.cli_set(sr_base + ['srv6', 'locator', locator, 'prefix', '2001:db8::/64'])
+ self.cli_set(sr_base + ['interface', 'lo'])
+
+ # The dummy interface used to install SRv6 SIDs in the Linux data plane
+ dum_iface = 'dum6'
+ self.cli_set(['interfaces', 'dummy', dum_iface])
+
+ self.cli_set(base_path + ['net', net])
+ self.cli_set(base_path + ['interface', 'lo'])
+
+ # SRv6 and SR-MPLS side by side
+ sr_path = base_path + ['segment-routing']
+ self.cli_set(sr_path + ['srv6', 'locator', locator])
+ self.cli_set(sr_path + ['srv6', 'interface', dum_iface])
+ self.cli_set(sr_path + ['maximum-label-depth', msd])
+ self.cli_commit()
+
+ tmp = self.getFRRconfig(f'router isis {domain}', stop_section='^exit')
+ self.assertIn(' segment-routing on', tmp)
+ self.assertIn(f' segment-routing node-msd {msd}', tmp)
+ self.assertIn(' segment-routing srv6', tmp)
+ self.assertIn(f' locator {locator}', tmp)
+ self.assertIn(f' interface {dum_iface}', tmp)
+
+ # Removing the only SR-MPLS option must disable SR-MPLS again. Not
+ # global-block: FRR rejects the "no" form frr-reload.py derives for it
+ self.cli_delete(sr_path + ['maximum-label-depth'])
+ self.cli_commit()
+
+ tmp = self.getFRRconfig(f'router isis {domain}', stop_section='^exit')
+ self.assertNotIn(' segment-routing on', tmp)
+ self.assertNotIn(' segment-routing node-msd', tmp)
+ self.assertIn(' segment-routing srv6', tmp)
+
if __name__ == '__main__':
unittest.main(verbosity=2, failfast=VyOSUnitTestSHIM.TestCase.debug_on())