diff --git a/mininet/node.py b/mininet/node.py index 403ed00cda60da46ae2c3991ce60be3b6ffd96ac..0a713acb3cb27ed770d83f91d0d83120ec035912 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -48,7 +48,7 @@ from subprocess import Popen, PIPE, STDOUT from time import sleep -from mininet.log import info, error, warn, debug +from mininet.log import info, error, debug from mininet.util import quietRun, makeIntfPair, moveIntf, isShellBuiltin from mininet.moduledeps import moduleDeps, OVS_KMOD, OF_KMOD, TUN @@ -62,7 +62,7 @@ class Node( object ): outToNode = {} # mapping of output fds to nodes portBase = 0 # Nodes always start with eth0/port0, even in OF 1.0 - + def __init__( self, name, inNamespace=True, defaultMAC=None, defaultIP=None, **kwargs ): """name: name of node @@ -93,6 +93,7 @@ def __init__( self, name, inNamespace=True, self.ports = {} # dict of interface names to port numbers # replace with Port objects, eventually ? self.ips = {} # dict of interfaces to ip addresses as strings + self.macs = {} # dict of interfacesto mac addresses as strings self.connection = {} # remote node connected to each interface self.execed = False self.lastCmd = None @@ -367,21 +368,50 @@ def setDefaultRoute( self, intf ): self.cmd( 'ip route flush root 0/0' ) return self.cmd( 'route add default ' + intf ) + def defaultIntf( self ): + "Return interface for lowest port" + ports = self.intfs.keys() + if ports: + return self.intfs[ min( ports ) ] + + _ipMatchRegex = re.compile( r'\d+\.\d+\.\d+\.\d+' ) + _macMatchRegex = re.compile( r'..:..:..:..:..:..' ) + def IP( self, intf=None ): "Return IP address of a node or specific interface." - if len( self.ips ) == 1: - return self.ips.values()[ 0 ] - if intf: - return self.ips.get( intf, None ) + if intf is None: + intf = self.defaultIntf() + if intf and not self.waiting: + self.updateIP( intf ) + return self.ips.get( intf, None ) def MAC( self, intf=None ): "Return MAC address of a node or specific interface." - if intf is None and len( self.intfs ) == 1: - intf = self.intfs.values()[ 0 ] + if intf is None: + intf = self.defaultIntf() + if intf and not self.waiting: + self.updateMAC( intf ) + return self.macs.get( intf, None ) + + def updateIP( self, intf ): + "Update IP address for an interface" + assert not self.waiting ifconfig = self.cmd( 'ifconfig ' + intf ) - macs = re.findall( '..:..:..:..:..:..', ifconfig ) - if len( macs ) > 0: - return macs[ 0 ] + ips = self._ipMatchRegex.findall( ifconfig ) + if ips: + self.ips[ intf ] = ips[ 0 ] + else: + self.ips[ intf ] = None + + def updateMAC( self, intf ): + "Update MAC address for an interface" + assert not self.waiting + ifconfig = self.cmd( 'ifconfig ' + intf ) + macs = self._macMatchRegex.findall( ifconfig ) + if macs: + self.macs[ intf ] = macs[ 0 ] + else: + self.macs[ intf ] = None def intfIsUp( self, intf ): "Check if an interface is up."