X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=xenserver%2Fopt_xensource_libexec_InterfaceReconfigureVswitch.py;h=ef3ed090e1b7a6d972928173256aeb7cc5de87c6;hb=3b1acc9955fa9c595f6b9e41999aa40041c7b049;hp=c08385918a03ce742f3924ccd6be2766c686d770;hpb=2ad2eb042517b975d761d456cceb5c9325c4aaa7;p=openvswitch diff --git a/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py b/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py index c0838591..ef3ed090 100644 --- a/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py +++ b/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py @@ -1,5 +1,5 @@ # Copyright (c) 2008,2009 Citrix Systems, Inc. -# Copyright (c) 2009 Nicira Networks. +# Copyright (c) 2009,2010 Nicira Networks. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published @@ -89,8 +89,9 @@ def pif_currently_in_use(pif): def pif_datapath(pif): """Return the datapath PIF associated with PIF. -For a non-VLAN PIF, the datapath name is the bridge name. -For a VLAN PIF, the datapath name is the bridge name for the PIF's VLAN slave. +A non-VLAN PIF is its own datapath PIF, except that a bridgeless PIF has +no datapath PIF at all. +A VLAN PIF's datapath PIF is its VLAN slave's datapath PIF. """ if pif_is_vlan(pif): return pif_datapath(pif_get_vlan_slave(pif)) @@ -122,7 +123,7 @@ def datapath_deconfigure_physical(netdev): def datapath_configure_bond(pif,slaves): bridge = pif_bridge_name(pif) - pifrec = db.get_pif_record(pif) + pifrec = db().get_pif_record(pif) interface = pif_netdev_name(pif) argv = ['--', '--fake-iface', 'add-bond', bridge, interface] @@ -161,10 +162,9 @@ def datapath_deconfigure_ipdev(interface): return ['--', '--if-exists', 'del-port', interface] def datapath_modify_config(commands): - if debug_mode(): - log("modifying configuration:") - for c in commands: - log(" %s" % c) + #log("modifying configuration:") + #for c in commands: + # log(" %s" % c) rc = run_command(['/usr/bin/ovs-vsctl'] + ['--timeout=20'] + [c for c in commands if not c.startswith('#')]) @@ -176,7 +176,7 @@ def datapath_modify_config(commands): # Toplevel Datapath Configuration. # -def configure_datapath(pif): +def configure_datapath(pif, parent=None, vlan=None): """Bring up the datapath configuration for PIF. Should be careful not to glitch existing users of the datapath, e.g. other VLANs etc. @@ -265,16 +265,21 @@ def configure_datapath(pif): vsctl_argv += ['# deconfigure physical port %s' % dev] vsctl_argv += datapath_deconfigure_physical(dev) + if parent and datapath: + vsctl_argv += ['--', '--may-exist', 'add-br', bridge, parent, vlan] + else: + vsctl_argv += ['--', '--may-exist', 'add-br', bridge] + if len(physical_devices) > 1: vsctl_argv += ['# deconfigure bond %s' % pif_netdev_name(pif)] vsctl_argv += datapath_deconfigure_bond(pif_netdev_name(pif)) vsctl_argv += ['# configure bond %s' % pif_netdev_name(pif)] vsctl_argv += datapath_configure_bond(pif, physical_devices) extra_up_ports += [pif_netdev_name(pif)] - else: + else: iface = pif_netdev_name(physical_devices[0]) vsctl_argv += ['# add physical device %s' % iface] - vsctl_argv += ['--', 'add-port', bridge, iface] + vsctl_argv += ['--', '--may-exist', 'add-port', bridge, iface] return vsctl_argv,extra_up_ports @@ -326,19 +331,18 @@ class DatapathVswitch(Datapath): extra_ports = [] pifrec = db().get_pif_record(self._pif) + dprec = db().get_pif_record(self._dp) ipdev = self._ipdev bridge = pif_bridge_name(self._dp) - c,e = configure_datapath(self._dp) + if pif_is_vlan(self._pif): + datapath = pif_datapath(self._pif) + c,e = configure_datapath(self._dp, datapath, pifrec['VLAN']) + else: + c,e = configure_datapath(self._dp) vsctl_argv += c extra_ports += e - if pif_is_vlan(pif): - datapath = pif_datapath(pif) - vsctl_argv += ['--', 'add-br', bridge, datapath, pifrec['VLAN']] - else: - vsctl_argv += ['--', 'add-br', bridge] - xs_network_uuids = [] for nwpif in db().get_pifs_by_device(db().get_pif_record(self._pif)['device']): rec = db().get_pif_record(nwpif) @@ -356,16 +360,17 @@ class DatapathVswitch(Datapath): vsctl_argv += ['--', 'br-set-external-id', bridge, 'xs-network-uuids', ';'.join(xs_network_uuids)] - vsctl_argv += ["# deconfigure ipdev %s" % ipdev] - vsctl_argv += datapath_deconfigure_ipdev(ipdev) - vsctl_argv += ["# reconfigure ipdev %s" % ipdev] - vsctl_argv += ['--', 'add-port', bridge, ipdev] + if ipdev != bridge: + vsctl_argv += ["# deconfigure ipdev %s" % ipdev] + vsctl_argv += datapath_deconfigure_ipdev(ipdev) + vsctl_argv += ["# reconfigure ipdev %s" % ipdev] + vsctl_argv += ['--', 'add-port', bridge, ipdev] # XXX Needs support in ovs-vsctl #if bridge == ipdev: - # vsctl_argv += ['--add=bridge.%s.mac=%s' % (bridge, pifrec['MAC'])] + # vsctl_argv += ['--add=bridge.%s.mac=%s' % (bridge, dprec['MAC'])] #else: - # vsctl_argv += ['--add=iface.%s.mac=%s' % (ipdev, pifrec['MAC'])] + # vsctl_argv += ['--add=iface.%s.mac=%s' % (ipdev, dprec['MAC'])] self._vsctl_argv = vsctl_argv self._extra_ports = extra_ports