Showing
1 changed file
with
37 additions
and
11 deletions
| 1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
| 2 | 2 | ||
| 3 | -''' file: custom/optical.py ''' | 3 | +''' file: optical.py ''' |
| 4 | 4 | ||
| 5 | from mininet.topo import Topo | 5 | from mininet.topo import Topo |
| 6 | +from mininet.node import RemoteController | ||
| 6 | from mininet.net import Mininet | 7 | from mininet.net import Mininet |
| 7 | from mininet.cli import CLI | 8 | from mininet.cli import CLI |
| 8 | from mininet.log import setLogLevel, info | 9 | from mininet.log import setLogLevel, info |
| 10 | +from mininet.link import Intf, Link | ||
| 9 | from mininet.util import irange | 11 | from mininet.util import irange |
| 10 | 12 | ||
| 13 | +class NullIntf( Intf ): | ||
| 14 | + "A dummy interface with a blank name that doesn't do any configuration" | ||
| 15 | + def __init__( self, name, **params ): | ||
| 16 | + self.name = '' | ||
| 17 | + | ||
| 18 | +class NullLink( Link ): | ||
| 19 | + "A dummy link that doesn't touch either interface" | ||
| 20 | + def makeIntfPair( cls, intf1, intf2, addr1=None, addr2=None ): | ||
| 21 | + pass | ||
| 22 | + def delete( self ): | ||
| 23 | + pass | ||
| 24 | + | ||
| 11 | class OpticalTopo( Topo ): | 25 | class OpticalTopo( Topo ): |
| 12 | 26 | ||
| 13 | - def build( self, n=3, tapStart=3 ): | 27 | + def addIntf( self, switch, intfName ): |
| 28 | + "Add intf intfName to switch" | ||
| 29 | + self.addLink( switch, switch, cls=NullLink, | ||
| 30 | + intfName1=intfName, cls2=NullIntf, intfName2=intfName ) | ||
| 31 | + | ||
| 32 | + def build( self, n=2, tapStart=3 ): | ||
| 14 | 33 | ||
| 15 | # Add hosts and switches | 34 | # Add hosts and switches |
| 16 | hosts = [] | 35 | hosts = [] |
| 17 | switches = [] | 36 | switches = [] |
| 18 | for i in irange( 1, n ): | 37 | for i in irange( 1, n ): |
| 19 | h = self.addHost( 'h%d' % i ) | 38 | h = self.addHost( 'h%d' % i ) |
| 20 | - s = self.addSwitch( 's%d' % i ) | 39 | + s = self.addSwitch( 's%d' % i, dpid="0000ffffffff%04d" % i ) |
| 21 | self.addLink( h, s ) | 40 | self.addLink( h, s ) |
| 22 | hosts.append( h ) | 41 | hosts.append( h ) |
| 23 | switches.append( s ) | 42 | switches.append( s ) |
| ... | @@ -25,23 +44,23 @@ class OpticalTopo( Topo ): | ... | @@ -25,23 +44,23 @@ class OpticalTopo( Topo ): |
| 25 | # Add optical tap interfaces | 44 | # Add optical tap interfaces |
| 26 | tapNum = tapStart | 45 | tapNum = tapStart |
| 27 | for sw in switches: | 46 | for sw in switches: |
| 28 | - self.addLink( sw, sw, intfName1='%s-eth0' % sw, intfName2='tap%d' % tapNum ) | 47 | + self.addIntf( sw, 'tap%d' % tapNum ) |
| 29 | tapNum += 1 | 48 | tapNum += 1 |
| 30 | 49 | ||
| 31 | # if you use, sudo mn --custom custom/optical.py, then register the topo: | 50 | # if you use, sudo mn --custom custom/optical.py, then register the topo: |
| 32 | -#sudo mn --custom optical-topo.py --topo optical,5 | 51 | +#sudo mn --custom optical.py --topo optical,5 |
| 33 | topos = { 'optical': OpticalTopo } | 52 | topos = { 'optical': OpticalTopo } |
| 34 | 53 | ||
| 35 | def installStaticFlows( net ): | 54 | def installStaticFlows( net ): |
| 36 | - for swName in [ 's1', 's2', 's3', 's4', 's5', 's6' ]: | 55 | + for sw in net.switches: |
| 37 | - info( 'Adding flows to %s...' % swName ) | 56 | + info( 'Adding flows to %s...' % sw.name ) |
| 38 | - sw = net[ swName ] | ||
| 39 | sw.dpctl( 'add-flow', 'in_port=1,actions=output=2' ) | 57 | sw.dpctl( 'add-flow', 'in_port=1,actions=output=2' ) |
| 40 | sw.dpctl( 'add-flow', 'in_port=2,actions=output=1' ) | 58 | sw.dpctl( 'add-flow', 'in_port=2,actions=output=1' ) |
| 41 | info( sw.dpctl( 'dump-flows' ) ) | 59 | info( sw.dpctl( 'dump-flows' ) ) |
| 42 | 60 | ||
| 43 | -def run(): | 61 | +def run( n ): |
| 44 | - net = Mininet( topo=OpticalTopo() ) | 62 | + topo = OpticalTopo( n ) |
| 63 | + net = Mininet( topo=topo, controller=RemoteController, autoSetMacs=True ) | ||
| 45 | net.start() | 64 | net.start() |
| 46 | #installStaticFlows( net ) | 65 | #installStaticFlows( net ) |
| 47 | CLI( net ) | 66 | CLI( net ) |
| ... | @@ -49,5 +68,12 @@ def run(): | ... | @@ -49,5 +68,12 @@ def run(): |
| 49 | 68 | ||
| 50 | # if the script is run directly (sudo custom/optical.py): | 69 | # if the script is run directly (sudo custom/optical.py): |
| 51 | if __name__ == '__main__': | 70 | if __name__ == '__main__': |
| 71 | + import sys | ||
| 72 | + try: | ||
| 73 | + n = int( sys.argv[1] ) | ||
| 74 | + except: | ||
| 75 | + print ( 'Usage: ./optical.py n # n is number of switches\n' | ||
| 76 | + 'Starting with default of 2 switches...\n' ) | ||
| 77 | + n = 2 | ||
| 52 | setLogLevel( 'info' ) | 78 | setLogLevel( 'info' ) |
| 53 | - run() | 79 | + run( n ) | ... | ... |
-
Please register or login to post a comment