84 lines
2.3 KiB
Python
Executable File
84 lines
2.3 KiB
Python
Executable File
"""
|
|
vlanhost.py: Host subclass that uses a VLAN tag for the default interface.
|
|
|
|
Dependencies:
|
|
This class depends on the "vlan" package
|
|
$ sudo apt-get install vlan
|
|
|
|
Usage (example uses VLAN ID=1000):
|
|
From the command line:
|
|
sudo mn --custom vlanhost.py --host vlan,vlan=1000
|
|
|
|
From a script (see exampleUsage function below):
|
|
from functools import partial
|
|
from vlanhost import VLANHost
|
|
|
|
....
|
|
|
|
host = partial( VLANHost, vlan=1000 )
|
|
net = Mininet( host=host, ... )
|
|
|
|
Directly running this script:
|
|
sudo python vlanhost.py 1000
|
|
|
|
"""
|
|
|
|
from mininet.node import Host
|
|
|
|
class VLANHost( Host ):
|
|
|
|
def config( self, vlan=100, **params ):
|
|
"""Configure VLANHost according to (optional) parameters:
|
|
vlan: VLAN ID for default interface"""
|
|
|
|
r = super( Host, self ).config( **params )
|
|
|
|
intf = self.defaultIntf()
|
|
# remove IP from default, "physical" interface
|
|
self.cmd( 'ifconfig %s inet 0' % intf )
|
|
# create VLAN interface
|
|
self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
|
|
# assign the host's IP to the VLAN interface
|
|
self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
|
|
# update the intf name and host's intf map
|
|
newName = '%s.%d' % ( intf, vlan )
|
|
# update the (Mininet) interface to refer to VLAN interface name
|
|
intf.name = newName
|
|
# add VLAN interface to host's name to intf map
|
|
self.nameToIntf[ newName ] = intf
|
|
|
|
return r
|
|
|
|
hosts = { 'vlan': VLANHost }
|
|
|
|
|
|
def exampleUsage( vlan ):
|
|
"""Simple example of how VLANHost can be used in a script"""
|
|
# This is where the magic happens...
|
|
host = partial( VLANHost, vlan=vlan )
|
|
# vlan (type: int): VLAN ID to be used by all hosts
|
|
|
|
# Start a basic network using our VLANHost
|
|
topo = SingleSwitchTopo( k=2 )
|
|
net = Mininet( host=host, topo=topo )
|
|
net.start()
|
|
CLI( net )
|
|
net.stop()
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
from functools import partial
|
|
|
|
from mininet.net import Mininet
|
|
from mininet.cli import CLI
|
|
from mininet.topo import SingleSwitchTopo
|
|
|
|
try:
|
|
vlan = int( sys.argv[ 1 ] )
|
|
except Exception:
|
|
print 'Usage: vlanhost.py <vlan id>\n'
|
|
print 'Using VLAN ID=100...'
|
|
vlan = 100
|
|
|
|
exampleUsage( vlan )
|