Support OpenVSwitch in kernel-mode

This commit is contained in:
Brandon Heller
2010-01-09 21:11:25 -08:00
parent 723d068c51
commit f7c2df2513
3 changed files with 61 additions and 7 deletions
+2 -2
View File
@@ -53,7 +53,7 @@ import sys
from time import sleep
from mininet.logging_mod import lg
from mininet.node import KernelSwitch
from mininet.node import KernelSwitch, OVSKernelSwitch
from mininet.util import quietRun, fixLimits
from mininet.util import make_veth_pair, move_intf, retry, MOVEINTF_DELAY
from mininet.xterm import cleanUpScreens, makeXterms
@@ -135,7 +135,7 @@ class Mininet(object):
sw_dpid = None
if self.auto_set_macs:
sw_dpid = dpid
if self.switch is KernelSwitch:
if self.switch is KernelSwitch or self.switch is OVSKernelSwitch:
sw = self.switch('s_' + self.topo.name(dpid), dp = self.dps,
dpid = sw_dpid)
self.dps += 1
+56 -3
View File
@@ -306,8 +306,6 @@ class UserSwitch(Switch):
class KernelSwitch(Switch):
'''Kernel-space switch.
Much faster than user-space!
Currently only works in the root namespace.
'''
@@ -348,7 +346,7 @@ class KernelSwitch(Switch):
self.execed = False
def stop(self):
'''Terminate reference kernel datapath.'''
'''Terminate kernel datapath.'''
quietRun('dpctl deldp nl:%i' % self.dp)
# In theory the interfaces should go away after we shut down.
# However, this takes time, so we're better off to remove them
@@ -360,6 +358,61 @@ class KernelSwitch(Switch):
lg.info('.')
class OVSKernelSwitch(Switch):
'''Open VSwitch kernel-space switch.
Currently only works in the root namespace.
'''
def __init__(self, name, dp = None, dpid = None):
'''Init.
@param name
@param dp netlink id (0, 1, 2, ...)
@param dpid datapath ID as unsigned int; random value if None
'''
Switch.__init__(self, name, inNamespace = False)
self.dp = dp
self.dpid = dpid
def start(self, controllers):
'''Start up kernel datapath.'''
ofplog = '/tmp/' + self.name + '-ofp.log'
quietRun('ifconfig lo up')
# Delete local datapath if it exists;
# then create a new one monitoring the given interfaces
quietRun('ovs-dpctl del-dp dp%i' % self.dp)
self.cmdPrint('ovs-dpctl add-dp dp%i' % self.dp)
if self.dpid:
intf = 'dp' % self.dp
mac_str = macColonHex(self.dpid)
self.cmd(['ifconfig', intf, 'hw', 'ether', mac_str])
if len(self.ports) != max(self.ports.keys()) + 1:
raise Exception('only contiguous, zero-indexed port ranges'
'supported: %s' % self.ports)
intfs = [self.ports[port] for port in self.ports.keys()]
self.cmdPrint('ovs-dpctl add-if dp' + str(self.dp) + ' ' +
' '.join(intfs))
# Run protocol daemon
self.cmdPrint('ovs-openflowd dp' + str(self.dp) + ' tcp:' +
controllers['c0'].IP() + ':' +
' --fail=closed 1> ' + ofplog + ' 2>' + ofplog + ' &')
self.execed = False
def stop(self):
'''Terminate kernel datapath.'''
quietRun('ovs-dpctl del-dp dp%i' % self.dp)
# In theory the interfaces should go away after we shut down.
# However, this takes time, so we're better off to remove them
# explicitly so that we won't get errors if we run before they
# have been removed by the kernel. Unfortunately this is very slow.
self.cmd('kill %ovs-openflowd')
for intf in self.intfs:
quietRun('ip link del ' + intf)
lg.info('.')
class Controller(Node):
'''A Controller is a Node that is running (or has execed) an
OpenFlow controller.'''