[libvirt] [PATCH v2 03/11] util: use new virNetDev*NetConfig() functions for hostdev setup/teardown

Laine Stump laine at laine.org
Fri Mar 24 05:02:27 UTC 2017


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




More information about the libvir-list mailing list