Esempio n. 1
0
    def build(self, *args, **kwargs):
        """
                     +-------+
              +------+ as2r  +-------+
              |      +-------+       |
              | =                  = |
              |                      |
          +---+---+      $       +---+---+
          | as1r  +<-------------+  as3r |
          +---+---+              +---+---+
              |                      |
              | $                  $ |
              |      +-------+       |
              +----->+ as4r  +<------+
                     +-------+
        """
        # Add all routers
        as1r = self.addRouter('as1r')
        as2r = self.addRouter('as2r')
        as3r = self.addRouter('as3r')
        as4r = self.addRouter('as4r')

        routers = self.routers()
        prefix = {routers[i]: '2001:db:%04x::/48' % i
                  for i in range(len(routers))}
        as1r.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(prefix[as1r],)),))
        as2r.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(prefix[as2r],)),))
        as3r.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(prefix[as3r],)),))
        as4r.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(prefix[as4r],)),))

        # Add links
        self.addLink(as1r, as2r)
        self.addLink(as1r, as3r)
        self.addLink(as1r, as4r)
        self.addLink(as2r, as3r)
        self.addLink(as3r, as4r)

        # Set AS-ownerships
        self.addAS(1, (as1r,))
        self.addAS(2, (as2r,))
        self.addAS(3, (as3r,))
        self.addAS(4, (as4r,))

        # Add BGP peering
        ebgp_session(self, as1r, as2r, link_type=SHARE)
        ebgp_session(self, as3r, as2r, link_type=SHARE)
        ebgp_session(self, as3r, as1r, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as1r, as4r, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as3r, as4r, link_type=CLIENT_PROVIDER)

        # Add test hosts
        for r in self.routers():
            link = self.addLink(r, self.addHost('h%s' % r))
            self.addSubnet(links=[link], subnets=[prefix[r]])
        super().build(*args, **kwargs)
Esempio n. 2
0
    def build(self, *args, **kwargs):
        """
                     +-------+
              +------+ as2r  +-------+
              |      +-------+       |
              | =                  = |
              |                      |
          +---+---+      $       +---+---+
          | as1r  +<-------------+  as3r |
          +---+---+              +---+---+
              |                      |
              | $                  $ |
              |      +-------+       |
              +----->+ as4r  +<------+
                     +-------+
        """
        # Add all routers
        as1r = self.addRouter('as1r')
        as2r = self.addRouter('as2r')
        as3r = self.addRouter('as3r')
        as4r = self.addRouter('as4r')
        as1r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), ))
        as2r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), ))
        as3r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), ))
        as4r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), ))

        # Add links
        self.addLink(as1r, as2r)
        self.addLink(as1r, as3r)
        self.addLink(as1r, as4r)
        self.addLink(as2r, as3r)
        self.addLink(as3r, as4r)

        # Set AS-ownerships
        self.addAS(1, (as1r, ))
        self.addAS(2, (as2r, ))
        self.addAS(3, (as3r, ))
        self.addAS(4, (as4r, ))

        # Add BGP peering
        ebgp_session(self, as1r, as2r, SHARE)
        ebgp_session(self, as3r, as2r, SHARE)
        ebgp_session(self, as3r, as1r, CLIENT_PROVIDER)
        ebgp_session(self, as1r, as4r, CLIENT_PROVIDER)
        ebgp_session(self, as3r, as4r, CLIENT_PROVIDER)

        # Add test hosts
        for r in self.routers():
            self.addLink(r, self.addHost('h%s' % r))
        super(BGPPrefixConnectedTopo, self).build(*args, **kwargs)
Esempio n. 3
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 27 BGP-RR-TE
        """
        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r3 = self.bgp('as1r3')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as6r1 = self.addRouter('as6r1')
        as6r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as6r2 = self.addRouter('as6r2')
        as6r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        h1 = self.addHost('h1')
        h2 = self.addHost('h2')
        h3 = self.addHost('h3')
        h4 = self.addHost('h4')

        # Add Links
        self.addLink(as1r1, as1r6, ipg_cost=1)
        self.addLink(as1r5, as1r6, igp_cost=1)
        self.addLink(as1r3, as1r5, igp_cost=1)
        self.addLink(as1r1, as1r3, igp_cost=5)
        self.addLink(as6r1, as1r1)
        self.addLink(as6r2, as1r3)
        self.addLink(as6r1,
                     h1,
                     params1={"ip": "dead:beef::/48"},
                     params2={"ip": "dead:beef::1/48"})
        self.addLink(as6r2,
                     h2,
                     params1={"ip": "dead:beef::2/48"},
                     params2={"ip": "dead:beef::3/48"})
        self.addLink(as1r5, h3)
        self.addLink(as1r6, h4)
        set_rr(self, rr=as1r1, peers=[as1r3, as1r5])
        set_rr(self, rr=as1r3, peers=[as1r1, as1r6])

        # Add full mesh
        self.addAS(6, (as6r1, as6r2))
        self.addAS(1, (as1r1, as1r3, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r1, as6r1)
        ebgp_session(self, as1r3, as6r2)

        super(SimpleBGPTopoErr, self).build(*args, **kwargs)
Esempio n. 4
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 38 iBGP
        """
        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as4r1 = self.addRouter('as4r1')
        as4r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), ))
        as4r2 = self.addRouter('as4r2')
        as4r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), ))
        h1 = self.addHost('h1')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as4r1, as1r6)
        self.addLink(as4r2, as1r5)
        self.addLink(as4r1,
                     h1,
                     params1={"ip": "dead:beef::/48"},
                     params2={"ip": "dead:beef::1/48"})
        self.addLink(as4r2,
                     h1,
                     params1={"ip": "dead:beef::2/48"},
                     params2={"ip": "dead:beef::3/48"})
        set_rr(self, as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6])

        # Add full mesh
        self.addAS(4, (as4r1, as4r2))
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as4r1)
        ebgp_session(self, as1r5, as4r2)

        super(SimpleBGPTopoRR, self).build(*args, **kwargs)
    def build(self, *args, **kwargs):
        """
        Topo from slide 33 iBGP
        """
        # Add all routers
        as1r1 = self.bgp('as1r1')

        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as4r1 = self.bgp('as4r1')
        as4r2 = self.bgp('as4r2')
        as5r1 = self.bgp('as5r1')
        as3r1 = self.bgp('as3r1')
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), ))
        h1 = self.addHost('h1')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as4r1, as1r5)
        self.addLink(as4r2, as1r4)
        self.addLink(as3r1, as1r1)
        self.addLink(as5r1, as1r6)
        self.addLink(as3r1, as5r1)
        self.addLink(as5r1, as2r1)
        self.addLink(as2r1, as4r1)
        self.addLink(as4r1, as4r2)
        self.addLink(as2r1,
                     h1,
                     params1={"ip": "dead:beef::/48"},
                     params2={"ip": "dead:beef::1/48"})

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addAS(3, (as3r1, ))
        self.addAS(5, (as5r1, ))
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addAS(1, (as1r1, as1r4, as1r5, as1r6))
        bgp_peering(self, as1r1, as1r6)
        bgp_peering(self, as1r1, as1r4)
        bgp_peering(self, as1r4, as1r5)
        bgp_peering(self, as1r6, as1r5)

        # Add eBGP session
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super(SimpleBGPTopoMissing3, self).build(*args, **kwargs)
Esempio n. 6
0
    def add_bgp(self, ovh_routers, external_routers):
        """
        Add Border Gateway Protocol (BGP) to the routers and specify which prefixes they advertise (both for IPv4
        and IPv6).

        :param all_routers: (list of RouterDescription) A list of all routers contained in the network.
        :param ovh_routers: (list of RouterDescription) List of OVH's routers having an eBGP session which will
        redistribute prefixes advertised by other ASes.
        :param telia_routers: (list of RouterDescription) List of Telia's routers to which OVH routers are connected.
        :param google_routers: (list of RouterDescription) List of Google's routers to which OVH routers are connected.
        :param cogent_routers: (list of RouterDescription) List of Cogent's routers to which OVH routers are connected.
        :param level3_routers: (list of RouterDescription) List of Level3's routers to which OVH routers are connected.
        """
        rules = [
            Rule("-A INPUT -p 89 -j DROP"),
            Rule("-A OUTPUT -p 89 -j DROP")
        ]  # Drop incoming and outgoing OSPF packets (for external AS)
        families = (AF_INET(redistribute=("connected", )),
                    AF_INET6(redistribute=("connected", )))
        for router in ovh_routers:
            router.addDaemon(BGP, address_families=families)
            ovh_rules = list()
            for interface in router.interfaces().getInterfaces():
                if "_" not in interface.getPeerRouter(
                ):  # Check if it is a peer router
                    ovh_rules.append(
                        Rule("-A INPUT -i {} -p 89 -j DROP".format(
                            interface)))  # Drop OSPF packets from other AS
                    ovh_rules.append(
                        Rule("-A OUTPUT -o {} -p 89 -j DROP".format(
                            interface)))  # Drop OSPF packets to other AS
                    # Accept 30 connections before limiting a 2 connections per second
                    ovh_rules.append(
                        Rule(
                            "-A INPUT -i {} -m limit --limit 2/s --limit-burst 30 -j ACCEPT"
                            .format(interface)))
            router.addDaemon(IPTables, rules=ovh_rules)
            router.addDaemon(IP6Tables, rules=ovh_rules)
        # Other AS advertise specific prefixes
        for router in external_routers:
            router.addDaemon(BGP, address_families=families)
            router.addDaemon(IPTables, rules=rules)
            router.addDaemon(IP6Tables, rules=rules)
Esempio n. 7
0
    def add_daemons(self, router, daemons, default_daemons=[]):
        """
            Add daemon to router. 
            Arguments : 
                - router    : the router class to which add daemons. 
                - daemons   : daemons specific for this router. 
                - default_daemons   : daemons by default. 
            
            daemons and default_daemons can be : 
                - list  : name of daemons (will be added without specific config). 
                - dict  : {daemon_name : dict (config)}
        """
        if isinstance(default_daemons, list):
            default_daemons = {d: {} for d in default_daemons}
        if isinstance(daemons, list): daemons = {d: {} for d in daemons}

        daemons = deep_merge(default_daemons, daemons)
        for d, d_config in daemons.items():
            if self.debug:
                print("Adding daemon {} with config {}".format(d, d_config))
            if d == 'ospf':
                router.addDaemon(OSPF)
            elif d == 'ospf6':
                router.addDaemon(OSPF6)
            elif d == 'bgp':
                if 'networks' in d_config:
                    d_config['networks'] = format_address(
                        d_config['networks'], self.__prefixes)
                if 'communities' in d_config:
                    self.__communities[router] = d_config["communities"]

                families = (AF_INET(redistribute=('connected', )),
                            AF_INET6(redistribute=('connected', )))
                router.addDaemon(BGP, address_families=families)
            else:
                raise NotImplementedError(
                    "Daemon {} is not supported yet !".format(d))

        return True
Esempio n. 8
0
    def add_daemons(self, router, daemons, default_daemons=[]):
        if isinstance(default_daemons, list):
            default_daemons = {d: {} for d in default_daemons}
        if isinstance(daemons, list): daemons = {d: {} for d in daemons}

        daemons = {**default_daemons, **daemons}
        for d, d_config in daemons.items():
            if self.debug:
                print("Adding daemon {} with config {}".format(d, d_config))
            if d == 'ospf':
                router.addDaemon(OSPF)
            elif d == 'ospf6':
                router.addDaemon(OSPF6)
            elif d == 'bgp':
                if 'networks' in d_config:
                    d_config['networks'] = format_address(
                        d_config['networks'], self.__prefixes)

                families = (AF_INET(redistribute=('connected', )),
                            AF_INET6(redistribute=('connected', )))
                router.addDaemon(BGP, address_families=families)

        return True
Esempio n. 9
0
    def build(self, *args, **kwargs):
        """
            +-----+       +-----+
        +---+as4r |       |as3r +---+
        |   +--+--+       +--+--+   |
        |      |   \ =   / = | =    | =
        |      |    \   /    |      |
        |      |     \ /     |      |
        | $    | $    \      |      |
        |      |     / \     |      |
        |      |    /   \    |      |
        |      V   /     \   |      |
        |   +-----+       +--+--+   |
        |   |as2r |       |as5r |   |
        |   +--+--+       +-----+   |
        |      | =                  |
        |      |                    |
        |      |                    |
        |      |                    |
        |      |                    |
        |   +--+--+                 |
        +-->+as1r +-----------------+
            +-----+
        """

        list_as_name = ["as1r", "as2r", "as3r", "as4r", "as5r"]
        link_type_name = ["SHARE", "CLIENT_PROVIDER"]
        link_type_object = [SHARE, CLIENT_PROVIDER]
        expected_format = '[AS1] [AS2] [LINK]'

        link = input(
            "Please enter the link you wish to add or 'ok' to let the network as it is\n"
            "To add a link between 2 AS, type '" + expected_format +
            "' where\n"
            " - [AS1] is the first AS (e.g. 'as1r')\n"
            "- [AS2] is the second AS (e.g. "
            "'as2r')\n "
            " - [LINK] is the type of link, i.e.\n"
            "   * 'SHARE' for a shared-cost link\n"
            "   * 'CLIENT_PROVIDER' for a "
            "client-provider link\n")

        while True:
            try:
                l, change = check_correct_link(link, list_as_name,
                                               link_type_name)
                break
            except Exception as e:
                link = input("Error: {}\n Try again: '".format(str(e)) +
                             expected_format + "'\n")

        # Add all routers
        as1r = self.addRouter('as1r')
        as2r = self.addRouter('as2r')
        as3r = self.addRouter('as3r')
        as4r = self.addRouter('as4r')
        as5r = self.addRouter('as5r')
        list_as_object = [as1r, as2r, as3r, as4r, as5r]
        as1r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), ))
        as2r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), ))
        as3r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), ))
        as4r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), ))
        as5r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:5::/48', )), ))

        # Add links
        self.addLink(as1r, as2r)
        self.addLink(as1r, as3r)
        self.addLink(as1r, as4r)
        self.addLink(as2r, as3r)
        self.addLink(as2r, as4r)
        self.addLink(as3r, as5r)
        self.addLink(as4r, as5r)

        # Set AS-ownerships
        self.addAS(1, (as1r, ))
        self.addAS(2, (as2r, ))
        self.addAS(3, (as3r, ))
        self.addAS(4, (as4r, ))
        self.addAS(5, (as5r, ))

        # Add BGP peering
        ebgp_session(self, as1r, as2r, SHARE)
        ebgp_session(self, as1r, as3r, SHARE)
        ebgp_session(self, as2r, as3r, SHARE)
        ebgp_session(self, as3r, as5r, SHARE)
        ebgp_session(self, as4r, as5r, SHARE)
        ebgp_session(self, as4r, as1r, CLIENT_PROVIDER)
        ebgp_session(self, as4r, as2r, CLIENT_PROVIDER)

        # Add custom link
        if change:
            src_as = None
            dst_as = None
            link_chosen = None
            for i in range(len(list_as_object)):
                if l[0] == list_as_name[i]:
                    src_as = list_as_object[i]
                    if dst_as is not None:
                        break
                if l[1] == list_as_name[i]:
                    dst_as = list_as_object[i]
                    if src_as is not None:
                        break
            for i in range(len(link_type_object)):
                if l[2] == link_type_name[i]:
                    link_chosen = link_type_object[i]
                    break
            self.addLink(src_as, dst_as)
            ebgp_session(self, src_as, dst_as, link_chosen)

        # Add test hosts
        for r in self.routers():
            self.addLink(r, self.addHost('h%s' % r))
        super(BGPAdjust, self).build(*args, **kwargs)
