From 8570de6e766297e4c9feab1c54ae05037f33edeb Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 23 Dec 2021 11:37:01 +0100 Subject: [PATCH] launch-libvirt: add virtio-net via the standard element Starting with version 3.8.0, libvirt allows us to specify the network address and network mask (as prefix) for SLIRP directly via the element in the domain XML: . This means we don't need the hack for virtio-net on such versions. Restrict the hack in construct_libvirt_xml_qemu_cmdline() to libvirt<3.8.0, and generate the proper element in construct_libvirt_xml_devices() on libvirt>=3.8.0. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2034160 Suggested-by: Richard W.M. Jones Signed-off-by: Laszlo Ersek Message-Id: <20211223103701.12702-4-lersek@redhat.com> Reviewed-by: Richard W.M. Jones Tested-by: Richard W.M. Jones (cherry picked from commit 5858c2cf6c24b3776e3867eafd9d86a1f4912d9c) --- lib/guestfs-internal.h | 3 ++- lib/launch-libvirt.c | 27 +++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h index 97a13ff2c..b11c945e9 100644 --- a/lib/guestfs-internal.h +++ b/lib/guestfs-internal.h @@ -148,7 +148,8 @@ #endif /* Place the virtio-net controller in slot 0x1e on the root bus, on normal - * hardware with PCI. Refer to RHBZ#2034160. + * hardware with PCI. Necessary only before libvirt 3.8.0. Refer to + * RHBZ#2034160. */ #ifdef HAVE_LIBVIRT_BACKEND #if defined(__arm__) || defined(__s390x__) diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c index 0f38f0aec..f6bb39d99 100644 --- a/lib/launch-libvirt.c +++ b/lib/launch-libvirt.c @@ -1396,6 +1396,28 @@ construct_libvirt_xml_devices (guestfs_h *g, } end_element (); } end_element (); + /* Virtio-net NIC with SLIRP (= userspace) back-end, if networking is + * enabled. Starting with libvirt 3.8.0, we can specify the network address + * and prefix for SLIRP in the domain XML. Therefore, we can add the NIC + * via the standard element rather than , and + * so libvirt can manage the PCI address of the virtio-net NIC like the PCI + * addresses of all other devices. Refer to RHBZ#2034160. + */ + if (g->enable_network && + guestfs_int_version_ge (¶ms->data->libvirt_version, 3, 8, 0)) { + start_element ("interface") { + attribute ("type", "user"); + start_element ("model") { + attribute ("type", "virtio"); + } end_element (); + start_element ("ip") { + attribute ("family", "ipv4"); + attribute ("address", NETWORK_ADDRESS); + attribute ("prefix", NETWORK_PREFIX); + } end_element (); + } end_element (); + } + /* Libvirt adds some devices by default. Indicate to libvirt * that we don't want them. */ @@ -1818,9 +1840,10 @@ construct_libvirt_xml_qemu_cmdline (guestfs_h *g, } end_element (); /* Workaround because libvirt user networking cannot specify "net=" - * parameter. + * parameter. Necessary only before libvirt 3.8.0; refer to RHBZ#2034160. */ - if (g->enable_network) { + if (g->enable_network && + !guestfs_int_version_ge (¶ms->data->libvirt_version, 3, 8, 0)) { start_element ("qemu:arg") { attribute ("value", "-netdev"); } end_element (); -- 2.31.1