[libvirt] Using Libvirt to change the bridge a virtual network card of a running vm is connected to

Hendrik Schwartke hendrik at os-t.de
Thu Jan 26 15:29:08 UTC 2012


Of course:

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 4b60839..edf7433 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -40,6 +40,8 @@
  #include "qemu_cgroup.h"
  #include "locking/domain_lock.h"
  #include "network/bridge_driver.h"
+#include "util/virnetdev.h"
+#include "util/virnetdevbridge.h"

  #define VIR_FROM_THIS VIR_FROM_QEMU

@@ -1163,6 +1165,44 @@ static virDomainNetDefPtr qemuDomainFindNet(virDomainObjPtr vm,
      return NULL;
  }

+int qemuDomainChangeNetBridge(virDomainNetDefPtr olddev,
+                              virDomainNetDefPtr newdev)
+{
+    const char *oldbridge = olddev->data.bridge.brname;
+    const char *newbridge = newdev->data.bridge.brname;
+
+    VIR_DEBUG("Change bridge for interface %s: %s ->  %s",
+              olddev->ifname, oldbridge, newbridge);
+
+    if (!virNetDevExists(newbridge)) {
+        qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                        _("unable to remove port from bridge"));
+        return -1;
+    }
+
+    if (oldbridge&&
+        virNetDevBridgeRemovePort(oldbridge, olddev->ifname)<  0) {
+        qemuReportError(VIR_ERR_OPERATION_FAILED,
+                        _("unable to remove port from bridge %s"), oldbridge);
+        return -1;
+    }
+    if (virNetDevBridgeAddPort(newbridge, newdev->ifname)<  0) {
+        qemuReportError(VIR_ERR_OPERATION_FAILED,
+                        _("unable to add port to bridge %s"), newbridge);
+        if (virNetDevBridgeAddPort(oldbridge, olddev->ifname)<  0) {
+            qemuReportError(VIR_ERR_OPERATION_FAILED,
+                            _("unable to recover former state by adding port to bridge %s"), oldbridge);
+            VIR_FREE(olddev->data.bridge.brname);
+        }
+        return -1;
+    }
+    VIR_FREE(olddev->data.bridge.brname);
+    olddev->data.bridge.brname = newdev->data.bridge.brname;
+    newdev->data.bridge.brname = NULL;
+    return 0;
+}
+
+
  int qemuDomainChangeNetLinkState(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainNetDefPtr dev,
@@ -1293,6 +1333,13 @@ int qemuDomainChangeNet(struct qemud_driver *driver,
          return -1;
      }

+    if (olddev->type == VIR_DOMAIN_NET_TYPE_BRIDGE
+&&  dev->type == VIR_DOMAIN_NET_TYPE_BRIDGE
+&&  STRNEQ_NULLABLE(olddev->data.bridge.brname, dev->data.bridge.brname)) {
+    	if ((ret = qemuDomainChangeNetBridge(olddev, dev))<  0)
+    		return ret;
+    }
+
      if (olddev->linkstate != dev->linkstate) {
          if ((ret = qemuDomainChangeNetLinkState(driver, vm, olddev, dev->linkstate))<  0)
              return ret;
diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
index 0310361..1e1f75c 100644
--- a/src/qemu/qemu_hotplug.h
+++ b/src/qemu/qemu_hotplug.h
@@ -80,6 +80,8 @@ int qemuDomainChangeNetLinkState(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainNetDefPtr dev,
                                   int linkstate);
+int qemuDomainChangeNetBridge(virDomainNetDefPtr olddev,
+                              virDomainNetDefPtr newdev);
  int qemuDomainDetachPciDiskDevice(struct qemud_driver *driver,
                                    virDomainObjPtr vm,
                                    virDomainDeviceDefPtr dev);




On 26.01.2012 15:18, Eric Blake wrote:
> On 01/26/2012 07:10 AM, Hendrik Schwartke wrote:
>> I fixed the patch and added it to
>> https://bugzilla.redhat.com/show_bug.cgi?id=784767.
> Thanks.  It's easier to review if we don't have to click through the
> link, so can you also send the updated patch to this list?
>




More information about the libvir-list mailing list