mirror of https://gitee.com/openkylin/libvirt.git
network: properly check for taps that are connected to an OVS bridge
When libvirtd is restarted, it checks that each guest tap device is still attached to the bridge device that the configuration info says it should be connected to. If not, the tap will be disconnected from [wherever it is] and connected to [wherever it should be]. The previous code that did this did not account for: 1) the IFLA_MASTER attribute in a netdev's ifinfo will be set to "ovs-system" for any tap device connected to an OVS bridge, *not* to the name of the bridge it is attached to. 2) virNetDevRemovePort() only works for devices that are attached to a standard Linux host bridge. If a device is currently attached to an OVS bridge, then virNetDevOpenvswitchRemovePort() must be called instead. This patch remedies those problems, and adds a couple of information log messages to aid in debugging any future problem. Resolves: https://bugzilla.redhat.com/1596176 Signed-off-by: Laine Stump <laine@laine.org> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
15072f3a97
commit
c17edaf778
|
@ -64,6 +64,7 @@
|
|||
#include "virnetdev.h"
|
||||
#include "virnetdevip.h"
|
||||
#include "virnetdevbridge.h"
|
||||
#include "virnetdevopenvswitch.h"
|
||||
#include "virnetdevtap.h"
|
||||
#include "virnetdevvportprofile.h"
|
||||
#include "virpci.h"
|
||||
|
@ -4823,19 +4824,35 @@ networkNotifyActualDevice(virDomainDefPtr dom,
|
|||
|
||||
/* see if we're connected to the correct bridge */
|
||||
if (netdef->bridge) {
|
||||
bool useOVS = false;
|
||||
|
||||
if (virNetDevGetMaster(iface->ifname, &master) < 0)
|
||||
goto error;
|
||||
|
||||
/* IFLA_MASTER for a tap on an OVS switch is always "ovs-system" */
|
||||
if (STREQ_NULLABLE(master, "ovs-system")) {
|
||||
useOVS = true;
|
||||
VIR_FREE(master);
|
||||
if (virNetDevOpenvswitchInterfaceGetMaster(iface->ifname, &master) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (STRNEQ_NULLABLE(netdef->bridge, master)) {
|
||||
/* disconnect from current (incorrect) bridge */
|
||||
if (master)
|
||||
ignore_value(virNetDevBridgeRemovePort(master, iface->ifname));
|
||||
if (master) {
|
||||
VIR_INFO("Removing %s from %s", iface->ifname, master);
|
||||
if (useOVS)
|
||||
ignore_value(virNetDevOpenvswitchRemovePort(master, iface->ifname));
|
||||
else
|
||||
ignore_value(virNetDevBridgeRemovePort(master, iface->ifname));
|
||||
}
|
||||
|
||||
/* attach/reattach to correct bridge.
|
||||
* NB: we can't notify the guest of any MTU change anyway,
|
||||
* so there is no point in trying to learn the actualMTU
|
||||
* (final arg to virNetDevTapAttachBridge())
|
||||
*/
|
||||
VIR_INFO("Attaching %s to %s", iface->ifname, netdef->bridge);
|
||||
if (virNetDevTapAttachBridge(iface->ifname, netdef->bridge,
|
||||
&iface->mac, dom->uuid,
|
||||
virDomainNetGetActualVirtPortProfile(iface),
|
||||
|
|
Loading…
Reference in New Issue