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