virHostdevNetConfigReplace() and virHostdevNetConfigRestore() are
modified to use the new virNetDev*NetConfig() functions.
Note that due to the VF's original MAC addresses being saved after it
has already been un-bound from the host net driver, the actual current
VF MAC address won't be saved (because it no longer exists) - only the
"admin MAC" will be saved. This reflects existing behavior that will
be fixed in an upcoming patch.
---
src/util/virhostdev.c | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index faa46aa..0f0a1ee 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -446,10 +446,13 @@ virHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev,
goto cleanup;
}
} else {
- /* Set only mac and vlan */
- if (virNetDevReplaceNetConfig(linkdev, vf,
- &hostdev->parent.data.net->mac,
- vlan, stateDir) < 0) {
+ /* Save/Set only mac and vlan */
+
+ if (virNetDevSaveNetConfig(linkdev, vf, stateDir, true) < 0)
+ goto cleanup;
+
+ if (virNetDevSetNetConfig(linkdev, vf, &hostdev->parent.data.net->mac,
+ vlan, NULL, true) < 0) {
goto cleanup;
}
}
@@ -502,9 +505,23 @@ virHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev,
NULL,
port_profile_associate);
} else {
- ret = virNetDevRestoreNetConfig(linkdev, vf, stateDir);
- if (ret < 0 && oldStateDir != NULL)
- ret = virNetDevRestoreNetConfig(linkdev, vf, oldStateDir);
+ virMacAddrPtr MAC = NULL;
+ virMacAddrPtr adminMAC = NULL;
+ virNetDevVlanPtr vlan = NULL;
+
+ ret = virNetDevReadNetConfig(linkdev, vf, stateDir, &adminMAC, &vlan,
&MAC);
+ if (ret < 0 && oldStateDir)
+ ret = virNetDevReadNetConfig(linkdev, vf, oldStateDir,
+ &adminMAC, &vlan, &MAC);
+
+ if (ret == 0) {
+ ignore_value(virNetDevSetNetConfig(linkdev, vf,
+ adminMAC, vlan, MAC, true));
+ }
+
+ VIR_FREE(MAC);
+ VIR_FREE(adminMAC);
+ virNetDevVlanFree(vlan);
}
VIR_FREE(linkdev);
--
2.9.3