mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-19 11:05:16 +00:00
qemu: support vlan change for linux host bridge during update-device
Since we previously only supported vlan tagging for interfaces connected to an OVS bridge [*], the code in qemuChangeNet() (used by the update-device API) assumed an interface with modified vlan config was on an OVS bridge, and would call the OVS-specific virNetDevOpenvswitchUpdateVlan(). Now that we support vlan tagging for interfaces connected to a standard Linux host bridge, we must check the type of connection and only call the OVS function when connected to an OVS bridge *both before and after the update*. Otherwise we just set the flag to re-connect to the bridge, which has the side effect of redoing the vlan setup. ([*] or an SRIOV VF assigned using VFIO, but we don't support *any runtime changes to that type of netdev so it's irrelevant here.) Signed-off-by: Laine Stump <laine@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
f35bddae90
commit
7a903458f1
@ -4144,8 +4144,13 @@ qemuDomainChangeNet(virQEMUDriver *driver,
|
|||||||
* they don't apply to a particular type.
|
* they don't apply to a particular type.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!virNetDevVlanEqual(virDomainNetGetActualVlan(olddev),
|
/* since attaching to a new bridge will re-do the vlan setup,
|
||||||
virDomainNetGetActualVlan(newdev))) {
|
* we don't need to separately do that in the case that we're
|
||||||
|
* already switching to a different bridge
|
||||||
|
*/
|
||||||
|
if (!(needBridgeChange ||
|
||||||
|
virNetDevVlanEqual(virDomainNetGetActualVlan(olddev),
|
||||||
|
virDomainNetGetActualVlan(newdev)))) {
|
||||||
needVlanUpdate = true;
|
needVlanUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4215,6 +4220,23 @@ qemuDomainChangeNet(virQEMUDriver *driver,
|
|||||||
needReplaceDevDef = true;
|
needReplaceDevDef = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (needVlanUpdate) {
|
||||||
|
if (virDomainNetDefIsOvsport(olddev) && virDomainNetDefIsOvsport(newdev)) {
|
||||||
|
/* optimization if we're attached to an OVS bridge. This
|
||||||
|
* will redo vlan setup without needing to re-attach the
|
||||||
|
* tap device to the bridge
|
||||||
|
*/
|
||||||
|
if (virNetDevOpenvswitchUpdateVlan(newdev->ifname, &newdev->vlan) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
/* vlan setup is done as a part of reconnecting the tap
|
||||||
|
* device to a new bridge (either OVS or Linux host bridge).
|
||||||
|
*/
|
||||||
|
needBridgeChange = true;
|
||||||
|
}
|
||||||
|
needReplaceDevDef = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (needBridgeChange) {
|
if (needBridgeChange) {
|
||||||
if (qemuDomainChangeNetBridge(vm, olddev, newdev) < 0)
|
if (qemuDomainChangeNetBridge(vm, olddev, newdev) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -4266,12 +4288,6 @@ qemuDomainChangeNet(virQEMUDriver *driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needVlanUpdate) {
|
|
||||||
if (virNetDevOpenvswitchUpdateVlan(newdev->ifname, &newdev->vlan) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
needReplaceDevDef = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needReplaceDevDef) {
|
if (needReplaceDevDef) {
|
||||||
/* the changes above warrant replacing olddev with newdev in
|
/* the changes above warrant replacing olddev with newdev in
|
||||||
* the domain's nets list.
|
* the domain's nets list.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user