blob: 606935e29e716654427e814a51086d9c8ff26e37 [file] [log] [blame]
Charles Chanebfcc912017-04-24 12:39:52 -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
13from routinglib import RoutedHost
Charles Chanec57b952017-04-24 17:05:06 -070014from trellislib import DhcpClient, DhcpServer
Charles Chanebfcc912017-04-24 12:39:52 -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
49 h1v6 = self.addHost('h1v6', cls=RoutedHost, mac='00:bb:00:00:00:01', ips=['2000::201/120'], gateway='2000::2ff')
50 h2v6 = self.addHost('h2v6', cls=RoutedHost, mac='00:bb:00:00:00:02', ips=['2000::202/120'], gateway='2000::2ff')
51 h3v6 = self.addHost('h3v6', cls=RoutedHost, mac='00:bb:00:00:00:03', ips=['2000::301/120'], gateway='2000::3ff')
52 h4v6 = self.addHost('h4v6', cls=RoutedHost, mac='00:bb:00:00:00:04', ips=['2000::302/120'], gateway='2000::3ff')
53 self.addLink(h1v6, s204)
54 self.addLink(h2v6, s204)
55 self.addLink(h3v6, s205)
56 self.addLink(h4v6, s205)
57
58 # Control plane switch (for quagga fpm)
59 cs0 = self.addSwitch('cs0', cls=OVSBridge)
60
61 # Control plane NAT (for quagga fpm)
62 nat = self.addHost('nat', cls=NAT,
63 ip='172.16.0.1/12',
64 subnet=str(ip_network(u'172.16.0.0/12')), inNamespace=False)
65 self.addLink(cs0, nat)
66
67 # Internal Quagga bgp1
68 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
69 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
70 bgp1 = self.addHost('bgp1', cls=BgpRouter,
71 interfaces=intfs,
72 quaggaConfFile='./bgpdbgp1.conf',
73 zebraConfFile='./zebradbgp1.conf')
74 self.addLink(bgp1, s205)
75 self.addLink(bgp1, cs0)
76
77 # External Quagga r1
78 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
79 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
80 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
81 r1 = self.addHost('r1', cls=BgpRouter,
82 interfaces=intfs,
83 quaggaConfFile='./bgpdr1.conf')
84 self.addLink(r1, s205)
85
86 # External switch behind r1
87 rs0 = self.addSwitch('rs0', cls=OVSBridge)
88 self.addLink(r1, rs0)
89
90 # External IPv4 Host behind r1
91 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
92 self.addLink(rs0, rh1)
93
94 # External DHCP server behind r1
95 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.99.3/24'], gateway='10.0.99.1')
96 self.addLink(rs0, dhcp)
97
98 # External IPv6 Host behind r1
99 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
100 self.addLink(r1, rh1v6)
101
102topos = { 'trellis' : Trellis }
103
Charles Chanebfcc912017-04-24 12:39:52 -0700104if __name__ == "__main__":
105 setLogLevel('debug')
106 topo = Trellis()
107
108 net = Mininet(topo=topo, controller=None)
109 net.addController(RemoteController('c0', ip='192.168.56.11'))
110 net.addController(RemoteController('c1', ip='192.168.56.12'))
111 net.addController(RemoteController('c2', ip='192.168.56.13'))
112
113 net.start()
114 CLI(net)
115 net.stop()