@Peter Krempa <pkre...@redhat.com> Can you take a look ?

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

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

-- 
*Quique Llorente*

CNV networking Senior Software Engineer

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

ellor...@redhat.com <arxc...@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/>

Reply via email to