summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2021-08-18 12:47:01 +0200
committerChristian Poessinger <christian@poessinger.com>2021-08-18 12:58:15 +0200
commit1cc2ac26106f8efad6defaba9ba4d1296d75cf1f (patch)
tree093f0df871f965e98d4097ea974b74eee7f8f76e
parent231095f95df129ef9e051ec218a1c3fe9e99cd98 (diff)
downloadvyos-1x-1cc2ac26106f8efad6defaba9ba4d1296d75cf1f.tar.gz
vyos-1x-1cc2ac26106f8efad6defaba9ba4d1296d75cf1f.zip
bgp: T3759: add l3vpn "rd" route-distinguisher commands
Add the following new commands: * set protocols bgp address-family ipv4-unicast rd vpn export * set protocols bgp address-family ipv6-unicast rd vpn export
-rw-r--r--data/templates/frr/bgpd.frr.tmpl7
-rw-r--r--interface-definitions/include/bgp/afi-rd.xml.i28
-rw-r--r--interface-definitions/include/bgp/protocol-common-config.xml.i2
-rw-r--r--interface-definitions/include/bgp/route-distinguisher.xml.i2
-rwxr-xr-xsmoketest/scripts/cli/test_protocols_bgp.py16
5 files changed, 48 insertions, 7 deletions
diff --git a/data/templates/frr/bgpd.frr.tmpl b/data/templates/frr/bgpd.frr.tmpl
index 60ec566b5..f3579ccd7 100644
--- a/data/templates/frr/bgpd.frr.tmpl
+++ b/data/templates/frr/bgpd.frr.tmpl
@@ -257,6 +257,9 @@ router bgp {{ local_as }} {{ 'vrf ' ~ vrf if vrf is defined and vrf is not none
address-family ipv6 flowspec
{% elif afi == 'l2vpn_evpn' %}
address-family l2vpn evpn
+{% if afi_config.rd is defined and afi_config.rd is not none %}
+ rd {{ afi_config.rd }}
+{% endif %}
{% endif %}
{% if afi_config.aggregate_address is defined and afi_config.aggregate_address is not none %}
{% for ip in afi_config.aggregate_address %}
@@ -350,8 +353,8 @@ router bgp {{ local_as }} {{ 'vrf ' ~ vrf if vrf is defined and vrf is not none
{% if afi_config.flooding is defined and afi_config.flooding.head_end_replication is defined %}
flooding head-end-replication
{% endif %}
-{% if afi_config.rd is defined and afi_config.rd is not none %}
- rd {{ afi_config.rd }}
+{% if afi_config.rd is defined and afi_config.rd.vpn is defined and afi_config.rd.vpn.export is defined %}
+ rd vpn export {{ afi_config.rd.vpn.export }}
{% endif %}
{% if afi_config.route_target is defined and afi_config.route_target is not none %}
{% if afi_config.route_target.both is defined and afi_config.route_target.both is not none %}
diff --git a/interface-definitions/include/bgp/afi-rd.xml.i b/interface-definitions/include/bgp/afi-rd.xml.i
new file mode 100644
index 000000000..c4d29268c
--- /dev/null
+++ b/interface-definitions/include/bgp/afi-rd.xml.i
@@ -0,0 +1,28 @@
+<!-- include start from bgp/afi-rd.xml.i -->
+<node name="rd">
+ <properties>
+ <help>Specify route distinguisher</help>
+ </properties>
+ <children>
+ <node name="vpn">
+ <properties>
+ <help>Between current address-family and VPN</help>
+ </properties>
+ <children>
+ <leafNode name="export">
+ <properties>
+ <help>For routes leaked from current address-family to VPN</help>
+ <valueHelp>
+ <format>ASN:NN_OR_IP-ADDRESS:NN</format>
+ <description>Route Distinguisher, (x.x.x.x:yyy|xxxx:yyyy)</description>
+ </valueHelp>
+ <constraint>
+ <regex>^((25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)(\.(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)){3}|[0-9]{1,10}):[0-9]{1,5}$</regex>
+ </constraint>
+ </properties>
+ </leafNode>
+ </children>
+ </node>
+ </children>
+</node>
+<!-- include end -->
diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i
index 58e3c5798..53be8b553 100644
--- a/interface-definitions/include/bgp/protocol-common-config.xml.i
+++ b/interface-definitions/include/bgp/protocol-common-config.xml.i
@@ -117,6 +117,7 @@
#include <include/route-map.xml.i>
</children>
</tagNode>
+ #include <include/bgp/afi-rd.xml.i>
<node name="redistribute">
<properties>
<help>Redistribute routes from other protocols into BGP</help>
@@ -499,6 +500,7 @@
#include <include/route-map.xml.i>
</children>
</tagNode>
+ #include <include/bgp/afi-rd.xml.i>
<node name="redistribute">
<properties>
<help>Redistribute routes from other protocols into BGP</help>
diff --git a/interface-definitions/include/bgp/route-distinguisher.xml.i b/interface-definitions/include/bgp/route-distinguisher.xml.i
index fdfbe7076..6d0aa3ef1 100644
--- a/interface-definitions/include/bgp/route-distinguisher.xml.i
+++ b/interface-definitions/include/bgp/route-distinguisher.xml.i
@@ -3,7 +3,7 @@
<properties>
<help>Route Distinguisher</help>
<valueHelp>
- <format>txt</format>
+ <format>ASN:NN_OR_IP-ADDRESS:NN</format>
<description>Route Distinguisher, (x.x.x.x:yyy|xxxx:yyyy)</description>
</valueHelp>
<constraint>
diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py
index d3d061229..4149b0bdd 100755
--- a/smoketest/scripts/cli/test_protocols_bgp.py
+++ b/smoketest/scripts/cli/test_protocols_bgp.py
@@ -731,6 +731,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):
neighbor = '192.0.2.55'
vrf_name = 'red'
label = 'auto'
+ rd = f'{neighbor}:{ASN}'
self.cli_set(base_path + ['local-as', ASN])
# testing only one AFI is sufficient as it's generic code
@@ -739,16 +740,23 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):
self.cli_set(base_path + ['address-family', afi, 'import', 'vpn'])
self.cli_set(base_path + ['address-family', afi, 'label', 'vpn', 'export', label])
+ self.cli_set(base_path + ['address-family', 'ipv4-unicast', 'rd', 'vpn', 'export', rd])
+
# commit changes
self.cli_commit()
# Verify FRR bgpd configuration
frrconfig = self.getFRRconfig(f'router bgp {ASN}')
self.assertIn(f'router bgp {ASN}', frrconfig)
- self.assertIn(f' address-family ipv6 unicast', frrconfig)
- self.assertIn(f' export vpn', frrconfig)
- self.assertIn(f' import vpn', frrconfig)
- self.assertIn(f' exit-address-family', frrconfig)
+ for afi in ['ipv4', 'ipv6']:
+ self.assertIn(f' address-family {afi} unicast', frrconfig)
+ self.assertIn(f' export vpn', frrconfig)
+ self.assertIn(f' import vpn', frrconfig)
+ self.assertIn(f' label vpn export {label}', frrconfig)
+ self.assertIn(f' exit-address-family', frrconfig)
+
+ self.assertIn(f' address-family ipv4 unicast', frrconfig)
+ self.assertIn(f' rd vpn export {rd}', frrconfig)
if __name__ == '__main__':
unittest.main(verbosity=2) \ No newline at end of file