Change to automatically update IP and MAC addresses.
This commit is contained in:
+41
-11
@@ -48,7 +48,7 @@ import select
|
|||||||
from subprocess import Popen, PIPE, STDOUT
|
from subprocess import Popen, PIPE, STDOUT
|
||||||
from time import sleep
|
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.util import quietRun, makeIntfPair, moveIntf, isShellBuiltin
|
||||||
from mininet.moduledeps import moduleDeps, OVS_KMOD, OF_KMOD, TUN
|
from mininet.moduledeps import moduleDeps, OVS_KMOD, OF_KMOD, TUN
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ class Node( object ):
|
|||||||
outToNode = {} # mapping of output fds to nodes
|
outToNode = {} # mapping of output fds to nodes
|
||||||
|
|
||||||
portBase = 0 # Nodes always start with eth0/port0, even in OF 1.0
|
portBase = 0 # Nodes always start with eth0/port0, even in OF 1.0
|
||||||
|
|
||||||
def __init__( self, name, inNamespace=True,
|
def __init__( self, name, inNamespace=True,
|
||||||
defaultMAC=None, defaultIP=None, **kwargs ):
|
defaultMAC=None, defaultIP=None, **kwargs ):
|
||||||
"""name: name of node
|
"""name: name of node
|
||||||
@@ -93,6 +93,7 @@ class Node( object ):
|
|||||||
self.ports = {} # dict of interface names to port numbers
|
self.ports = {} # dict of interface names to port numbers
|
||||||
# replace with Port objects, eventually ?
|
# replace with Port objects, eventually ?
|
||||||
self.ips = {} # dict of interfaces to ip addresses as strings
|
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.connection = {} # remote node connected to each interface
|
||||||
self.execed = False
|
self.execed = False
|
||||||
self.lastCmd = None
|
self.lastCmd = None
|
||||||
@@ -367,21 +368,50 @@ class Node( object ):
|
|||||||
self.cmd( 'ip route flush root 0/0' )
|
self.cmd( 'ip route flush root 0/0' )
|
||||||
return self.cmd( 'route add default ' + intf )
|
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 ):
|
def IP( self, intf=None ):
|
||||||
"Return IP address of a node or specific interface."
|
"Return IP address of a node or specific interface."
|
||||||
if len( self.ips ) == 1:
|
if intf is None:
|
||||||
return self.ips.values()[ 0 ]
|
intf = self.defaultIntf()
|
||||||
if intf:
|
if intf and not self.waiting:
|
||||||
return self.ips.get( intf, None )
|
self.updateIP( intf )
|
||||||
|
return self.ips.get( intf, None )
|
||||||
|
|
||||||
def MAC( self, intf=None ):
|
def MAC( self, intf=None ):
|
||||||
"Return MAC address of a node or specific interface."
|
"Return MAC address of a node or specific interface."
|
||||||
if intf is None and len( self.intfs ) == 1:
|
if intf is None:
|
||||||
intf = self.intfs.values()[ 0 ]
|
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 )
|
ifconfig = self.cmd( 'ifconfig ' + intf )
|
||||||
macs = re.findall( '..:..:..:..:..:..', ifconfig )
|
ips = self._ipMatchRegex.findall( ifconfig )
|
||||||
if len( macs ) > 0:
|
if ips:
|
||||||
return macs[ 0 ]
|
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 ):
|
def intfIsUp( self, intf ):
|
||||||
"Check if an interface is up."
|
"Check if an interface is up."
|
||||||
|
|||||||
Reference in New Issue
Block a user