blob: 66c0c18d44aa3ec676a3533e1be75801d06da5b8 [file] [log] [blame]
pingping-lin117a43b2015-09-08 17:40:53 -07001#!/usr/bin/python
2
3"""
4Set up the SDN-IP topology as same as it on Internet2
5"""
6
7"""
8AS 64513, (SDN AS)
9AS 64514, reachable by 10.0.4.1
10AS 64515, reachable by 10.0.5.1
11AS 64516, reachable by 10.0.6.1
12"""
13
14from mininet.net import Mininet
15from mininet.node import Controller, RemoteController
16from mininet.log import setLogLevel, info
17from mininet.cli import CLI
18from mininet.topo import Topo
19from mininet.util import quietRun
20from mininet.moduledeps import pathCheck
21
22import os.path
23import time
24from subprocess import Popen, STDOUT, PIPE
25
26QUAGGA_DIR = '/usr/lib/quagga'
27QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
28onos1IP = '10.128.4.52'
29numSw = 39
30
31
32class SDNTopo( Topo ):
33 "SDN Topology"
34
35 def __init__( self, *args, **kwargs ):
36
37 Topo.__init__( self, *args, **kwargs )
38
39 # BGP peer hosts
40 peer64514 = self.addHost( 'peer64514' )
41 peer64515 = self.addHost( 'peer64515' )
42 peer64516 = self.addHost( 'peer64516' )
43 sw100 = self.addSwitch( 'sw100', dpid = '00000000000000a1' )
44
45 '''
46 sw1 = self.addSwitch( 'SEAT', dpid = '00000000000000a1' )
47 sw2 = self.addSwitch( 'PORT', dpid = '00000000000000a2' )
48 sw3 = self.addSwitch( 'SUNN', dpid = '00000000000000a3' )
49 sw4 = self.addSwitch( 'RENO', dpid = '00000000000000a4' )
50 sw5 = self.addSwitch( 'LOSA', dpid = '00000000000000a5' )
51 sw6 = self.addSwitch( 'MISS', dpid = '00000000000000a6' )
52 sw7 = self.addSwitch( 'LASV', dpid = '00000000000000a7' )
53 sw8 = self.addSwitch( 'SALT', dpid = '00000000000000a8' )
54 sw9 = self.addSwitch( 'PHOE', dpid = '00000000000000a9' )
55 sw10 = self.addSwitch( 'TUCS', dpid = '0000000000000a10' )
56 sw11 = self.addSwitch( 'DENV', dpid = '0000000000000a11' )
57 sw12 = self.addSwitch( 'ELPA', dpid = '0000000000000a12' )
58 sw13 = self.addSwitch( 'MINN', dpid = '0000000000000a13' )
59 sw14 = self.addSwitch( 'KANS', dpid = '0000000000000a14' )
60 sw15 = self.addSwitch( 'TULS', dpid = '0000000000000a15' )
61 sw16 = self.addSwitch( 'DALL', dpid = '0000000000000a16' )
62 sw17 = self.addSwitch( 'HOUH', dpid = '0000000000000a17' )
63 sw18 = self.addSwitch( 'COLU', dpid = '0000000000000a18' )
64 sw19 = self.addSwitch( 'JCSN', dpid = '0000000000000a19' )
65 sw20 = self.addSwitch( 'BATO', dpid = '0000000000000a20' )
66 sw21 = self.addSwitch( 'EQCH', dpid = '0000000000000a21' )
67 sw22 = self.addSwitch( 'STAR', dpid = '0000000000000a22' )
68 sw23 = self.addSwitch( 'CHIC', dpid = '0000000000000a23' )
69 sw24 = self.addSwitch( 'INDI', dpid = '0000000000000a24' )
70 sw25 = self.addSwitch( 'CINC', dpid = '0000000000000a25' )
71 sw26 = self.addSwitch( 'LOUI', dpid = '0000000000000a26' )
72 sw27 = self.addSwitch( 'ATLA', dpid = '0000000000000a27' )
73 sw28 = self.addSwitch( 'JACK', dpid = '0000000000000a28' )
74 sw29 = self.addSwitch( 'CLEV', dpid = '0000000000000a29' )
75 sw30 = self.addSwitch( 'PITT', dpid = '0000000000000a30' )
76 sw31 = self.addSwitch( 'ASHB', dpid = '0000000000000a31' )
77 sw32 = self.addSwitch( 'WASH', dpid = '0000000000000a32' )
78 sw33 = self.addSwitch( 'RALE', dpid = '0000000000000a33' )
79 sw34 = self.addSwitch( 'CHAR', dpid = '0000000000000a34' )
80 sw35 = self.addSwitch( 'ALBA', dpid = '0000000000000a35' )
81 sw36 = self.addSwitch( 'BOST', dpid = '0000000000000a36' )
82 sw37 = self.addSwitch( 'HART', dpid = '0000000000000a37' )
83 sw38 = self.addSwitch( 'NEWY', dpid = '0000000000000a38' )
84 sw39 = self.addSwitch( 'PHIL', dpid = '0000000000000a39' )
85 '''
86 sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
87 sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
88 sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
89 sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
90 sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
91 sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
92 sw7 = self.addSwitch( 'sw7', dpid = '00000000000000a7' )
93 sw8 = self.addSwitch( 'sw8', dpid = '00000000000000a8' )
94 sw9 = self.addSwitch( 'sw9', dpid = '00000000000000a9' )
95 sw10 = self.addSwitch( 'sw10', dpid = '0000000000000a10' )
96 sw11 = self.addSwitch( 'sw11', dpid = '0000000000000a11' )
97 sw12 = self.addSwitch( 'sw12', dpid = '0000000000000a12' )
98 sw13 = self.addSwitch( 'sw13', dpid = '0000000000000a13' )
99 sw14 = self.addSwitch( 'sw14', dpid = '0000000000000a14' )
100 sw15 = self.addSwitch( 'sw15', dpid = '0000000000000a15' )
101 sw16 = self.addSwitch( 'sw16', dpid = '0000000000000a16' )
102 sw17 = self.addSwitch( 'sw17', dpid = '0000000000000a17' )
103 sw18 = self.addSwitch( 'sw18', dpid = '0000000000000a18' )
104 sw19 = self.addSwitch( 'sw19', dpid = '0000000000000a19' )
105 sw20 = self.addSwitch( 'sw20', dpid = '0000000000000a20' )
106 sw21 = self.addSwitch( 'sw21', dpid = '0000000000000a21' )
107 sw22 = self.addSwitch( 'sw22', dpid = '0000000000000a22' )
108 sw23 = self.addSwitch( 'sw23', dpid = '0000000000000a23' )
109 sw24 = self.addSwitch( 'sw24', dpid = '0000000000000a24' )
110 sw25 = self.addSwitch( 'sw25', dpid = '0000000000000a25' )
111 sw26 = self.addSwitch( 'sw26', dpid = '0000000000000a26' )
112 sw27 = self.addSwitch( 'sw27', dpid = '0000000000000a27' )
113 sw28 = self.addSwitch( 'sw28', dpid = '0000000000000a28' )
114 sw29 = self.addSwitch( 'sw29', dpid = '0000000000000a29' )
115 sw30 = self.addSwitch( 'sw30', dpid = '0000000000000a30' )
116 sw31 = self.addSwitch( 'sw31', dpid = '0000000000000a31' )
117 sw32 = self.addSwitch( 'sw32', dpid = '0000000000000a32' )
118 sw33 = self.addSwitch( 'sw33', dpid = '0000000000000a33' )
119 sw34 = self.addSwitch( 'sw34', dpid = '0000000000000a34' )
120 sw35 = self.addSwitch( 'sw35', dpid = '0000000000000a35' )
121 sw36 = self.addSwitch( 'sw36', dpid = '0000000000000a36' )
122 sw37 = self.addSwitch( 'sw37', dpid = '0000000000000a37' )
123 sw38 = self.addSwitch( 'sw38', dpid = '0000000000000a38' )
124 sw39 = self.addSwitch( 'sw39', dpid = '0000000000000a39' )
125
126
127 # Add a layer2 switch for control plane connectivity
128 # This switch isn't part of the SDN topology
129 # We'll use the ovs-controller to turn this into a learning switch
130 swCtl100 = self.addSwitch( 'swCtl100', dpid = '0000000000000100' )
131
132
133 # BGP speaker hosts
134 speaker1 = self.addHost( 'speaker1' )
135 speaker2 = self.addHost( 'speaker2' )
136
137 root = self.addHost( 'root', inNamespace = False , ip = '0' )
138
139 # hosts behind each AS
140 host64514 = self.addHost( 'host64514' )
141 host64515 = self.addHost( 'host64515' )
142 host64516 = self.addHost( 'host64516' )
143
144 self.addLink( 'speaker1', sw24 )
145 self.addLink( 'speaker2', sw24 )
146
147 # connect all switches
148 self.addLink( sw1, sw2 )
149 self.addLink( sw1, sw6 )
150 self.addLink( sw1, sw8 )
151 self.addLink( sw2, sw3 )
152 self.addLink( sw3, sw4 )
153 self.addLink( sw3, sw5 )
154 self.addLink( sw4, sw8 )
155 self.addLink( sw5, sw7 )
156 self.addLink( sw5, sw9 )
157 self.addLink( sw6, sw13 )
158 self.addLink( sw7, sw8 )
159 self.addLink( sw8, sw11 )
160 self.addLink( sw9, sw10 )
161 self.addLink( sw10, sw12 )
162 self.addLink( sw11, sw12 )
163 self.addLink( sw11, sw14 )
164 self.addLink( sw12, sw17 )
165 self.addLink( sw13, sw14 )
166 self.addLink( sw13, sw21 )
167 self.addLink( sw14, sw15 )
168 self.addLink( sw14, sw18 )
169 self.addLink( sw14, sw23 )
170 self.addLink( sw15, sw16 )
171 self.addLink( sw16, sw17 )
172 self.addLink( sw17, sw19 )
173 self.addLink( sw17, sw20 )
174 self.addLink( sw18, sw23 )
175 self.addLink( sw19, sw27 )
176 self.addLink( sw20, sw28 )
177 self.addLink( sw21, sw22 )
178 self.addLink( sw21, sw29 )
179 self.addLink( sw22, sw23 )
180 self.addLink( sw23, sw24 )
181 self.addLink( sw23, sw31 )
182 self.addLink( sw24, sw25 )
183 self.addLink( sw25, sw26 )
184 self.addLink( sw26, sw27 )
185 self.addLink( sw27, sw28 )
186 self.addLink( sw27, sw34 )
187 self.addLink( sw29, sw30 )
188 self.addLink( sw29, sw35 )
189 self.addLink( sw30, sw31 )
190 self.addLink( sw31, sw32 )
191 self.addLink( sw32, sw33 )
192 self.addLink( sw32, sw39 )
193 self.addLink( sw33, sw34 )
194 self.addLink( sw35, sw36 )
195 self.addLink( sw36, sw37 )
196 self.addLink( sw37, sw38 )
197 self.addLink( sw38, sw39 )
198
199 # connection between switches and peers
200 self.addLink( peer64514, sw32 )
201 self.addLink( peer64515, sw8 )
202 self.addLink( peer64516, sw28 )
203
204 # connection between BGP peer and hosts behind the BGP peer
205 self.addLink( peer64514, host64514 )
206 self.addLink( peer64515, host64515 )
207 self.addLink( peer64516, host64516 )
208
209 # Internal Connection To Hosts
210 self.addLink( swCtl100, peer64514 )
211 self.addLink( swCtl100, peer64515 )
212 self.addLink( swCtl100, peer64516 )
213 self.addLink( swCtl100, speaker1 )
214 self.addLink( swCtl100, speaker2 )
215
216
217
218 # add host64514 to control plane for ping test
219 self.addLink( swCtl100, host64514 )
220 self.addLink( swCtl100, root )
221
222
223def startsshd( host ):
224 "Start sshd on host"
225 info( '*** Starting sshd\n' )
226 name, intf, ip = host.name, host.defaultIntf(), host.IP()
227 banner = '/tmp/%s.banner' % name
228 host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
229 host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
230 info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
231
232def startsshds ( hosts ):
233 for h in hosts:
234 startsshd( h )
235
236def stopsshd():
237 "Stop *all* sshd processes with a custom banner"
238 info( '*** Shutting down stale sshd/Banner processes ',
239 quietRun( "pkill -9 -f Banner" ), '\n' )
240
241def startquagga( host, num, config_file ):
242 info( '*** Starting Quagga on %s\n' % host )
243 zebra_cmd = \
244 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
245 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
246 quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
247 % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
248
249 print zebra_cmd
250 print quagga_cmd
251
252 host.cmd( zebra_cmd )
253 host.cmd( quagga_cmd )
254
255def startquaggahost5( host, num ):
256 info( '*** Starting Quagga on %s\n' % host )
257 zebra_cmd = \
258 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
259 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
260 quagga_cmd = \
261 '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
262 % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
263
264 host.cmd( zebra_cmd )
265 host.cmd( quagga_cmd )
266
267
268def stopquagga():
269 quietRun( 'sudo pkill -9 -f bgpd' )
270 quietRun( 'sudo pkill -9 -f zebra' )
271
272def sdn1net():
273 topo = SDNTopo()
274 info( '*** Creating network\n' )
275 # time.sleep( 30 )
276 net = Mininet( topo = topo, controller = RemoteController )
277
278
279 speaker1, speaker2, peer64514, peer64515, peer64516 = \
280 net.get( 'speaker1', 'speaker2' ,
281 'peer64514', 'peer64515', 'peer64516' )
282
283 # Adding addresses to host64513_1 interface connected to sw24
284 # for BGP peering
285 speaker1.setMAC( '00:00:00:00:00:01', 'speaker1-eth0' )
286 speaker1.cmd( 'ip addr add 10.0.4.101/24 dev speaker1-eth0' )
287 speaker1.cmd( 'ip addr add 10.0.5.101/24 dev speaker1-eth0' )
288 speaker1.cmd( 'ip addr add 10.0.6.101/24 dev speaker1-eth0' )
289
290 speaker1.defaultIntf().setIP( '10.1.4.101/24' )
291 speaker1.defaultIntf().setMAC( '00:00:00:00:00:01' )
292
293 # Net has to be start after adding the above link
294 net.start()
295
296 # setup configuration on the interface connected to switch
297 peer64514.cmd( "ifconfig peer64514-eth0 10.0.4.1 up" )
298 peer64514.setMAC( '00:00:00:00:00:04', 'peer64514-eth0' )
299 peer64515.cmd( "ifconfig peer64515-eth0 10.0.5.1 up" )
300 peer64515.setMAC( '00:00:00:00:00:05', 'peer64515-eth0' )
301 peer64516.cmd( "ifconfig peer64516-eth0 10.0.6.1 up" )
302 peer64516.setMAC( '00:00:00:00:00:06', 'peer64516-eth0' )
303
304 # setup configuration on the interface connected to hosts
305 peer64514.setIP( "4.0.0.254", 8, "peer64514-eth1" )
306 peer64514.setMAC( '00:00:00:00:00:44', 'peer64514-eth1' )
307 peer64515.setIP( "5.0.0.254", 8, "peer64515-eth1" )
308 peer64515.setMAC( '00:00:00:00:00:55', 'peer64515-eth1' )
309 peer64516.setIP( "6.0.0.254", 8, "peer64516-eth1" )
310 peer64516.setMAC( '00:00:00:00:00:66', 'peer64516-eth1' )
311
312 # enable forwarding on BGP peer hosts
313 peer64514.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
314 peer64515.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
315 peer64516.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
316
317 # config interface for control plane connectivity
318 peer64514.setIP( "192.168.0.4", 24, "peer64514-eth2" )
319 peer64515.setIP( "192.168.0.5", 24, "peer64515-eth2" )
320 peer64516.setIP( "192.168.0.6", 24, "peer64516-eth2" )
321
322 # Setup hosts in each non-SDN AS
323 host64514, host64515, host64516 = \
324 net.get( 'host64514', 'host64515', 'host64516' )
325 host64514.cmd( 'ifconfig host64514-eth0 4.0.0.1 up' )
326 host64514.cmd( 'ip route add default via 4.0.0.254' )
327 host64514.setIP( '192.168.0.44', 24, 'host64514-eth1' ) # for control plane
328 host64515.cmd( 'ifconfig host64515-eth0 5.0.0.1 up' )
329 host64515.cmd( 'ip route add default via 5.0.0.254' )
330 host64516.cmd( 'ifconfig host64516-eth0 6.0.0.1 up' )
331 host64516.cmd( 'ip route add default via 6.0.0.254' )
332
333
334 # set up swCtl100 as a learning
335 swCtl100 = net.get( 'swCtl100' )
336 swCtl100.cmd( 'ovs-vsctl set-controller swCtl100 none' )
337 swCtl100.cmd( 'ovs-vsctl set-fail-mode swCtl100 standalone' )
338
339 # connect all switches to controller
340 for i in range ( 1, numSw + 1 ):
341 swX = net.get( 'sw%s' % ( i ) )
342 swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6633' % ( i, onos1IP ) )
343
344 # Start Quagga on border routers
345 '''
346 for i in range ( 64514, 64516 + 1 ):
347 startquagga( 'peer%s' % ( i ), i, 'quagga%s.conf' % ( i ) )
348 '''
349 startquagga( peer64514, 64514, 'quagga64514.conf' )
350 startquagga( peer64515, 64515, 'quagga64515.conf' )
351 startquagga( peer64516, 64516, 'quagga64516.conf' )
352
353 # start Quagga in SDN network
354 startquagga( speaker1, 64513, 'quagga-sdn.conf' )
355
356
357 root = net.get( 'root' )
358 root.intf( 'root-eth0' ).setIP( '1.1.1.2/24' )
359 root.cmd( 'ip addr add 192.168.0.100/24 dev root-eth0' )
360
361 speaker1.intf( 'speaker1-eth1' ).setIP( '1.1.1.1/24' )
362
363
364 stopsshd()
365
366 hosts = [ peer64514, peer64515, peer64516, host64514];
367 startsshds( hosts )
368 #
369
370 forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1IP )
371 root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
372 -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1IP ) )
373
374
375 # time.sleep( 3000000000 )
376 CLI( net )
377
378
379 stopsshd()
380 stopquagga()
381 net.stop()
382
383if __name__ == '__main__':
384 # setLogLevel( 'debug' )
385 sdn1net()