util: reset MAC address of macvtap passthrough physdev after disassociate

libvirt always resets the MAC address of the physdev used for macvtap
passthrough when the guest is finished with it. This was happening
prior to the 802.1Qb[gh] DISASSOCIATE command, and was quite often
failing, presumably because the driver wouldn't allow the MAC address
to be reset while the association was still active, with a log message
like this:

virNetDevSetMAC:168 : Cannot set interface MAC to 00:00:00:00:00:00 on 'eth13': Cannot assign requested address

This patch changes the order - we now do the 802.1Qb[gh] disassociate
and delete the macvtap interface first, then and reset the MAC
address.
This commit is contained in:
Laine Stump 2016-01-21 14:19:56 -05:00
parent 81da8bc73b
commit 29cc45cb79

View File

@ -935,14 +935,6 @@ int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
int ret = 0;
int vf = -1;
if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) {
if (virtPortProfile &&
virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH)
ignore_value(virNetDevRestoreMacAddress(linkdev, stateDir));
else
ignore_value(virNetDevRestoreNetConfig(linkdev, vf, stateDir));
}
if (ifname) {
if (virNetDevVPortProfileDisassociate(ifname,
virtPortProfile,
@ -955,6 +947,14 @@ int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
ret = -1;
}
if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) {
if (virtPortProfile &&
virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH)
ignore_value(virNetDevRestoreMacAddress(linkdev, stateDir));
else
ignore_value(virNetDevRestoreNetConfig(linkdev, vf, stateDir));
}
virNetlinkEventRemoveClient(0, macaddr, NETLINK_ROUTE);
return ret;