blob: 33a597407d50a08e45d2de9559647a4c669f1eac [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
Yi Tseng9e332d82017-07-28 17:52:21 -070014from trellislib import DhcpClient, DhcpServer, DhcpRelay
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
Yi Tseng9e332d82017-07-28 17:52:21 -070036 intfs = {
37 'relay-eth0': {
38 'ipAddrs': ['10.0.4.254/24']
39 },
40 'relay-eth1': {
41 'ipAddrs': ['10.0.2.100/24']
42 }
43 }
44 dhcpRelay = self.addHost('relay', cls=DhcpRelay, serverIp='10.0.99.3',
45 gateway='10.0.2.254', interfaces=intfs)
46
Charles Chanebfcc912017-04-24 12:39:52 -070047 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
48 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
49 # IPv4 Hosts
50 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
51 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
52 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
53 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
Yi Tseng9e332d82017-07-28 17:52:21 -070054 self.addLink(h1, dhcpRelay)
55 self.addLink(dhcpRelay, s204)
Charles Chanebfcc912017-04-24 12:39:52 -070056 self.addLink(h2, s204)
57 self.addLink(h3, s205)
58 self.addLink(h4, s205)
59
60 # IPv6 Hosts
61 h1v6 = self.addHost('h1v6', cls=RoutedHost, mac='00:bb:00:00:00:01', ips=['2000::201/120'], gateway='2000::2ff')
62 h2v6 = self.addHost('h2v6', cls=RoutedHost, mac='00:bb:00:00:00:02', ips=['2000::202/120'], gateway='2000::2ff')
63 h3v6 = self.addHost('h3v6', cls=RoutedHost, mac='00:bb:00:00:00:03', ips=['2000::301/120'], gateway='2000::3ff')
64 h4v6 = self.addHost('h4v6', cls=RoutedHost, mac='00:bb:00:00:00:04', ips=['2000::302/120'], gateway='2000::3ff')
65 self.addLink(h1v6, s204)
66 self.addLink(h2v6, s204)
67 self.addLink(h3v6, s205)
68 self.addLink(h4v6, s205)
69
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 switch behind r1
99 rs0 = self.addSwitch('rs0', cls=OVSBridge)
100 self.addLink(r1, rs0)
101
102 # External IPv4 Host behind r1
103 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
104 self.addLink(rs0, rh1)
105
106 # External DHCP server behind r1
107 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.99.3/24'], gateway='10.0.99.1')
108 self.addLink(rs0, dhcp)
109
110 # External IPv6 Host behind r1
111 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
112 self.addLink(r1, rh1v6)
113
114topos = { 'trellis' : Trellis }
115
Charles Chanebfcc912017-04-24 12:39:52 -0700116if __name__ == "__main__":
117 setLogLevel('debug')
118 topo = Trellis()
119
120 net = Mininet(topo=topo, controller=None)
121 net.addController(RemoteController('c0', ip='192.168.56.11'))
122 net.addController(RemoteController('c1', ip='192.168.56.12'))
123 net.addController(RemoteController('c2', ip='192.168.56.13'))
124
125 net.start()
126 CLI(net)
127 net.stop()