Statistics
| Branch: | Tag: | Revision:

mininet / mininet / topolib.py @ b5962e8e

History | View | Annotate | Download (2.46 KB)

1
"Library of potentially useful topologies for Mininet"
2

    
3
from mininet.topo import Topo
4
from mininet.net import Mininet
5

    
6
class TreeTopo( Topo ):
7
    "Topology for a tree network with a given depth and fanout."
8

    
9
    def __init__( self, depth=1, fanout=2 ):
10
        super( TreeTopo, self ).__init__()
11
        # Numbering:  h1..N, s1..M
12
        self.hostNum = 1
13
        self.switchNum = 1
14
        # Build topology
15
        self.addTree( depth, fanout )
16

    
17
    def addTree( self, depth, fanout ):
18
        """Add a subtree starting with node n.
19
           returns: last node added"""
20
        isSwitch = depth > 0
21
        if isSwitch:
22
            node = self.addSwitch( 's%s' % self.switchNum )
23
            self.switchNum += 1
24
            for _ in range( fanout ):
25
                child = self.addTree( depth - 1, fanout )
26
                self.addLink( node, child )
27
        else:
28
            node = self.addHost( 'h%s' % self.hostNum )
29
            self.hostNum += 1
30
        return node
31

    
32

    
33
def TreeNet( depth=1, fanout=2, **kwargs ):
34
    "Convenience function for creating tree networks."
35
    topo = TreeTopo( depth, fanout )
36
    return Mininet( topo, **kwargs )
37

    
38

    
39
class TorusTopo( Topo ):
40
    """2-D Torus topology
41
       WARNING: this topology has LOOPS and WILL NOT WORK
42
       with the default controller or any Ethernet bridge
43
       without STP turned on! It can be used with STP, e.g.:
44
       # mn --topo torus,3,3 --switch lxbr,stp=1 --test pingall"""
45
    def __init__( self, x, y, *args, **kwargs ):
46
        Topo.__init__( self, *args, **kwargs )
47
        if x < 3 or y < 3:
48
            raise Exception( 'Please use 3x3 or greater for compatibility '
49
                            'with Mininet 2.1.0' )
50
        hosts, switches, dpid = {}, {}, 0
51
        # Create and wire interior
52
        for i in range( 0, x ):
53
            for j in range( 0, y ):
54
                loc = '%dx%d' % ( i + 1, j + 1 )
55
                # dpid cannot be zero for OVS
56
                dpid = ( i + 1 ) * 256 + ( j + 1 )
57
                switch = switches[ i, j ] = self.addSwitch( 's' + loc, dpid='%016x' % dpid )
58
                host = hosts[ i, j ] = self.addHost( 'h' + loc )
59
                self.addLink( host, switch )
60
        # Connect switches
61
        for i in range( 0, x ):
62
            for j in range( 0, y ):
63
                sw1 = switches[ i, j ]
64
                sw2 = switches[ i, ( j + 1 ) % y ]
65
                sw3 = switches[ ( i + 1 ) % x, j ]
66
                self.addLink( sw1, sw2 )
67
                self.addLink( sw1, sw3 )
68

    
69
    
70