blob: 62269ed335b500e94cdd22a067d6f98b155bd13e [file] [log] [blame]
Charles Chanb0dd5ed2017-03-29 17:36:21 -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.link import TCLink
11from mininet.nodelib import NAT
12from ipaddress import ip_network
13from routinglib import BgpRouter
14from routinglib import RoutedHost
Charles Chanec57b952017-04-24 17:05:06 -070015from trellislib import DhcpClient, DhcpServer
16from trellislib import DualHomedDhcpClient
Charles Chanb0dd5ed2017-03-29 17:36:21 -070017
18class Trellis( Topo ):
19 "Trellis basic topology"
20
21 def __init__( self, *args, **kwargs ):
22 Topo.__init__( self, *args, **kwargs )
23
24 # Spines
25 s226 = self.addSwitch('s226', dpid='226')
26 s227 = self.addSwitch('s227', dpid='227')
27
28 # Leaves
29 s203 = self.addSwitch('s203', dpid='203')
30 s204 = self.addSwitch('s204', dpid='204')
31 s205 = self.addSwitch('s205', dpid='205')
32 s206 = self.addSwitch('s206', dpid='206')
33
34 # Leaf-Spine Links
35 self.addLink(s226, s203)
36 self.addLink(s226, s203)
37 self.addLink(s226, s204)
38 self.addLink(s226, s204)
39 self.addLink(s226, s205)
40 self.addLink(s226, s205)
41 self.addLink(s226, s206)
42 self.addLink(s226, s206)
43 self.addLink(s227, s203)
44 self.addLink(s227, s203)
45 self.addLink(s227, s204)
46 self.addLink(s227, s204)
47 self.addLink(s227, s205)
48 self.addLink(s227, s205)
49 self.addLink(s227, s206)
50 self.addLink(s227, s206)
51
52 # Leaf-Leaf Links
53 self.addLink(s203, s204)
54 self.addLink(s205, s206)
55
56 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
57 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
58 # IPv4 Hosts
59 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
60 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
61 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
62 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
63 self.addLink(h1, s204)
64 self.addLink(h2, s204)
65 self.addLink(h3, s205)
66 self.addLink(h4, s205)
67
68 # IPv6 Hosts
69 h1v6 = self.addHost('h1v6', cls=RoutedHost, mac='00:bb:00:00:00:01', ips=['2000::201/120'], gateway='2000::2ff')
70 h2v6 = self.addHost('h2v6', cls=RoutedHost, mac='00:bb:00:00:00:02', ips=['2000::202/120'], gateway='2000::2ff')
71 h3v6 = self.addHost('h3v6', cls=RoutedHost, mac='00:bb:00:00:00:03', ips=['2000::301/120'], gateway='2000::3ff')
72 h4v6 = self.addHost('h4v6', cls=RoutedHost, mac='00:bb:00:00:00:04', ips=['2000::302/120'], gateway='2000::3ff')
73 self.addLink(h1v6, s204)
74 self.addLink(h2v6, s204)
75 self.addLink(h3v6, s205)
76 self.addLink(h4v6, s205)
77
78 # Dual-homed IPv4 Hosts
79 dh1 = self.addHost('dh1', cls=DualHomedDhcpClient, mac='00:cc:00:00:00:01')
80 self.addLink(dh1, s204)
81 self.addLink(dh1, s203)
82
83 # DHCP server
84 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
85 self.addLink(dhcp, s205)
86
87 # Control plane switch (for quagga fpm)
88 cs0 = self.addSwitch('cs0', cls=OVSBridge)
89
90 # Control plane NAT (for quagga fpm)
91 nat = self.addHost('nat', cls=NAT,
92 ip='172.16.0.1/12',
93 subnet=str(ip_network(u'172.16.0.0/12')), inNamespace=False)
94 self.addLink(cs0, nat)
95
96 # Internal Quagga bgp1
Charles Chanc3122db2017-09-01 10:58:24 -070097 intfs = {'bgp1-eth0': [{'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:03', 'vlan': '110'},
98 {'ipAddrs': ['10.0.7.2/24', '2000::702/120'], 'mac': '00:88:00:00:00:03', 'vlan': '170'}],
99 'bgp1-eth1': {'ipAddrs': ['172.16.0.3/12']}}
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700100 bgp1 = self.addHost('bgp1', cls=BgpRouter,
101 interfaces=intfs,
102 quaggaConfFile='./bgpdbgp1.conf',
103 zebraConfFile='./zebradbgp1.conf')
104 self.addLink(bgp1, s205)
105 self.addLink(bgp1, cs0)
106
Charles Chanc3122db2017-09-01 10:58:24 -0700107 # Internal Quagga bgp2
108 intfs = {'bgp2-eth0': [{'ipAddrs': ['10.0.5.2/24', '2000::502/120'], 'mac': '00:88:00:00:00:04', 'vlan': '150'},
109 {'ipAddrs': ['10.0.6.2/24', '2000::602/120'], 'mac': '00:88:00:00:00:04', 'vlan': '160'}],
110 'bgp2-eth1': {'ipAddrs': ['172.16.0.4/12']}}
111 bgp2 = self.addHost('bgp2', cls=BgpRouter,
112 interfaces=intfs,
113 quaggaConfFile='./bgpdbgp2.conf',
114 zebraConfFile='./zebradbgp2.conf')
115 self.addLink(bgp2, s206)
116 self.addLink(bgp2, cs0)
117
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700118 # External Quagga r1
119 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
Charles Chanc3122db2017-09-01 10:58:24 -0700120 'r1-eth1': {'ipAddrs': ['10.0.5.1/24', '2000::501/120'], 'mac': '00:88:00:00:00:11'},
121 'r1-eth2': {'ipAddrs': ['10.0.99.1/16']},
122 'r1-eth3': {'ipAddrs': ['2000::9901/120']},
123 'r1-eth4': {'ipAddrs': ['2000::7701/120']}}
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700124 r1 = self.addHost('r1', cls=BgpRouter,
125 interfaces=intfs,
126 quaggaConfFile='./bgpdr1.conf')
127 self.addLink(r1, s205)
Charles Chanc3122db2017-09-01 10:58:24 -0700128 self.addLink(r1, s206)
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700129
130 # External IPv4 Host behind r1
131 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
132 self.addLink(r1, rh1)
133
134 # External IPv6 Host behind r1
135 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
136 self.addLink(r1, rh1v6)
137
Charles Chanc3122db2017-09-01 10:58:24 -0700138 # Another external IPv6 Host behind r1
139 rh11v6 = self.addHost('rh11v6', cls=RoutedHost, ips=['2000::7702/120'], gateway='2000::7701')
140 self.addLink(r1, rh11v6)
141
142 # External Quagga r2
143 intfs = {'r2-eth0': {'ipAddrs': ['10.0.6.1/24', '2000::601/120'], 'mac': '00:88:00:00:00:02'},
144 'r2-eth1': {'ipAddrs': ['10.0.7.1/24', '2000::701/120'], 'mac': '00:88:00:00:00:22'},
145 'r2-eth2': {'ipAddrs': ['10.0.99.1/16']},
146 'r2-eth3': {'ipAddrs': ['2000::9901/120']},
147 'r2-eth4': {'ipAddrs': ['2000::8801/120']}}
148 r2 = self.addHost('r2', cls=BgpRouter,
149 interfaces=intfs,
150 quaggaConfFile='./bgpdr2.conf')
151 self.addLink(r2, s206)
152 self.addLink(r2, s205)
153
154 # External IPv4 Host behind r2
155 rh2 = self.addHost('rh2', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
156 self.addLink(r2, rh2)
157
158 # External IPv6 Host behind r2
159 rh2v6 = self.addHost('rh126', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
160 self.addLink(r2, rh2v6)
161
162 # Another external IPv6 Host behind r1
163 rh22v6 = self.addHost('rh22v6', cls=RoutedHost, ips=['2000::8802/120'], gateway='2000::8801')
164 self.addLink(r2, rh22v6)
165
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700166topos = { 'trellis' : Trellis }
167
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700168if __name__ == "__main__":
169 setLogLevel('debug')
170 topo = Trellis()
171
172 net = Mininet(topo=topo, controller=None)
Charles Chanc3122db2017-09-01 10:58:24 -0700173 #net.addController(RemoteController('c0', ip='192.168.56.11'))
174 #net.addController(RemoteController('c1', ip='192.168.56.12'))
175 #net.addController(RemoteController('c2', ip='192.168.56.13'))
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700176
177 net.start()
178 CLI(net)
179 net.stop()