blob: 598c4f5b2de1c37799a5734cc0a8be55444ee2a8 [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
97 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
98 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
99 bgp1 = self.addHost('bgp1', cls=BgpRouter,
100 interfaces=intfs,
101 quaggaConfFile='./bgpdbgp1.conf',
102 zebraConfFile='./zebradbgp1.conf')
103 self.addLink(bgp1, s205)
104 self.addLink(bgp1, cs0)
105
106 # External Quagga r1
107 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
108 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
109 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
110 r1 = self.addHost('r1', cls=BgpRouter,
111 interfaces=intfs,
112 quaggaConfFile='./bgpdr1.conf')
113 self.addLink(r1, s205)
114
115 # External IPv4 Host behind r1
116 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
117 self.addLink(r1, rh1)
118
119 # External IPv6 Host behind r1
120 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
121 self.addLink(r1, rh1v6)
122
123topos = { 'trellis' : Trellis }
124
Charles Chanb0dd5ed2017-03-29 17:36:21 -0700125if __name__ == "__main__":
126 setLogLevel('debug')
127 topo = Trellis()
128
129 net = Mininet(topo=topo, controller=None)
130 net.addController(RemoteController('c0', ip='192.168.56.11'))
131 net.addController(RemoteController('c1', ip='192.168.56.12'))
132 net.addController(RemoteController('c2', ip='192.168.56.13'))
133
134 net.start()
135 CLI(net)
136 net.stop()