def test_100_evpn_mac_hash_equal(self):
        # Two indistinct EVPN NLRI should
        # hash to the same value, and be equal

        nlri1 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("1.1.1.1"))

        nlri2 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("1.1.1.1"))

        self.assertEqual(hash(nlri1), hash(nlri2))
        self.assertEqual(nlri1, nlri2)
示例#2
0
    def __init__(self, *args, **kwargs):

        vpn_instance.VPNInstance.__init__(self, *args, **kwargs)

        self.gw_port = None

        # Advertise route to receive multi-destination traffic
        self.log.info("Generating BGP route for broadcast/multicast traffic")

        nlri = exa.EVPNMulticast(
            self.instance_rd,
            exa.EthernetTag(),
            exa.IP.create(self.bgp_manager.get_local_address()),
            None,
            exa.IP.create(self.bgp_manager.get_local_address()))

        attributes = exa.Attributes()

        attributes.add(self._gen_encap_extended_communities())

        # add PMSI Tunnel Attribute route
        attributes.add(
            exa.PMSIIngressReplication(self.dp_driver.get_local_address(),
                                       self.instance_label))

        self.multicast_route_entry = engine.RouteEntry(nlri, self.export_rts,
                                                       attributes)

        self._advertise_route(self.multicast_route_entry)
示例#3
0
    def generate_vif_bgp_route(self, mac_address, ip_prefix, plen, label, rd):
        # Generate BGP route and advertise it...

        assert(plen == 32)

        # label parameter ignored, we need to use instance label
        nlri = exa.EVPNMAC(
            rd, exa.ESI(), exa.EthernetTag(), exa.MAC(mac_address), 6*8,
            exa.Labels([self.instance_label]),
            exa.IP.create(ip_prefix), None,
            exa.IP.create(self.dp_driver.get_local_address()))

        return engine.RouteEntry(nlri)
    def test_101_evpn_hash_equal_somefieldsvary(self):
        # Two EVPN MAC NLRIs differing by their ESI or label or RD,
        # or nexthop, but otherwise identical should hash to the same value,
        # and be equal

        nlri0 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("1.1.1.1"))

        # Esi
        nlri1 = exa.EVPNMAC(
            TEST_RD, exa.ESI(b''.join(six.int2byte(1) for _ in range(0, 10))),
            exa.EthernetTag(111), exa.MAC("01:02:03:04:05:06"), 6 * 8,
            exa.Labels([42], True), exa.IP.create("1.1.1.1"))

        # label
        nlri2 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([4444], True), exa.IP.create("1.1.1.1"))

        # IP: different IPs, but same MACs: different route
        nlri3 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("2.2.2.2"))

        # with a next hop...
        nlri4 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("1.1.1.1"),
                            exa.IP.pton("10.10.10.10"))
        nlri5 = exa.EVPNMAC(TEST_RD, exa.ESI(), exa.EthernetTag(111),
                            exa.MAC("01:02:03:04:05:06"), 6 * 8,
                            exa.Labels([42], True), exa.IP.create("1.1.1.1"),
                            exa.IP.pton("11.11.11.11"))

        self.assertEqual(hash(nlri0), hash(nlri1))
        self.assertEqual(hash(nlri0), hash(nlri2))
        self.assertEqual(hash(nlri0), hash(nlri4))
        self.assertEqual(nlri0, nlri1)
        self.assertEqual(nlri0, nlri2)
        self.assertEqual(nlri0, nlri4)
        self.assertEqual(nlri1, nlri2)
        self.assertEqual(nlri1, nlri4)
        self.assertEqual(nlri2, nlri4)
        self.assertEqual(nlri4, nlri5)

        self.assertNotEqual(hash(nlri0), hash(nlri3))
        self.assertNotEqual(nlri0, nlri3)
        self.assertNotEqual(nlri1, nlri3)
        self.assertNotEqual(nlri2, nlri3)
        self.assertNotEqual(nlri3, nlri4)
示例#5
0
    def generate_vif_bgp_route(self, mac_address, ip_prefix, plen, label, rd):
        # Generate BGP route and advertise it...

        if ip_prefix:
            assert (plen == 32)

        if self._vxlan_dp_driver():
            mpls_label_field = exa.Labels([], raw_labels=[self.instance_label])
        else:
            mpls_label_field = exa.Labels([self.instance_label])

        # label parameter ignored, we need to use instance label
        nlri = exa.EVPNMAC(rd, exa.ESI(), exa.EthernetTag(),
                           exa.MAC(mac_address), 6 * 8, mpls_label_field,
                           exa.IP.create(ip_prefix) if ip_prefix else None,
                           None,
                           exa.IP.create(self.dp_driver.get_local_address()))

        return engine.RouteEntry(nlri)
示例#6
0
    def __init__(self, *args, **kwargs):

        vpn_instance.VPNInstance.__init__(self, *args, **kwargs)

        self.gw_port = None

        encaps = self.dp_driver.supported_encaps()
        if (exa.Encapsulation(exa.Encapsulation.Type.VXLAN) in encaps
                and any([
                exa.Encapsulation(exa.Encapsulation.Type.MPLS) in encaps,
                exa.Encapsulation(exa.Encapsulation.Type.GRE) in encaps,
                exa.Encapsulation(exa.Encapsulation.Type.MPLS_UDP) in encaps
                ])):
            raise Exception("The dataplane can't support both an MPLS encap "
                            "and a VXLAN encapsulation")

        # Advertise route to receive multi-destination traffic
        self.log.info("Generating BGP route for broadcast/multicast traffic")

        nlri = exa.EVPNMulticast(
            self.instance_rd,
            exa.EthernetTag(),
            exa.IP.create(self.bgp_manager.get_local_address()),
            None,
            exa.IP.create(self.bgp_manager.get_local_address()))

        attributes = exa.Attributes()

        attributes.add(self._gen_encap_extended_communities())

        # add PMSI Tunnel Attribute route
        attributes.add(
            exa.PMSIIngressReplication(self.dp_driver.get_local_address(),
                                       raw_label=self.instance_label))

        self.multicast_route_entry = engine.RouteEntry(nlri, self.export_rts,
                                                       attributes)

        self._advertise_route(self.multicast_route_entry)