Esempio n. 10
0
    def build(self, *args, **kwargs):
        r"""
            +-----+       +-----+
        +---+as4r |       |as3r +---+
        |   +--+--+       +--+--+   |
        |      |   \ =   / = | =    | =
        |      |    \   /    |      |
        |      |     \ /     |      |
        | $    | $    \      |      |
        |      |     / \     |      |
        |      |    /   \    |      |
        |      V   /     \   |      |
        |   +-----+       +--+--+   |
        |   |as2r |       |as5r |   |
        |   +--+--+       +-----+   |
        |      | =                  |
        |      |                    |
        |      |                    |
        |      |                    |
        |      |                    |
        |   +--+--+                 |
        +-->+as1r +-----------------+
            +-----+
        """

        # Add all routers
        as1r, as2r, as3r, as4r, as5r = self.addRouters('as1r', 'as2r', 'as3r',
                                                       'as4r', 'as5r')

        routers = self.routers()
        prefix = {
            routers[i]: '2001:db:%04x::/48' % i
            for i in range(len(routers))
        }
        as1r.addDaemon(
            BGP, address_families=(AF_INET6(networks=(prefix[as1r], )), ))
        as2r.addDaemon(
            BGP, address_families=(AF_INET6(networks=(prefix[as2r], )), ))
        as3r.addDaemon(
            BGP, address_families=(AF_INET6(networks=(prefix[as3r], )), ))
        as4r.addDaemon(
            BGP, address_families=(AF_INET6(networks=(prefix[as4r], )), ))
        as5r.addDaemon(
            BGP, address_families=(AF_INET6(networks=(prefix[as5r], )), ))

        # Add links
        self.addLinks((as1r, as2r), (as1r, as3r), (as1r, as4r), (as2r, as3r),
                      (as2r, as4r), (as3r, as5r), (as4r, as5r))

        # Set AS-ownerships
        self.addAS(1, (as1r, ))
        self.addAS(2, (as2r, ))
        self.addAS(3, (as3r, ))
        self.addAS(4, (as4r, ))
        self.addAS(5, (as5r, ))

        # Add BGP peering
        ebgp_session(self, as1r, as2r, link_type=SHARE)
        ebgp_session(self, as1r, as3r, link_type=SHARE)
        ebgp_session(self, as2r, as3r, link_type=SHARE)
        ebgp_session(self, as3r, as5r, link_type=SHARE)
        ebgp_session(self, as4r, as5r, link_type=SHARE)
        ebgp_session(self, as4r, as1r, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as4r, as2r, link_type=CLIENT_PROVIDER)

        # Check extra link parameters
        self.check_extra_link()

        # Add custom link
        if self.as_start is not None:
            self.addLink(self.as_start, self.as_end)
            ebgp_session(self,
                         self.as_start,
                         self.as_end,
                         link_type=self.bgp_policy)

        # Add test hosts
        for r in self.routers():
            link = self.addLink(r, self.addHost('h%s' % r))
            self.addSubnet(links=[link], subnets=[prefix[r]])
        super().build(*args, **kwargs)
Esempio n. 11
0
    def build(self, *args, **kwargs):
        """
                    +-----+
             +----->+as2r +<----------------+
             |      +-----+                 |
             | $                          $ |
             |                              |
          +--+--+      =      +--+--+       |
          |as1r +-------------+ as3r|       |
          +--+--+             +--+--+       |
             ^                   ^          |
             | $               $ |          |
             |                   |          |
          +--+--+      =      +--+--+       |
          |as4r +-------------+as8r |       |
          +--+--+             +--+--+       |
             ^                   ^          |
             | $               $ |          |
             |                   |          |
          +--+--+      =      +--+--+       |
          |as6r+--------------+as5r +-------+
          +--+--+             +--+--+
             ^                   |
             | $               $ |
             |      +------+     |
             +------+ as7r +<----+
                    +------+
        """
        # Add all routers
        as1r = self.addRouter('as1r')
        as2r = self.addRouter('as2r')
        as3r = self.addRouter('as3r')
        as4r = self.addRouter('as4r')
        as5r = self.addRouter('as5r')
        as6r = self.addRouter('as6r')
        as7r = self.addRouter('as7r')
        as8r = self.addRouter('as8r')
        as1r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), ))
        as2r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), ))
        as3r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), ))
        as4r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), ))
        as5r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:5::/48', )), ))
        as6r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:6::/48', )), ))
        as7r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:7::/48', )), ))
        as8r.addDaemon(
            BGP, address_families=(AF_INET6(networks=('2001:db:8::/48', )), ))

        # Add links
        self.addLink(as1r, as2r)
        self.addLink(as1r, as3r)
        self.addLink(as1r, as4r)
        self.addLink(as2r, as5r)
        self.addLink(as3r, as8r)
        self.addLink(as4r, as6r)
        self.addLink(as4r, as8r)
        self.addLink(as5r, as6r)
        self.addLink(as5r, as7r)
        self.addLink(as5r, as8r)
        self.addLink(as6r, as7r)

        # Set AS-ownerships
        self.addAS(1, (as1r, ))
        self.addAS(2, (as2r, ))
        self.addAS(3, (as3r, ))
        self.addAS(4, (as4r, ))
        self.addAS(5, (as5r, ))
        self.addAS(6, (as6r, ))
        self.addAS(7, (as7r, ))
        self.addAS(8, (as8r, ))

        # Add BGP peering
        ebgp_session(self, as1r, as3r, SHARE)
        ebgp_session(self, as4r, as8r, SHARE)
        ebgp_session(self, as6r, as5r, SHARE)
        ebgp_session(self, as1r, as2r, CLIENT_PROVIDER)
        ebgp_session(self, as4r, as1r, CLIENT_PROVIDER)
        ebgp_session(self, as5r, as2r, CLIENT_PROVIDER)
        ebgp_session(self, as5r, as7r, CLIENT_PROVIDER)
        ebgp_session(self, as5r, as8r, CLIENT_PROVIDER)
        ebgp_session(self, as6r, as4r, CLIENT_PROVIDER)
        ebgp_session(self, as7r, as6r, CLIENT_PROVIDER)
        ebgp_session(self, as8r, as3r, CLIENT_PROVIDER)

        # Add test hosts
        for r in self.routers():
            self.addLink(r, self.addHost('h%s' % r))
        super(BGPMultipleWays, self).build(*args, **kwargs)
Esempio n. 12
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 26 iBGP
		"""

        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as4r1 = self.bgp('as4r1')
        as4r2 = self.bgp('as4r2')
        as3r1 = self.bgp('as3r1')
        as3r2 = self.bgp('as3r2')
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as2h1 = self.addHost("as2h1")
        as1h1 = self.addHost("as1h1")
        as1h2 = self.addHost("as1h2")
        as1h3 = self.addHost("as1h3")
        as1h4 = self.addHost("as1h4")
        as1h5 = self.addHost("as1h5")
        as1h6 = self.addHost("as1h6")

        # Add Links
        self.addLink(as1r1,
                     as1r6,
                     params1={"ip": ("fd00:1:1::1/48", )},
                     params2={"ip": ("fd00:1:1::2/48", )})
        self.addLink(as1r1,
                     as1r3,
                     params1={"ip": ("fd00:1:2::1/48", )},
                     params2={"ip": ("fd00:1:2::2/48", )})
        self.addLink(as1r3,
                     as1r2,
                     params1={"ip": ("fd00:1:4::1/48", )},
                     params2={"ip": ("fd00:1:4::2/48", )})
        self.addLink(as1r3,
                     as1r6,
                     params1={"ip": ("fd00:1:3::1/48", )},
                     params2={"ip": ("fd00:1:3::2/48", )})
        self.addLink(as1r2,
                     as1r4,
                     params1={"ip": ("fd00:1:5::1/48", )},
                     params2={"ip": ("fd00:1:5::2/48", )})
        self.addLink(as1r4,
                     as1r5,
                     params1={"ip": ("fd00:1:6::1/48", )},
                     params2={"ip": ("fd00:1:6::2/48", )})
        self.addLink(as1r5,
                     as1r6,
                     params1={"ip": ("fd00:1:7::1/48", )},
                     params2={"ip": ("fd00:1:7::2/48", )})
        self.addLink(as4r1,
                     as1r5,
                     params1={"ip": ("fd00:4:2::1/48", )},
                     params2={"ip": ("fd00:4:2::2/48", )})
        self.addLink(as4r2,
                     as1r4,
                     params1={"ip": ("fd00:4:1::1/48", )},
                     params2={"ip": ("fd00:4:1::2/48", )})
        self.addLink(as3r2,
                     as1r1,
                     params1={"ip": ("fd00:3:1::1/48", )},
                     params2={"ip": ("fd00:3:1::2/48", )})
        self.addLink(as3r1,
                     as1r6,
                     params1={"ip": ("fd00:3:2::1/48", )},
                     params2={"ip": ("fd00:3:2::2/48", )})
        self.addLink(as3r1,
                     as3r2,
                     params1={"ip": ("fd00:3:3::1/48", )},
                     params2={"ip": ("fd00:3:3::2/48", )},
                     igp_cost=7)
        self.addLink(as3r1,
                     as2r1,
                     params1={"ip": ("fd00:2:1::1/48", )},
                     params2={"ip": ("fd00:2:1::2/48", )})
        self.addLink(as2r1,
                     as4r1,
                     params1={"ip": ("fd00:2:2::1/48", )},
                     params2={"ip": ("fd00:2:2::2/48", )})
        self.addLink(as4r1,
                     as4r2,
                     params1={"ip": ("fd00:4:3::1/48", )},
                     params2={"ip": ("fd00:4:3::2/48", )},
                     igp_cost=2)
        self.addLink(as2r1,
                     as2h1,
                     params1={"ip": ("dead:beef::1/32", )},
                     params2={"ip": ("dead:beef::2/32", )})

        self.addLink(as1r1, as1h1)
        self.addLink(as1r2, as1h2)
        self.addLink(as1r3, as1h3)
        self.addLink(as1r4, as1h4)
        self.addLink(as1r5, as1h5)
        self.addLink(as1r6, as1h6)

        # Set Med
        al = AccessList(name='all', entries=('any', ))
        as3r2.get_config(BGP).set_med(7, to_peer=as1r1, matching=(al, ))
        as3r1.get_config(BGP).set_med(0, to_peer=as1r6, matching=(al, ))
        as4r1.get_config(BGP).set_med(0, to_peer=as1r5, matching=(al, ))
        as4r2.get_config(BGP).set_med(2, to_peer=as1r4, matching=(al, ))

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addiBGPFullMesh(3, routers=[as3r1, as3r2])
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addiBGPFullMesh(
            1, routers=[as1r1, as1r2, as1r3, as1r4, as1r5, as1r6])

        # Add eBGP session
        ebgp_session(self, as1r6, as3r1)
        ebgp_session(self, as1r1, as3r2)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super(MedBGPTopo, self).build(*args, **kwargs)
Esempio n. 13
0
    def build(self, *args, **kwargs):
        """
                                 +
                           AS1   |   AS3
            +----------------------------+
            |                    |       |
        +---+---+                |   +---+---+
        | as1r1 +--------+       |   | as3r1 |
        +---+---+        |       |   +---+---+
            |            |       |       |
          2 |            |       +-------|------------+
            |            |       |       |        AS5
        +---+---+    +---+---+   |   +---+---+
        | as1r3 +----+ as1r6 +-------+ as5r1 +
        +---+---+    +---+---+   |   +---+---+
            |            |       |       |
            |            |       +-------|------------+
            |            |       |       |        AS2
        +---+---+        |       |   +---+---+    +---+---+
        | as1r2 |        |       |   | as2r1 +----+ as2h1 |
        +---+---+        |       |   +---+---+    +---+---+
            |            |       |       |
          4 |            |       +-------|------------+
            |            |       |       |        AS4
        +---+---+    +---+---+   |   +---+---+
        | as1r4 +----+ as1r5 +-------+ as4r1 +
        +---+---+    +-------+   |   +---+---+
            |                    |       |
            |                    |   +---+---+
            +------------------------+ as4r2 +
                                 |   +-------+
                                 |
                                 +
        """

        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as1r6 = self.bgp('as1r6',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as4r1 = self.bgp('as4r1',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as4r2 = self.bgp('as4r2',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as5r1 = self.bgp('as5r1',
                         family=AF_INET6(redistribute=('connected',)))
        as3r1 = self.bgp('as3r1',
                         family=AF_INET6(redistribute=('connected',)))
        as2r1 = self.bgp('as2r1',
                         family=AF_INET6(networks=('dead:beef::/32',)))

        # Add host
        as2h1 = self.addHost('as2h1')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3, igp_metric=2)
        self.addLinks((as1r3, as1r2), (as1r3, as1r6))
        self.addLink(as1r2, as1r4, igp_metric=4)
        self.addLinks((as1r4, as1r5), (as1r5, as1r6), (as4r1, as1r5),
                      (as4r2, as1r4), (as3r1, as1r1), (as5r1, as1r6),
                      (as3r1, as5r1), (as5r1, as2r1), (as2r1, as4r1),
                      (as4r1, as4r2), (as2r1, as2h1))
        self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32',))

        set_rr(self, rr=as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6])
        set_rr(self, rr=as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6])

        # Add full mesh
        self.addAS(2, (as2r1,))
        self.addAS(3, (as3r1,))
        self.addAS(5, (as5r1,))
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as5r1)
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super().build(*args, **kwargs)
Esempio n. 14
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 30 iBGP
        """
        # Add all routers
        as1r1 = self.addRouter('as1r1')
        as1r1.addDaemon(BGP,
                        address_families=(AF_INET6(networks=('1:1::/48', )), ))
        as1r2 = self.addRouter('as1r2')
        as1r2.addDaemon(BGP,
                        address_families=(AF_INET6(networks=('1:1::/48', )), ))
        as1r3 = self.addRouter('as1r3')
        as1r3.addDaemon(BGP,
                        address_families=(AF_INET6(networks=('1:1::/48', )), ))
        as1r4 = self.addRouter('as1r4')
        as1r4.addDaemon(BGP,
                        address_families=(AF_INET6(networks=('1:1::/48', )), ))
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), ))
        h1 = self.addHost('h1')
        as3r1 = self.addRouter('as3r1')
        as3r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('beef:dead::/48', )), ))
        as3r2 = self.addRouter('as3r2')
        as3r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('beef:dead::/48', )), ))
        h2 = self.addHost('h2')

        # Add links
        self.addLink(as1r1, as1r2)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r4)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r3, as2r1)
        self.addLink(as1r2, as3r1)
        self.addLink(as3r1, as3r2)
        self.addLink(as3r2, as2r1)
        self.addLink(as2r1,
                     h1,
                     params1={"ip": "dead:beef::/48"},
                     params2={"ip": "dead:beef::1/48"})
        self.addLink(as3r1,
                     h2,
                     params1={"ip": "dead:beef::4/48"},
                     params2={"ip": "dead:beef::5/48"})
        self.addLink(as3r2,
                     h2,
                     params1={"ip": "dead:beef::2/48"},
                     params2={"ip": "dead:beef::3/48"})

        # Add AS and fullmeshes
        self.addAS(2, (as2r1, ))
        self.addiBGPFullMesh(1, routers=[as1r1, as1r2, as1r3, as1r4])
        self.addiBGPFullMesh(3, routers=[as3r1, as3r2])

        # Add eBGP sessions
        ebgp_session(self, as1r2, as3r1)
        ebgp_session(self, as3r2, as2r1)
        ebgp_session(self, as2r1, as1r3)

        super(SimpleBGPTopoRoutes, self).build(*args, **kwargs)
