diff options
| author | Christian Breunig <christian@breunig.cc> | 2024-02-11 09:31:38 +0100 | 
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2024-02-11 09:33:17 +0100 | 
| commit | f308df322bd62024e29dd458642cb6bcac8a5ad6 (patch) | |
| tree | 7fc547f62f37e82e3afa01736b702bb812694ded | |
| parent | f068330bb2605e1a8bec17c638211dc99ccd0536 (diff) | |
| download | vyos-1x-f308df322bd62024e29dd458642cb6bcac8a5ad6.tar.gz vyos-1x-f308df322bd62024e29dd458642cb6bcac8a5ad6.zip  | |
bgp: T6032: add EVPN MAC-VRF Site-of-Origin support
In some EVPN deployments it is useful to associate a logical VTEP's Layer 2
domain (MAC-VRF) with a Site-of-Origin "site" identifier. This provides a BGP
topology-independent means of marking and import-filtering EVPN routes
originated from a particular L2 domain. One situation where this is valuable
is when deploying EVPN using anycast VTEPs
set protocols bgp address-family l2vpn-evpn mac-vrf soo
| -rw-r--r-- | data/templates/frr/bgpd.frr.j2 | 5 | ||||
| -rw-r--r-- | interface-definitions/include/bgp/protocol-common-config.xml.i | 24 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_protocols_bgp.py | 4 | 
3 files changed, 31 insertions, 2 deletions
diff --git a/data/templates/frr/bgpd.frr.j2 b/data/templates/frr/bgpd.frr.j2 index 23f81348b..419d0bee1 100644 --- a/data/templates/frr/bgpd.frr.j2 +++ b/data/templates/frr/bgpd.frr.j2 @@ -390,7 +390,7 @@ router bgp {{ system_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }}  {%         endif %}  {%         if afi_config.ead_es_route_target.export is vyos_defined %}  {%             for route_target in afi_config.ead_es_route_target.export %} - ead-es-route-target export {{ route_target }} +  ead-es-route-target export {{ route_target }}  {%             endfor %}  {%         endif %}  {%         if afi_config.rt_auto_derive is vyos_defined %} @@ -402,6 +402,9 @@ router bgp {{ system_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }}  {%         if afi_config.flooding.head_end_replication is vyos_defined %}    flooding head-end-replication  {%         endif %} +{%         if afi_config.mac_vrf.soo is vyos_defined %} +  mac-vrf soo {{ afi_config.mac_vrf.soo }} +{%         endif %}  {%         if afi_config.nexthop.vpn.export is vyos_defined %}    nexthop vpn export {{ afi_config.nexthop.vpn.export }}  {%         endif %} diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index ea6e75bbd..ca67eaf3c 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -894,6 +894,30 @@              </leafNode>            </children>          </node> +        <node name="mac-vrf"> +          <properties> +            <help>EVPN MAC-VRF</help> +          </properties> +          <children> +            <leafNode name="soo"> +              <properties> +                <help>Site-of-Origin extended community</help> +                <valueHelp> +                  <format>ASN:NN</format> +                  <description>based on autonomous system number in format <0-65535:0-4294967295></description> +                </valueHelp> +                <valueHelp> +                  <format>IP:NN</format> +                  <description>Based on a router-id IP address in format <IP:0-65535></description> +                </valueHelp> +                <constraint> +                  <validator name="bgp-extended-community"/> +                </constraint> +                <constraintErrorMessage>Should be in form: ASN:NN or IPADDR:NN where ASN is autonomous system number</constraintErrorMessage> +              </properties> +            </leafNode> +          </children> +        </node>          <tagNode name="vni">            <properties>              <help>VXLAN Network Identifier</help> diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index 08a6e1696..db49db98f 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -748,7 +748,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):      def test_bgp_07_l2vpn_evpn(self):          vnis = ['10010', '10020', '10030'] -        neighbors = ['192.0.2.10', '192.0.2.20', '192.0.2.30'] +        soo = '1.2.3.4:10000'          evi_limit = '1000'          route_targets = ['1.1.1.1:100', '1.1.1.1:200', '1.1.1.1:300'] @@ -760,6 +760,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'default-originate', 'ipv6'])          self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'disable-ead-evi-rx'])          self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'disable-ead-evi-tx']) +        self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'mac-vrf', 'soo', soo])          for vni in vnis:              self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'vni', vni, 'advertise-default-gw'])              self.cli_set(base_path + ['address-family', 'l2vpn-evpn', 'vni', vni, 'advertise-svi-ip']) @@ -783,6 +784,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          self.assertIn(f'  disable-ead-evi-rx', frrconfig)          self.assertIn(f'  disable-ead-evi-tx', frrconfig)          self.assertIn(f'  flooding disable', frrconfig) +        self.assertIn(f'  mac-vrf soo {soo}', frrconfig)          for vni in vnis:              vniconfig = self.getFRRconfig(f'  vni {vni}')              self.assertIn(f'vni {vni}', vniconfig)  | 
