blob: df0243ce10e36f9b1660c80980a291e6ff40b678 [file] [log] [blame]
pierventred0806a62018-01-10 11:54:17 +01001#!/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, OVSSwitch
10from mininet.nodelib import NAT
11from ipaddress import ip_network
12from routinglib import BgpRouter
13from routinglib import RoutedHost, RoutedHost6
14from trellislib import DhcpClient, Dhcp6Client, DhcpRelay, DhcpServer, Dhcp6Server
15from functools import partial
16
17class Trellis( Topo ):
18 "Trellis dual-link topology"
19
20 def __init__( self, *args, **kwargs ):
21 Topo.__init__( self, *args, **kwargs )
22
23 # Spines
24 s226 = self.addSwitch('s226', dpid='226')
25 s227 = self.addSwitch('s227', dpid='227')
26
27 # Leaves
28 s204 = self.addSwitch('s204', dpid='204')
29 s205 = self.addSwitch('s205', dpid='205')
30
31 # Switch Links - dual-link
32 self.addLink(s226, s204)
33 self.addLink(s226, s204)
34
35 self.addLink(s226, s205)
36 self.addLink(s226, s205)
37
38 self.addLink(s227, s204)
39 self.addLink(s227, s204)
40
41 self.addLink(s227, s205)
42 self.addLink(s227, s205)
43
44 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
45 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
46 # IPv4 Hosts
47 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
48 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
49 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
50 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
51 self.addLink(h1, s204)
52 self.addLink(h2, s204)
53 self.addLink(h3, s205)
54 self.addLink(h4, s205)
55
56 # IPv6 Hosts
57 h1v6 = self.addHost('h1v6', cls=Dhcp6Client, mac='00:bb:00:00:00:01')
58 h2v6 = self.addHost('h2v6', cls=Dhcp6Client, mac='00:bb:00:00:00:02')
59 h3v6 = self.addHost('h3v6', cls=Dhcp6Client, mac='00:bb:00:00:00:03')
60 h4v6 = self.addHost('h4v6', cls=Dhcp6Client, mac='00:bb:00:00:00:04')
61 self.addLink(h1v6, s204)
62 self.addLink(h2v6, s204)
63 self.addLink(h3v6, s205)
64 self.addLink(h4v6, s205)
65
66 # DHCP server
67 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
68
69 # DHCPv6 server
70 dhcp6 = self.addHost('dhcp6', cls=Dhcp6Server, mac='00:99:66:00:00:01', ips=['2000::3fd/120'], gateway='2000::3ff')
71
72 # Data plane switch (for DHCP servers)
73 cs1 = self.addSwitch('cs1', cls=OVSBridge)
74 self.addLink(cs1, s205)
75 self.addLink(dhcp, cs1)
76 self.addLink(dhcp6, cs1)
77
78 # Control plane switch (for quagga fpm)
79 cs0 = self.addSwitch('cs0', cls=OVSBridge)
80
81 # Control plane NAT (for quagga fpm)
82 nat = self.addHost('nat', cls=NAT,
83 ip='172.16.0.1/12',
84 subnet=str(ip_network(u'172.16.0.0/12')), inNamespace=False)
85 self.addLink(cs0, nat)
86
87 # Internal Quagga bgp1
88 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
89 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
90 bgp1 = self.addHost('bgp1', cls=BgpRouter,
91 interfaces=intfs,
92 quaggaConfFile='./bgpdbgp1.conf',
93 zebraConfFile='./zebradbgp1.conf')
94 self.addLink(bgp1, s205)
95 self.addLink(bgp1, cs0)
96
97 # External Quagga r1
98 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
99 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
100 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
101 r1 = self.addHost('r1', cls=BgpRouter,
102 interfaces=intfs,
103 quaggaConfFile='./bgpdr1.conf')
104 self.addLink(r1, s205)
105
106 # External IPv4 Host behind r1
107 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
108 self.addLink(r1, rh1)
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
116if __name__ == "__main__":
117 setLogLevel('debug')
118 topo = Trellis()
119
120 switch = partial(OVSSwitch, protocols='OpenFlow13')
121 net = Mininet(topo=topo, controller=None, switch=switch)
122 net.addController(RemoteController('c0', ip='192.168.56.11'))
123 net.addController(RemoteController('c1', ip='192.168.56.12'))
124 net.addController(RemoteController('c2', ip='192.168.56.13'))
125
126 net.start()
127 CLI(net)
128 net.stop()