Esempio n. 15
0
    def build(self, *args, **kwargs):
        family = AF_INET6()
        lan_as1_h1 = 'cafe:babe:dead:beaf::/64'
        lan_as2_h2 = 'c1a4:4ad:c0ff:ee::/64'

        # first step, adding routers
        # routers of as1
        as1_rr1 = self.addRouter("as1_rr1", config=RouterConfig)
        as1_rr2 = self.addRouter("as1_rr2", config=RouterConfig)

        as1_s1 = self.addRouter("as1_s1", config=RouterConfig)
        as1_s2 = self.addRouter("as1_s2", config=RouterConfig)

        # adding OSPF6 as IGP
        as1_rr1.addDaemon(OSPF6)
        as1_rr2.addDaemon(OSPF6)
        as1_s1.addDaemon(OSPF6)
        as1_s2.addDaemon(OSPF6)

        # adding BGP to establish iBGP sessions
        as1_rr1.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_as1_h1,),),))
        as1_rr2.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_as1_h1,),),))
        as1_s1.addDaemon(BGP, address_families=(family,))
        as1_s2.addDaemon(BGP, address_families=(family,))

        # set the ASN for routers belonging to AS1
        self.addAS(1, (as1_rr1, as1_rr2, as1_s1, as1_s2))

        # configure as1_rr{1,2} as route reflectors
        set_rr(self, rr=as1_rr1, peers=[as1_s1, as1_rr2])
        set_rr(self, rr=as1_rr2, peers=[as1_s2, as1_rr1])

        # routers of as2
        as2_cl1 = self.addRouter("as2_cl1", config=RouterConfig)
        as2_cl2 = self.addRouter("as2_cl2", config=RouterConfig)

        # adding a BGP daemon for AS2 routers
        as2_cl1.addDaemon(BGP, address_families=(AF_INET6(redistribute=['connected']),))
        as2_cl2.addDaemon(BGP, address_families=(AF_INET6(redistribute=['connected']),))

        # set the ASN for routers belonging to AS2
        self.addAS(2, (as2_cl1, as2_cl2))

        # we add a host in as1
        as1_h1 = self.addHost("as1_h1")
        # and also in as2
        as2_h2 = self.addHost("as2_h2")

        # The goal of this network is to establish a connection between h1 and h2

        # adding links between the routers (and hosts)
        self.addLink(as1_rr1, as1_rr2, igp_metric=5)
        self.addLinks((as1_s1, as1_s2), (as1_s1, as1_rr2),
                      (as1_s2, as1_rr1),
                      (as1_rr1, as2_cl1), (as1_rr2, as2_cl2),
                      (as1_h1, as1_s2), (as2_cl1, as2_h2), (as2_cl2, as2_h2))

        # adding a subnet between hosts and routers
        self.addSubnet((as1_s2, as1_h1), subnets=(lan_as1_h1,))
        self.addSubnet((as2_cl1, as2_h2), subnets=(lan_as2_h2,))
        self.addSubnet((as2_cl2, as2_h2), subnets=(lan_as2_h2,))

        # adding eBGP sessions between the two ASes
        ebgp_session(self, as2_cl1, as1_rr1, link_type=SHARE)
        ebgp_session(self, as2_cl2, as1_rr2, link_type=SHARE)

        super().build(*args, **kwargs)
Esempio n. 16
0
 def bgp(self, name, family=AF_INET6()):
     r = self.addRouter(name)
     r.addDaemon(BGP, address_families=(family, ))
     return r
