From nobody Tue Dec 16 13:51:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1742894358; cv=none; d=zohomail.com; s=zohoarc; b=U6CslMeb+/FWZhZwRgup2uYO3BHNuja4MXMCKHV/kAlB+rOn5YJt9lrI5haqnWS3+nR1U41YekLkoGH8/s80frg+CIz3MXCrN6HtVoYFSNLt4+2/0qrTJiEUQ/dYsdEy5lq6NKmOLxS4/p8qn0Ain6FuXMAxBZBTE6jeFFu+cI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742894358; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=w79YlAvhySQRhRp5LKivOnXnYmMNFicI6K+2/qvW/BA=; b=PUa3Ji5JZTuQMB0oboUgOzQ9NwIPyiUrd5/Urk421Anko/zwe/e9XxXkeUVB1fRyGv4Ezp7eJ4RMMIeKl5Np6AIkvURI7GtnRVlvFbdftXlUPRF+nc+KugCrg0jUuWD14PmhBxA6KVfEZhjJqmqoDtMjpzawuxyLtB1SQwz1kM4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1742894358390531.0129874681288; Tue, 25 Mar 2025 02:19:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id B2AD4157B; Tue, 25 Mar 2025 05:19:17 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0275E15AE; Tue, 25 Mar 2025 05:18:27 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 80B9714E5; Tue, 25 Mar 2025 05:18:22 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id D790B14F1 for ; Tue, 25 Mar 2025 05:18:21 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-374-noesOhqDNmqz2cJ9DNIChQ-1; Tue, 25 Mar 2025 05:18:19 -0400 Received: from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1306A19560AA for ; Tue, 25 Mar 2025 09:18:19 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.3.236]) by mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5D77E1956095 for ; Tue, 25 Mar 2025 09:18:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1742894301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jmc5TnQQ1MxmhExCRPvTKRz1v5Z3+dMAoo0UVZBVj04=; b=I8x2fl7X9nxY17X1vp28pQFhi5mB+7AdyYcCs5cETZ92ewyHftOzpDroSkBNMn5jO6EHuY 3AiVv1G7xhSgX7zJ9ls2jJh1/5kMUzXEK8RZlDP3hCPKR8+lf6UMr5Ptww2ztXf5p2SpOG 51gETBrRtlapf0y+2J/V8mgt9Do8I9s= X-MC-Unique: noesOhqDNmqz2cJ9DNIChQ-1 X-Mimecast-MFC-AGG-ID: noesOhqDNmqz2cJ9DNIChQ_1742894299 To: devel@lists.libvirt.org Subject: [PATCH v3 1/3] qemu: Reflect MAC address change in live domain XML Date: Tue, 25 Mar 2025 10:18:11 +0100 Message-ID: <9c1291905389e365fdf0b902c44720e36f08c027.1742894006.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.15 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: kndOW7GrJehzUAfpxucajB2EflzfGtqqbCELucZDvJI_1742894299 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: RL3WZRQI53LJZGRCZ6337TJO6UE7AX4E X-Message-ID-Hash: RL3WZRQI53LJZGRCZ6337TJO6UE7AX4E X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1742894359805019000 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik If a guest changes MAC address on its vNIC, then QEMU emits NIC_RX_FILTER_CHANGED event (the event is emitted in other cases too, but that's not important right now). Now, domain XML allows users to chose whether to trust these events or not: For the 'no' case no action is performed and the event is ignored. But for the 'yes' case, some host side features of corresponding vNIC (well tap/macvtap device) are tweaked to reflect changed MAC address. But what is missing is reflecting this new MAC address in domain XML. Basically, what happens is: the host sees traffic with new MAC address, all tools inside the guest see the new MAC address (including 'virsh domifaddr --source agent') which makes it harder to match device in the guest with the one in the domain XML. Therefore, report this new MAC address as another attribute of the element: Signed-off-by: Michal Privoznik --- docs/formatdomain.rst | 5 +++++ src/conf/domain_conf.c | 6 ++++++ src/conf/domain_conf.h | 3 +++ src/conf/schemas/domaincommon.rng | 5 +++++ src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++ src/qemu/qemu_driver.c | 2 +- 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index aae58fab60..3be7ee0ff4 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -5052,6 +5052,11 @@ when it's in the reserved VMware range by adding a `= `type=3D"static"`` attribute to the ```` element. Note that this attribute is useless if the prov= ided MAC address is outside of the reserved VMWare ranges. =20 +:since:`Since 11.2.0`, the ```` element can optionally contain +``currentAddress`` attribute (output only), which contains new MAC address= if the +guest changed it. This is currently implemented only for QEMU/KVM and requ= ires +setting ``trustGuestRxFilters`` to ``yes``. + :since:`Since 7.3.0`, one can set the ACPI index against network interface= s. With some operating systems (eg Linux with systemd), the ACPI index is used to provide network interface device naming, that is stable across changes diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7ea74b9b64..99ecb03067 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2853,6 +2853,7 @@ virDomainNetDefFree(virDomainNetDef *def) if (!def) return; =20 + g_free(def->currentAddress); g_free(def->modelstr); =20 switch (def->type) { @@ -24948,6 +24949,11 @@ virDomainNetDefFormat(virBuffer *buf, virBufferAsprintf(&macAttrBuf, " type=3D'%s'", virDomainNetMacType= TypeToString(def->mac_type)); if (def->mac_check !=3D VIR_TRISTATE_BOOL_ABSENT) virBufferAsprintf(&macAttrBuf, " check=3D'%s'", virTristateBoolTyp= eToString(def->mac_check)); + if (def->currentAddress && + !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)) { + virBufferAsprintf(&macAttrBuf, " currentAddress=3D'%s'", + virMacAddrFormat(def->currentAddress, macstr)); + } virXMLFormatElement(buf, "mac", &macAttrBuf, NULL); =20 if (publicActual) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ed39b60f6d..0d1dd954ae 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1091,6 +1091,9 @@ struct _virDomainNetDef { bool mac_generated; /* true if mac was *just now* auto-generated by li= bvirt */ virDomainNetMacType mac_type; virTristateBool mac_check; + virMacAddr *currentAddress; /* MAC address from query-rx-filter (as re= ported + by guest). Not parsed from domain XML. = Output + only. */ int model; /* virDomainNetModelType */ char *modelstr; union { diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 8bf909e6fb..5597d5a66b 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -3844,6 +3844,11 @@ + + + + + diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index fcdf28f3fc..7f89b193f9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11072,6 +11072,19 @@ syncNicRxFilterMulticast(char *ifname, } =20 =20 +/** + * qemuDomainSyncRxFilter: + * @vm: domain object + * @def: domain interface definition + * @asyncJob: async job type + * + * Fetch new state of RX Filter and set host side of the interface + * accordingly (e.g. reflect MAC address change on macvtap). + * + * Reflect changed MAC address in the domain definition. + * + * Returns: 0 on success, -1 on error. + */ int qemuDomainSyncRxFilter(virDomainObj *vm, virDomainNetDef *def, @@ -11080,6 +11093,7 @@ qemuDomainSyncRxFilter(virDomainObj *vm, qemuDomainObjPrivate *priv =3D vm->privateData; g_autoptr(virNetDevRxFilter) guestFilter =3D NULL; g_autoptr(virNetDevRxFilter) hostFilter =3D NULL; + virMacAddr *oldMac =3D NULL; int rc; =20 if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) @@ -11125,6 +11139,24 @@ qemuDomainSyncRxFilter(virDomainObj *vm, return -1; } =20 + if (def->currentAddress) + oldMac =3D def->currentAddress; + else + oldMac =3D &def->mac; + + if (virMacAddrCmp(oldMac, &guestFilter->mac)) { + /* Reflect changed MAC address in the domain XML. */ + if (virMacAddrCmp(&def->mac, &guestFilter->mac)) { + if (!def->currentAddress) { + def->currentAddress =3D g_new0(virMacAddr, 1); + } + + virMacAddrSet(def->currentAddress, &guestFilter->mac); + } else { + VIR_FREE(def->currentAddress); + } + } + return 0; } =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3cf21380ed..20b94ccdf0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3689,7 +3689,7 @@ processNicRxFilterChangedEvent(virDomainObj *vm, "from domain %p %s", devAlias, vm, vm->def->name); =20 - if (virDomainObjBeginJob(vm, VIR_JOB_QUERY) < 0) + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) return; =20 if (!virDomainObjIsActive(vm)) { --=20 2.48.1