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?