Esempio n. 17
0
    def build(self, *args, **kwargs):
        """
        Build the topology of our OVH network and set up it by adding routers, links, protocols, setting up routers
        reflectors, etc.
        """
        # Adding routers
        fra1_g1 = self.addRouter("fra1_g1", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 1, IPV4_LO_PREFIX).__str__()
        ])
        fra1_g2 = self.addRouter("fra1_g2", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "2",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 2, IPV4_LO_PREFIX).__str__()
        ])
        fra_sbb1 = self.addRouter("fra_sbb1", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "3",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 3, IPV4_LO_PREFIX).__str__()
        ])
        fra_sbb2 = self.addRouter("fra_sbb2", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "4",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 4, IPV4_LO_PREFIX).__str__()
        ])
        fra_1 = self.addRouter("fra_1", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "5",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 5, IPV4_LO_PREFIX).__str__()
        ])
        fra_5 = self.addRouter("fra_5", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "6",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 6, IPV4_LO_PREFIX).__str__()
        ])
        rbx_g1 = self.addRouter("rbx_g1", [
            IPv6Address("2023", "a", "d", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 7, IPV4_LO_PREFIX).__str__()
        ])
        rbx_g2 = self.addRouter("rbx_g2", [
            IPv6Address("2023", "a", "d", "0", "0", "0", "0", "2",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 8, IPV4_LO_PREFIX).__str__()
        ])
        sbg_g1 = self.addRouter("sbg_g1", [
            IPv6Address("2023", "a", "e", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 9, IPV4_LO_PREFIX).__str__()
        ])
        sbg_g2 = self.addRouter("sbg_g2", [
            IPv6Address("2023", "a", "e", "0", "0", "0", "0", "2",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 10, IPV4_LO_PREFIX).__str__()
        ])
        par_th2 = self.addRouter("par_th2", [
            IPv6Address("2023", "a", "f", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 11, IPV4_LO_PREFIX).__str__()
        ])
        par_gsw = self.addRouter("par_gsw", [
            IPv6Address("2023", "a", "f", "0", "0", "0", "0", "2",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 12, IPV4_LO_PREFIX).__str__()
        ])
        telia = self.addRouter("telia", [
            IPv6Address("2299", "a", "5", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(123, 3, 2, 1, IPV4_LO_PREFIX).__str__()
        ])
        google = self.addRouter("google", [
            IPv6Address("2169", "a", "6", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(124, 3, 2, 1, IPV4_LO_PREFIX).__str__()
        ])
        cogent = self.addRouter("cogent", [
            IPv6Address("2174", "a", "7", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(125, 3, 2, 1, IPV4_LO_PREFIX).__str__()
        ])
        level3 = self.addRouter("level3", [
            IPv6Address("2356", "a", "8", "0", "0", "0", "0", "1",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(126, 3, 2, 1, IPV4_LO_PREFIX).__str__()
        ])
        all_routers = [
            fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1, fra_5, rbx_g1, rbx_g2,
            sbg_g1, sbg_g2, par_th2, par_gsw, telia, google, cogent, level3
        ]
        fra_routers = [fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1,
                       fra_5]  # In Frankfurt
        rbx_routers = [rbx_g1, rbx_g2]  # In Roubaix
        sbg_routers = [sbg_g1, sbg_g2]  # In Strasbourg
        par_routers = [par_th2, par_gsw]  # In Paris
        ovh_routers = fra_routers + rbx_routers + sbg_routers + par_routers
        external_routers = [telia, google, cogent, level3]

        # Adding physical links
        self.add_physical_link(fra1_g1, fra1_g2, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "0",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 0, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra1_g1, fra_sbb1, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "2",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 2, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra1_g2, fra_sbb2, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "4",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 4, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_sbb1, fra_sbb2, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "6",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 6, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_sbb1, fra_5, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "8",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 8, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_sbb1, fra_1, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "a",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 10, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            fra_sbb1,
            sbg_g1, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "c",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 12, IPV4_LINK_PREFIX)),
            igp_cost_value=2)
        self.add_physical_link(
            fra_sbb1,
            rbx_g1, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "e",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 14, IPV4_LINK_PREFIX)),
            igp_cost_value=5)
        self.add_physical_link(fra_sbb2, fra_1, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "10",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 16, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_sbb2, fra_5, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "12",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 18, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            fra_sbb2,
            rbx_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "14",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 20, IPV4_LINK_PREFIX)),
            igp_cost_value=5)
        self.add_physical_link(
            fra_sbb2,
            sbg_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "16",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 22, IPV4_LINK_PREFIX)),
            igp_cost_value=2)
        self.add_physical_link(fra_1, telia, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "18",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 24, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_5, telia, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "1a",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 26, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_5, level3, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "1c",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 28, IPV4_LINK_PREFIX)))
        self.add_physical_link(rbx_g1, rbx_g2, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "1e",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 30, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            rbx_g1,
            par_th2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "20",
                                  IPV6_LINK_PREFIX),
                      IPv4Address(12, 16, 217, 32, IPV4_LINK_PREFIX)),
            igp_cost_value=3)
        self.add_physical_link(rbx_g2, par_gsw, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "22",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 34, IPV4_LINK_PREFIX)))
        self.add_physical_link(sbg_g1, sbg_g2, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "24",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 36, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            sbg_g1,
            par_th2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "26",
                                  IPV6_LINK_PREFIX),
                      IPv4Address(12, 16, 217, 38, IPV4_LINK_PREFIX)),
            igp_cost_value=5)
        self.add_physical_link(par_th2, par_gsw, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "28",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 40, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            par_th2,
            google, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "2a",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 42, IPV4_LINK_PREFIX)),
            igp_cost_value=2)
        self.add_physical_link(par_th2, cogent, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "2c",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 44, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            par_gsw,
            sbg_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "2e",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 46, IPV4_LINK_PREFIX)),
            igp_cost_value=5)
        self.add_physical_link(par_gsw, level3, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "30",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 48, IPV4_LINK_PREFIX)))
        self.add_physical_link(par_gsw, cogent, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "32",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 50, IPV4_LINK_PREFIX)))
        self.add_physical_link(
            par_gsw,
            google, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "34",
                                 IPV6_LINK_PREFIX),
                     IPv4Address(12, 16, 217, 52, IPV4_LINK_PREFIX)),
            igp_cost_value=2)

        # Adding OSPF and BGP daemons to routers
        self.add_ospf(all_routers)
        self.add_bgp(ovh_routers, external_routers)

        # Adding AS ownerships
        self.addAS(OVH_AS, (fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1, fra_5,
                            rbx_g1, rbx_g2, sbg_g1, par_th2, par_gsw, sbg_g2))
        self.addAS(TELIA_AS, (telia, ))
        self.addAS(COGENT_AS, (cogent, ))
        self.addAS(LEVEL3_AS, (level3, ))
        self.addAS(GOOGLE_AS, (google, ))

        # Configuring RRs/iBGP sessions
        peers_fra_fr5_sbb1 = peers_fra_5 = [fra1_g1, fra1_g2, fra_sbb2, fra_1]
        peers_rbx_g1 = peers_rbx_g2 = [sbg_g1, par_th2, par_gsw, sbg_g2]
        set_rr(self, rr=fra_sbb1, peers=peers_fra_fr5_sbb1)
        set_rr(self, rr=fra_5, peers=peers_fra_5)
        set_rr(self, rr=rbx_g1, peers=peers_rbx_g1)
        set_rr(self, rr=rbx_g2, peers=peers_rbx_g2)
        self.addiBGPFullMesh(16276, routers=[fra_sbb1, fra_5, rbx_g1,
                                             rbx_g2])  # (4*3)/2 iBGP sessions

        # Adding eBGP sessions
        ebgp_session(self, telia, fra_1, link_type=CLIENT_PROVIDER)
        ebgp_session(self, telia, fra_5, link_type=CLIENT_PROVIDER)
        ebgp_session(self, level3, fra_5, link_type=CLIENT_PROVIDER)
        ebgp_session(self, google, par_gsw, link_type=CLIENT_PROVIDER)
        ebgp_session(self, cogent, par_gsw, link_type=CLIENT_PROVIDER)
        ebgp_session(self, level3, par_gsw, link_type=CLIENT_PROVIDER)
        ebgp_session(self, cogent, par_th2, link_type=CLIENT_PROVIDER)
        ebgp_session(self, google, par_th2, link_type=CLIENT_PROVIDER)

        # DNS anycast
        sbg_web = self.addHost("sbg_web")
        fra_server = self.addRouter("fra_server", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "7",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 13, IPV4_LO_PREFIX).__str__()
        ])
        rbx_server = self.addRouter("rbx_server", [
            IPv6Address("2023", "a", "c", "0", "0", "0", "0", "7",
                        IPV6_LO_PREFIX).__str__(),
            IPv4Address(12, 16, 216, 13, IPV4_LO_PREFIX).__str__()
        ])
        fra_server.addDaemon(
            BGP,
            address_families=(AF_INET(redistribute=("connected", )),
                              AF_INET6(redistribute=("connected", ))))
        rbx_server.addDaemon(
            BGP,
            address_families=(AF_INET(redistribute=("connected", )),
                              AF_INET6(redistribute=("connected", ))))
        self.addAS(64512, (fra_server, ))  # private ASN
        self.addAS(64513, (rbx_server, ))
        self.add_physical_link(rbx_g1, rbx_server, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "36",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 54, IPV4_LINK_PREFIX)))
        self.add_physical_link(fra_sbb2, fra_server, (IPv6Address(
            "2023", "b", "0", "0", "0", "0", "0", "36",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 54, IPV4_LINK_PREFIX)))
        self.add_physical_link(sbg_g2, sbg_web, (IPv6Address(
            "2023", "e", "2", "0", "0", "0", "0", "3",
            IPV6_LINK_PREFIX), IPv4Address(12, 16, 218, 71, IPV4_LINK_PREFIX)))

        ebgp_session(self, fra_server, fra_sbb2, link_type=CLIENT_PROVIDER)
        ebgp_session(self, rbx_server, rbx_g1, link_type=CLIENT_PROVIDER)

        fra_server.addDaemon(Named)
        rbx_server.addDaemon(Named)
        self.addDNSZone(name=DOMAIN,
                        dns_master=fra_server,
                        dns_slaves=[rbx_server],
                        nodes=[sbg_web])

        reverse_domain_name_ipv6 = ip_address("2023::").reverse_pointer[
            -10:]  # adding a missing PTR record
        ptr_record_ipv6 = PTRRecord(
            IPv6Address("2023", "b", "0", "0", "0", "0", "0", "38",
                        IPV6_LINK_PREFIX).__str__()[:-4],
            sbg_web + f".{DOMAIN}")
        self.addDNSZone(name=reverse_domain_name_ipv6,
                        dns_master=fra_server,
                        dns_slaves=[rbx_server],
                        ns_domain_name=DOMAIN,
                        records=[ptr_record_ipv6])

        super().build(*args, **kwargs)
    def build(self, *args, **kwargs):
        # --- Metrics ---
        small = 1
        medium = 3
        large = 8
        extra_large = 13

        # IPv4 range 198.27.92.0/24
        # IPv6 range 2604:2dc0::/32
        # lan USA : 2604:2dc0:0000::/34
        # OTHER : 2604:2dc0:2000::/34
        # lan APAC : 2604:2dc0:4000::/34
        # lan EU : 2604:2dc0:8000::/34

        #OVH = \32
        #OVH+continent = \34
        #OVH+continent+type = \36

        # ===================== OVH Router configurations ==================
        # 16 routers identified by a single IPv4, IPv6 address
        # ==================================================================
        # --- Routers configuration ---
        sin = self.addRouter("sin", config=RouterConfig,lo_addresses=["2604:2dc0:4000::0/36","198.27.92.0/24"])
        syd = self.addRouter("syd", config=RouterConfig,lo_addresses=["2604:2dc0:4000::1/36","198.27.92.1/24"])

        pao = self.addRouter("pao", config=RouterConfig,lo_addresses=["2604:2dc0::0/36","198.27.92.2/24"])
        sjo = self.addRouter("sjo", config=RouterConfig,lo_addresses=["2604:2dc0::1/36","198.27.92.3/24"])
        lax1 = self.addRouter("lax1", config=RouterConfig,lo_addresses=["2604:2dc0::2/36","198.27.92.4/24"])

        chi1 = self.addRouter("chi1", config=RouterConfig,lo_addresses=["2604:2dc0::3/36","198.27.92.5/24"])
        chi5 = self.addRouter("chi5", config=RouterConfig,lo_addresses=["2604:2dc0::4/36","198.27.92.6/24"])

        bhs1 = self.addRouter("bhs1", config=RouterConfig,lo_addresses=["2604:2dc0::5/36","198.27.92.7/24"])
        bhs2 = self.addRouter("bhs2", config=RouterConfig,lo_addresses=["2604:2dc0::6/36","198.27.92.8/24"])

        ash1 = self.addRouter("ash1", config=RouterConfig,lo_addresses=["2604:2dc0::7/36","198.27.92.9/24"])
        ash5 = self.addRouter("ash5", config=RouterConfig,lo_addresses=["2604:2dc0::8/36","198.27.92.10/24"])

        nwk1 = self.addRouter("nwk1", config=RouterConfig,lo_addresses=["2604:2dc0::9/36","198.27.92.11/24"])
        nwk5 = self.addRouter("nwk5", config=RouterConfig,lo_addresses=["2604:2dc0::a/36","198.27.92.12/24"])
        nyc = self.addRouter("nyc", config=RouterConfig,lo_addresses=["2604:2dc0::b/36","198.27.92.13/24"])

        lon_thw = self.addRouter("lon_thw", config=RouterConfig,lo_addresses=["2604:2dc0:8000::0/36","198.27.92.14/24"])
        lon_drch = self.addRouter("lon_drch", config=RouterConfig,lo_addresses=["2604:2dc0:8000::1/36","198.27.92.15/24"])
        
        anycast1 = self.addRouter("anycast1",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] )   
        anycast2 = self.addRouter("anycast2",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] )   
        anycast3 = self.addRouter("anycast3",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] ) 
        anycastServers = [anycast1,anycast2,anycast3]

        OVHRouters = [sin, syd, pao, sjo, lax1, chi1, chi5, bhs1, bhs2, ash1, ash5, nwk1, nwk5, nyc, lon_thw, lon_drch,anycast1,anycast2,anycast3]
        NARouters = [pao,sjo,lax1,chi1,chi5,bhs1,bhs2,ash1,ash5,nwk1,nwk5,nyc]
        APACRouters = [sin,syd]
        EURouters = [lon_thw,lon_drch]
        self.addAS(16276, OVHRouters)


        # --- Subnets of each router ---
        #       IPv6
        subnetSin6 = "2604:2dc0:4800::0/40"
        subnetSyd6 = "2604:2dc0:4900::0/40"

        subnetPao6 = "2604:2dc0:0800::0/40"
        subnetSjo6 = "2604:2dc0:0900::0/40"
        subnetLax16 = "2604:2dc0:0a00::0/40"

        subnetChi16 = "2604:2dc0:0b00::0/40"
        subnetChi56 = "2604:2dc0:0c00::0/40"

        subnetBhs16 = "2604:2dc0:0d00::0/40"
        subnetBhs26 = "2604:2dc0:0e00::0/40"

        subnetAsh16 = "2604:2dc0:0f00::0/40"
        subnetAsh56 = "2604:2dc0:1000::0/40"

        subnetNwk16 = "2604:2dc0:1100::0/40"
        subnetNwk56 = "2604:2dc0:1200::0/40"
        subnetNyc6 = "2604:2dc0:1300::0/40"

        subnetLon_thw6 = "2604:2dc0:8800::0/40"
        subnetLon_drch6 = "2604:2dc0:8900::0/40"

        #       IPv4
        subnetSin = "198.27.92.16/28"
        subnetSyd = "198.27.92.32/28"

        subnetPao = "198.27.92.48/28"
        subnetSjo = "198.27.92.64/28"
        subnetLax1 = "198.27.92.80/28"

        subnetChi1 = "198.27.92.96/28"
        subnetChi5 = "198.27.92.112/28"

        subnetBhs1 = "198.27.92.128/28"
        subnetBhs2 = "198.27.92.144/28"

        subnetAsh1 = "198.27.92.160/28"
        subnetAsh5 = "198.27.92.176/28"

        subnetNwk1 = "198.27.92.192/28"
        subnetNwk5 = "198.27.92.208/28"
        subnetNyc = "198.27.92.224/28"

        subnetLon_thw = "198.27.92.240/29"
        subnetLon_drch = "198.27.92.248/29"

        OVHSubsnets4 = [subnetSin, subnetSyd,subnetPao,subnetSjo,subnetLax1,subnetChi1,subnetChi5,subnetBhs1,subnetBhs2,subnetAsh1,subnetAsh5,subnetNwk1,subnetNwk5,subnetNyc,subnetLon_thw,subnetLon_drch]
        OVHSubsnets6 = [subnetSin6, subnetSyd6,subnetPao6,subnetSjo6,subnetLax16,subnetChi16,subnetChi56,subnetBhs16,subnetBhs26,subnetAsh16,subnetAsh56,subnetNwk16,subnetNwk56,subnetNyc6,subnetLon_thw6,subnetLon_drch6]

        # ====== Host configuration ========================================
        #
        # ==================================================================
        hpao = self.addHost("hpao")
        self.addLink(hpao,pao)

        hsjo = self.addHost("hsjo")
        self.addLink(hsjo,sjo)

        hlax1 = self.addHost("hlax1")
        self.addLink(hlax1,lax1)

        hchi1 = self.addHost("hchi1")
        self.addLink(hchi1,chi1)

        hchi5 = self.addHost("hchi5")
        self.addLink(hchi5,chi5)

        hbhs1 = self.addHost("hbhs1")
        self.addLink(hbhs1,bhs1)

        hbhs2 = self.addHost("hbhs2")
        self.addLink(hbhs2,bhs2)

        hash1 = self.addHost("hash1")
        self.addLink(hash1,ash1)

        hash5 = self.addHost("hash5")
        self.addLink(hash5,ash5)

        hnwk1 = self.addHost("hnwk1")
        self.addLink(hnwk1,nwk1)

        hnwk5 = self.addHost("hnwk5")
        self.addLink(hnwk5,nwk5)

        hnyc = self.addHost("hnyc")
        self.addLink(hnyc,nyc)


        hEU = self.addHost("hEU")
        self.addLink(hEU,lon_thw,igp_metric=1)

        hAPAC = self.addHost("hAPAC")
        self.addLink(hAPAC,sin,igp_metric=1)

        self.addSubnet(nodes = [sin,hAPAC], subnets = [subnetSin6, subnetSin])
        self.addSubnet(nodes = [syd], subnets = [subnetSyd6,subnetSyd])

        self.addSubnet(nodes = [pao,hpao], subnets = [subnetPao6,subnetPao])
        self.addSubnet(nodes = [sjo,hsjo], subnets = [subnetSjo6,subnetSjo])
        self.addSubnet(nodes = [lax1,hlax1], subnets = [subnetLax16,subnetLax1])

        self.addSubnet(nodes = [chi1,hchi1], subnets = [subnetChi16,subnetChi1])
        self.addSubnet(nodes = [chi5,hchi5], subnets = [subnetChi56,subnetChi5])

        self.addSubnet(nodes = [bhs1,hbhs1], subnets = [subnetBhs16,subnetBhs1])
        self.addSubnet(nodes = [bhs2,hbhs2], subnets = [subnetBhs26,subnetBhs2])

        self.addSubnet(nodes = [ash1,hash1], subnets = [subnetAsh16,subnetAsh1])
        self.addSubnet(nodes = [ash5,hash5], subnets = [subnetAsh56,subnetAsh5])

        self.addSubnet(nodes = [nwk1,hnwk1], subnets = [subnetNwk16,subnetNwk1])
        self.addSubnet(nodes = [nwk5,hnwk5], subnets = [subnetNwk56,subnetNwk5])
        self.addSubnet(nodes = [nyc,hnyc], subnets = [subnetNyc6,subnetNyc])

        self.addSubnet(nodes = [lon_thw,hEU], subnets = [subnetLon_thw6,subnetLon_thw])
        self.addSubnet(nodes = [lon_drch], subnets = [subnetLon_drch6,subnetLon_drch])


        # --- Physical links between routers ---
        self.addLink(sin, sjo,igp_metric=extra_large)
        self.addLink(syd,lax1,igp_metric=extra_large)

        self.addLink(syd,sin,igp_metric=large)
        self.addLink(syd,lon_thw,igp_metric=extra_large)
        self.addLink(syd,lon_drch,igp_metric=extra_large)
        self.addLink(sin,lon_thw,igp_metric=extra_large)
        self.addLink(sin,lon_drch,igp_metric=extra_large)
        self.addLink(lon_thw,lon_drch,igp_metric=small)

        self.addLink(pao,sjo,igp_metric=medium)
        self.addLink(sjo,lax1,igp_metric=medium)

        self.addLink(pao,chi1,igp_metric=medium)
        self.addLink(pao,chi5,igp_metric=medium)
        self.addLink(chi1,chi5,igp_metric=small)

        self.addLink(lax1,ash1,igp_metric=large)
        self.addLink(lax1,ash5,igp_metric=large)
        self.addLink(ash1,ash5,igp_metric=small)

        self.addLink(chi1,bhs1,igp_metric=medium)
        self.addLink(chi5,bhs2,igp_metric=medium)
        self.addLink(bhs1,bhs2,igp_metric=small)

        self.addLink(bhs1,nwk1,igp_metric=medium)
        self.addLink(bhs2,nwk5,igp_metric=medium)

        self.addLink(ash1,nwk1,igp_metric=large)
        self.addLink(ash5,nwk5,igp_metric=large)

        self.addLink(ash1,chi1,igp_metric=large)
        self.addLink(ash5,chi5,igp_metric=large)

        self.addLink(nwk1,nwk5,igp_metric=small)
        self.addLink(nwk1,nyc,igp_metric=small)
        self.addLink(nwk5,nyc,igp_metric=small)

        self.addLink(nwk1,lon_thw,igp_metric=extra_large)
        self.addLink(nwk5,lon_drch,igp_metric=extra_large)
        
        """
        self.addLink(anycast1,sin)
        self.addLink(anycast2,ash1);     
        self.addLink(anycast3,lon_thw)   

        """ 

        anycast1_link = self.addLink(anycast1,  sin)
        anycast1_link[anycast1].addParams(ip = ("fc00:0:27::2/48","192.168.39.2/24"))
        anycast1_link[sin].addParams(ip = ("fc00:0:27::1/48","192.168.39.1/24"))


        anycast2_link = self.addLink(anycast2,  ash1)
        anycast2_link[anycast2].addParams(ip = ("fc00:0:28::1/48","192.168.40.1/24"))
        anycast2_link[ash1].addParams(ip = ("fc00:0:28::2/48","192.168.40.2/24"))


        anycast3_link = self.addLink(anycast3,  lon_thw)
        anycast3_link[anycast3].addParams(ip = ("fc00:0:29::1/48","192.168.41.1/24"))
        anycast3_link[lon_thw].addParams(ip = ("fc00:0:29::2/48","192.168.41.2/24"))




        # --- Rules for inputTable ---

        ip_rules = [InputFilter(default="DROP", rules=[
            Allow(iif='lo'),
            Allow(m='conntrack --ctstate RELATED,ESTABLISHED'),
            Deny(m='conntrack --ctstate INVALID'),
            Allow(p='icmp --icmp-type 0', m='conntrack --ctstate NEW'),
            Allow(p='icmp --icmp-type 3', m='conntrack --ctstate NEW'),
            Allow(p='icmp --icmp-type 8', m='conntrack --ctstate NEW'),
            Allow(p='icmp --icmp-type 9', m='conntrack --ctstate NEW'),
            Allow(p='icmp --icmp-type 10', m='conntrack --ctstate NEW'),
            Allow(p='icmp --icmp-type 11', m='conntrack --ctstate NEW'),
            Allow(src='1.3.1.0/24'),
            Allow(src='1.4.2.0/24'),
            Allow(src='1.5.3.0/24'),
            Allow(src='1.6.4.0/24'),
            Allow(src='198.27.92.0/24'),
            ]),
            OutputFilter(default="ACCEPT", rules=[
            Deny(m='state --state INVALID'),
            ]),
            TransitFilter(default="ACCEPT", rules=[
            Deny(m='state --state INVALID'),
            ])]

        ip6_rules = [
            Rule('-A INPUT -i lo -j ACCEPT'),
            Rule('-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT'),
            Rule('-A INPUT -m conntrack --ctstate INVALID -j DROP'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 0 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 3 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 8 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 9 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 10 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -p icmpv6 --icmpv6-type 11 -m conntrack --ctstate NEW -j ACCEPT'),
            Rule('-A INPUT -s c1a4:4ad:c0ff:ee::/64 -j ACCEPT'),
            Rule('-A INPUT -s c1a4:4ad:c0ff:ee::/64 -j ACCEPT'),
            Rule('-A INPUT -s cafe:d0d0:e5:dead::/64 -j ACCEPT'),
            Rule('-A INPUT -s aaaa:aaaa:aaaa:aaaa::/64 -j ACCEPT'),
            Rule('-A INPUT -s 2604:2dc0::/32 -j ACCEPT'),
            Rule('-P INPUT ACCEPT')]

        for r in OVHRouters:
            r.addDaemon(IPTables, rules=ip_rules)
            r.addDaemon(IP6Tables, rules=ip6_rules) 

        # ========================= OSPF configuration ==================
        #
        # ===============================================================
        # --- Add a OSPF daemon on each router of OVH
        for r in OVHRouters:
            if(r not in anycastServers):
                r.addDaemon(OSPF, KEYID=1, KEY="OVHKEY")
                r.addDaemon(OSPF6)

        # ========================= BGP configuration ==================
        #   - 3 route reflectors at level 1 (highest in hierarchy)
        #   - 3 route reflectors at level 0
        # ==============================================================
        # --- Add a BGP daemon on each router ---
        for i in range(len(OVHRouters)-len(anycastServers)):
            OVHRouters[i].addDaemon(BGP,debug = ("neighbor",),address_families=(AF_INET(networks=(OVHSubsnets4[i],)),AF_INET6(networks=(OVHSubsnets6[i],))), bgppassword="******")

        anycast1.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",))));
        anycast2.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",))));
        anycast3.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",))));

        bgp_anycast(self,sin,anycast1)
        bgp_anycast(self,ash1,anycast2)
        bgp_anycast(self,lon_thw,anycast3)


        # add bgp communities setup
        for r in NARouters:
            rm_setup(self,r,'NA')
        for r in EURouters:
            rm_setup(self,r,'EU')
        for r in APACRouters:
            rm_setup(self,r,'APAC')


        # --- Configure the router reflectors ---
        #       Lower hierarchy route reflectors

        # --- Configure the router reflectors ---
        set_rr(self, rr= bhs1, peers=[chi1,pao,nwk1,nyc])
        set_rr(self, rr= bhs2, peers=[nwk5,pao,sjo,chi1,chi5,lax1])
        set_rr(self, rr= ash5, peers=[nyc,chi5,nwk5,lax1,sjo,nwk1])

        bgp_peering(self, bhs1, bhs2)
        bgp_peering(self, bhs1, ash5)
        bgp_peering(self, bhs2, ash5)

        #       higher hierarchy route reflectors
        set_rr(self, rr= ash1, peers=[bhs1,bhs2,ash5,anycast1])      # This one is a super RR
        set_rr(self, rr = lon_thw, peers=[lon_drch,anycast2])                           # This one is a super RR
        set_rr(self, rr = sin, peers=[syd,anycast3])                                    # This one is a super RR

        ibgp_Inter_Region(self, ash1, lon_thw)
        ibgp_Inter_Region(self, ash1, sin)
        ibgp_Inter_Region(self, sin, lon_thw)


        # ====== Router configurations of transit/stub providers ===========
        # - 1 stub provider : Google (ggl)
        # - 3 transit providers :
        #       - Cogent (cgt)
        #       - Level3 (lvl3)
        #       - Telia (tel)
        # ==================================================================

        # --- Google (AS=2)
        ggl = self.addRouter("ggl", config=RouterConfig)
        self.addLinks( (ggl,ash1), (ggl,ash5) )
        self.addAS(2,(ggl , ))

        lan_ggl = '1.3.1.0/24'
        lan_ggl_v6 = 'cafe:babe:dead:beaf::/64'
        ggl.addDaemon(BGP, address_families=(AF_INET(networks=(lan_ggl,)),AF_INET6(networks=(lan_ggl_v6,))), bgppassword="******")

        h_ggl = self.addHost("h_ggl")
        self.addSubnet(nodes = [ggl, h_ggl], subnets=(lan_ggl,lan_ggl_v6))
        self.addLink(h_ggl,ggl,igp_metric=1)

        ebgp_Client(self,ash5,ggl,'NA')
        ebgp_Client(self,ash1,ggl,'NA')

        # --- Cogent (AS=3)
        cgt = self.addRouter("cgt", config=RouterConfig)
        self.addLinks( (cgt,nwk1), (cgt,nwk5), (cgt,ash1), (cgt,ash5), (cgt,chi1), (cgt,sjo) )
        self.addAS(3,(cgt , ))

        lan_cgt = '1.4.2.0/24'
        lan_cgt_v6 = 'c1a4:4ad:c0ff:ee::/64'
        cgt.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_cgt_v6,)),AF_INET(networks=(lan_cgt,)),), bgppassword="******")

        h_cgt = self.addHost("h_cgt")
        self.addSubnet(nodes = [cgt, h_cgt], subnets=(lan_cgt,lan_cgt_v6))
        self.addLink(h_cgt,cgt,igp_metric=1)

        ebgp_Peer(self,nwk1, cgt,'NA')
        ebgp_Peer(self,nwk5, cgt,'NA')
        ebgp_Peer(self,ash1, cgt,'NA')
        ebgp_Peer(self,ash5, cgt,'NA')
        ebgp_Peer(self,chi1, cgt,'NA')
        ebgp_Peer(self,sjo, cgt,'NA')

        # --- Level 3 (AS=4)
        lvl3 = self.addRouter("lvl3", config=RouterConfig)
        self.addLinks( (lvl3,nwk1), (lvl3,nwk5), (lvl3,chi1), (lvl3,chi5), (lvl3,sjo) )
        self.addAS(4,(lvl3, ))

        lan_lvl3 = '1.5.3.0/24'
        lan_lvl3_v6 = 'cafe:d0d0:e5:dead::/64'
        lvl3.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_lvl3_v6,)),AF_INET(networks=(lan_lvl3,)),), bgppassword="******")

        h_lvl3 = self.addHost("h_lvl3")
        self.addSubnet(nodes = [lvl3, h_lvl3], subnets=(lan_lvl3,lan_lvl3_v6))
        self.addLink(h_lvl3,lvl3,igp_metric=1)

        ebgp_Peer(self,nwk1, lvl3,'NA')
        ebgp_Peer(self,nwk5, lvl3,'NA')
        ebgp_Peer(self,chi1, lvl3,'NA')
        ebgp_Peer(self,chi5, lvl3,'NA')
        ebgp_Peer(self,sjo, lvl3,'NA')

        # --- Telia (AS=5)
        tel = self.addRouter("tel", config=RouterConfig)

        self.addLinks( (tel,nwk1), (tel,nwk5), (tel,ash5), (tel,chi5), (tel,pao) )
        self.addAS(5,(tel, ))

        lan_tel = '1.6.4.0/24'
        lan_tel_v6 = 'aaaa:aaaa:aaaa:aaaa::/64'
        tel.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_tel_v6,)),AF_INET(networks=(lan_tel,)),), bgppassword="******")

        h_tel = self.addHost("h_tel")
        self.addSubnet(nodes = [tel, h_tel], subnets=(lan_tel,lan_tel_v6))
        self.addLink(h_tel,tel,igp_metric=1)

        ebgp_Peer(self,nwk1, tel,'NA')
        ebgp_Peer(self,nwk5, tel,'NA')
        ebgp_Peer(self,ash5, tel,'NA')
        ebgp_Peer(self,chi5, tel,'NA')
        ebgp_Peer(self,pao, tel,'NA')


        # ebgp_session(self, tel, nwk1, link_type=SHARE)
        # ebgp_session(self, tel, nwk5, link_type=SHARE)
        # ebgp_session(self, tel, ash5, link_type=SHARE)
        # ebgp_session(self, tel, chi5, link_type=SHARE)
        # ebgp_session(self, tel, pao, link_type=SHARE)


        externalRouters = [ggl, cgt, lvl3, tel]

        for eR in externalRouters:
            eR.addDaemon(OSPF6)
            eR.addDaemon(OSPF)


        # --- Test for BGP communities ---

        # tel shouldn't be reached by hosts outside NA
        tel.get_config(BGP).set_community(community = '16276:31',to_peer= nwk1)
        tel.get_config(BGP).set_community(community = '16276:31',to_peer= nwk5)
        tel.get_config(BGP).set_community(community = '16276:31',to_peer= ash5)
        tel.get_config(BGP).set_community(community = '16276:31',to_peer= chi5)
        tel.get_config(BGP).set_community(community = '16276:31',to_peer= pao)

        # routes from ggl should be sent to other clients/peers with prepending
        ggl.get_config(BGP).set_community(community = '16276:9',to_peer= ash1)
        ggl.get_config(BGP).set_community(community = '16276:9',to_peer= ash5)

        # routes from cgt sent to other clients/peers should have the no-export community
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= nwk1)
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= nwk5)
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= ash1)
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= ash5)
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= chi1)
        cgt.get_config(BGP).set_community(community= '16276:95',to_peer= sjo)

        # routes from lvl3 should be blackholed other than chi should be blackholed
        lvl3.get_config(BGP).set_community(community='blackhole',to_peer=nwk1)
        lvl3.get_config(BGP).set_community(community='blackhole',to_peer=nwk5)
        lvl3.get_config(BGP).set_community(community='blackhole',to_peer=sjo)

        # routes from lvl3 learn by chi1 should have a higher pref and those learn by chi5 a lower pref
        lvl3.get_config(BGP).set_community(community='16276:10',to_peer=chi1)
        lvl3.get_config(BGP).set_community(community='16276:20',to_peer=chi5)



        super().build(*args, **kwargs)
