[PATCHv2] passt: Define backend hostname and fqdn

Enrique Llorente via Devel posted 1 patch 3 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20250530122128.297271-1-ellorent@redhat.com
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(-)
[PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente via Devel 3 months, 1 week ago
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 <ellorent@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
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Laine Stump via Devel 4 weeks ago
Sorry again for taking so long to respond to this - it's turned into a 
ridiculous mental block for me for really unexplainable reasons...

On 5/30/25 8:21 AM, Enrique Llorente via Devel 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

Not sure what the above "tag-looking" line is for. Is there some 
automation that consumes it?

> Resolves: https://issues.redhat.com/browse/RHEL-79806
> 
> Signed-off-by: Enrique Llorente <ellorent@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``

You're missing an Oxford(ish) Comma just after "upstream" :-)

> +will conigure the DHCP option 12 hostname and DHCP option 81 and DHCPv6
> +option 39 fqdn attribute.

(pardon this interlude...)


For the curious, here are links to the relevant RFCs:

https://datatracker.ietf.org/doc/html/rfc2132#section-3.14 - DHCPv4 
option 12
https://datatracker.ietf.org/doc/html/rfc4702 - DHCPv4 option 81
https://datatracker.ietf.org/doc/html/rfc4704 - DHCPv6 option 39

In a previous attempt at reviewing this patch, I spent (wasted) a lot of 
time querying an AI chatbot about the details of these options and their 
usage, naively writing a bunch of text based on the provided details, 
and only then looking up the source material (the RFCs, you know - like 
in the "Beforefore Time"?) to verify the details, just to learn that the 
chatbot had misled me and so everything I'd written was incorrect (well, 
most of it anyway).

In the end what I've learned (other than that everything an AI chatbot 
tells you really is just as suspect as Gary Marcus and others say it is) is:

1) while DHCPv4 option 12 can bet sent from server to client without the 
client previously sending an option 12, for DHCPv4 option 81 / v6 option 
39, the server can only send those options in a response if the client 
previously included the same option in its request (*However*, the 
payload of the option sent by the client could just be empty, which I'm 
guessing is often the case).

2) Even though option 12 is named "host name", it is totally permissible 
for an option 12 to contain a FQDN (in either direction) rather than 
just a plain unqualified host name. (And dnsmasq, as one example, 
handles this quite well).

3) Even though options 81/39 are named "FQDN", it is also totally 
permissible for the client to send an unqualified host name in an option 
81/39, after which the server can/should respond with an option 81/39 
that either adds the domain onto that hostname, or potentially provides 
a completely different fqdn.

3) If DHCPv4 negotiation has both an option 12 and option 81, the option 
12 is ignored in favor of option 81.

4) Really, *none* of this has any bearing on this patch at all (I just 
thought it was interesting and didn't want the time I spent parsing 
through the RFCs to be completely wasted :-)

(Note that, based on the original descriptions from the aforementioned 
(but unnamed) chatbot, I had created an entire universe (with 
accompanying long diatribe) where DHCP option 81 was being misused. Good 
thing I took the time to look up the primary source and read/understand 
it myself.)


>  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

Along with adding descriptions of the new attributes, they should be 
added to at least one existing example XML in the documentation, or a 
new example added if it's more complicated. (Actually it can also be 
very useful to include an example of the XML (and the change it causes 
to the passt commandline) in the commit log message - makes it easy to 
search through "git log" for that commit).


(What? Is it time for another interlude already? Yes. Yes it is.)

As usual, I spent way too much time thinking about what is the ideal 
place for these options in the XML grammar, my main concern being that 
adding more and more attributes to the <backend> element could become 
unwieldy, but also that the same options might be useful in other 
situations and/or be used as templates for future similar additional 
options.

One idea I had was that we could add a <dhcp> subelement to <backend> 
where dhcp options could be added, e.g.:

<interface type='vhostuser'>
   <backend type='passt>
     <dhcp hostname='blah' fqdn='blah.blorp.com'/>
   </backend>

I suppose that would have been nicer if we could *consistently* put all 
the things that are used to configure the host-side DHCP server in this 
mythical <dhcp> element, but that possibility was eliminated when the 
original passt support re-used the pre-existing toplevel <ip> subelement 
to configure passt's DHCP server IP addresses (<ip> was originally added 
to configure the IP addresses of interfaces when an LXC domain is 
created - they aren't just "available for the domain to request" from a 
DHCP server, but are directly configured using the netlink equivalent of 
"ip addr add"). We can't move that into backend/dhcp, meaning <dhcp> 
would only contain *some* of the dhcp options, and there's probably no 
point in only doing it for some DHCP options, so that idea is a non-starter.

