From a83edf1a11c86df0a1419930b31544296a7a6e6c Mon Sep 17 00:00:00 2001 From: Nataliia Solomko Date: Wed, 24 Jun 2026 17:10:45 +0300 Subject: [PATCH] bgp: T9013: Add BMP source-interface support --- data/templates/frr/bgpd.frr.j2 | 2 +- .../include/bgp/protocol-common-config.xml.i | 1 + smoketest/scripts/cli/test_protocols_bgp.py | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/data/templates/frr/bgpd.frr.j2 b/data/templates/frr/bgpd.frr.j2 index c10aa282620..3035262a6c7 100644 --- a/data/templates/frr/bgpd.frr.j2 +++ b/data/templates/frr/bgpd.frr.j2 @@ -538,7 +538,7 @@ router bgp {{ system_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }} {{ 'as-nota {% endif %} {% endif %} {% if bmp_config.address is vyos_defined %} - bmp connect {{ bmp_config.address }} port {{ bmp_config.port }} min-retry {{ bmp_config.min_retry }} max-retry {{ bmp_config.max_retry }} + bmp connect {{ bmp_config.address }} port {{ bmp_config.port }} min-retry {{ bmp_config.min_retry }} max-retry {{ bmp_config.max_retry }} {{ 'source-interface ' ~ bmp_config.source_interface if bmp_config.source_interface is vyos_defined }} {% endif %} {% endfor %} exit diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index f342402bb65..e6ee667fba8 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -874,6 +874,7 @@ #include #include + #include 5000 diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index 680829bce6b..cee52e5487d 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -1852,6 +1852,7 @@ def test_bgp_99_bmp(self): mirror_buffer = '32000000' bmp_path = base_path + ['bmp'] target_path = bmp_path + ['target', target_name] + source_iface = 'eth0' # by default the 'bmp' module not loaded for the bgpd expect Error self.cli_set(bmp_path) @@ -1879,6 +1880,7 @@ def test_bgp_99_bmp(self): # config other bmp options self.cli_set(target_path + ['address', target_address]) + self.cli_set(target_path + ['source-interface', source_iface]) self.cli_set(bmp_path + ['mirror-buffer-limit', mirror_buffer]) self.cli_set(target_path + ['port', target_port]) self.cli_set(target_path + ['min-retry', min_retry]) @@ -1899,7 +1901,21 @@ def test_bgp_99_bmp(self): self.assertIn(f'bmp monitor ipv6 unicast {monitor_ipv6}', frrconfig) self.assertIn(f'bmp monitor ipv4 unicast loc-rib', frrconfig) self.assertIn(f'bmp monitor ipv6 unicast loc-rib', frrconfig) - self.assertIn(f'bmp connect {target_address} port {target_port} min-retry {min_retry} max-retry {max_retry}', frrconfig) + self.assertIn( + f'bmp connect {target_address} port {target_port} min-retry {min_retry} max-retry {max_retry} source-interface {source_iface}', + frrconfig, + ) + + # verify source-interface is removed from FRR config after deletion + self.cli_delete(target_path + ['source-interface']) + self.cli_commit() + + frrconfig = self.getFRRconfig(f'router bgp {ASN}', stop_section='^exit') + self.assertIn( + f'bmp connect {target_address} port {target_port} min-retry {min_retry} max-retry {max_retry}', + frrconfig, + ) + self.assertNotIn('source-interface', frrconfig) def test_bgp_100_link_state(self): router_id = '127.0.0.1'