From nobody Mon Sep 8 17:07:21 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 header.i=maximilian_martin@gmx.de; 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=1755528464; cv=none; d=zohomail.com; s=zohoarc; b=j+tkIBVrdQNUxg9i/MFEtSLx3mOxEuQ9A4VOdghVReY5mxgJ+ZT5CQoQA3NtbtuH1pOzRSwi25B38iKpw9mtXce29Wv87KWNf8xcNbUzw8UlGVR3Xkbue5VOkfQ2/oGbwzvPwruxqTkWzNlaAcuRg8ZpixYF6lyZetwkcR4ybSc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755528464; h=Content-Transfer-Encoding:Cc:Cc: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; bh=thqzT3vCSPgZdr2HtmvOy/3bTYaoB2eb+nED1aL1Ii8=; b=Vn7EuvzTpIOefyH8yul4zXaXHijMAX63HcDmaFlii5Sw5Tx9WVTAp+QXeyUMc6vxwHCkjHo472LiXA6olfTlpJ8g16EuJRyUGmxqMIV0gzz8cHYTZqLAvaO0N8A1LrWYrUil7iMTEOgTWlWawKb0a6SNNL2A9O8p4EN/6dj2lfg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail header.i=maximilian_martin@gmx.de; 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 1755528464130370.5175170154389; Mon, 18 Aug 2025 07:47:44 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1784896B; Mon, 18 Aug 2025 10:47:43 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 9580BD76; Mon, 18 Aug 2025 10:39:44 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id AB8DDAE2; Mon, 18 Aug 2025 10:39:36 -0400 (EDT) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (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 15DA9B01 for ; Mon, 18 Aug 2025 10:39:31 -0400 (EDT) Received: from cu-host.fritz.box ([185.17.205.244]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M7Jza-1uvgye3Syy-007dRB; Mon, 18 Aug 2025 16:34:20 +0200 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,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=gmx.de; s=s31663417; t=1755527970; x=1756132770; i=maximilian_martin@gmx.de; bh=thqzT3vCSPgZdr2HtmvOy/3bTYaoB2eb+nED1aL1Ii8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=avKnAKtff3U7nOB/DlPoNPomfYq3kkW36S3w8Uks6G2ijw23qZlhEnfb4ZSX5Gb3 m8/ancIU/9sluZrYg+Icn64OHwYnIL+ru0sQtGt2FaPMexze0WI0L5x++fCeL8sky 9b4I/k1wtfwJUd1EFgjNCnEsjG4fHn0+EwrvcLxeApWNB/5pS1baG1fixPsrk8u8s 2FHdNiLmxn3w9feTAHohQ4+3Iw0MDBxn20ctDNxGG7d7Jm/kW7mFlwdy68r6VAKn2 HzKJOI3usRtr6tWIWPsZJ/sxx4gF6O3SUUkLpMx0WkodQgkwDeswWlHV7EkS69d6e Nv3d/Vi0vjeGeQLHhA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a To: devel@lists.libvirt.org Subject: [PATCH v3 6/7] nodedev: add USB port to nodedev XML Date: Mon, 18 Aug 2025 16:34:16 +0200 Message-Id: <20250818143417.765-7-maximilian_martin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250818143417.765-1-maximilian_martin@gmx.de> References: <20250818143417.765-1-maximilian_martin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:aOfX51/EuZpD0HV4sjvZ3ubpmO3Xz73V53opoEDEJXwY3B7Cc4t hYjNJS8GD7uqeLGymNKq1jTqK/ilWHkS4OaMyTdbMzanz2zqqifFu0euizbGRtzLWf7IO2Z H+9i1t48uO4TytNXWct6lfgchDkWa8WP99fAoiPt25lWqfUKhDsfDdwZDoSfslxAV4VlfCT laaqyWUbnyeshFcHNOcsg== UI-OutboundReport: notjunk:1;M01:P0:ohH27wCoL/A=;BDR/ckjS5TBR1XuTAKgjNn64Sri 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 5ODZUBloHgpw9+EEkHmnNZKWcmIB Message-ID-Hash: TWCBODT4B63V2MOXLL6YUPHI7DFKM5JU X-Message-ID-Hash: TWCBODT4B63V2MOXLL6YUPHI7DFKM5JU X-MailFrom: maximilian_martin@gmx.de 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 CC: Maximilian Martin 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: Maximilian Martin via Devel Reply-To: Maximilian Martin X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1755528466153116600 Content-Type: text/plain; charset="utf-8" From: Maximilian Martin This adds the physical USB port to the capabilities of a USB device in nodedev XML. example: 1.4 Signed-off-by: Maximilian Martin --- src/conf/node_device_conf.c | 5 +++ src/conf/node_device_conf.h | 1 + src/conf/schemas/basictypes.rng | 31 +++++++++++++++++++ src/conf/schemas/domaincommon.rng | 30 ------------------ src/conf/schemas/nodedev.rng | 3 ++ src/node_device/node_device_udev.c | 4 +++ .../usb_device_1d6b_1_0000_00_1d_0.xml | 1 + 7 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 9c7982c680..ed0d340aa2 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -432,6 +432,9 @@ virNodeDeviceCapUSBDevDefFormat(virBuffer *buf, virBufferAsprintf(buf, "%d\n", data->usb_dev.bus); virBufferAsprintf(buf, "%d\n", data->usb_dev.device); + if (data->usb_dev.port) + virBufferEscapeString(buf, "%s\n", + data->usb_dev.port); virBufferAsprintf(buf, "usb_dev.product); if (data->usb_dev.product_name) @@ -2083,6 +2086,7 @@ virNodeDevCapUSBDevParseXML(xmlXPathContextPtr ctxt, _("invalid USB product ID supplied for= '%1$s'")) < 0) return -1; =20 + usb_dev->port =3D virXPathString("string(./port[1])", ctxt); usb_dev->vendor_name =3D virXPathString("string(./vendor[1])", ctxt); usb_dev->product_name =3D virXPathString("string(./product[1])", ctxt); =20 @@ -2802,6 +2806,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) case VIR_NODE_DEV_CAP_USB_DEV: g_free(data->usb_dev.product_name); g_free(data->usb_dev.vendor_name); + g_free(data->usb_dev.port); break; case VIR_NODE_DEV_CAP_USB_INTERFACE: g_free(data->usb_if.description); diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index b98fb750ce..d6d2081278 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -211,6 +211,7 @@ typedef struct _virNodeDevCapUSBDev virNodeDevCapUSBDev; struct _virNodeDevCapUSBDev { unsigned int bus; unsigned int device; + char *port; unsigned int product; unsigned int vendor; char *product_name; diff --git a/src/conf/schemas/basictypes.rng b/src/conf/schemas/basictypes.= rng index 2931e316b7..7d0361b413 100644 --- a/src/conf/schemas/basictypes.rng +++ b/src/conf/schemas/basictypes.rng @@ -378,6 +378,37 @@ =20 + + + -1 + + + + + (0x)?[0-9a-fA-F]{1,4} + + + + + [0-9]{1,2}.[0-9]{1,2} + + + + + (0x)?[0-9a-fA-F]{1,3} + + + + + (0x)?[0-9a-fA-F]{1,2} + + + + + ((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-= F]{1,3} + + + (0x)?[0-9a-fA-F]{16} diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 438bdc6ef6..ee91bf7133 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -8686,36 +8686,6 @@ - - - -1 - - - - - (0x)?[0-9a-fA-F]{1,4} - - - - - [0-9]{1,2}.[0-9]{1,2} - - - - - (0x)?[0-9a-fA-F]{1,3} - - - - - (0x)?[0-9a-fA-F]{1,2} - - - - - ((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-= F]{1,3} - - [0-9]{1,2} diff --git a/src/conf/schemas/nodedev.rng b/src/conf/schemas/nodedev.rng index 31ce517e4d..3b5d1391c5 100644 --- a/src/conf/schemas/nodedev.rng +++ b/src/conf/schemas/nodedev.rng @@ -288,6 +288,9 @@ + + + =20 diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 30c2ddf568..1f1f84c6ca 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -595,6 +595,10 @@ udevProcessUSBDevice(struct udev_device *device, return -1; if (udevGetUintProperty(device, "ID_VENDOR_ID", &usb_dev->vendor, 16) = < 0) return -1; + if (!usb_dev->port) { + udevGetStringSysfsAttr(device, "devpath", + &usb_dev->port); + } =20 udevGetStringProperty(device, "ID_VENDOR_FROM_DATABASE", diff --git a/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml b/t= ests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml index 29533e769b..0898213532 100644 --- a/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml +++ b/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml @@ -4,6 +4,7 @@ 2 1 + 3 1.1 root hub Linux Foundation --=20 2.39.5