Skip to content

Commit

Permalink
launch-libvirt: add virtio-net via the standard <interface> element
Browse files Browse the repository at this point in the history
Starting with version 3.8.0, libvirt allows us to specify the network
address and network mask (as prefix) for SLIRP directly via the
<interface> element in the domain XML:
<https://libvirt.org/formatdomain.html#userspace-slirp-stack>. This means
we don't need the <qemu:commandline> 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 <interface> 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 <rjones@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20211223103701.12702-4-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Tested-by: Richard W.M. Jones <rjones@redhat.com>
  • Loading branch information
lersek committed Dec 23, 2021
1 parent 216de16 commit 5858c2c
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
3 changes: 2 additions & 1 deletion lib/guestfs-internal.h
Expand Up @@ -173,7 +173,8 @@ cleanup_mutex_unlock (pthread_mutex_t **ptr)
#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__)
Expand Down
27 changes: 25 additions & 2 deletions lib/launch-libvirt.c
Expand Up @@ -1413,6 +1413,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 <interface> element rather than <qemu:commandline>, 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 (&params->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.
*/
Expand Down Expand Up @@ -1835,9 +1857,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 (&params->data->libvirt_version, 3, 8, 0)) {
start_element ("qemu:arg") {
attribute ("value", "-netdev");
} end_element ();
Expand Down

0 comments on commit 5858c2c

Please sign in to comment.