blob: dd57eb4f11a22046201d6e4a504878c154073b5d [file] [log] [blame]
Charles Chan6f149a92017-03-24 19:35:41 -07001#!/usr/bin/python
2
3import sys
4sys.path.append('..')
5from mininet.topo import Topo
6from mininet.net import Mininet
7from mininet.cli import CLI
8from mininet.log import setLogLevel
9from mininet.node import RemoteController, OVSBridge, Host
10from mininet.nodelib import NAT
11from ipaddress import ip_network
12from routinglib import BgpRouter
Yi Tseng45ee6922017-07-17 14:49:17 -070013from routinglib import RoutedHost, RoutedHost6
14from trellislib import DhcpClient, Dhcp6Client, DhcpRelay, DhcpServer, Dhcp6Server
Charles Chan6f149a92017-03-24 19:35:41 -070015
16class Trellis( Topo ):
17 "Trellis basic topology"
18
19 def __init__( self, *args, **kwargs ):
20 Topo.__init__( self, *args, **kwargs )
21
22 # Spines
23 s226 = self.addSwitch('s226', dpid='226')
24 s227 = self.addSwitch('s227', dpid='227')
25
26 # Leaves
27 s204 = self.addSwitch('s204', dpid='204')
28 s205 = self.addSwitch('s205', dpid='205')
29
30 # Switch Links
31 self.addLink(s226, s204)
32 self.addLink(s226, s205)
33 self.addLink(s227, s204)
34 self.addLink(s227, s205)
35
36 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
37 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
38 # IPv4 Hosts
39 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
40 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
41 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
42 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
43 self.addLink(h1, s204)
44 self.addLink(h2, s204)
45 self.addLink(h3, s205)
46 self.addLink(h4, s205)
47
48 # IPv6 Hosts
Yi Tseng45ee6922017-07-17 14:49:17 -070049 h1v6 = self.addHost('h1v6', cls=Dhcp6Client, mac='00:bb:00:00:00:01')
50 h2v6 = self.addHost('h2v6', cls=Dhcp6Client, mac='00:bb:00:00:00:02')
51 h3v6 = self.addHost('h3v6', cls=Dhcp6Client, mac='00:bb:00:00:00:03')
52 h4v6 = self.addHost('h4v6', cls=Dhcp6Client, mac='00:bb:00:00:00:04')
Charles Chan6f149a92017-03-24 19:35:41 -070053 self.addLink(h1v6, s204)
54 self.addLink(h2v6, s204)
55 self.addLink(h3v6, s205)
56 self.addLink(h4v6, s205)
57
58 # DHCP server
59 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
Yi Tseng45ee6922017-07-17 14:49:17 -070060
61 # DHCPv6 server
62 dhcp6 = self.addHost('dhcp6', cls=Dhcp6Server, mac='00:99:66:00:00:01', ips=['2000::3fd/120'], gateway='2000::3ff')
63
64 # Control plane switch (for DHCP servers)
65 cs1 = self.addSwitch('cs1', cls=OVSBridge)
66 self.addLink(cs1, s205)
67 self.addLink(dhcp, cs1)
68 self.addLink(dhcp6, cs1)
Charles Chan6f149a92017-03-24 19:35:41 -070069
70 # Control plane switch (for quagga fpm)
71 cs0 = self.addSwitch('cs0', cls=OVSBridge)
72
73 # Control plane NAT (for quagga fpm)
74 nat = self.addHost('nat', cls=NAT,
75 ip='172.16.0.1/12',
76 subnet=str(ip_network(u'172.16.0.0/12')), inNamespace=False)
77 self.addLink(cs0, nat)
78
79 # Internal Quagga bgp1
80 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
81 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
82 bgp1 = self.addHost('bgp1', cls=BgpRouter,
83 interfaces=intfs,
84 quaggaConfFile='./bgpdbgp1.conf',
85 zebraConfFile='./zebradbgp1.conf')
86 self.addLink(bgp1, s205)
87 self.addLink(bgp1, cs0)
88
89 # External Quagga r1
90 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
91 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
92 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
93 r1 = self.addHost('r1', cls=BgpRouter,
94 interfaces=intfs,
95 quaggaConfFile='./bgpdr1.conf')
96 self.addLink(r1, s205)
97
98 # External IPv4 Host behind r1
99 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
100 self.addLink(r1, rh1)
101
102 # External IPv6 Host behind r1
103 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
104 self.addLink(r1, rh1v6)
105
106topos = { 'trellis' : Trellis }
107
Charles Chan6f149a92017-03-24 19:35:41 -0700108if __name__ == "__main__":
109 setLogLevel('debug')
110 topo = Trellis()
111
112 net = Mininet(topo=topo, controller=None)
113 net.addController(RemoteController('c0', ip='192.168.56.11'))
114 net.addController(RemoteController('c1', ip='192.168.56.12'))
115 net.addController(RemoteController('c2', ip='192.168.56.13'))
116
117 net.start()
118 CLI(net)
119 net.stop()