Another possibility I thought of was to put these attributes either 
directly at the top level (which would be completely nonsensical), or in 
another existing subelement, e.g. <ip> (doesn't work because the "fqdn" 
option applies to both IPv4 and IPv6 of the same <interface>, and also 
it would mean that every *other* use of <ip> would now have this new 
attribute that we would need to check for just to be sure it wasn't 
added in a place where it didn't make sense), possibly in <source> ("How 
is that better than putting it in <backend>?") or maybe a *new* toplevel 
subelement ("And call it *what*?" is the proper rhetorical question 
here). So - no, no, no, and (checks list) no.

I do think it is worthwhile to consider how some other backend might 
make use of these options, for example let's say we decided to enhance 
<interface type='network'> by supporting use of the <ip> in the domain 
xml to add a static host entry to the network; it would be totally 
reasonable to expect that we could also use a host name from the 
<interface> in that static host entry. With the XML implemented by this 
patch, that would look like:

   <interface type='network'>
     <source network='blah'/>
     <mac address='52:54:00:A1:BE:EF'/>
     <ip address='192.168.128.22'/>
     <backend hostname='xyzzy'/>
     ...
   </interface>

(which would temporarily add a static host entry like this to the 
libvirt virtual network "blah"):

    <host mac='52:54:00:A1:BE:EF' name='xyzzy' ip='192.168.128.22'/>

I mean... it seems kind of arbitrary that "hostname" is in the <backend> 
subelement while the ip address isn't, but then really in the end isn't 
*everything* arbitrary?? (This is starting to sound like something The 
Dude would say).

So, after all my internal wrestling with the placement and naming of 
these two options, I think I'll just declare all my pondering as 
pointless, and agree that what you've proposed is just fine (unless 
someone else has a better idea in the next couple days :-)

> 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 */

A better description would be good, something like "DHCPv4 hostname 
(option 12)"

> +    char *fqdn; /* fully qualified domain name of the passt process */

Maybe "DHCP fully qualified domain name (option 81/v4 39/v6)"?

>   };
>   
>   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>

           <optional>
             <attribute name="hostname">
               <ref name="dnsName"/>
             </attribute>
           </optional>
           <optional>
             <attribute name="fqdn">
               <ref name="dnsName"/>
             </attribute>
           </optional>


And while I'm on the subject - I also notice that there was nothing 
added to src/conf/domain_validate.c to reject someone adding hostname or 
fqdn when the backend isn't type='passt' - it will happily accept them 
and then they will of course be ignored. (Noticing this made me realize 
that there is also no validation check for the existing logFile 
attribute, which I will send in a separate patch after we get this patch 
pushed).

I've attached a patch to this reply that fixes these two problems (but 
not the documentation issues I mentioned above, ie. adding the new 
attributes to an example in formatdomain.rst and adding an example of an 
<interface> with the new <backend> options in the commit log).

Otherwise this all looks fine. I'm going to wait a couple days to see if 
anyone has any useful response to my despair about XML 
naming/organization, and then if nobody has a better idea and you're 
okay with the changes in the attached patchfile, I'll add the example 
XML in the two places and push it.

Thanks for the contribution. I promise I'll respond in a more timely 
manner next time.

