]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
libxl: Fix initialization of nictype in libxl_device_nic
authorJim Fehlig <jfehlig@suse.com>
Mon, 6 Jan 2014 18:37:20 +0000 (11:37 -0700)
committerJim Fehlig <jfehlig@suse.com>
Mon, 6 Jan 2014 23:15:32 +0000 (16:15 -0700)
As pointed out by the Xen folks [1], HVM nics should always be set
to type LIBXL_NIC_TYPE_VIF_IOEMU unless the user explicity requests
LIBXL_NIC_TYPE_VIF via model='netfront'.  The current logic in
libxlMakeNic() only sets the nictype to LIBXL_NIC_TYPE_VIF_IOEMU if
a model is specified that is not 'netfront', which breaks PXE booting
configurations where no model is specified (i.e. use the hypervisor
default).

Reported-by: Stefan Bader <stefan.bader@canonical.com>
[1] https://www.redhat.com/archives/libvir-list/2013-December/msg01156.html

src/libxl/libxl_conf.c
src/libxl/libxl_conf.h

index aaeb00e992c69b6f0b1f1d62ac5a5044c6fb9d40..04d01afb02a5f114101b287e202336287543c568 100644 (file)
@@ -855,8 +855,12 @@ error:
 }
 
 int
-libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
+libxlMakeNic(virDomainDefPtr def,
+             virDomainNetDefPtr l_nic,
+             libxl_device_nic *x_nic)
 {
+    bool ioemu_nic = STREQ(def->os.type, "hvm");
+
     /* TODO: Where is mtu stored?
      *
      * x_nics[i].mtu = 1492;
@@ -866,12 +870,16 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
 
     virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
 
-    if (l_nic->model && !STREQ(l_nic->model, "netfront")) {
-        if (VIR_STRDUP(x_nic->model, l_nic->model) < 0)
-            return -1;
+    if (ioemu_nic)
         x_nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
-    } else {
+    else
         x_nic->nictype = LIBXL_NIC_TYPE_VIF;
+
+    if (l_nic->model) {
+        if (VIR_STRDUP(x_nic->model, l_nic->model) < 0)
+            return -1;
+        if (STREQ(l_nic->model, "netfront"))
+            x_nic->nictype = LIBXL_NIC_TYPE_VIF;
     }
 
     if (VIR_STRDUP(x_nic->ifname, l_nic->ifname) < 0)
@@ -908,7 +916,7 @@ libxlMakeNicList(virDomainDefPtr def,  libxl_domain_config *d_config)
         return -1;
 
     for (i = 0; i < nnics; i++) {
-        if (libxlMakeNic(l_nics[i], &x_nics[i]))
+        if (libxlMakeNic(def, l_nics[i], &x_nics[i]))
             goto error;
     }
 
index ffa93bd494fb0018d5cfd435bb37e9ec9e1c520a..90d590f4b2f8413a96f03943d3881b4dd8f49e0a 100644 (file)
@@ -142,7 +142,9 @@ libxlMakeCapabilities(libxl_ctx *ctx);
 int
 libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
 int
-libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
+libxlMakeNic(virDomainDefPtr def,
+             virDomainNetDefPtr l_nic,
+             libxl_device_nic *x_nic);
 int
 libxlMakeVfb(libxlDriverPrivatePtr driver,
              virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);