On Mon, Jun 23, 2025 at 5:39 PM Han Han <h...@redhat.com> wrote: > > > On Fri, May 30, 2025 at 8:22 PM Enrique Llorente via Devel < > devel@lists.libvirt.org> wrote: > >> This commit introduces a feature enhancement for configuring hostnames in >> virtual machines (VMs) using DHCP. It adds new options to the "passt" tool >> to set the hostname and fully qualified domain name (FQDN) for VMs. These >> map to DHCP option 12 for the hostname and options 81 (IPv4) and 39 (IPv6) >> for the FQDN. >> >> The update enables passt to dynamically assign hostnames to DHCP-aware >> VMs. To achieve this, the commit adds two fields to the passt domain XML >> backend. These fields allow passt to configure the hostname and FQDN for >> the virtual machine, ensuring smooth integration with the DHCP protocol. >> >> This improvement is particularly valuable in environments where VMs need >> dynamic hostname configuration, enhancing flexibility and automation in >> virtualized network setups. >> >> libvirt: Integrate passt --hostname --fqdn options >> Resolves: https://issues.redhat.com/browse/RHEL-79806 >> >> Signed-off-by: Enrique Llorente <ellor...@redhat.com> >> --- >> Compared to v1 this fix the mapping between backend fqdn and hostname >> >> docs/formatdomain.rst | 8 +++++--- >> src/conf/domain_conf.c | 10 +++++++++- >> src/conf/domain_conf.h | 2 ++ >> src/conf/schemas/domaincommon.rng | 6 ++++++ >> src/qemu/qemu_passt.c | 6 ++++++ >> tests/qemuxmlconfdata/net-user-passt.x86_64-7.2.0.xml | 2 +- >> tests/qemuxmlconfdata/net-user-passt.x86_64-latest.xml | 2 +- >> tests/qemuxmlconfdata/net-user-passt.xml | 2 +- >> .../net-vhostuser-passt.x86_64-latest.xml | 2 +- >> tests/qemuxmlconfdata/net-vhostuser-passt.xml | 2 +- >> 10 files changed, 33 insertions(+), 9 deletions(-) >> >> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst >> index 8753ee9c23..9c80aa9270 100644 >> --- a/docs/formatdomain.rst >> +++ b/docs/formatdomain.rst >> @@ -5372,10 +5372,12 @@ came from the host's IP. >> There are a few other options that are configurable only for the passt >> backend. For example, the ``<backend>`` attribute ``logFile`` can be >> used to tell the passt process for this interface where to write its >> -message log, and the ``<source>`` attribute ``dev`` can tell it a >> +message log, the ``<source>`` attribute ``dev`` can tell it a >> particular host interface to use when deriving the routes given to the >> -guest for forwarding traffic upstream. Due to the design decisions of >> -passt, when using SELinux on the host, it is recommended that the log >> +guest for forwarding traffic upstream and the ``hostname`` and ``fqdn`` >> +will conigure the DHCP option 12 hostname and DHCP option 81 and DHCPv6 >> +option 39 fqdn attribute. Due to the design decisions of passt, when >> using >> +SELinux on the host, it is recommended that the log >> file reside in the runtime directory of the user under which the passt >> process will run, most probably ``/run/user/$UID`` (where ``$UID`` is >> the UID of that user), e.g. ``/run/user/1000``. Be aware that libvirt >> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c >> index b3b0bd7329..15143f8fa2 100644 >> --- a/src/conf/domain_conf.c >> +++ b/src/conf/domain_conf.c >> @@ -2909,6 +2909,8 @@ virDomainNetDefFree(virDomainNetDef *def) >> g_free(def->backend.tap); >> g_free(def->backend.vhost); >> g_free(def->backend.logFile); >> + g_free(def->backend.hostname); >> + g_free(def->backend.fqdn); >> virDomainNetTeamingInfoFree(def->teaming); >> g_free(def->virtPortProfile); >> g_free(def->script); >> @@ -9757,6 +9759,8 @@ virDomainNetBackendParseXML(xmlNodePtr node, >> } >> >> def->backend.logFile = virXMLPropString(node, "logFile"); >> + def->backend.hostname = virXMLPropString(node, "hostname"); >> + def->backend.fqdn = virXMLPropString(node, "fqdn"); >> >> if (tap) >> def->backend.tap = virFileSanitizePath(tap); >> @@ -20757,7 +20761,9 @@ virDomainNetBackendIsEqual(virDomainNetBackend >> *src, >> if (src->type != dst->type || >> STRNEQ_NULLABLE(src->tap, dst->tap) || >> STRNEQ_NULLABLE(src->vhost, dst->vhost) || >> - STRNEQ_NULLABLE(src->logFile, dst->logFile)) { >> + STRNEQ_NULLABLE(src->logFile, dst->logFile) || >> + STRNEQ_NULLABLE(src->hostname, dst->hostname) || >> + STRNEQ_NULLABLE(src->fqdn, dst->fqdn)) { >> return false; >> } >> return true; >> @@ -24838,6 +24844,8 @@ virDomainNetBackendFormat(virBuffer *buf, >> virBufferEscapeString(&attrBuf, " tap='%s'", backend->tap); >> virBufferEscapeString(&attrBuf, " vhost='%s'", backend->vhost); >> virBufferEscapeString(&attrBuf, " logFile='%s'", backend->logFile); >> + virBufferEscapeString(&attrBuf, " hostname='%s'", backend->hostname); >> + virBufferEscapeString(&attrBuf, " fqdn='%s'", backend->fqdn); >> virXMLFormatElement(buf, "backend", &attrBuf, NULL); >> } >> >> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h >> index 58b97a2b54..79fd2f1f63 100644 >> --- a/src/conf/domain_conf.h >> +++ b/src/conf/domain_conf.h >> @@ -1067,6 +1067,8 @@ struct _virDomainNetBackend { >> char *vhost; >> /* The following are currently only valid/used when backend >> type='passt' */ >> char *logFile; /* path to logfile used by passt process */ >> + char *hostname; /* hostname of the passt process */ >> + char *fqdn; /* fully qualified domain name of the passt process */ >> }; >> >> struct _virDomainNetPortForwardRange { >> diff --git a/src/conf/schemas/domaincommon.rng >> b/src/conf/schemas/domaincommon.rng >> index 5597d5a66b..f64199ca18 100644 >> --- a/src/conf/schemas/domaincommon.rng >> +++ b/src/conf/schemas/domaincommon.rng >> @@ -3913,6 +3913,12 @@ >> <ref name="absFilePath"/> >> </attribute> >> </optional> >> + <optional> >> + <attribute name="hostname"/> >> + </optional> >> + <optional> >> + <attribute name="fqdn"/> >> + </optional> >> </element> >> </optional> >> <optional> >> diff --git a/src/qemu/qemu_passt.c b/src/qemu/qemu_passt.c >> index fcc34de384..81e5c51f6c 100644 >> --- a/src/qemu/qemu_passt.c >> +++ b/src/qemu/qemu_passt.c >> @@ -229,6 +229,12 @@ qemuPasstStart(virDomainObj *vm, >> if (net->backend.logFile) >> virCommandAddArgList(cmd, "--log-file", net->backend.logFile, >> NULL); >> >> + if (net->backend.hostname) >> + virCommandAddArgList(cmd, "--hostname", net->backend.hostname, >> NULL); >> + >> + if (net->backend.fqdn) >> + virCommandAddArgList(cmd, "--fqdn", net->backend.fqdn, NULL); >> + >> /* Add IP address info */ >> for (i = 0; i < net->guestIP.nips; i++) { >> const virNetDevIPAddr *ip = net->guestIP.ips[i]; >> diff --git a/tests/qemuxmlconfdata/net-user-passt.x86_64-7.2.0.xml >> b/tests/qemuxmlconfdata/net-user-passt.x86_64-7.2.0.xml >> index cfe07cc627..77da297936 100644 >> --- a/tests/qemuxmlconfdata/net-user-passt.x86_64-7.2.0.xml >> +++ b/tests/qemuxmlconfdata/net-user-passt.x86_64-7.2.0.xml >> @@ -50,7 +50,7 @@ >> <range start='443' to='344'/> >> </portForward> >> <model type='rtl8139'/> >> - <backend type='passt' logFile='/var/log/loglaw.blog'/> >> + <backend type='passt' logFile='/var/log/loglaw.blog' >> hostname='hostname1' fqdn='hostname1.test.local'/> >> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' >> function='0x0'/> >> </interface> >> <input type='mouse' bus='ps2'/> >> diff --git a/tests/qemuxmlconfdata/net-user-passt.x86_64-latest.xml >> b/tests/qemuxmlconfdata/net-user-passt.x86_64-latest.xml >> index d7e0ef5f90..917a9edaa0 100644 >> --- a/tests/qemuxmlconfdata/net-user-passt.x86_64-latest.xml >> +++ b/tests/qemuxmlconfdata/net-user-passt.x86_64-latest.xml >> @@ -50,7 +50,7 @@ >> <range start='443' to='344'/> >> </portForward> >> <model type='rtl8139'/> >> - <backend type='passt' logFile='/var/log/loglaw.blog'/> >> + <backend type='passt' logFile='/var/log/loglaw.blog' >> hostname='hostname1' fqdn='hostname1.test.local'/> >> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' >> function='0x0'/> >> </interface> >> <input type='mouse' bus='ps2'/> >> diff --git a/tests/qemuxmlconfdata/net-user-passt.xml >> b/tests/qemuxmlconfdata/net-user-passt.xml >> index 20c9f50542..80d15de2ed 100644 >> --- a/tests/qemuxmlconfdata/net-user-passt.xml >> +++ b/tests/qemuxmlconfdata/net-user-passt.xml >> @@ -47,7 +47,7 @@ >> <range start='443' to='344'/> >> </portForward> >> <model type='rtl8139'/> >> - <backend type='passt' logFile='/var/log/loglaw.blog'/> >> + <backend type='passt' logFile='/var/log/loglaw.blog' >> hostname='hostname1' fqdn='hostname1.test.local'/> >> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' >> function='0x0'/> >> </interface> >> <input type='mouse' bus='ps2'/> >> diff --git a/tests/qemuxmlconfdata/net-vhostuser-passt.x86_64-latest.xml >> b/tests/qemuxmlconfdata/net-vhostuser-passt.x86_64-latest.xml >> index 529aff11f8..5802754c4b 100644 >> --- a/tests/qemuxmlconfdata/net-vhostuser-passt.x86_64-latest.xml >> +++ b/tests/qemuxmlconfdata/net-vhostuser-passt.x86_64-latest.xml >> @@ -53,7 +53,7 @@ >> <range start='443' to='344'/> >> </portForward> >> <model type='virtio'/> >> - <backend type='passt' logFile='/var/log/loglaw.blog'/> >> + <backend type='passt' logFile='/var/log/loglaw.blog' >> hostname='hostname1' fqdn='hostname1.test.local'/> >> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' >> function='0x0'/> >> </interface> >> <interface type='vhostuser'> >> diff --git a/tests/qemuxmlconfdata/net-vhostuser-passt.xml >> b/tests/qemuxmlconfdata/net-vhostuser-passt.xml >> index 71b845329b..0a37511a0f 100644 >> --- a/tests/qemuxmlconfdata/net-vhostuser-passt.xml >> +++ b/tests/qemuxmlconfdata/net-vhostuser-passt.xml >> @@ -50,7 +50,7 @@ >> <range start='443' to='344'/> >> </portForward> >> <model type='virtio'/> >> - <backend type='passt' logFile='/var/log/loglaw.blog'/> >> + <backend type='passt' logFile='/var/log/loglaw.blog' >> hostname='hostname1' fqdn='hostname1.test.local'/> >> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' >> function='0x0'/> >> </interface> >> <interface type='vhostuser'> >> -- >> 2.49.0 >> >> Build libvirt-11.5 with this patch. It works for me. > > Correct the version: v11.4.0-98-g1ee74707bd
> -- > Tested-by: Han Han <h...@redhat.com> >