>           </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'>
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente Pastora via Devel 1 week ago
On Mon, Aug 11, 2025 at 6:40 AM Laine Stump <laine@redhat.com> wrote:
>
> Sorry again for taking so long to respond to this - it's turned into a
> ridiculous mental block for me for really unexplainable reasons...
>
> On 5/30/25 8:21 AM, Enrique Llorente via Devel 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
>
> Not sure what the above "tag-looking" line is for. Is there some
> automation that consumes it?
>
> > Resolves: https://issues.redhat.com/browse/RHEL-79806
> >
> > Signed-off-by: Enrique Llorente <ellorent@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``
>
> You're missing an Oxford(ish) Comma just after "upstream" :-)
>
> > +will conigure the DHCP option 12 hostname and DHCP option 81 and DHCPv6
> > +option 39 fqdn attribute.
>
> (pardon this interlude...)
>
>
> For the curious, here are links to the relevant RFCs:
>
> https://datatracker.ietf.org/doc/html/rfc2132#section-3.14 - DHCPv4
> option 12
> https://datatracker.ietf.org/doc/html/rfc4702 - DHCPv4 option 81
> https://datatracker.ietf.org/doc/html/rfc4704 - DHCPv6 option 39
>
> In a previous attempt at reviewing this patch, I spent (wasted) a lot of
> time querying an AI chatbot about the details of these options and their
> usage, naively writing a bunch of text based on the provided details,
> and only then looking up the source material (the RFCs, you know - like
> in the "Beforefore Time"?) to verify the details, just to learn that the
> chatbot had misled me and so everything I'd written was incorrect (well,
> most of it anyway).
>
> In the end what I've learned (other than that everything an AI chatbot
> tells you really is just as suspect as Gary Marcus and others say it is) is:
>
> 1) while DHCPv4 option 12 can bet sent from server to client without the
> client previously sending an option 12, for DHCPv4 option 81 / v6 option
> 39, the server can only send those options in a response if the client
> previously included the same option in its request (*However*, the
> payload of the option sent by the client could just be empty, which I'm
> guessing is often the case).
>
> 2) Even though option 12 is named "host name", it is totally permissible
> for an option 12 to contain a FQDN (in either direction) rather than
> just a plain unqualified host name. (And dnsmasq, as one example,
> handles this quite well).
>
> 3) Even though options 81/39 are named "FQDN", it is also totally
> permissible for the client to send an unqualified host name in an option
> 81/39, after which the server can/should respond with an option 81/39
> that either adds the domain onto that hostname, or potentially provides
> a completely different fqdn.
>
> 3) If DHCPv4 negotiation has both an option 12 and option 81, the option
> 12 is ignored in favor of option 81.
>
> 4) Really, *none* of this has any bearing on this patch at all (I just
> thought it was interesting and didn't want the time I spent parsing
> through the RFCs to be completely wasted :-)
>
> (Note that, based on the original descriptions from the aforementioned
> (but unnamed) chatbot, I had created an entire universe (with
> accompanying long diatribe) where DHCP option 81 was being misused. Good
> thing I took the time to look up the primary source and read/understand
> it myself.)
>
>
> >  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
>
> Along with adding descriptions of the new attributes, they should be
> added to at least one existing example XML in the documentation, or a
> new example added if it's more complicated. (Actually it can also be
> very useful to include an example of the XML (and the change it causes
> to the passt commandline) in the commit log message - makes it easy to
> search through "git log" for that commit).
>
>
> (What? Is it time for another interlude already? Yes. Yes it is.)
>
> As usual, I spent way too much time thinking about what is the ideal
> place for these options in the XML grammar, my main concern being that
> adding more and more attributes to the <backend> element could become
> unwieldy, but also that the same options might be useful in other
> situations and/or be used as templates for future similar additional
> options.
>
> One idea I had was that we could add a <dhcp> subelement to <backend>
> where dhcp options could be added, e.g.:
>
> <interface type='vhostuser'>
>    <backend type='passt>
>      <dhcp hostname='blah' fqdn='blah.blorp.com'/>
>    </backend>
>
> I suppose that would have been nicer if we could *consistently* put all
> the things that are used to configure the host-side DHCP server in this
> mythical <dhcp> element, but that possibility was eliminated when the
> original passt support re-used the pre-existing toplevel <ip> subelement
> to configure passt's DHCP server IP addresses (<ip> was originally added
> to configure the IP addresses of interfaces when an LXC domain is
> created - they aren't just "available for the domain to request" from a
> DHCP server, but are directly configured using the netlink equivalent of
> "ip addr add"). We can't move that into backend/dhcp, meaning <dhcp>
> would only contain *some* of the dhcp options, and there's probably no
> point in only doing it for some DHCP options, so that idea is a non-starter.
>
> Another possibility I thought of was to put these attributes either
> directly at the top level (which would be completely nonsensical), or in
> another existing subelement, e.g. <ip> (doesn't work because the "fqdn"
> option applies to both IPv4 and IPv6 of the same <interface>, and also
> it would mean that every *other* use of <ip> would now have this new
> attribute that we would need to check for just to be sure it wasn't
> added in a place where it didn't make sense), possibly in <source> ("How
> is that better than putting it in <backend>?") or maybe a *new* toplevel
> subelement ("And call it *what*?" is the proper rhetorical question
> here). So - no, no, no, and (checks list) no.
>
> I do think it is worthwhile to consider how some other backend might
> make use of these options, for example let's say we decided to enhance
> <interface type='network'> by supporting use of the <ip> in the domain
> xml to add a static host entry to the network; it would be totally
> reasonable to expect that we could also use a host name from the
> <interface> in that static host entry. With the XML implemented by this
> patch, that would look like:
>
>    <interface type='network'>
>      <source network='blah'/>
>      <mac address='52:54:00:A1:BE:EF'/>
>      <ip address='192.168.128.22'/>
>      <backend hostname='xyzzy'/>
>      ...
>    </interface>
>
> (which would temporarily add a static host entry like this to the
> libvirt virtual network "blah"):
>
>     <host mac='52:54:00:A1:BE:EF' name='xyzzy' ip='192.168.128.22'/>
>
> I mean... it seems kind of arbitrary that "hostname" is in the <backend>
> subelement while the ip address isn't, but then really in the end isn't
> *everything* arbitrary?? (This is starting to sound like something The
> Dude would say).
>
> So, after all my internal wrestling with the placement and naming of
> these two options, I think I'll just declare all my pondering as
> pointless, and agree that what you've proposed is just fine (unless
> someone else has a better idea in the next couple days :-)
>
> > 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 */
>
> A better description would be good, something like "DHCPv4 hostname
> (option 12)"
>
> > +    char *fqdn; /* fully qualified domain name of the passt process */
>
> Maybe "DHCP fully qualified domain name (option 81/v4 39/v6)"?
>
> >   };
> >
> >   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>
>
>            <optional>
>              <attribute name="hostname">
>                <ref name="dnsName"/>
>              </attribute>
>            </optional>
>            <optional>
>              <attribute name="fqdn">
>                <ref name="dnsName"/>
>              </attribute>
>            </optional>
>
>
> And while I'm on the subject - I also notice that there was nothing
> added to src/conf/domain_validate.c to reject someone adding hostname or
> fqdn when the backend isn't type='passt' - it will happily accept them
> and then they will of course be ignored. (Noticing this made me realize
> that there is also no validation check for the existing logFile
> attribute, which I will send in a separate patch after we get this patch
> pushed).
>
> I've attached a patch to this reply that fixes these two problems (but
> not the documentation issues I mentioned above, ie. adding the new
> attributes to an example in formatdomain.rst and adding an example of an
> <interface> with the new <backend> options in the commit log).
>
> Otherwise this all looks fine. I'm going to wait a couple days to see if
> anyone has any useful response to my despair about XML
> naming/organization, and then if nobody has a better idea and you're
> okay with the changes in the attached patchfile, I'll add the example
> XML in the two places and push it.
>

