1 |
1 |
#!/usr/bin/python
|
2 |
|
"""Mininet: A simple networking testbed for OpenFlow!
|
3 |
|
author: Bob Lantz ( rlantz@cs.stanford.edu )
|
4 |
|
author: Brandon Heller ( brandonh@stanford.edu )
|
|
2 |
"""
|
|
3 |
|
|
4 |
Mininet: A simple networking testbed for OpenFlow!
|
|
5 |
|
|
6 |
author: Bob Lantz (rlantz@cs.stanford.edu)
|
|
7 |
author: Brandon Heller (brandonh@stanford.edu)
|
5 |
8 |
|
6 |
9 |
Mininet creates scalable OpenFlow test networks by using
|
7 |
10 |
process-based virtualization and network namespaces.
|
... | ... | |
11 |
14 |
top of a single Linux kernel.
|
12 |
15 |
|
13 |
16 |
Each host has:
|
14 |
|
A virtual console ( pipes to a shell )
|
15 |
|
A virtual interfaces ( half of a veth pair )
|
16 |
|
A parent shell ( and possibly some child processes ) in a namespace
|
|
17 |
A virtual console (pipes to a shell)
|
|
18 |
A virtual interfaces (half of a veth pair)
|
|
19 |
A parent shell (and possibly some child processes) in a namespace
|
17 |
20 |
|
18 |
21 |
Hosts have a network interface which is configured via ifconfig/ip
|
19 |
22 |
link/etc.
|
... | ... | |
24 |
27 |
In kernel datapath mode, the controller and switches are simply
|
25 |
28 |
processes in the root namespace.
|
26 |
29 |
|
27 |
|
Kernel OpenFlow datapaths are instantiated using dpctl( 8 ), and are
|
|
30 |
Kernel OpenFlow datapaths are instantiated using dpctl(8), and are
|
28 |
31 |
attached to the one side of a veth pair; the other side resides in the
|
29 |
32 |
host namespace. In this mode, switch processes can simply connect to the
|
30 |
33 |
controller via the loopback interface.
|
31 |
34 |
|
32 |
35 |
In user datapath mode, the controller and switches are full-service
|
33 |
36 |
nodes that live in their own network namespaces and have management
|
34 |
|
interfaces and IP addresses on a control network ( e.g. 10.0.123.1,
|
35 |
|
currently routed although it could be bridged. )
|
|
37 |
interfaces and IP addresses on a control network (e.g. 10.0.123.1,
|
|
38 |
currently routed although it could be bridged.)
|
36 |
39 |
|
37 |
40 |
In addition to a management interface, user mode switches also have
|
38 |
41 |
several switch interfaces, halves of veth pairs whose other halves
|
39 |
42 |
reside in the host nodes that the switches are connected to.
|
40 |
43 |
|
41 |
44 |
Naming:
|
42 |
|
Host nodes are named h1-hN
|
43 |
|
Switch nodes are named s0-sN
|
44 |
|
Interfaces are named { nodename }-eth0 .. { nodename }-ethN,"""
|
|
45 |
|
|
46 |
Host nodes are named h1-hN
|
|
47 |
Switch nodes are named s0-sN
|
|
48 |
Interfaces are named { nodename }-eth0 .. { nodename }-ethN
|
|
49 |
|
|
50 |
"""
|
|
51 |
|
45 |
52 |
import os
|
46 |
53 |
import re
|
47 |
54 |
import signal
|
... | ... | |
79 |
86 |
autoSetMacs=False, autoStaticArp=False ):
|
80 |
87 |
"""Create Mininet object.
|
81 |
88 |
topo: Topo object
|
82 |
|
switch: Switch class
|
|
89 |
switch: Switch class
|
83 |
90 |
host: Host class
|
84 |
91 |
controller: Controller class
|
85 |
92 |
cparams: ControllerParams object
|
... | ... | |
219 |
226 |
lg.info( '\n' )
|
220 |
227 |
lg.info( '*** Testing control network\n' )
|
221 |
228 |
while not controller.intfIsUp( controller.intfs[ 0 ] ):
|
222 |
|
lg.info( '*** Waiting for %s to come up\n', controller.intfs[ 0 ] )
|
|
229 |
lg.info( '*** Waiting for %s to come up\n',
|
|
230 |
controller.intfs[ 0 ] )
|
223 |
231 |
sleep( 1 )
|
224 |
232 |
for switchDpid in self.topo.switches():
|
225 |
233 |
switch = self.nodes[ switchDpid ]
|
... | ... | |
509 |
517 |
# Commands
|
510 |
518 |
def help( self, args ):
|
511 |
519 |
"Semi-useful help for CLI."
|
512 |
|
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n' +
|
513 |
|
'You may also send a command to a node using:\n' +
|
514 |
|
' <node> command {args}\n' +
|
515 |
|
'For example:\n' +
|
516 |
|
' mininet> h0 ifconfig\n' +
|
517 |
|
'\n' +
|
518 |
|
'The interpreter automatically substitutes IP ' +
|
519 |
|
'addresses\n' +
|
520 |
|
'for node names, so commands like\n' +
|
521 |
|
' mininet> h0 ping -c1 h1\n' +
|
522 |
|
'should work.\n' +
|
523 |
|
'\n\n' +
|
524 |
|
'Interactive commands are not really supported yet,\n' +
|
525 |
|
'so please limit commands to ones that do not\n' +
|
526 |
|
'require user interaction and will terminate\n' +
|
|
520 |
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n'
|
|
521 |
'You may also send a command to a node using:\n'
|
|
522 |
' <node> command {args}\n'
|
|
523 |
'For example:\n'
|
|
524 |
' mininet> h0 ifconfig\n'
|
|
525 |
'\n'
|
|
526 |
'The interpreter automatically substitutes IP '
|
|
527 |
'addresses\n'
|
|
528 |
'for node names, so commands like\n'
|
|
529 |
' mininet> h0 ping -c1 h1\n'
|
|
530 |
'should work.\n'
|
|
531 |
'\n\n'
|
|
532 |
'Interactive commands are not really supported yet,\n'
|
|
533 |
'so please limit commands to ones that do not\n'
|
|
534 |
'require user interaction and will terminate\n'
|
527 |
535 |
'after a reasonable amount of time.\n' )
|
528 |
536 |
print( helpStr )
|
529 |
537 |
|