Esempio n. 19
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 43 iBGP
		"""
        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as4r1 = self.bgp('as4r1')
        as4r2 = self.bgp('as4r2')
        as5r1 = self.bgp('as5r1')
        as3r1 = self.bgp('as3r1')
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as2h1 = self.addHost("as2h1")
        as1h1 = self.addHost("as1h1")
        as1h2 = self.addHost("as1h2")
        as1h3 = self.addHost("as1h3")
        as1h4 = self.addHost("as1h4")
        as1h5 = self.addHost("as1h5")
        as1h6 = self.addHost("as1h6")

        # Add Links
        self.addLink(as1r1,
                     as1r6,
                     params1={"ip": ("fd00:1:1::1/48", )},
                     params2={"ip": ("fd00:1:1::2/48", )})
        self.addLink(as1r1,
                     as1r3,
                     params1={"ip": ("fd00:1:2::1/48", )},
                     params2={"ip": ("fd00:1:2::2/48", )})
        self.addLink(as1r3,
                     as1r2,
                     params1={"ip": ("fd00:1:4::1/48", )},
                     params2={"ip": ("fd00:1:4::2/48", )})
        self.addLink(as1r3,
                     as1r6,
                     params1={"ip": ("fd00:1:3::1/48", )},
                     params2={"ip": ("fd00:1:3::2/48", )})
        self.addLink(as1r2,
                     as1r4,
                     params1={"ip": ("fd00:1:5::1/48", )},
                     params2={"ip": ("fd00:1:5::2/48", )})
        self.addLink(as1r4,
                     as1r5,
                     params1={"ip": ("fd00:1:6::1/48", )},
                     params2={"ip": ("fd00:1:6::2/48", )})
        self.addLink(as1r5,
                     as1r6,
                     params1={"ip": ("fd00:1:7::1/48", )},
                     params2={"ip": ("fd00:1:7::2/48", )})
        self.addLink(as4r1,
                     as1r5,
                     params1={"ip": ("fd00:4:2::1/48", )},
                     params2={"ip": ("fd00:4:2::2/48", )})
        self.addLink(as4r2,
                     as1r4,
                     params1={"ip": ("fd00:4:1::1/48", )},
                     params2={"ip": ("fd00:4:1::2/48", )})
        self.addLink(as3r1,
                     as1r1,
                     params1={"ip": ("fd00:3:1::1/48", )},
                     params2={"ip": ("fd00:3:1::2/48", )})
        self.addLink(as5r1,
                     as1r6,
                     params1={"ip": ("fd00:5:1::1/48", )},
                     params2={"ip": ("fd00:5:1::2/48", )})
        self.addLink(as3r1,
                     as5r1,
                     params1={"ip": ("fd00:5:2::1/48", )},
                     params2={"ip": ("fd00:5:2::2/48", )})
        self.addLink(as5r1,
                     as2r1,
                     params1={"ip": ("fd00:2:1::1/48", )},
                     params2={"ip": ("fd00:2:1::2/48", )})
        self.addLink(as2r1,
                     as4r1,
                     params1={"ip": ("fd00:2:2::1/48", )},
                     params2={"ip": ("fd00:2:2::2/48", )})
        self.addLink(as4r1,
                     as4r2,
                     params1={"ip": ("fd00:4:3::1/48", )},
                     params2={"ip": ("fd00:4:3::2/48", )})
        self.addLink(as2r1,
                     as2h1,
                     params1={"ip": ("dead:beef::1/32", )},
                     params2={"ip": ("dead:beef::2/32", )})

        self.addLink(as1r1, as1h1)
        self.addLink(as1r2, as1h2)
        self.addLink(as1r3, as1h3)
        self.addLink(as1r4, as1h4)
        self.addLink(as1r5, as1h5)
        self.addLink(as1r6, as1h6)

        set_rr(self, rr=as1r2, peers=[as1r1, as1r3, as1r4, as1r5, as1r6])
        set_rr(self, rr=as1r4, peers=[as1r1, as1r2, as1r5, as1r3, as1r6])
        set_rr(self, rr=as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6])

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addAS(3, (as3r1, ))
        self.addAS(5, (as5r1, ))
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as5r1)
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super(BGPTopo3RR1, self).build(*args, **kwargs)
Esempio n. 20
0
    def build(self, *args, **kwargs):
        """
         +---$>----AS5--------------=-----+
         |                                |
        AS1 -<$--- AS2 --=--> AS3---=----AS4
         ^                     |
         +-----------$---------+ 
        """
        # Add all routers
        as1 = self.addRouter('as1')
        as2 = self.addRouter('as2')
        as3 = self.addRouter('as3')
        as4 = self.addRouter('as4')
        as5 = self.addRouter('as5')

        routers = self.routers()
        prefix = {
            routers[i]: '2001:cafe:%04x::/48' % (i + 1)
            for i in range(len(routers))
        }

        as1.addDaemon(BGP,
                      address_families=(AF_INET6(networks=(prefix[as1], )), ))
        as2.addDaemon(BGP,
                      address_families=(AF_INET6(networks=(prefix[as2], )), ))
        as3.addDaemon(BGP,
                      address_families=(AF_INET6(networks=(prefix[as3], )), ))
        as4.addDaemon(BGP,
                      address_families=(AF_INET6(networks=(prefix[as4], )), ))
        as5.addDaemon(BGP,
                      address_families=(AF_INET6(networks=(prefix[as5], )), ))

        # Add hosts

        h1 = self.addHost("h1")
        h2 = self.addHost("h2")
        h3 = self.addHost("h3")
        h4 = self.addHost("h4")
        h5 = self.addHost("h5")

        # Add all links
        l12 = self.addLink(as1, as2, delay='10ms')
        l12[as1].addParams(ip="2001:cafe:1:12::1/64")
        l12[as2].addParams(ip="2001:cafe:1:12::2/64")

        l13 = self.addLink(as1, as3, delay='10ms')
        l13[as1].addParams(ip="2001:cafe:1:13::1/64")
        l13[as3].addParams(ip="2001:cafe:1:13::3/64")

        l23 = self.addLink(as2, as3, delay='10ms')
        l23[as2].addParams(ip="2001:cafe:2:23::2/64")
        l23[as3].addParams(ip="2001:cafe:2:23::3/64")

        l15 = self.addLink(as1, as5, delay='10ms')
        l15[as1].addParams(ip="2001:cafe:1:15::1/64")
        l15[as5].addParams(ip="2001:cafe:1:15::5/64")

        l24 = self.addLink(as2, as4, delay='10ms')
        l24[as2].addParams(ip="2001:cafe:2:24::2/64")
        l24[as4].addParams(ip="2001:cafe:2:24::4/64")

        l34 = self.addLink(as3, as4, delay='10ms')
        l34[as3].addParams(ip="2001:cafe:3:34::3/64")
        l34[as4].addParams(ip="2001:cafe:3:34::4/64")

        l45 = self.addLink(as4, as5, delay='10ms')
        l45[as4].addParams(ip="2001:cafe:4:45::4/64")
        l45[as5].addParams(ip="2001:cafe:4:45::5/64")

        # Links to the hosts
        las1h1 = self.addLink(as1, h1)
        las1h1[as1].addParams(ip=("2001:cafe:1:1::1/64"))
        las1h1[h1].addParams(ip=("2001:cafe:1:1::11/64"))

        las2h2 = self.addLink(as2, h2)
        las2h2[as2].addParams(ip=("2001:cafe:2:1::2/64"))
        las2h2[h2].addParams(ip=("2001:cafe:2:1::12/64"))

        las3h3 = self.addLink(as3, h3)
        las3h3[as3].addParams(ip=("2001:cafe:3:1::3/64"))
        las3h3[h3].addParams(ip=("2001:cafe:3:1::13/64"))

        las4h4 = self.addLink(as4, h4)
        las4h4[as4].addParams(ip=("2001:cafe:4:1::4/64"))
        las4h4[h4].addParams(ip=("2001:cafe:4:1::14/64"))

        las5h5 = self.addLink(as5, h5)
        las5h5[as5].addParams(ip=("2001:cafe:5:1::5/64"))
        las5h5[h5].addParams(ip=("2001:cafe:5:1::15/64"))

        # Set AS-ownerships
        self.addAS(1, (as1, ))
        self.addAS(2, (as2, ))
        self.addAS(3, (as3, ))
        self.addAS(4, (as4, ))
        self.addAS(5, (as5, ))

        # Add eBGP sessions
        ebgp_session(self, as2, as1, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as3, as1, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as5, as1, link_type=CLIENT_PROVIDER)
        ebgp_session(self, as3, as4, link_type=CLIENT_PROVIDER)

        ebgp_session(self, as2, as3, link_type=SHARE)
        ebgp_session(self, as2, as4, link_type=SHARE)
        ebgp_session(self, as4, as5, link_type=SHARE)
        super(MyTopology, self).build(*args, **kwargs)
Esempio n. 21
0
    def build(self, *args, **kwargs):

        # first step, adding routers
        # =========================================================

        # routers of MRS
        MRS1 = self.addRouter(
            "MRS1",
            config=RouterConfig,
            lo_addresses=[europe_ipv6 + "000::/64", MRS_ipv4 + "100/32"])
        MRS2 = self.addRouter(
            "MRS2",
            config=RouterConfig,
            lo_addresses=[europe_ipv6 + "100::/64", MRS_ipv4 + "110/32"])
        # routers of PAR
        PAR1 = self.addRouter(
            "PAR1",
            config=RouterConfig,
            lo_addresses=[europe_ipv6 + "200::/64", PAR_ipv4 + "100/32"])
        PAR2 = self.addRouter(
            "PAR2",
            config=RouterConfig,
            lo_addresses=[europe_ipv6 + "300::/64", PAR_ipv4 + "110/32"])
        # routers of SIN
        SIN1 = self.addRouter(
            "SIN1",
            config=RouterConfig,
            lo_addresses=[asia_ipv6 + "000::/64", SIN_ipv4 + "100/32"])
        SIN2 = self.addRouter(
            "SIN2",
            config=RouterConfig,
            lo_addresses=[asia_ipv6 + "100::/64", SIN_ipv4 + "110/32"])
        # routers of SYD
        SYD1 = self.addRouter(
            "SYD1",
            config=RouterConfig,
            lo_addresses=[asia_ipv6 + "200::/64", SYD_ipv4 + "100/32"])
        SYD2 = self.addRouter(
            "SYD2",
            config=RouterConfig,
            lo_addresses=[asia_ipv6 + "300::/64", SYD_ipv4 + "110/32"])
        # routers of LAX
        LAX1 = self.addRouter(
            "LAX1",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "000::/64", LAX_ipv4 + "100/32"])
        LAX2 = self.addRouter(
            "LAX2",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "100::/64", LAX_ipv4 + "110/32"])
        # routers of SJO
        SJO1 = self.addRouter(
            "SJO1",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "200::/64", SJO_ipv4 + "100/32"])
        SJO2 = self.addRouter(
            "SJO2",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "300::/64", SJO_ipv4 + "110/32"])
        # routers of ASH
        ASH1 = self.addRouter(
            "ASH1",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "400::/64", ASH_ipv4 + "100/32"])
        ASH2 = self.addRouter(
            "ASH2",
            config=RouterConfig,
            lo_addresses=[NA_ipv6 + "500::/64", ASH_ipv4 + "110/32"])
        # routers peering vodafone
        VDFSIN1 = self.addRouter(
            "VDFSIN1",
            config=RouterConfig,
            lo_addresses=[VDF_ipv6 + "000::/64", VDF_ipv4 + "100/32"])
        VDFSIN2 = self.addRouter(
            "VDFSIN2",
            config=RouterConfig,
            lo_addresses=[VDF_ipv6 + "001::/64", VDF_ipv4 + "110/32"])
        VDFASH1 = self.addRouter(
            "VDFASH1",
            config=RouterConfig,
            lo_addresses=[VDF_ipv6 + "002::/64", VDF_ipv4 + "120/32"])
        VDFPAR2 = self.addRouter(
            "VDFPAR2",
            config=RouterConfig,
            lo_addresses=[VDF_ipv6 + "003::/64", VDF_ipv4 + "130/32"])
        # routers peering equinix
        EQXSIN1 = self.addRouter(
            "EQXSIN1",
            config=RouterConfig,
            lo_addresses=[EQX_ipv6 + "000::/64", EQX_ipv4 + "100/32"])
        EQXSYD2 = self.addRouter(
            "EQXSYD2",
            config=RouterConfig,
            lo_addresses=[EQX_ipv6 + "001::/64", EQX_ipv4 + "110/32"])
        # routers peering NTT
        NTTSYD1 = self.addRouter(
            "NTTSYD1",
            config=RouterConfig,
            lo_addresses=[NTT_ipv6 + "000::/64", NTT_ipv4 + "100/32"])
        NTTSYD2 = self.addRouter(
            "NTTSYD2",
            config=RouterConfig,
            lo_addresses=[NTT_ipv6 + "001::/64", NTT_ipv4 + "110/32"])

        # adding OSPF6 as IGP
        # =========================================================
        MRS1.addDaemon(OSPF6)
        MRS2.addDaemon(OSPF6)

        SIN1.addDaemon(OSPF6)
        SIN2.addDaemon(OSPF6)

        SYD1.addDaemon(OSPF6)
        SYD2.addDaemon(OSPF6)

        LAX1.addDaemon(OSPF6)
        LAX2.addDaemon(OSPF6)

        SJO1.addDaemon(OSPF6)
        SJO2.addDaemon(OSPF6)

        ASH1.addDaemon(OSPF6)
        ASH2.addDaemon(OSPF6)

        PAR1.addDaemon(OSPF6)
        PAR2.addDaemon(OSPF6)

        VDFSIN1.addDaemon(OSPF6)
        VDFSIN2.addDaemon(OSPF6)
        VDFASH1.addDaemon(OSPF6)
        VDFPAR2.addDaemon(OSPF6)

        EQXSIN1.addDaemon(OSPF6)
        EQXSYD2.addDaemon(OSPF6)

        NTTSYD1.addDaemon(OSPF6)
        NTTSYD2.addDaemon(OSPF6)

        # adding OSPF
        # =========================================================

        MRS1.addDaemon(OSPF)
        MRS2.addDaemon(OSPF)

        SIN1.addDaemon(OSPF)
        SIN2.addDaemon(OSPF)

        SYD1.addDaemon(OSPF)
        SYD2.addDaemon(OSPF)

        LAX1.addDaemon(OSPF)
        LAX2.addDaemon(OSPF)

        SJO1.addDaemon(OSPF)
        SJO2.addDaemon(OSPF)

        ASH1.addDaemon(OSPF)
        ASH2.addDaemon(OSPF)

        PAR1.addDaemon(OSPF)
        PAR2.addDaemon(OSPF)

        VDFSIN1.addDaemon(OSPF)
        VDFSIN2.addDaemon(OSPF)
        VDFASH1.addDaemon(OSPF)
        VDFPAR2.addDaemon(OSPF)

        EQXSIN1.addDaemon(OSPF)
        EQXSYD2.addDaemon(OSPF)

        NTTSYD1.addDaemon(OSPF)
        NTTSYD2.addDaemon(OSPF)

        # adding BGP
        # =========================================================
        MRS1.addDaemon(BGP, debug=("neighbor", "updates"))
        MRS2.addDaemon(BGP, debug=("neighbor", "updates"))

        SIN1.addDaemon(BGP, debug=("neighbor", "updates"))
        SIN2.addDaemon(BGP, debug=("neighbor", "updates"))

        SYD1.addDaemon(BGP, debug=("neighbor", "updates"))
        SYD2.addDaemon(BGP, debug=("updates", "neighbor"))

        LAX1.addDaemon(BGP, debug=("neighbor", "updates"))
        LAX2.addDaemon(BGP, debug=("updates", "neighbor"))

        SJO1.addDaemon(BGP, debug=("updates", "neighbor"))
        SJO2.addDaemon(BGP, debug=("updates", "neighbor"))

        ASH1.addDaemon(BGP, debug=("updates", "neighbor"))
        ASH2.addDaemon(BGP, debug=("updates", "neighbor"))

        PAR1.addDaemon(BGP, debug=("updates", "neighbor"))
        PAR2.addDaemon(BGP, debug=("updates", "neighbor"))

        VDFSIN1.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))
        VDFSIN2.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))
        VDFASH1.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))
        VDFPAR2.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))

        EQXSIN1.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))
        EQXSYD2.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))

        NTTSYD1.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))
        NTTSYD2.addDaemon(BGP,
                          address_families=(
                              AF_INET6(redistribute=['connected']),
                              AF_INET(redistribute=['connected']),
                          ),
                          debug=("updates", ))

        # linkin twin datacenters
        # =========================================================
        l_MRS1_MRS2 = self.addLink(MRS1,
                                   MRS2,
                                   igp_metric=2,
                                   password=OSPF_PW_EU)
        l_MRS1_MRS2[MRS1].addParams(ip=(europe_ipv6 + "00a::1/64",
                                        MRS_ipv4 + "129/30"))
        l_MRS1_MRS2[MRS2].addParams(ip=(europe_ipv6 + "00a::2/64",
                                        MRS_ipv4 + "130/30"))

        l_SIN1_SIN2 = self.addLink(SIN1,
                                   SIN2,
                                   igp_metric=2,
                                   password=OSPF_PW_AS)
        l_SIN1_SIN2[SIN1].addParams(ip=(asia_ipv6 + "00a::1/64",
                                        SIN_ipv4 + "129/30"))
        l_SIN1_SIN2[SIN2].addParams(ip=(asia_ipv6 + "00a::2/64",
                                        SIN_ipv4 + "130/30"))

        l_SYD1_SYD2 = self.addLink(SYD1,
                                   SYD2,
                                   igp_metric=2,
                                   password=OSPF_PW_AS)
        l_SYD1_SYD2[SYD1].addParams(ip=(asia_ipv6 + "00c::1/64",
                                        SYD_ipv4 + "129/30"))
        l_SYD1_SYD2[SYD2].addParams(ip=(asia_ipv6 + "00c::2/64",
                                        SYD_ipv4 + "130/30"))

        l_PAR1_PAR2 = self.addLink(PAR1,
                                   PAR2,
                                   igp_metric=2,
                                   password=OSPF_PW_EU)
        l_PAR1_PAR2[PAR1].addParams(ip=(europe_ipv6 + "00b::1/64",
                                        PAR_ipv4 + "129/30"))
        l_PAR1_PAR2[PAR2].addParams(ip=(europe_ipv6 + "00b::2/64",
                                        PAR_ipv4 + "130/30"))

        l_ASH1_ASH2 = self.addLink(ASH1,
                                   ASH2,
                                   igp_metric=2,
                                   password=OSPF_PW_NA)
        l_ASH1_ASH2[ASH1].addParams(ip=(NA_ipv6 + "00a::1/64",
                                        ASH_ipv4 + "129/30"))
        l_ASH1_ASH2[ASH2].addParams(ip=(NA_ipv6 + "00a::2/64",
                                        ASH_ipv4 + "130/30"))

        l_LAX1_LAX2 = self.addLink(LAX1,
                                   LAX2,
                                   igp_metric=2,
                                   password=OSPF_PW_NA)
        l_LAX1_LAX2[LAX1].addParams(ip=(NA_ipv6 + "00b::1/64",
                                        LAX_ipv4 + "129/30"))
        l_LAX1_LAX2[LAX2].addParams(ip=(NA_ipv6 + "00b::2/64",
                                        LAX_ipv4 + "130/30"))

        l_SJO1_SJO2 = self.addLink(SJO1,
                                   SJO2,
                                   igp_metric=2,
                                   password=OSPF_PW_NA)
        l_SJO1_SJO2[SJO1].addParams(ip=(NA_ipv6 + "00c::1/64",
                                        SJO_ipv4 + "129/30"))
        l_SJO1_SJO2[SJO2].addParams(ip=(NA_ipv6 + "00c::2/64",
                                        SJO_ipv4 + "130/30"))

        # =========================================================

        l_MRS1_SIN1 = self.addLink(MRS1,
                                   SIN1,
                                   igp_metric=20,
                                   password=OSPF_PW_EU)
        l_MRS1_SIN1[MRS1].addParams(ip=(europe_ipv6 + "011::1/64",
                                        MRS_ipv4 + "5/30"))
        l_MRS1_SIN1[SIN1].addParams(ip=(europe_ipv6 + "011::2/64",
                                        MRS_ipv4 + "6/30"))

        l_MRS2_SIN2 = self.addLink(MRS2,
                                   SIN2,
                                   igp_metric=26,
                                   password=OSPF_PW_EU)
        l_MRS2_SIN2[MRS2].addParams(ip=(europe_ipv6 + "022::1/64",
                                        MRS_ipv4 + "9/30"))
        l_MRS2_SIN2[SIN2].addParams(ip=(europe_ipv6 + "022::2/64",
                                        MRS_ipv4 + "10/30"))

        l_SIN1_SYD1 = self.addLink(SIN1,
                                   SYD1,
                                   igp_metric=3,
                                   password=OSPF_PW_AS)
        l_SIN1_SYD1[SIN1].addParams(ip=(asia_ipv6 + "011::1/64",
                                        SIN_ipv4 + "5/30"))
        l_SIN1_SYD1[SYD1].addParams(ip=(asia_ipv6 + "011::2/64",
                                        SIN_ipv4 + "6/30"))

        l_SIN2_SYD2 = self.addLink(SIN2,
                                   SYD2,
                                   igp_metric=3,
                                   password=OSPF_PW_AS)
        l_SIN2_SYD2[SIN2].addParams(ip=(asia_ipv6 + "022::1/64",
                                        SIN_ipv4 + "9/30"))
        l_SIN2_SYD2[SYD2].addParams(ip=(asia_ipv6 + "022::2/64",
                                        SIN_ipv4 + "10/30"))

        l_SIN2_SJO1 = self.addLink(SIN2,
                                   SJO1,
                                   igp_metric=20,
                                   password=OSPF_PW_AS)
        l_SIN2_SJO1[SIN2].addParams(ip=(asia_ipv6 + "021::1/64",
                                        SIN_ipv4 + "13/30"))
        l_SIN2_SJO1[SJO1].addParams(ip=(asia_ipv6 + "021::2/64",
                                        SIN_ipv4 + "14/30"))

        l_SIN1_SJO2 = self.addLink(SIN1,
                                   SJO2,
                                   igp_metric=20,
                                   password=OSPF_PW_AS)
        l_SIN1_SJO2[SIN1].addParams(ip=(asia_ipv6 + "220::1/64",
                                        SIN_ipv4 + "17/30"))
        l_SIN1_SJO2[SJO2].addParams(ip=(asia_ipv6 + "220::2/64",
                                        SIN_ipv4 + "18/30"))

        # =======================================================

        l_ASH1_LAX1 = self.addLink(ASH1,
                                   LAX1,
                                   igp_metric=3,
                                   password=OSPF_PW_NA)
        l_ASH1_LAX1[ASH1].addParams(ip=(NA_ipv6 + "011::1/64",
                                        ASH_ipv4 + "5/30"))
        l_ASH1_LAX1[LAX1].addParams(ip=(NA_ipv6 + "011::2/64",
                                        ASH_ipv4 + "6/30"))

        l_ASH2_LAX2 = self.addLink(ASH2,
                                   LAX2,
                                   igp_metric=3,
                                   password=OSPF_PW_NA)
        l_ASH2_LAX2[ASH2].addParams(ip=(NA_ipv6 + "022::1/64",
                                        ASH_ipv4 + "9/30"))
        l_ASH2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "022::2/64",
                                        ASH_ipv4 + "10/30"))

        l_ASH1_LAX2 = self.addLink(ASH1,
                                   LAX2,
                                   igp_metric=3,
                                   password=OSPF_PW_NA)
        l_ASH1_LAX2[ASH1].addParams(ip=(NA_ipv6 + "012::1/64",
                                        ASH_ipv4 + "13/30"))
        l_ASH1_LAX2[LAX2].addParams(ip=(NA_ipv6 + "012::2/64",
                                        ASH_ipv4 + "14/30"))

        l_SJO1_LAX1 = self.addLink(SJO1,
                                   LAX1,
                                   igp_metric=3,
                                   password=OSPF_PW_NA)
        l_SJO1_LAX1[SJO1].addParams(ip=(NA_ipv6 + "110::1/64",
                                        SJO_ipv4 + "5/30"))
        l_SJO1_LAX1[LAX1].addParams(ip=(NA_ipv6 + "110::2/64",
                                        SJO_ipv4 + "6/30"))

        l_SJO2_LAX2 = self.addLink(SJO2,
                                   LAX2,
                                   igp_metric=3,
                                   password=OSPF_PW_NA)
        l_SJO2_LAX2[SJO2].addParams(ip=(NA_ipv6 + "220::1/64",
                                        SJO_ipv4 + "9/30"))
        l_SJO2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "220::2/64",
                                        SJO_ipv4 + "10/30"))

        l_PAR1_ASH1 = self.addLink(PAR1,
                                   ASH1,
                                   igp_metric=20,
                                   password=OSPF_PW_EU)
        l_PAR1_ASH1[PAR1].addParams(ip=(europe_ipv6 + "110::1/64",
                                        PAR_ipv4 + "5/30"))
        l_PAR1_ASH1[ASH1].addParams(ip=(europe_ipv6 + "110::2/64",
                                        PAR_ipv4 + "6/30"))

        l_PAR2_ASH2 = self.addLink(PAR2,
                                   ASH2,
                                   igp_metric=20,
                                   password=OSPF_PW_EU)
        l_PAR2_ASH2[PAR2].addParams(ip=(europe_ipv6 + "220::1/64",
                                        PAR_ipv4 + "9/30"))
        l_PAR2_ASH2[ASH2].addParams(ip=(europe_ipv6 + "220::2/64",
                                        PAR_ipv4 + "10/30"))

        l_PAR1_MRS2 = self.addLink(PAR1,
                                   MRS2,
                                   igp_metric=3,
                                   password=OSPF_PW_EU)
        l_PAR1_MRS2[PAR1].addParams(ip=(europe_ipv6 + "101::1/64",
                                        PAR_ipv4 + "13/30"))
        l_PAR1_MRS2[MRS2].addParams(ip=(europe_ipv6 + "101::2/64",
                                        PAR_ipv4 + "14/30"))

        l_PAR2_MRS1 = self.addLink(PAR2,
                                   MRS1,
                                   igp_metric=3,
                                   password=OSPF_PW_EU)
        l_PAR2_MRS1[PAR2].addParams(ip=(europe_ipv6 + "202::1/64",
                                        PAR_ipv4 + "17/30"))
        l_PAR2_MRS1[MRS1].addParams(ip=(europe_ipv6 + "202::2/64",
                                        PAR_ipv4 + "18/30"))

        l_SYD2_LAX2 = self.addLink(SYD2,
                                   LAX2,
                                   igp_metric=20,
                                   password=OSPF_PW_AS)
        l_SYD2_LAX2[SYD2].addParams(ip=(NA_ipv6 + "303::1/64",
                                        SYD_ipv4 + "5/30"))
        l_SYD2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "303::2/64",
                                        SYD_ipv4 + "6/30"))

        # =============================================================================
        # Peering links

        l_VDF_PAR2 = self.addLink(VDFPAR2, PAR2, igp_metric=11)
        l_VDF_PAR2[VDFPAR2].addParams(ip=(europe_ipv6 + "ffa::1/64",
                                          PAR_ipv4 + "21/30"))
        l_VDF_PAR2[PAR2].addParams(ip=(europe_ipv6 + "ffa::2/64",
                                       PAR_ipv4 + "22/30"))

        l_VDF_ASH1 = self.addLink(VDFASH1, ASH1, igp_metric=11)
        l_VDF_ASH1[VDFASH1].addParams(ip=(NA_ipv6 + "ffa::1/64",
                                          ASH_ipv4 + "21/30"))
        l_VDF_ASH1[ASH1].addParams(ip=(NA_ipv6 + "ffa::2/64",
                                       ASH_ipv4 + "22/30"))

        l_VDF_SIN1 = self.addLink(VDFSIN1, SIN1, igp_metric=11)
        l_VDF_SIN1[VDFSIN1].addParams(ip=(asia_ipv6 + "ffa::1/64",
                                          SIN_ipv4 + "21/30"))
        l_VDF_SIN1[SIN1].addParams(ip=(asia_ipv6 + "ffa::2/64",
                                       SIN_ipv4 + "22/30"))

        l_VDF_SIN2 = self.addLink(VDFSIN2, SIN2, igp_metric=11)
        l_VDF_SIN2[VDFSIN2].addParams(ip=(asia_ipv6 + "1fa::1/64",
                                          SIN_ipv4 + "25/30"))
        l_VDF_SIN2[SIN2].addParams(ip=(asia_ipv6 + "1fa::2/64",
                                       SIN_ipv4 + "26/30"))

        l_EQX_SIN1 = self.addLink(EQXSIN1, SIN1, igp_metric=11)
        l_EQX_SIN1[EQXSIN1].addParams(ip=(asia_ipv6 + "2fb::1/64",
                                          SIN_ipv4 + "29/30"))
        l_EQX_SIN1[SIN1].addParams(ip=(asia_ipv6 + "2fb::2/64",
                                       SIN_ipv4 + "30/30"))

        l_EQX_SYD2 = self.addLink(EQXSYD2, SYD2, igp_metric=11)
        l_EQX_SYD2[EQXSYD2].addParams(ip=(asia_ipv6 + "3fa::1/64",
                                          SYD_ipv4 + "9/30"))
        l_EQX_SYD2[SYD2].addParams(ip=(asia_ipv6 + "3fa::2/64",
                                       SYD_ipv4 + "10/30"))

        l_NTT_SYD2 = self.addLink(NTTSYD2, SYD2, igp_metric=11)
        l_NTT_SYD2[NTTSYD2].addParams(ip=(asia_ipv6 + "4fb::1/64",
                                          SYD_ipv4 + "13/30"))
        l_NTT_SYD2[SYD2].addParams(ip=(asia_ipv6 + "4fb::2/64",
                                       SYD_ipv4 + "14/30"))

        l_NTT_SYD1 = self.addLink(NTTSYD1, SYD1, igp_metric=11)
        l_NTT_SYD1[NTTSYD1].addParams(ip=(asia_ipv6 + "5fa::1/64",
                                          SYD_ipv4 + "17/30"))
        l_NTT_SYD1[SYD1].addParams(ip=(asia_ipv6 + "5fa::2/64",
                                       SYD_ipv4 + "18/30"))

        # =============================================================================
        # servers

        SER1 = self.addRouter(
            "SER1",
            config=RouterConfig,
            lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"])
        SER2 = self.addRouter(
            "SER2",
            config=RouterConfig,
            lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"])
        SER3 = self.addRouter(
            "SER3",
            config=RouterConfig,
            lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"])

        # Adding BGP daemons to manage failures

        SER1.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(server_ipv6 +
                                                            "1::/64", )),
                                         AF_INET(redistribute=['connected'])))
        SER2.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(server_ipv6 +
                                                            "1::/64", )),
                                         AF_INET(redistribute=['connected'])))
        SER3.addDaemon(BGP,
                       address_families=(AF_INET6(networks=(server_ipv6 +
                                                            "1::/64", )),
                                         AF_INET(redistribute=['connected'])))

        self.addAS(64512, (SER1, SER2, SER3))

        l_SER1_SJO2 = self.addLink(SER1, SJO2, igp_metric=3)
        l_SER1_SJO2[SER1].addParams(ip=(server_ipv6 + "a1a::1/64",
                                        server_ipv4 + "2/27"))
        l_SER1_SJO2[SJO2].addParams(ip=(server_ipv6 + "a1a::2/64",
                                        server_ipv4 + "3/27"))

        l_SER2_PAR2 = self.addLink(SER2, PAR2, igp_metric=3)
        l_SER2_PAR2[SER2].addParams(ip=(server_ipv6 + "a2a::1/64",
                                        server_ipv4 + "5/27"))
        l_SER2_PAR2[PAR2].addParams(ip=(server_ipv6 + "a2a::2/64",
                                        server_ipv4 + "6/27"))

        l_SER3_SIN2 = self.addLink(SER3, SIN2, igp_metric=3)
        l_SER3_SIN2[SER3].addParams(ip=(server_ipv6 + "a3a::1/64",
                                        server_ipv4 + "9/27"))
        l_SER3_SIN2[SIN2].addParams(ip=(server_ipv6 + "a3a::2/64",
                                        server_ipv4 + "10/27"))

        ebgp_session(self, SER1, SJO2)
        ebgp_session(self, SER2, PAR2)
        ebgp_session(self, SER3, SIN2)

        # =============================================================================
        # BGP setup
        self.addAS(1, (MRS1, MRS2, PAR1, PAR2, SIN1, SIN2, SYD1, SYD2, SJO1,
                       SJO2, LAX1, LAX2, ASH1, ASH2))
        set_rr(self,
               rr=SIN1,
               peers=[SYD1, MRS1, SIN2, MRS2, SJO1, SJO2, SYD2, ASH1, PAR2])
        set_rr(self,
               rr=SYD2,
               peers=[SYD1, SIN2, SJO1, LAX1, LAX2, SIN1, ASH1, PAR2])
        set_rr(self,
               rr=ASH1,
               peers=[SJO1, SJO2, LAX1, LAX2, PAR1, ASH2, SIN1, SYD2, PAR2])
        set_rr(self, rr=PAR2, peers=[MRS1, MRS2, PAR1, ASH2, SIN1, SYD2, ASH1])

        self.addAS(2, (EQXSIN1, EQXSYD2))
        self.addAS(3, (VDFASH1, VDFPAR2, VDFSIN1, VDFSIN2))
        self.addAS(4, (NTTSYD1, NTTSYD2))

        ebgp_session(self, VDFPAR2, PAR2)
        ebgp_session(self, VDFASH1, ASH1)
        ebgp_session(self, VDFSIN1, SIN1)
        ebgp_session(self, VDFSIN2, SIN2)
        ebgp_session(self, EQXSIN1, SIN1)
        ebgp_session(self, EQXSYD2, SYD2)
        ebgp_session(self, NTTSYD2, SYD2)
        ebgp_session(self, NTTSYD1, SYD1)

        hVdfPar2 = self.addHost("hVdfPar2")
        hVdfAsh1 = self.addHost("hVdfAsh1")
        hVdfSin1 = self.addHost("hVdfSin1")
        hVdfSin2 = self.addHost("hVdfSin2")

        hEqxSin1 = self.addHost("hEqxSin1")
        hEqxSyd2 = self.addHost("hEqxSyd2")

        hNttSyd2 = self.addHost("hNttSyd2")
        hNttSyd1 = self.addHost("hNttSyd1")

        # Host setup
        l_hVdfPar2 = self.addLink(hVdfPar2, VDFPAR2, igp_metric=2)
        l_hVdfPar2[hVdfPar2].addParams(ip=(VDF_ipv6 + "aaa::1/64",
                                           VDF_ipv4 + "21/30"))
        l_hVdfPar2[VDFPAR2].addParams(ip=(VDF_ipv6 + "aaa::2/64",
                                          VDF_ipv4 + "22/30"))

        l_hVdfAsh1 = self.addLink(hVdfAsh1, VDFASH1, igp_metric=2)
        l_hVdfAsh1[hVdfAsh1].addParams(ip=(VDF_ipv6 + "bbb::1/64",
                                           VDF_ipv4 + "25/30"))
        l_hVdfAsh1[VDFASH1].addParams(ip=(VDF_ipv6 + "bbb::2/64",
                                          VDF_ipv4 + "26/30"))

        l_hVdfSin1 = self.addLink(hVdfSin1, VDFSIN1, igp_metric=2)
        l_hVdfSin1[hVdfSin1].addParams(ip=(VDF_ipv6 + "ccc::1/64",
                                           VDF_ipv4 + "29/30"))
        l_hVdfSin1[VDFSIN1].addParams(ip=(VDF_ipv6 + "ccc::2/64",
                                          VDF_ipv4 + "30/30"))

        l_hVdfSin2 = self.addLink(hVdfSin2, VDFSIN2, igp_metric=2)
        l_hVdfSin2[hVdfSin2].addParams(ip=(VDF_ipv6 + "ddd::1/64",
                                           VDF_ipv4 + "33/30"))
        l_hVdfSin2[VDFSIN2].addParams(ip=(VDF_ipv6 + "ddd::2/64",
                                          VDF_ipv4 + "34/30"))

        l_hEqxSyd2 = self.addLink(hEqxSyd2, EQXSYD2, igp_metric=2)
        l_hEqxSyd2[hEqxSyd2].addParams(ip=(EQX_ipv6 + "aaa::1/64",
                                           EQX_ipv4 + "13/30"))
        l_hEqxSyd2[EQXSYD2].addParams(ip=(EQX_ipv6 + "aaa::2/64",
                                          EQX_ipv4 + "14/30"))

        l_hEqxSin1 = self.addLink(hEqxSin1, EQXSIN1, igp_metric=2)
        l_hEqxSin1[hEqxSin1].addParams(ip=(EQX_ipv6 + "bbb::1/64",
                                           EQX_ipv4 + "17/30"))
        l_hEqxSin1[EQXSIN1].addParams(ip=(EQX_ipv6 + "bbb::2/64",
                                          EQX_ipv4 + "18/30"))

        l_hNttSyd2 = self.addLink(hNttSyd2, NTTSYD2, igp_metric=2)
        l_hNttSyd2[hNttSyd2].addParams(ip=(NTT_ipv6 + "aaa::1/64",
                                           NTT_ipv4 + "13/30"))
        l_hNttSyd2[NTTSYD2].addParams(ip=(NTT_ipv6 + "aaa::2/64",
                                          NTT_ipv4 + "14/30"))

        l_hNttSyd1 = self.addLink(hNttSyd1, NTTSYD1, igp_metric=2)
        l_hNttSyd1[hNttSyd1].addParams(ip=(NTT_ipv6 + "bbb::1/64",
                                           NTT_ipv4 + "17/30"))
        l_hNttSyd1[NTTSYD1].addParams(ip=(NTT_ipv6 + "bbb::2/64",
                                          NTT_ipv4 + "18/30"))

        super().build(*args, **kwargs)
Esempio n. 22
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 44 iBGP BLUE config
        """
        # Add routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as1r7 = self.bgp('as1r7')
        as1r8 = self.bgp('as1r8')
        as1r9 = self.bgp('as1r9')
        as1ra = self.bgp('as1ra')
        as1rb = self.bgp('as1rb')
        as5r1 = self.bgp('as5r1')
        as3r1 = self.bgp('as3r1')
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), ))

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as1r5, as1r7)
        self.addLink(as1r5, as1r9)
        self.addLink(as1r6, as1r7)
        self.addLink(as1r6, as1r8)
        self.addLink(as1r8, as1ra)
        self.addLink(as1r8, as1r9)
        self.addLink(as1r9, as1rb)
        self.addLink(as1ra, as2r1)
        self.addLink(as1ra, as1rb)
        self.addLink(as1rb, as2r1)
        self.addLink(as3r1, as1r1)
        self.addLink(as5r1, as1r6)
        self.addLink(as3r1, as5r1)
        self.addLink(as5r1, as2r1)
        set_rr(self,
               rr=as1r2,
               peers=[
                   as1r1, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8, as1r9,
                   as1ra, as1rb
               ])
        set_rr(self,
               rr=as1r3,
               peers=[
                   as1r1, as1r2, as1r4, as1r5, as1r6, as1r7, as1r8, as1r9,
                   as1ra, as1rb
               ])
        set_rr(self,
               rr=as1r8,
               peers=[
                   as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r9,
                   as1ra, as1rb
               ])
        set_rr(self,
               rr=as1r9,
               peers=[
                   as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8,
                   as1ra, as1rb
               ])

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addAS(3, (as3r1, ))
        self.addAS(5, (as5r1, ))
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8,
                       as1r9, as1ra, as1rb))

        # Add eBGP session
        ebgp_session(self, as1r6, as5r1)
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as1ra, as2r1)
        ebgp_session(self, as1rb, as2r1)

        super(BGPTopo3RR3, self).build(*args, **kwargs)
