diff --git a/mininet/net.py b/mininet/net.py index 1c932f9..8edaee3 100755 --- a/mininet/net.py +++ b/mininet/net.py @@ -91,7 +91,7 @@ import re import select import signal from time import sleep -from itertools import chain +from itertools import chain, groupby from mininet.cli import CLI from mininet.log import info, error, debug, output @@ -408,10 +408,9 @@ class Mininet( object ): info( '*** Stopping %i terms\n' % len( self.terms ) ) self.stopXterms() info( '*** Stopping %i switches\n' % len( self.switches ) ) - if self.switches: - swclass = type( self.switches[ 0 ] ) + for swclass, switches in groupby( sorted( self.switches, key=type ), type ): if hasattr( swclass, 'batchShutdown' ): - swclass.batchShutdown( self.switches ) + swclass.batchShutdown( switches ) for switch in self.switches: info( switch.name + ' ' ) switch.stop() diff --git a/mininet/node.py b/mininet/node.py index 27d1e16..54bfd23 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -993,7 +993,7 @@ class OVSSwitch( Switch ): "Call ovs-vsctl del-br on all OVSSwitches in a list" quietRun( 'ovs-vsctl ' + ' -- '.join( '--if-exists del-br %s' % s - for s in switches if type(s) == cls ) ) + for s in switches ) ) def dpctl( self, *args ): "Run ovs-ofctl command" @@ -1106,6 +1106,12 @@ class IVSSwitch(Switch): 'not be loaded. Try modprobe openvswitch.\n' ) exit( 1 ) + @classmethod + def batchShutdown( cls, switches ): + "Kill each IVS switch, to be waited on later in stop()" + for switch in switches: + switch.cmd( 'kill %ivs' ) + def start( self, controllers ): "Start up a new IVS switch" args = ['ivs']