I understand that your patch addresses your comments here, I am fine
with it, so you can
add it to the changes proposed here and push it.

> Thanks for the contribution. I promise I'll respond in a more timely
> manner next time.
>
> >           </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'>



-- 
Quique Llorente

CNV networking Senior Software Engineer

Red Hat EMEA

ellorent@redhat.com

@RedHat   Red Hat  Red Hat
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Laine Stump via Devel 5 days, 1 hour ago
On 9/1/25 3:26 AM, Enrique Llorente Pastora wrote:
> On Mon, Aug 11, 2025 at 6:40 AM Laine Stump <laine@redhat.com> wrote:
>>
>> Otherwise this all looks fine. I'm going to wait a couple days to see if
>> anyone has any useful response to my despair about XML
>> naming/organization, and then if nobody has a better idea and you're
>> okay with the changes in the attached patchfile, I'll add the example
>> XML in the two places and push it.
>>
> 
> I understand that your patch addresses your comments here, I am fine
> with it, so you can
> add it to the changes proposed here and push it.


Okay, I'll get that squashed in, run it through CI testing, and push it 
tonight or tomorrow. Thanks!

Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Peter Krempa via Devel 2 months ago
On Fri, May 30, 2025 at 14:21:23 +0200, Enrique Llorente via Devel 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 <ellorent@redhat.com>

Please clarify if any AI was used to generate code in this patch and
thus it would need to be rejected the same way as your other patch.
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente Pastora via Devel 2 months ago
On Thu, Jul 10, 2025 at 12:26 PM Peter Krempa <pkrempa@redhat.com> wrote:
>
> On Fri, May 30, 2025 at 14:21:23 +0200, Enrique Llorente via Devel 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 <ellorent@redhat.com>
>
> Please clarify if any AI was used to generate code in this patch and
> thus it would need to be rejected the same way as your other patch.
>

No, for this one no AI was used, it can be reviewed without problem.

-- 
Quique Llorente

CNV networking Senior Software Engineer

Red Hat EMEA

ellorent@redhat.com

@RedHat   Red Hat  Red Hat
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Han Han via Devel 2 months, 2 weeks ago
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 <ellorent@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.

-- 
Tested-by: Han Han <hhan@redhat.com>
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Han Han via Devel 2 months, 2 weeks ago
On Mon, Jun 23, 2025 at 5:39 PM Han Han <hhan@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 <ellorent@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 <hhan@redhat.com>
>
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente Pastora via Devel 2 months, 2 weeks ago
@Peter Krempa <pkrempa@redhat.com> Can you take a look ?

