From 87bbe75152e3e0625776587c1fd4cd7104319fe1 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 7 Mar 2021 21:49:50 +0100 Subject: bgp: T3391: add per AFI maximum-paths support * set protocols bgp ASN address-family ipv4-unicast maximum-paths * set protocols bgp ASN address-family ipv4-unicast maximum-paths-ibgp * set protocols bgp ASN address-family ipv6-unicast maximum-paths * set protocols bgp ASN address-family ipv6-unicast maximum-paths-ibgp --- data/templates/frr/bgp.frr.tmpl | 6 +++++ .../include/bgp-afi-maximum-paths.xml.i | 26 ++++++++++++++++++++++ interface-definitions/protocols-bgp.xml.in | 2 ++ smoketest/scripts/cli/test_protocols_bgp.py | 21 +++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 interface-definitions/include/bgp-afi-maximum-paths.xml.i diff --git a/data/templates/frr/bgp.frr.tmpl b/data/templates/frr/bgp.frr.tmpl index 9340795bc..b7abbff5c 100644 --- a/data/templates/frr/bgp.frr.tmpl +++ b/data/templates/frr/bgp.frr.tmpl @@ -208,6 +208,12 @@ router bgp {{ asn }} aggregate-address {{ ip }}{{ ' as-set' if afi_config.aggregate_address[ip].as_set is defined }}{{ ' summary-only' if afi_config.aggregate_address[ip].summary_only is defined }} {% endfor %} {% endif %} +{% if afi_config.maximum_paths is defined and afi_config.maximum_paths is not none %} + maximum-paths {{ afi_config.maximum_paths }} +{% endif %} +{% if afi_config.maximum_paths_ibgp is defined and afi_config.maximum_paths_ibgp is not none %} + maximum-paths ibgp {{ afi_config.maximum_paths_ibgp }} +{% endif %} {% if afi_config.redistribute is defined and afi_config.redistribute is not none %} {% for protocol in afi_config.redistribute %} {% if protocol == 'table' %} diff --git a/interface-definitions/include/bgp-afi-maximum-paths.xml.i b/interface-definitions/include/bgp-afi-maximum-paths.xml.i new file mode 100644 index 000000000..5ee0d13a3 --- /dev/null +++ b/interface-definitions/include/bgp-afi-maximum-paths.xml.i @@ -0,0 +1,26 @@ + + + + Forward packets over multiple paths (eBGP) + + u32:1-256 + Number of paths to consider + + + + + + + + + Forward packets over multiple paths (iBGP) + + u32:1-256 + Number of paths to consider + + + + + + + diff --git a/interface-definitions/protocols-bgp.xml.in b/interface-definitions/protocols-bgp.xml.in index cc4f9d2b6..c2a123313 100644 --- a/interface-definitions/protocols-bgp.xml.in +++ b/interface-definitions/protocols-bgp.xml.in @@ -62,6 +62,7 @@ #include + #include Redistribute routes from other protocols into BGP @@ -171,6 +172,7 @@ #include + #include Redistribute routes from other protocols into BGP diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index 8d42fafc3..f22b47551 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -131,6 +131,9 @@ peer_group_config = { def getFRRBGPconfig(): return cmd(f'vtysh -c "show run" | sed -n "/^router bgp {ASN}/,/^!/p"') +def getFRRBgpAfiConfig(afi): + return cmd(f'vtysh -c "show run" | sed -n "/^router bgp {ASN}/,/^!/p" | sed -n "/^ address-family {afi} unicast/,/^ exit-address-family/p"') + def getFRRBGPVNIconfig(vni): return cmd(f'vtysh -c "show run" | sed -n "/^ vni {vni}/,/^!/p"') @@ -218,6 +221,10 @@ class TestProtocolsBGP(unittest.TestCase): router_id = '127.0.0.1' local_pref = '500' stalepath_time = '60' + max_path_v4 = '2' + max_path_v4ibgp = '4' + max_path_v6 = '8' + max_path_v6ibgp = '16' self.session.set(base_path + ['parameters', 'router-id', router_id]) self.session.set(base_path + ['parameters', 'log-neighbor-changes']) @@ -229,6 +236,12 @@ class TestProtocolsBGP(unittest.TestCase): self.session.set(base_path + ['parameters', 'graceful-shutdown']) self.session.set(base_path + ['parameters', 'ebgp-requires-policy']) + # AFI maximum path support + self.session.set(base_path + ['address-family', 'ipv4-unicast', 'maximum-paths', max_path_v4]) + self.session.set(base_path + ['address-family', 'ipv4-unicast', 'maximum-paths-ibgp', max_path_v4ibgp]) + self.session.set(base_path + ['address-family', 'ipv6-unicast', 'maximum-paths', max_path_v6]) + self.session.set(base_path + ['address-family', 'ipv6-unicast', 'maximum-paths-ibgp', max_path_v6ibgp]) + # commit changes self.session.commit() @@ -243,6 +256,14 @@ class TestProtocolsBGP(unittest.TestCase): self.assertIn(f' bgp graceful-shutdown', frrconfig) self.assertNotIn(f'bgp ebgp-requires-policy', frrconfig) + afiv4_config = getFRRBgpAfiConfig('ipv4') + self.assertIn(f' maximum-paths {max_path_v4}', afiv4_config) + self.assertIn(f' maximum-paths ibgp {max_path_v4ibgp}', afiv4_config) + + afiv6_config = getFRRBgpAfiConfig('ipv6') + self.assertIn(f' maximum-paths {max_path_v6}', afiv6_config) + self.assertIn(f' maximum-paths ibgp {max_path_v6ibgp}', afiv6_config) + def test_bgp_02_neighbors(self): # Test out individual neighbor configuration items, not all of them are -- cgit v1.2.3