Esempio n. 23
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 42 iBGP RED config
		"""
        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as4r1 = self.bgp('as4r1')
        as4r2 = self.bgp('as4r2')
        as5r1 = self.bgp('as5r1')
        as3r1 = self.bgp('as3r1')
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as2h1 = self.addHost("as2h1")
        as1h1 = self.addHost("as1h1")
        as1h2 = self.addHost("as1h2")
        as1h3 = self.addHost("as1h3")
        as1h4 = self.addHost("as1h4")
        as1h5 = self.addHost("as1h5")
        as1h6 = self.addHost("as1h6")

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as4r1, as1r5)
        self.addLink(as4r2, as1r4)
        self.addLink(as3r1, as1r1)
        self.addLink(as5r1, as1r6)
        self.addLink(as3r1, as5r1)
        self.addLink(as5r1, as2r1)
        self.addLink(as2r1, as4r1)
        self.addLink(as4r1, as4r2)
        self.addLink(as2r1, as2h1)
        self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32', ))

        self.addLink(as1r1, as1h1)
        self.addLink(as1r2, as1h2)
        self.addLink(as1r3, as1h3)
        self.addLink(as1r4, as1h4)
        self.addLink(as1r5, as1h5)
        self.addLink(as1r6, as1h6)

        set_rr(self, rr=as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6])
        set_rr(self, rr=as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6])

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addAS(3, (as3r1, ))
        self.addAS(5, (as5r1, ))
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as5r1)
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super(BGPTopo2RR2, self).build(*args, **kwargs)
Esempio n. 24
0
    def build(self, *args, **kwargs):
        """
         +---$>----AS3---$>-- AS4---$>---AS7---$>--AS8
         |          ||         ||         $        |
         |          ||         ||         \/       |
        AS1 -<$--- AS2 --$--> AS5---=---AS6-----=---
   
        """
        # Add all routers and hosts
        r = [None] * 9
        h = [None] * 9
        for i in range(1, 9):
            r[i] = self.addRouter("as" + str(i))
            h[i] = self.addHost("h" + str(i))
            r[i].addDaemon(BGP,
                           address_families=(AF_INET6(
                               networks=('2001:cafe:%04x::/48' % (i), )), ))
            self.addAS(i, (r[i], ))

        # Add all links
        l12 = self.addLink(r[1], r[2], delay='10ms')
        l12[r[1]].addParams(ip="2001:cafe:1:12::1/64")
        l12[r[2]].addParams(ip="2001:cafe:1:12::2/64")

        l13 = self.addLink(r[1], r[3], delay='10ms')
        l13[r[1]].addParams(ip="2001:cafe:1:13::1/64")
        l13[r[3]].addParams(ip="2001:cafe:1:13::3/64")

        l23 = self.addLink(r[2], r[3], delay='10ms')
        l23[r[2]].addParams(ip="2001:cafe:2:23::2/64")
        l23[r[3]].addParams(ip="2001:cafe:2:23::3/64")

        l25 = self.addLink(r[2], r[5], delay='10ms')
        l25[r[2]].addParams(ip="2001:cafe:2:25::2/64")
        l25[r[5]].addParams(ip="2001:cafe:2:25::5/64")

        l34 = self.addLink(r[3], r[4], delay='10ms')
        l34[r[3]].addParams(ip="2001:cafe:3:34::3/64")
        l34[r[4]].addParams(ip="2001:cafe:3:34::4/64")

        l45 = self.addLink(r[4], r[5], delay='10ms')
        l45[r[4]].addParams(ip="2001:cafe:4:45::4/64")
        l45[r[5]].addParams(ip="2001:cafe:4:45::5/64")

        l47 = self.addLink(r[4], r[7], delay='10ms')
        l47[r[4]].addParams(ip="2001:cafe:4:47::4/64")
        l47[r[7]].addParams(ip="2001:cafe:4:47::7/64")

        l56 = self.addLink(r[5], r[6], delay='10ms')
        l56[r[5]].addParams(ip="2001:cafe:5:56::5/64")
        l56[r[6]].addParams(ip="2001:cafe:5:56::6/64")

        l78 = self.addLink(r[7], r[8], delay='10ms')
        l78[r[7]].addParams(ip="2001:cafe:7:78::7/64")
        l78[r[8]].addParams(ip="2001:cafe:7:78::8/64")

        l68 = self.addLink(r[6], r[8], delay='10ms')
        l68[r[6]].addParams(ip="2001:cafe:6:68::6/64")
        l68[r[8]].addParams(ip="2001:cafe:6:68::8/64")

        l67 = self.addLink(r[6], r[7], delay='10ms')
        l67[r[6]].addParams(ip="2001:cafe:6:67::6/64")
        l67[r[7]].addParams(ip="2001:cafe:6:67::7/64")
        # Links to the hosts
        for i in range(1, 9):
            l = self.addLink(r[i], h[i])
            l[r[i]].addParams(ip=('2001:cafe:%04x:1::%04x/64' % (i, i)))
            l[h[i]].addParams(ip=('2001:cafe:%04x:1::%04x/64' % (i, 16 + i)))

        # Add eBGP sessions
        ebgp_session(self, r[2], r[1], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[1], r[3], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[3], r[4], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[2], r[5], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[4], r[7], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[7], r[6], link_type=CLIENT_PROVIDER)
        ebgp_session(self, r[7], r[8], link_type=CLIENT_PROVIDER)

        ebgp_session(self, r[2], r[3], link_type=SHARE)
        ebgp_session(self, r[4], r[5], link_type=SHARE)
        ebgp_session(self, r[5], r[6], link_type=SHARE)
        ebgp_session(self, r[8], r[6], link_type=SHARE)

        super(MyTopology, self).build(*args, **kwargs)
Esempio n. 25
0
    def build(self, *args, **kwargs):
        """
                                 +
                           AS1   |   AS4
        +-------+                |
        | as1r1 +--------+       |
        +---+---+        |       |
          2 |            |       |
        +---+---+    +---+---+   |   +-------+
        | as1r3 +----+ as1r6 +-------+ as4r1 +--------+
        +---+---+    +---+---+   |   +-------+        |
            |            |       |                    |
        +---+---+        |       |                 +--+--+     +-------+
        | as1r2 |        |       |                 | s4  +-----+ as4h1 |
        +---+---+        |       |                 +--+--+     +-------+
          4 |            |       |                    |
        +---+---+    +---+---+   |   +-------+        |
        | as1r4 +----+ as1r5 +-------+ as4r2 +--------+
        +-------+    +-------+   |   +-------+
                                 |
                                 +
        """

        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as1r6 = self.bgp('as1r6',
                         family=AF_INET6(redistribute=('ospf6', 'connected')))
        as4r1 = self.bgp('as4r1',
                         family=AF_INET6(networks=('dead:beef::/32', )))
        as4r2 = self.bgp('as4r2',
                         family=AF_INET6(networks=('dead:beef::/32', )))

        # Add the host and the switch
        as4h1 = self.addHost('as4h1')
        switch = self.addSwitch('s4')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3, igp_metric=2)
        self.addLinks((as1r3, as1r2), (as1r3, as1r6))
        self.addLink(as1r2, as1r4, igp_metric=4)
        self.addLinks((as1r4, as1r5), (as1r5, as1r6), (as4r1, as1r6),
                      (as4r2, as1r5), (as4r1, switch), (as4r2, switch),
                      (switch, as4h1))
        self.addSubnet((as4r1, as4r2, as4h1), subnets=('dead:beef::/32', ))

        al = AccessList(name='all', entries=('any', ))
        as1r6.get_config(BGP).set_local_pref(99,
                                             from_peer=as4r1,
                                             matching=(al, ))
        as1r5.get_config(BGP).set_local_pref(50,
                                             from_peer=as4r2,
                                             matching=(al, ))

        # Add full mesh
        self.addAS(4, (as4r1, as4r2))
        self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as4r1)
        ebgp_session(self, as1r5, as4r2)

        super().build(*args, **kwargs)
Esempio n. 26
0
    def build(self, *args, **kwargs):
        """
    TODO slide 42 iBGP RED config
           +----------+                                   +--------+
                      |                                   |
         AS1          |                  AS2              |        AS3
                      |                                   |
                      |                                   |
    +-------+   eBGP  |  +-------+     iBGP    +-------+  |  eBGP   +-------+
    | as1r1 +------------+ as2r1 +-------------+ as2r2 +------------+ as3r1 |
    +-------+         |  +-------+             +-------+  |         +-------+
                      |                                   |
                      |                                   |
                      |                                   |
         +------------+                                   +--------+
        """
        # Add all routers
        as1r1 = self.addRouter('as1r1')
        as1r1.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r2 = self.addRouter('as1r2')
        as1r2.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r3 = self.addRouter('as1r3')
        as1r3.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r4 = self.addRouter('as1r4')
        as1r4.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r5 = self.addRouter('as1r5')
        as1r5.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r6 = self.addRouter('as1r6')
        as1r6.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as4r1 = self.addRouter('as4r1')
        as4r1.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as4r2 = self.addRouter('as4r2')
        as4r2.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as5r1 = self.addRouter('as5r1')
        as5r1.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as3r1 = self.addRouter('as3r1')
        as3r1.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as2r1 = self.addRouter('as2r1')
        as2r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as2h1 = self.addHost('as21')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as4r1, as1r5)
        self.addLink(as4r2, as1r4)
        self.addLink(as3r1, as1r1)
        self.addLink(as5r1, as1r6)
        self.addLink(as3r1, as5r1)
        self.addLink(as5r1, as2r1)
        self.addLink(as2r1, as4r1)
        self.addLink(as4r1, as4r2)
        self.addLink(as2r1, as2h1)
        self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32', ))

        set_rr(self, as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6])
        set_rr(self, as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6])

        # Add full mesh
        self.addAS(2, (as2r1, ))
        self.addAS(3, (as3r1, ))
        self.addAS(5, (as5r1, ))
        self.addiBGPFullMesh(4, routers=[as4r1, as4r2])
        self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as5r1)
        ebgp_session(self, as1r1, as3r1)
        ebgp_session(self, as1r4, as4r2)
        ebgp_session(self, as1r5, as4r1)
        ebgp_session(self, as3r1, as5r1)
        ebgp_session(self, as5r1, as2r1)
        ebgp_session(self, as2r1, as4r1)

        super(BGPTopoRR, self).build(*args, **kwargs)
Esempio n. 27
0
    def build(self, *args, **kwargs):
        """
    TODO
           +----------+                                   +--------+
                      |                                   |
         AS1          |                  AS2              |        AS3
                      |                                   |
                      |                                   |
    +-------+   eBGP  |  +-------+     iBGP    +-------+  |  eBGP   +-------+
    | as1r1 +------------+ as2r1 +-------------+ as2r2 +------------+ as3r1 |
    +-------+         |  +-------+             +-------+  |         +-------+
                      |                                   |
                      |                                   |
                      |                                   |
         +------------+                                   +--------+
        """

        # Add all routers
        as1r1 = self.addRouter('as1r1')
        as1r1.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r2 = self.addRouter('as1r2')
        as1r2.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r3 = self.addRouter('as1r3')
        as1r3.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r4 = self.addRouter('as1r4')
        as1r4.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r5 = self.addRouter('as1r5')
        as1r5.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as1r6 = self.addRouter('as1r6')
        as1r6.addDaemon(
            BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
        as4r1 = self.addRouter('as4r1')
        as4r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as4r2 = self.addRouter('as4r2')
        as4r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as4h1 = self.addHost("as4h1")

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as4r1, as1r6)
        self.addLink(as4r2, as1r5)
        self.addLink(as4r1, as4h1)
        self.addLink(as4r2, as4h1)
        self.addSubnet((as4r1, as4h1), subnets=('dead:beef::/32', ))
        self.addSubnet((as4h1, as4r2), subnets=('dead:beef::/32', ))

        al = new_access_list(name='all', entries=('any', ))
        set_local_pref(self, as1r6, as4r1, 99, filter_list=(al, ))
        set_local_pref(self, as1r5, as4r2, 50, filter_list=(al, ))

        # Add full mesh
        self.addAS(4, (as4r1, as4r2))
        self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))

        # Add eBGP session
        ebgp_session(self, as1r6, as4r1)
        ebgp_session(self, as1r5, as4r2)

        super(BGPTopoLocalPref, self).build(*args, **kwargs)
Esempio n. 28
0
    def build(self, *args, **kwargs):
        """
        Topo from slide 30 BGP_RR_TE with R3 and R4 as RRs
        """
        # Add all routers
        as1r1 = self.bgp('as1r1')
        as1r2 = self.bgp('as1r2')
        as1r3 = self.bgp('as1r3')
        as1r4 = self.bgp('as1r4')
        as1r5 = self.bgp('as1r5')
        as1r6 = self.bgp('as1r6')
        as8r1 = self.addRouter('as8r1')
        as8r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        as8r2 = self.addRouter('as8r2')
        as8r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), ))
        h1 = self.addHost('h1')
        as7r1 = self.addRouter('as7r1')
        as7r1.addDaemon(
            BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), ))
        as7r2 = self.addRouter('as7r2')
        as7r2.addDaemon(
            BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), ))
        as7r3 = self.addRouter('as7r3')
        as7r3.addDaemon(
            BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), ))
        h2 = self.addHost('h2')

        # Add Links
        self.addLink(as1r1, as1r6)
        self.addLink(as1r1, as1r3)
        self.addLink(as1r3, as1r2)
        self.addLink(as1r3, as1r6)
        self.addLink(as1r2, as1r4)
        self.addLink(as1r4, as1r5)
        self.addLink(as1r5, as1r6)
        self.addLink(as1r2, as8r1)
        self.addLink(as1r4, as8r2)
        self.addLink(as1r1, as7r1)
        self.addLink(as1r3, as7r2)
        self.addLink(as1r5, as7r3)
        self.addLink(as1r6, as7r3)
        self.addLink(as8r1,
                     h1,
                     params1={"ip": "dead:beef::/48"},
                     params2={"ip": "dead:beef::1/48"})
        self.addLink(as8r2,
                     h1,
                     params1={"ip": "dead:beef::2/48"},
                     params2={"ip": "dead:beef::3/48"})
        self.addLink(as7r1,
                     h2,
                     params1={"ip": "feeb:daed::/48"},
                     params2={"ip": "feeb:daed::1/48"})
        self.addLink(as7r1,
                     h2,
                     params1={"ip": "feeb:daed::4/48"},
                     params2={"ip": "feeb:daed::5/48"})
        self.addLink(as7r2,
                     h2,
                     params1={"ip": "feeb:daed::2/48"},
                     params2={"ip": "feeb:daed::3/48"})
        set_rr(self, rr=as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6])
        set_rr(self, rr=as1r4, peers=[as1r1, as1r2, as1r3, as1r5, as1r6])

        # Add full mesh
        self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6))
        self.addAS(7, (as7r1, as7r2, as7r3))
        self.addAS(8, (as8r1, as8r2))

        # Add eBGP session
        ebgp_session(self, as1r2, as8r1)
        ebgp_session(self, as1r4, as8r2)
        ebgp_session(self, as1r1, as7r1)
        ebgp_session(self, as1r3, as7r2)
        ebgp_session(self, as1r5, as7r3)
        ebgp_session(self, as1r6, as7r3)

        super(BGPTopoTE2, self).build(*args, **kwargs)
Esempio n. 29
0
 def bgp(self, name):
     r = self.addRouter(name)
     r.addDaemon(
         BGP, address_families=(AF_INET6(redistribute=('connected', )), ))
     return r
Esempio n. 30
0
#!/usr/bin/env python3

from ipmininet.ipnet import IPNet
from ipmininet.cli import IPCLI
from ipmininet.iptopo import IPTopo
from ipmininet.router.config import BGP, OSPF, OSPF6, RouterConfig, AF_INET, AF_INET6, set_rr, bgp_fullmesh, ebgp_session, SHARE, CLIENT_PROVIDER, bgp_peering

families = (
    AF_INET(redistribute=('connected',)),
    AF_INET6(redistribute=('connected',))
)

class TestTopo(IPTopo):
    def build(self, * args, ** kwargs):
        def add_daemon(r):
            r.addDaemon(BGP, address_families=families)
            r.addDaemon(OSPF)
            r.addDaemon(OSPF6)
            return r
        
        as1_r1 = self.addRouter("as1_r1", config = RouterConfig)
        as2_r1 = self.addRouter("as2_r1", config = RouterConfig)
        
        as1_r2 = self.addRouter("as1_r2", config = RouterConfig)
        as2_r2 = self.addRouter("as2_r2", config = RouterConfig)
        
        as1_h = self.addHost("as1_h")
        as2_h = self.addHost("as2_h")
        
        self.addAS(1, [as1_r1, as1_r2])
        self.addAS(2, [as2_r1, as2_r2])