On Mon, Jun 23, 2025 at 12:04 PM Han Han <hhan@redhat.com> wrote:

>
>
> On Mon, Jun 23, 2025 at 5:39 PM Han Han <hhan@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 <ellorent@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 <hhan@redhat.com>
>>
>

-- 
*Quique Llorente*

CNV networking Senior Software Engineer

Red Hat EMEA <https://www.redhat.com/>

ellorent@redhat.com <arxcruz@redhat.com>
@RedHat <https://twitter.com/redhat>   Red Hat
<https://www.linkedin.com/company/red-hat>  Red Hat
<https://www.facebook.com/RedHatInc>
<https://www.redhat.com/>
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Peter Krempa via Devel 2 months, 2 weeks ago
On Wed, Jun 25, 2025 at 11:50:18 +0200, Enrique Llorente Pastora wrote:
> @Peter Krempa <pkrempa@redhat.com> Can you take a look ?

This is not my area. Also please don't contact individuals:

https://www.libvirt.org/submitting-patches.html#review-process
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Laine Stump 1 month, 4 weeks ago
On 6/25/25 7:11 AM, Peter Krempa via Devel wrote:
> On Wed, Jun 25, 2025 at 11:50:18 +0200, Enrique Llorente Pastora wrote:
>> @Peter Krempa <pkrempa@redhat.com> Can you take a look ?
> 
> This is not my area. Also please don't contact individuals:
> 
> https://www.libvirt.org/submitting-patches.html#review-process


Sorry, I had looked at this back in June before leaving on a rather long 
vacation, and intended to reply then, but I spent too much time 
researching the backstory of the various DHCP options, wrote up a rather 
long reply, researched some more, changed my mind, erased everything I'd 
written and started over, repeated that again once or twice, and then 
had to leave before I made up my mind and wrote the final reply. (Yes, I 
admit I have a problem with overthinking just about everything :-/)

I've gotten back this week and spent a full day just getting my email 
client to stop locking up "forever" (as long as my patience allowed 
anyway) churning through all the mailing lists I'm subscribed to for 
historical reasons (but don't actually read :-/) so that I could even 
start going through my mail and reminding myself what I was doing all 
those eons ago before I left town. I do have some opinions about the 
location/naming of these new options. I will try to dig out what I'd 
written back in June and send it by Monday.
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente Pastora via Devel 1 month, 3 weeks ago
On Fri, Jul 11, 2025 at 10:06 AM Laine Stump <laine@laine.org> wrote:
>
> On 6/25/25 7:11 AM, Peter Krempa via Devel wrote:
> > On Wed, Jun 25, 2025 at 11:50:18 +0200, Enrique Llorente Pastora wrote:
> >> @Peter Krempa <pkrempa@redhat.com> Can you take a look ?
> >
> > This is not my area. Also please don't contact individuals:
> >
> > https://www.libvirt.org/submitting-patches.html#review-process
>
>
> Sorry, I had looked at this back in June before leaving on a rather long
> vacation, and intended to reply then, but I spent too much time
> researching the backstory of the various DHCP options, wrote up a rather
> long reply, researched some more, changed my mind, erased everything I'd
> written and started over, repeated that again once or twice, and then
> had to leave before I made up my mind and wrote the final reply. (Yes, I
> admit I have a problem with overthinking just about everything :-/)
>
> I've gotten back this week and spent a full day just getting my email
> client to stop locking up "forever" (as long as my patience allowed
> anyway) churning through all the mailing lists I'm subscribed to for
> historical reasons (but don't actually read :-/) so that I could even
> start going through my mail and reminding myself what I was doing all
> those eons ago before I left town. I do have some opinions about the
> location/naming of these new options. I will try to dig out what I'd
> written back in June and send it by Monday.

No problem whenever you can.

>


-- 
Quique Llorente

CNV networking Senior Software Engineer

Red Hat EMEA

ellorent@redhat.com

@RedHat   Red Hat  Red Hat
Re: [PATCHv2] passt: Define backend hostname and fqdn
Posted by Enrique Llorente Pastora via Devel 2 months, 2 weeks ago
Hi, can I get some reviews for this ?

Thanks!

On Fri, May 30, 2025 at 2:21 PM Enrique Llorente <ellorent@redhat.com>
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 <ellorent@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
>
>

-- 
*Quique Llorente*

CNV networking Senior Software Engineer

Red Hat EMEA <https://www.redhat.com/>

ellorent@redhat.com <arxcruz@redhat.com>
@RedHat <https://twitter.com/redhat>   Red Hat
<https://www.linkedin.com/company/red-hat>  Red Hat
<https://www.facebook.com/RedHatInc>
<https://www.redhat.com/>