Skip to content

Commit 89fb081

Browse files
committed
First crack at fixing multiple links
* Makes MultiGraph more like networkx.multigraph * Adds converTo method * Synchronizes node1 with xxx1 in link options
1 parent aae0aff commit 89fb081

2 files changed

Lines changed: 190 additions & 125 deletions

File tree

mininet/net.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -321,25 +321,36 @@ def items( self ):
321321
"return (key,value) tuple list for every node in net"
322322
return zip( self.keys(), self.values() )
323323

324+
@staticmethod
325+
def randMac():
326+
"Return a random, non-multicast MAC address"
327+
return macColonHex( random.randint(1, 2**48 - 1) & 0xfeffffffffff | 0x020000000000 )
328+
324329
def addLink( self, node1, node2, port1=None, port2=None,
325-
cls=None, **params ):
330+
cls=None, paramDict=None, **params ):
326331
""""Add a link from node1 to node2
327332
node1: source node
328333
node2: dest node
329-
port1: source port
330-
port2: dest port
334+
port1: source port (optional)
335+
port2: dest port (optional)
336+
cls: link class (optional)
337+
paramDict: dictionary of additional link params (optional)
338+
params: additional link params (optional)
331339
returns: link object"""
332-
mac1 = macColonHex( random.randint(1, 2**48 - 1) & 0xfeffffffffff | 0x020000000000 )
333-
mac2 = macColonHex( random.randint(1, 2**48 - 1) & 0xfeffffffffff | 0x020000000000 )
334-
defaults = { 'port1': port1,
335-
'port2': port2,
336-
'addr1': mac1,
337-
'addr2': mac2,
338-
'intf': self.intf }
339-
defaults.update( params )
340-
if not cls:
341-
cls = self.link
342-
link = cls( node1, node2, **defaults )
340+
mac1 = self.randMac()
341+
mac2 = self.randMac()
342+
paramDict = {} if paramDict is None else paramDict
343+
paramDict.update( params )
344+
# Ugly: try to ensure that node1 and node2 line up correctly with
345+
# other link parameters
346+
node1 = self[ paramDict.pop( 'node1', node1.name ) ]
347+
node2 = self[ paramDict.pop( 'node2', node2.name ) ]
348+
paramDict.setdefault( 'port1', port1 )
349+
paramDict.setdefault( 'port2', port2 )
350+
paramDict.setdefault( 'addr1', mac1 )
351+
paramDict.setdefault( 'addr2', mac2 )
352+
cls = self.link if cls is None else cls
353+
link = cls( node1, node2, **paramDict )
343354
self.links.append( link )
344355
return link
345356

@@ -397,11 +408,11 @@ def buildFromTopo( self, topo=None ):
397408
info( switchName + ' ' )
398409

399410
info( '\n*** Adding links:\n' )
400-
for srcName, dstName in topo.links(sort=True):
411+
for srcName, dstName in topo.links( sort=True ):
401412
src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ]
402413
params = topo.linkInfo( srcName, dstName )
403414
srcPort, dstPort = topo.port( srcName, dstName )
404-
self.addLink( src, dst, srcPort, dstPort, **params )
415+
self.addLink( src, dst, srcPort, dstPort, paramDict=params )
405416
info( '(%s, %s) ' % ( src.name, dst.name ) )
406417

407418
info( '\n' )

0 commit comments

Comments
 (0)