From nobody Thu Apr 16 00:35:40 2026 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=1745264405; cv=none; d=zohomail.com; s=zohoarc; b=bsGwuZ+FoQuz4vyi5hnW0KDczd/PeEcrDnnn+IB7Uk9c6tD/06c4Tgbijwfkh4huG+4nMFGXu+DAf8aGF6DcjC6rz8o1oQSmUjHPW5nP3Kvml8nVbAX9a6WQ4GFXagJP9o+oAaIr4KMia1C88cXf/M4wt0oA9vKX8RKdeNt1tII= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745264405; 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=WJVSUdVzHN0OXUaiFzahP2GvKxvBaXI0fKw9+KzwFVM=; b=B2H1WV/0jeM5LzEZcOXULKAiP0NZ0xSZNQC59FgD+IWv9emL05NB6irtfdUKIxKDxzj+owkWHqd8oTFeXAApurp92rxPb0UDXllG0rUszOm6o2cfCMDLuRPKrsSN8AhEgYlVO+j1D23k/lxHFBKISQhleoGkUxOVRSBEG6HDyFc= 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 1745264405370533.7735339775884; Mon, 21 Apr 2025 12:40:05 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5A62FD0D; Mon, 21 Apr 2025 15:40:04 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0E16ECBA; Mon, 21 Apr 2025 15:39:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1077BC9B; Mon, 21 Apr 2025 15:38:59 -0400 (EDT) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (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 474F5E8A for ; Mon, 21 Apr 2025 15:38:46 -0400 (EDT) Received: from cu-host.fritz.box ([185.17.205.183]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MmDEg-1uoqNo3jX6-00fpzG; Mon, 21 Apr 2025 21:38:44 +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=1745264324; x=1745869124; i=maximilian_martin@gmx.de; bh=WJVSUdVzHN0OXUaiFzahP2GvKxvBaXI0fKw9+KzwFVM=; 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=Mh8FzfTRGzUnG8IB1gBCSJxCItYKzJ/IVPig+sNGwQ4l/INwXltS37B+nZuHGmOB oCE5NbJWfH/AiR5qkXr2pLVY+PmVJNMo/yWrJ8j0E2DsNM29niq/1LExT/S/MS0ya QZACM2eIsk9iQ+pwRqPruvqKlvWkbMknAmgZ9tZtZeewLOgM/6hwhZlTwQJHq0IKV TaUCBvt5rj/MC20FH1pETSvJaPFHwL16ypoNSnvoWPXCnwK+ZkD+dgRYDDuDvFyBB gR9RG9TCHKKDVdw8hen9huIRNJZm1XTaOrpEU9xM6M+F0lYQpjHBddOHPc0y6/H5X 3Sms45VFIVh8auiEHQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a To: devel@lists.libvirt.org Subject: [PATCH 1/4] virusb test data: add devpath files for port addressing Date: Mon, 21 Apr 2025 21:38:35 +0200 Message-Id: <20250421193838.1934-2-maximilian_martin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250421193838.1934-1-maximilian_martin@gmx.de> References: <20250421193838.1934-1-maximilian_martin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:lQjjE0Jmnubv45PireHAQhViyAFtod1Y+RZxABuKTDWqeMtXuTy dGBk91QR127YjGfFpup1fjLAh/ZUU6BvOyuHu8D7cuIWBMjkGr9RZtuSFMcIogC9DE1tBqs 1VfVnJGjwSbgnbMIj/M+g2VP3pXQxgweU+WE7tYUKqxsgeiDMfqMMkWKgcjTszH7hmU798I EM3sgEw8w4GmdhcWS37lw== UI-OutboundReport: notjunk:1;M01:P0:nHK4q8NX6xU=;SnFH2WESAP48Te0Y+XjBRh0Onk9 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 Q4mhdEQyrfTTU= Message-ID-Hash: CZFIKRDRBS7KXC7E6FHEP6NY3SL3PXXA X-Message-ID-Hash: CZFIKRDRBS7KXC7E6FHEP6NY3SL3PXXA 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: 1745264406058019100 Content-Type: text/plain; charset="utf-8" From: Maximilian Martin This patch adds devpath files to the virusb test data. These files are mockups for the USB sysfs files that contain the port of a USB device in dotted notation. They are used for testing of USB bus/port matching. Signed-off-by: Maximilian Martin --- tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.5/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1.6/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/1-1/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/2-1.2/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/2-1/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/usb1/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/usb2/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/usb3/devpath | 1 + tests/virusbtestdata/sys_bus_usb/devices/usb4/devpath | 1 + 15 files changed, 15 insertions(+) create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devp= ath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devp= ath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.6/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1.2/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb1/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb2/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb3/devpath create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb4/devpath diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devpath b/t= ests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devpath new file mode 100644 index 0000000000..02a7fbef02 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devpath @@ -0,0 +1 @@ +1.5.3.1 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devpath b/t= ests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devpath new file mode 100644 index 0000000000..23ca863cd4 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devpath @@ -0,0 +1 @@ +1.5.3.3 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devpath b/tes= ts/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devpath new file mode 100644 index 0000000000..8af85beb51 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devpath @@ -0,0 +1 @@ +1.5.3 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devpath b/tes= ts/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devpath new file mode 100644 index 0000000000..94fe62c274 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devpath @@ -0,0 +1 @@ +1.5.4 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devpath b/tes= ts/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devpath new file mode 100644 index 0000000000..9075be4951 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devpath @@ -0,0 +1 @@ +1.5.5 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devpath b/tes= ts/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devpath new file mode 100644 index 0000000000..eac1e0ada6 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devpath @@ -0,0 +1 @@ +1.5.6 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5/devpath b/tests= /virusbtestdata/sys_bus_usb/devices/1-1.5/devpath new file mode 100644 index 0000000000..c239c60cba --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5/devpath @@ -0,0 +1 @@ +1.5 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.6/devpath b/tests= /virusbtestdata/sys_bus_usb/devices/1-1.6/devpath new file mode 100644 index 0000000000..810ee4e91e --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.6/devpath @@ -0,0 +1 @@ +1.6 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1/devpath b/tests/v= irusbtestdata/sys_bus_usb/devices/1-1/devpath new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1/devpath @@ -0,0 +1 @@ +1 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/2-1.2/devpath b/tests= /virusbtestdata/sys_bus_usb/devices/2-1.2/devpath new file mode 100644 index 0000000000..5625e59da8 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/2-1.2/devpath @@ -0,0 +1 @@ +1.2 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/2-1/devpath b/tests/v= irusbtestdata/sys_bus_usb/devices/2-1/devpath new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/2-1/devpath @@ -0,0 +1 @@ +1 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/usb1/devpath b/tests/= virusbtestdata/sys_bus_usb/devices/usb1/devpath new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/usb1/devpath @@ -0,0 +1 @@ +0 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/usb2/devpath b/tests/= virusbtestdata/sys_bus_usb/devices/usb2/devpath new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/usb2/devpath @@ -0,0 +1 @@ +0 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/usb3/devpath b/tests/= virusbtestdata/sys_bus_usb/devices/usb3/devpath new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/usb3/devpath @@ -0,0 +1 @@ +0 diff --git a/tests/virusbtestdata/sys_bus_usb/devices/usb4/devpath b/tests/= virusbtestdata/sys_bus_usb/devices/usb4/devpath new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/tests/virusbtestdata/sys_bus_usb/devices/usb4/devpath @@ -0,0 +1 @@ +0 --=20 2.39.5 From nobody Thu Apr 16 00:35:40 2026 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=1745264505; cv=none; d=zohomail.com; s=zohoarc; b=I/dcQlQb0YMs0uq9qtZ9TwPKTYsGXRAn25a2P+CNSh8x0l9CFXdCCQHRDm2tOyi14rfrPED9EmfU4trhzKZCnyt76z4pU4YOU4/EG/FRlJio5Vpt3EuQSSxOve/0hiX+3QMVrW2Sn7gCN2r2oCYx1jnpkcHx0ZmkITyHyEzKukw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745264505; 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=JZxbFyuFGP2fiGUyh/jFF16l2R5O5phA9RWe6DFvMSU=; b=MZ1l1Sm7jxQKNOO4mZZ7N5bln2nk4qMTYsQYoi+JAA2uxSBSd+lKGd+ax/j+KIt7jYIG8YI8DSjbmoSrBq3U+aAMN9lMpWU0AatA+TDGR3XoDwReX6sJ1eF+kQJe3nR+YrWwdl1QZntTzeJHD9m/ZJ9qvF1QWUV9JerPvNa112s= 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 1745264505505786.6871604923718; Mon, 21 Apr 2025 12:41:45 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 7925DE76; Mon, 21 Apr 2025 15:41:44 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5D5B9C95; Mon, 21 Apr 2025 15:39:12 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 0287FC91; Mon, 21 Apr 2025 15:38:59 -0400 (EDT) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (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 71E61E90 for ; Mon, 21 Apr 2025 15:38:47 -0400 (EDT) Received: from cu-host.fritz.box ([185.17.205.183]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M3UUy-1u6OkG16jC-00G5gu; Mon, 21 Apr 2025 21:38:46 +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=1745264326; x=1745869126; i=maximilian_martin@gmx.de; bh=JZxbFyuFGP2fiGUyh/jFF16l2R5O5phA9RWe6DFvMSU=; 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=R1+o6jL0oI2jfXg3h0sOMFNnmTmRg575bgeHC1DCMQfZkFYn7n7rJay6XKt7hXij BhL4rZA3UmLOtc/LX6iVLIanTFNDonwVZz/L1cQsTMc7fCSSn0T48yEDHR0JolS5T f/6WaokOanrIdCq8f4lat1JO/lTSQoXJZQKUdGlNCz2KYrutkgr1BQ4R45XRbL9Tx bAFFWUsvpQS9rZMuiDN/S0ODNKBOjM726sIh3MgIG1IySWnQRtipzs1OV9mzUEGkM sCyAMQFzQMXXh7Pb8LL3c7hmyLgn3KZjKcJCFfpAK1foFg1DkBSpkWi+vN/19LoxR iuBNgI8KpDisMzrSvQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a To: devel@lists.libvirt.org Subject: [PATCH 2/4] domain_conf, virhostdev, virusb, virusb test: add bus/port matching Date: Mon, 21 Apr 2025 21:38:36 +0200 Message-Id: <20250421193838.1934-3-maximilian_martin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250421193838.1934-1-maximilian_martin@gmx.de> References: <20250421193838.1934-1-maximilian_martin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:CLVeSQtaFNYpwSLEWXeN/EIKzqDHFYs0xRDgUy7bFned9Eykiv6 OV/1DeFhM/gXMmFIwDo5n54KsDIydabCn2PQjFP012nUYwG8VGP/7SL/1a1TICrlBYeEO0I GNR2DsDF1pHw/Q7TbIX92i8mi1+XvTUKv3n6CZthEPA/nh8HIIW65ATMm9B4afVrmChpnk5 nFRWs/cmQSo77RAPm+17A== UI-OutboundReport: notjunk:1;M01:P0:XRy5nTY/0fg=;pyYs81xqxotaruiyLRfqBBAHO4S 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 Message-ID-Hash: BFVKP63RUMIIIA5TXF4UAZEBJVASNJLM X-Message-ID-Hash: BFVKP63RUMIIIA5TXF4UAZEBJVASNJLM 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: 1745264508383019100 Content-Type: text/plain; charset="utf-8" From: Maximilian Martin This patch implements USB bus/port matching. In addition to vendor/product and bus/device matching, bus/port matching is implemented. This involves additions and refactorings in the domain configuration, host device handling, and USB helpers. Also, test methods are refactored and extended. Signed-off-by: Maximilian Martin --- src/conf/domain_conf.c | 69 ++++++++++++++-- src/conf/domain_conf.h | 1 + src/hypervisor/virhostdev.c | 131 +++++++++++++++++------------- src/libvirt_private.syms | 2 - src/util/virusb.c | 156 ++++++++++++------------------------ src/util/virusb.h | 32 ++++---- tests/virusbtest.c | 149 ++++++++++++++++++++++++---------- 7 files changed, 312 insertions(+), 228 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 542d6ade91..423cad99e5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2670,6 +2670,15 @@ virDomainHostdevSubsysSCSIClear(virDomainHostdevSubs= ysSCSI *scsisrc) } } =20 +static void +virDomainHostdevSubsysUSBClear(virDomainHostdevSubsysUSB *usbsrc) +{ + if (!usbsrc) + return; + + VIR_FREE(usbsrc->port); +} + =20 static void virDomainHostdevDefClear(virDomainHostdevDef *def) @@ -2713,6 +2722,8 @@ virDomainHostdevDefClear(virDomainHostdevDef *def) g_clear_pointer(&def->source.subsys.u.pci.origstates, virBitma= pFree); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + virDomainHostdevSubsysUSBClear(&def->source.subsys.u.usb); + break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; @@ -5945,13 +5956,47 @@ virDomainHostdevSubsysUSBDefParseXML(xmlNodePtr nod= e, } =20 if ((addressNode =3D virXPathNode("./address", ctxt))) { - if (virXMLPropUInt(addressNode, "bus", 0, - VIR_XML_PROP_REQUIRED, &usbsrc->bus) < 0) + bool found_device =3D false; + bool found_port =3D false; + char *port =3D NULL; + int ret =3D -1; + + ret =3D virXMLPropUInt(addressNode, "bus", 0, + VIR_XML_PROP_REQUIRED, &usbsrc->bus); + if (ret < 0) { + return -1; + } else if (ret =3D=3D 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("missing bus")); return -1; + } =20 - if (virXMLPropUInt(addressNode, "device", 0, - VIR_XML_PROP_REQUIRED, &usbsrc->device) < 0) + ret =3D virXMLPropUInt(addressNode, "device", 0, + VIR_XML_PROP_NONE, &usbsrc->device); + if (ret < 0) return -1; + else if (ret > 0) + found_device =3D true; + + port =3D virXMLPropString(addressNode, "port"); + if (port) { + if (*port) { + usbsrc->port =3D port; + found_port =3D true; + } else { + VIR_FREE(port); + } + } + + if (!found_device && !found_port) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("usb address needs either device id or port")); + return -1; + } else if (found_device && found_port) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("found both device id and port in usb address (amb= iguous setting)")); + return -1; + } } =20 return 0; @@ -14774,8 +14819,13 @@ virDomainHostdevMatchSubsysUSB(virDomainHostdevDef= *first, virDomainHostdevSubsysUSB *first_usbsrc =3D &first->source.subsys.u.us= b; virDomainHostdevSubsysUSB *second_usbsrc =3D &second->source.subsys.u.= usb; =20 - if (first_usbsrc->bus && first_usbsrc->device) { - /* specified by bus location on host */ + if (first_usbsrc->bus && first_usbsrc->port) { + /* specified by bus and port on host */ + if (first_usbsrc->bus =3D=3D second_usbsrc->bus && + STREQ_NULLABLE(first_usbsrc->port, second_usbsrc->port)) + return 1; + } else if (first_usbsrc->bus && first_usbsrc->device) { + /* specified by bus and device id on host */ if (first_usbsrc->bus =3D=3D second_usbsrc->bus && first_usbsrc->device =3D=3D second_usbsrc->device) return 1; @@ -24345,10 +24395,15 @@ virDomainHostdevDefFormatSubsysUSB(virBuffer *buf, virBufferAsprintf(&sourceChildBuf, "\n", u= sbsrc->product); } =20 - if (usbsrc->bus || usbsrc->device) + if (usbsrc->bus && usbsrc->port) { + virBufferAsprintf(&sourceChildBuf, "
\n", + includeTypeInAddr ? "type=3D'usb' " : "", + usbsrc->bus, usbsrc->port); + } else if (usbsrc->bus || usbsrc->device) { virBufferAsprintf(&sourceChildBuf, "
\n", includeTypeInAddr ? "type=3D'usb' " : "", usbsrc->bus, usbsrc->device); + } =20 virXMLFormatElement(buf, "source", &sourceAttrBuf, &sourceChildBuf); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 58b97a2b54..aaa8b8573a 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -228,6 +228,7 @@ struct _virDomainHostdevSubsysUSB { on vendor/product */ unsigned bus; unsigned device; + char *port; =20 unsigned vendor; unsigned product; diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c index 0a1d8500d4..9e77477a9b 100644 --- a/src/hypervisor/virhostdev.c +++ b/src/hypervisor/virhostdev.c @@ -1358,6 +1358,42 @@ virHostdevMarkUSBDevices(virHostdevManager *mgr, return -1; } =20 +static int +virHostdevFindUSBDeviceWithFlags(virDomainHostdevDef *hostdev, + bool mandatory, + unsigned int flags, + virUSBDevice **usb) +{ + virDomainHostdevSubsysUSB *usbsrc =3D &hostdev->source.subsys.u.usb; + unsigned vendor =3D usbsrc->vendor; + unsigned product =3D usbsrc->product; + unsigned bus =3D usbsrc->bus; + char *port =3D usbsrc->port; + unsigned device =3D usbsrc->device; + virUSBDeviceList *devs; + int rc; + + rc =3D virUSBDeviceFind(vendor, product, bus, device, port, NULL, + mandatory, flags, &devs); + if (rc < 0) + return -1; + + if (rc =3D=3D 1) { + *usb =3D virUSBDeviceListGet(devs, 0); + virUSBDeviceListSteal(devs, *usb); + } + virObjectUnref(devs); + + if (rc > 1) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("Multiple USB devices for %1$x:%2$x, use to specify one"), + vendor, product); + return -1; + } + + return rc; +} + =20 int virHostdevFindUSBDevice(virDomainHostdevDef *hostdev, @@ -1366,77 +1402,64 @@ virHostdevFindUSBDevice(virDomainHostdevDef *hostde= v, { virDomainHostdevSubsysUSB *usbsrc =3D &hostdev->source.subsys.u.usb; unsigned vendor =3D usbsrc->vendor; - unsigned product =3D usbsrc->product; unsigned bus =3D usbsrc->bus; unsigned device =3D usbsrc->device; + char *port =3D usbsrc->port; bool autoAddress =3D usbsrc->autoAddress; + unsigned int flags =3D 0; int rc; =20 *usb =3D NULL; =20 - if (vendor && bus) { - rc =3D virUSBDeviceFind(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); - if (rc < 0) { - return -1; - } else if (!autoAddress) { - goto out; - } else { - VIR_INFO("USB device %x:%x could not be found at previous" - " address (bus:%u device:%u)", - vendor, product, bus, device); - } + if (vendor) + flags |=3D USB_DEVICE_FIND_BY_VENDOR; + if (device) + flags |=3D USB_DEVICE_FIND_BY_DEVICE; + if (port) + flags |=3D USB_DEVICE_FIND_BY_PORT; + + /* Rule out invalid cases. */ + if (vendor && device && port) { + VIR_WARN("Cannot match USB device on vendor/product, bus/device, a= nd bus/port at once. Ignoring bus/device."); + flags &=3D ~((unsigned int) USB_DEVICE_FIND_BY_DEVICE); + } else if (device && port) { + VIR_WARN("Cannot match USB device on bus/device and bus/port at on= ce. Ignoring bus/device."); + flags &=3D ~((unsigned int) USB_DEVICE_FIND_BY_DEVICE); + } else if (!vendor && !device && !port) { + VIR_WARN("No matching fields for USB device found. Vendor/product,= bus/device, or bus/port required."); + return -1; } =20 - /* When vendor is specified, its USB address is either unspecified or = the - * device could not be found at the USB device where it had been - * automatically found before. - */ - if (vendor) { - g_autoptr(virUSBDeviceList) devs =3D NULL; + /* First attempt, matching on all valid fields. */ + rc =3D virHostdevFindUSBDeviceWithFlags(hostdev, + autoAddress ? false : mandatory, + flags, usb); + if (rc < 0) + return -1; =20 - rc =3D virUSBDeviceFindByVendor(vendor, product, NULL, mandatory, = &devs); - if (rc < 0) { - return -1; - } else if (rc =3D=3D 0) { - goto out; - } else if (rc > 1) { - if (autoAddress) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Multiple USB devices for %1$x:%2$x were = found, but none of them is at bus:%3$u device:%4$u"), - vendor, product, bus, device); - } else { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Multiple USB devices for %1$x:%2$x, use =
to specify one"), - vendor, product); - } + if (rc !=3D 1 && autoAddress && device) { + VIR_INFO("USB device could not be found at previous address " + "(bus:%u device:%u)", bus, device); + + /* Second attempt, for when the device number has changed. */ + flags &=3D ~((unsigned int) USB_DEVICE_FIND_BY_DEVICE); + usbsrc->device =3D 0; + + rc =3D virHostdevFindUSBDeviceWithFlags(hostdev, mandatory, + flags, usb); + if (rc < 0) return -1; - } =20 - *usb =3D virUSBDeviceListGet(devs, 0); - virUSBDeviceListSteal(devs, *usb); + usbsrc->autoAddress =3D true; + } =20 + if (!*usb) { + hostdev->missing =3D true; + } else if (!usbsrc->bus || !usbsrc->device) { usbsrc->bus =3D virUSBDeviceGetBus(*usb); usbsrc->device =3D virUSBDeviceGetDevno(*usb); - usbsrc->autoAddress =3D true; - - if (autoAddress) { - VIR_INFO("USB device %x:%x found at bus:%u device:%u (moved" - " from bus:%u device:%u)", - vendor, product, - usbsrc->bus, usbsrc->device, - bus, device); - } - } else if (bus) { - if (virUSBDeviceFindByBus(bus, device, NULL, mandatory, usb) < 0) - return -1; } =20 - out: - if (!*usb) - hostdev->missing =3D true; return 0; } =20 diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a8ebf9efd8..cd7d00674f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3679,8 +3679,6 @@ virURIResolveAlias; # util/virusb.h virUSBDeviceFileIterate; virUSBDeviceFind; -virUSBDeviceFindByBus; -virUSBDeviceFindByVendor; virUSBDeviceFree; virUSBDeviceGetBus; virUSBDeviceGetDevno; diff --git a/src/util/virusb.c b/src/util/virusb.c index cf3461f80a..8aca190c4c 100644 --- a/src/util/virusb.c +++ b/src/util/virusb.c @@ -61,12 +61,6 @@ struct _virUSBDeviceList { virUSBDevice **devs; }; =20 -typedef enum { - USB_DEVICE_ALL =3D 0, - USB_DEVICE_FIND_BY_VENDOR =3D 1 << 0, - USB_DEVICE_FIND_BY_BUS =3D 1 << 1, -} virUSBDeviceFindFlags; - static virClass *virUSBDeviceListClass; =20 static void virUSBDeviceListDispose(void *obj); @@ -102,11 +96,27 @@ static int virUSBSysReadFile(const char *f_name, const= char *d_name, return 0; } =20 +static int virUSBSysReadFileStr(const char *f_name, const char *d_name, + char **value) +{ + char *buf =3D NULL; + g_autofree char *filename =3D NULL; + + filename =3D g_strdup_printf(USB_SYSFS "/devices/%s/%s", d_name, f_nam= e); + + if (virFileReadAll(filename, 1024, &buf) < 0) + return -1; + + *value =3D buf; + return 0; +} + static virUSBDeviceList * virUSBDeviceSearch(unsigned int vendor, unsigned int product, unsigned int bus, unsigned int devno, + const char *port, const char *vroot, unsigned int flags) { @@ -127,6 +137,8 @@ virUSBDeviceSearch(unsigned int vendor, =20 while ((direrr =3D virDirRead(dir, &de, USB_SYSFS "/devices")) > 0) { unsigned int found_prod, found_vend, found_bus, found_devno; + char *found_port; + bool port_matches; char *tmpstr =3D de->d_name; =20 if (strchr(de->d_name, ':')) @@ -154,16 +166,32 @@ virUSBDeviceSearch(unsigned int vendor, 10, &found_devno) < 0) goto cleanup; =20 - if ((flags & USB_DEVICE_FIND_BY_VENDOR) && - (found_prod !=3D product || found_vend !=3D vendor)) - continue; + if (virUSBSysReadFileStr("devpath", de->d_name, + &found_port) < 0) { + goto cleanup; + } else { + found_port[strlen(found_port) - 1] =3D '\0'; /* remove newline= */ + port_matches =3D STREQ_NULLABLE(found_port, port); + VIR_FREE(found_port); + } =20 - if (flags & USB_DEVICE_FIND_BY_BUS) { + if (flags & USB_DEVICE_FIND_BY_VENDOR) { + if (found_prod !=3D product || found_vend !=3D vendor) + continue; + } + + if (flags & USB_DEVICE_FIND_BY_DEVICE) { if (found_bus !=3D bus || found_devno !=3D devno) continue; found =3D true; } =20 + if (flags & USB_DEVICE_FIND_BY_PORT) { + if (found_bus !=3D bus || !port_matches) + continue; + found =3D true; + } + usb =3D virUSBDeviceNew(found_bus, found_devno, vroot); =20 if (!usb) @@ -186,36 +214,38 @@ virUSBDeviceSearch(unsigned int vendor, } =20 int -virUSBDeviceFindByVendor(unsigned int vendor, - unsigned int product, - const char *vroot, - bool mandatory, - virUSBDeviceList **devices) +virUSBDeviceFind(unsigned int vendor, + unsigned int product, + unsigned int bus, + unsigned int devno, + const char *port, + const char *vroot, + bool mandatory, + unsigned int flags, + virUSBDeviceList **devices) { virUSBDeviceList *list; int count; =20 - if (!(list =3D virUSBDeviceSearch(vendor, product, 0, 0, - vroot, - USB_DEVICE_FIND_BY_VENDOR))) + if (!(list =3D virUSBDeviceSearch(vendor, product, bus, devno, port, + vroot, flags))) return -1; =20 - if (list->count =3D=3D 0) { + count =3D list->count; + if (count =3D=3D 0) { virObjectUnref(list); if (!mandatory) { - VIR_DEBUG("Did not find USB device %04x:%04x", - vendor, product); if (devices) *devices =3D NULL; return 0; } =20 virReportError(VIR_ERR_INTERNAL_ERROR, - _("Did not find USB device %1$04x:%2$04x"), vendor,= product); + _("Did not find matching USB device: vid:%1$04x, pid:%2$04x, b= us:%3$u, device:%4$u, port:%5$s"), + vendor, product, bus, devno, port ? port : ""); return -1; } =20 - count =3D list->count; if (devices) *devices =3D list; else @@ -224,86 +254,6 @@ virUSBDeviceFindByVendor(unsigned int vendor, return count; } =20 -int -virUSBDeviceFindByBus(unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - virUSBDevice **usb) -{ - virUSBDeviceList *list; - - if (!(list =3D virUSBDeviceSearch(0, 0, bus, devno, - vroot, - USB_DEVICE_FIND_BY_BUS))) - return -1; - - if (list->count =3D=3D 0) { - virObjectUnref(list); - if (!mandatory) { - VIR_DEBUG("Did not find USB device bus:%u device:%u", - bus, devno); - if (usb) - *usb =3D NULL; - return 0; - } - - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Did not find USB device bus:%1$u device:%2$u"), - bus, devno); - return -1; - } - - if (usb) { - *usb =3D virUSBDeviceListGet(list, 0); - virUSBDeviceListSteal(list, *usb); - } - virObjectUnref(list); - - return 0; -} - -int -virUSBDeviceFind(unsigned int vendor, - unsigned int product, - unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - virUSBDevice **usb) -{ - virUSBDeviceList *list; - - unsigned int flags =3D USB_DEVICE_FIND_BY_VENDOR|USB_DEVICE_FIND_BY_BU= S; - if (!(list =3D virUSBDeviceSearch(vendor, product, bus, devno, - vroot, flags))) - return -1; - - if (list->count =3D=3D 0) { - virObjectUnref(list); - if (!mandatory) { - VIR_DEBUG("Did not find USB device %04x:%04x bus:%u device:%u", - vendor, product, bus, devno); - if (usb) - *usb =3D NULL; - return 0; - } - - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Did not find USB device %1$04x:%2$04x bus:%3$u d= evice:%4$u"), - vendor, product, bus, devno); - return -1; - } - - if (usb) { - *usb =3D virUSBDeviceListGet(list, 0); - virUSBDeviceListSteal(list, *usb); - } - virObjectUnref(list); - - return 0; -} - virUSBDevice * virUSBDeviceNew(unsigned int bus, unsigned int devno, diff --git a/src/util/virusb.h b/src/util/virusb.h index d2b3f69942..cfd1ad51cc 100644 --- a/src/util/virusb.h +++ b/src/util/virusb.h @@ -30,30 +30,26 @@ typedef struct _virUSBDeviceList virUSBDeviceList; =20 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virUSBDeviceList, virObjectUnref); =20 +typedef enum { + USB_DEVICE_ALL =3D 0, + USB_DEVICE_FIND_BY_VENDOR =3D 1 << 0, + USB_DEVICE_FIND_BY_DEVICE =3D 1 << 1, + USB_DEVICE_FIND_BY_PORT =3D 1 << 2, +} virUSBDeviceFindFlags; =20 virUSBDevice *virUSBDeviceNew(unsigned int bus, unsigned int devno, const char *vroot); =20 -int virUSBDeviceFindByBus(unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - virUSBDevice **usb); - -int virUSBDeviceFindByVendor(unsigned int vendor, - unsigned int product, - const char *vroot, - bool mandatory, - virUSBDeviceList **devices); - int virUSBDeviceFind(unsigned int vendor, - unsigned int product, - unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - virUSBDevice **usb); + unsigned int product, + unsigned int bus, + unsigned int devno, + const char *port, + const char *vroot, + bool mandatory, + unsigned int flags, + virUSBDeviceList **devices); =20 void virUSBDeviceFree(virUSBDevice *dev); int virUSBDeviceSetUsedBy(virUSBDevice *dev, diff --git a/tests/virusbtest.c b/tests/virusbtest.c index 870e136321..62b7b8bc29 100644 --- a/tests/virusbtest.c +++ b/tests/virusbtest.c @@ -26,9 +26,11 @@ #define VIR_FROM_THIS VIR_FROM_NONE =20 typedef enum { - FIND_BY_ALL, FIND_BY_VENDOR, - FIND_BY_BUS + FIND_BY_DEVICE, + FIND_BY_PORT, + FIND_BY_VENDOR_AND_DEVICE, + FIND_BY_VENDOR_AND_PORT } testUSBFindFlags; =20 struct findTestInfo { @@ -37,6 +39,7 @@ struct findTestInfo { unsigned int product; unsigned int bus; unsigned int devno; + const char *port; const char *vroot; bool mandatory; int how; @@ -70,25 +73,34 @@ static int testDeviceFind(const void *opaque) g_autoptr(virUSBDeviceList) devs =3D NULL; int rv =3D 0; size_t i, ndevs =3D 0; + unsigned int flags =3D 0; =20 switch (info->how) { - case FIND_BY_ALL: - rv =3D virUSBDeviceFind(info->vendor, info->product, - info->bus, info->devno, - info->vroot, info->mandatory, &dev); - break; case FIND_BY_VENDOR: - rv =3D virUSBDeviceFindByVendor(info->vendor, info->product, - info->vroot, info->mandatory, &devs); + flags =3D USB_DEVICE_FIND_BY_VENDOR; + break; + case FIND_BY_DEVICE: + flags =3D USB_DEVICE_FIND_BY_DEVICE; + break; + case FIND_BY_PORT: + flags =3D USB_DEVICE_FIND_BY_PORT; break; - case FIND_BY_BUS: - rv =3D virUSBDeviceFindByBus(info->bus, info->devno, - info->vroot, info->mandatory, &dev); + case FIND_BY_VENDOR_AND_DEVICE: + flags =3D USB_DEVICE_FIND_BY_VENDOR | + USB_DEVICE_FIND_BY_DEVICE; + break; + case FIND_BY_VENDOR_AND_PORT: + flags =3D USB_DEVICE_FIND_BY_VENDOR | + USB_DEVICE_FIND_BY_PORT; break; } =20 + rv =3D virUSBDeviceFind(info->vendor, info->product, + info->bus, info->devno, info->port, + info->vroot, info->mandatory, flags, &devs); + if (info->expectFailure) { - if (rv =3D=3D 0) { + if (rv >=3D 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "unexpected success"); } else { @@ -99,9 +111,20 @@ static int testDeviceFind(const void *opaque) goto cleanup; } =20 + if (info->how !=3D FIND_BY_VENDOR) { + if (rv =3D=3D 1) { + dev =3D virUSBDeviceListGet(devs, 0); + virUSBDeviceListSteal(devs, dev); + } else { + goto cleanup; + } + } + switch (info->how) { - case FIND_BY_ALL: - case FIND_BY_BUS: + case FIND_BY_DEVICE: + case FIND_BY_PORT: + case FIND_BY_VENDOR_AND_DEVICE: + case FIND_BY_VENDOR_AND_PORT: if (virUSBDeviceFileIterate(dev, testDeviceFileActor, NULL) < 0) goto cleanup; break; @@ -146,14 +169,17 @@ testUSBList(const void *opaque G_GNUC_UNUSED) virUSBDeviceList *list =3D NULL; virUSBDeviceList *devlist =3D NULL; virUSBDevice *dev =3D NULL; + virUSBDeviceList *devs =3D NULL; int ret =3D -1; + int rv; size_t i, ndevs; =20 if (!(list =3D virUSBDeviceListNew())) goto cleanup; =20 #define EXPECTED_NDEVS_ONE 3 - if (virUSBDeviceFindByVendor(0x1d6b, 0x0002, NULL, true, &devlist) < 0) + if (virUSBDeviceFind(0x1d6b, 0x0002, 0, 0, NULL, NULL, true, + USB_DEVICE_FIND_BY_VENDOR, &devlist) < 0) goto cleanup; =20 ndevs =3D virUSBDeviceListCount(devlist); @@ -176,7 +202,8 @@ testUSBList(const void *opaque G_GNUC_UNUSED) goto cleanup; =20 #define EXPECTED_NDEVS_TWO 3 - if (virUSBDeviceFindByVendor(0x18d1, 0x4e22, NULL, true, &devlist) < 0) + if (virUSBDeviceFind(0x18d1, 0x4e22, 0, 0, NULL, NULL, true, + USB_DEVICE_FIND_BY_VENDOR, &devlist) < 0) goto cleanup; =20 ndevs =3D virUSBDeviceListCount(devlist); @@ -196,8 +223,16 @@ testUSBList(const void *opaque G_GNUC_UNUSED) EXPECTED_NDEVS_ONE + EXPECTED_NDEVS_TWO) < 0) goto cleanup; =20 - if (virUSBDeviceFind(0x18d1, 0x4e22, 1, 20, NULL, true, &dev) < 0) + rv =3D virUSBDeviceFind(0x18d1, 0x4e22, 1, 20, NULL, NULL, true, + USB_DEVICE_FIND_BY_VENDOR | + USB_DEVICE_FIND_BY_DEVICE, &devs); + if (rv !=3D 1) { goto cleanup; + } else { + dev =3D virUSBDeviceListGet(devs, 0); + virUSBDeviceListSteal(devs, dev); + } + virObjectUnref(devs); =20 if (!virUSBDeviceListFind(list, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -229,49 +264,75 @@ mymain(void) { int rv =3D 0; =20 -#define DO_TEST_FIND_FULL(name, vend, prod, bus, devno, vroot, mand, how, = fail) \ +#define DO_TEST_FIND_FULL(name, vend, prod, bus, devno, \ + port, vroot, mand, how, fail) \ do { \ struct findTestInfo data =3D { name, vend, prod, bus, \ - devno, vroot, mand, how, fail \ + devno, port, vroot, mand, how, fail \ }; \ if (virTestRun("USBDeviceFind " name, testDeviceFind, &data) < 0) \ rv =3D -1; \ } while (0) =20 -#define DO_TEST_FIND(name, vend, prod, bus, devno) \ - DO_TEST_FIND_FULL(name, vend, prod, bus, devno, NULL, true, \ - FIND_BY_ALL, false) -#define DO_TEST_FIND_FAIL(name, vend, prod, bus, devno) \ - DO_TEST_FIND_FULL(name, vend, prod, bus, devno, NULL, true, \ - FIND_BY_ALL, true) - -#define DO_TEST_FIND_BY_BUS(name, bus, devno) \ - DO_TEST_FIND_FULL(name, 101, 202, bus, devno, NULL, true, \ - FIND_BY_BUS, false) -#define DO_TEST_FIND_BY_BUS_FAIL(name, bus, devno) \ - DO_TEST_FIND_FULL(name, 101, 202, bus, devno, NULL, true, \ - FIND_BY_BUS, true) - #define DO_TEST_FIND_BY_VENDOR(name, vend, prod) \ - DO_TEST_FIND_FULL(name, vend, prod, 123, 456, NULL, true, \ + DO_TEST_FIND_FULL(name, vend, prod, 123, 456, NULL, NULL, true, \ FIND_BY_VENDOR, false) #define DO_TEST_FIND_BY_VENDOR_FAIL(name, vend, prod) \ - DO_TEST_FIND_FULL(name, vend, prod, 123, 456, NULL, true, \ + DO_TEST_FIND_FULL(name, vend, prod, 123, 456, NULL, NULL, true, \ FIND_BY_VENDOR, true) =20 - DO_TEST_FIND("Nexus", 0x18d1, 0x4e22, 1, 20); - DO_TEST_FIND_FAIL("Nexus wrong devnum", 0x18d1, 0x4e22, 1, 25); - DO_TEST_FIND_FAIL("Bogus", 0xf00d, 0xbeef, 1024, 768); - - DO_TEST_FIND_BY_BUS("integrated camera", 1, 5); - DO_TEST_FIND_BY_BUS_FAIL("wrong bus/devno combination", 2, 20); - DO_TEST_FIND_BY_BUS_FAIL("missing bus", 5, 20); - DO_TEST_FIND_BY_BUS_FAIL("missing devnum", 1, 158); +#define DO_TEST_FIND_BY_DEVICE(name, bus, devno) \ + DO_TEST_FIND_FULL(name, 0x1010, 0x2020, bus, devno, NULL, NULL, true, \ + FIND_BY_DEVICE, false) +#define DO_TEST_FIND_BY_DEVICE_FAIL(name, bus, devno) \ + DO_TEST_FIND_FULL(name, 0x1010, 0x2020, bus, devno, NULL, NULL, true, \ + FIND_BY_DEVICE, true) + +#define DO_TEST_FIND_BY_PORT(name, bus, port) \ + DO_TEST_FIND_FULL(name, 0x1010, 0x2020, bus, 456, port, NULL, true, \ + FIND_BY_PORT, false) +#define DO_TEST_FIND_BY_PORT_FAIL(name, bus, port) \ + DO_TEST_FIND_FULL(name, 0x1010, 0x2020, bus, 456, port, NULL, true, \ + FIND_BY_PORT, true) + +#define DO_TEST_FIND_BY_VENDOR_AND_DEVICE(name, vend, prod, bus, devno) \ + DO_TEST_FIND_FULL(name, vend, prod, bus, devno, NULL, NULL, true, \ + FIND_BY_VENDOR_AND_DEVICE, false) +#define DO_TEST_FIND_BY_VENDOR_AND_DEVICE_FAIL(name, vend, prod, bus, devn= o) \ + DO_TEST_FIND_FULL(name, vend, prod, bus, devno, NULL, NULL, true, \ + FIND_BY_VENDOR_AND_DEVICE, true) + +#define DO_TEST_FIND_BY_VENDOR_AND_PORT(name, vend, prod, bus, port) \ + DO_TEST_FIND_FULL(name, vend, prod, bus, 456, port, NULL, true, \ + FIND_BY_VENDOR_AND_PORT, false) +#define DO_TEST_FIND_BY_VENDOR_AND_PORT_FAIL(name, vend, prod, bus, port) \ + DO_TEST_FIND_FULL(name, vend, prod, bus, 456, port, NULL, true, \ + FIND_BY_VENDOR_AND_PORT, true) + + DO_TEST_FIND_BY_DEVICE("integrated camera", 1, 5); + DO_TEST_FIND_BY_DEVICE_FAIL("wrong bus/devno combination", 2, 20); + DO_TEST_FIND_BY_DEVICE_FAIL("missing bus", 5, 20); + DO_TEST_FIND_BY_DEVICE_FAIL("missing devnum", 1, 158); =20 DO_TEST_FIND_BY_VENDOR("Nexus (multiple results)", 0x18d1, 0x4e22); DO_TEST_FIND_BY_VENDOR_FAIL("Bogus vendor and product", 0xf00d, 0xbeef= ); DO_TEST_FIND_BY_VENDOR_FAIL("Valid vendor", 0x1d6b, 0xbeef); =20 + DO_TEST_FIND_BY_PORT("Logitech mouse", 1, "1.5.3.3"); + DO_TEST_FIND_BY_PORT_FAIL("wrong bus/port combination", 2, "1.5.3.3"); + DO_TEST_FIND_BY_PORT_FAIL("missing bus", 5, "1.5.3.3"); + DO_TEST_FIND_BY_PORT_FAIL("missing port", 1, "8.2.5"); + + DO_TEST_FIND_BY_VENDOR_AND_DEVICE("Nexus", 0x18d1, 0x4e22, 1, 20); + DO_TEST_FIND_BY_VENDOR_AND_DEVICE_FAIL("Bogus vendor and product", 0xf= 00d, 0xbeef, 1, 25); + DO_TEST_FIND_BY_VENDOR_AND_DEVICE_FAIL("Nexus wrong devnum", 0x18d1, 0= x4e22, 1, 25); + DO_TEST_FIND_BY_VENDOR_AND_DEVICE_FAIL("Bogus", 0xf00d, 0xbeef, 1024, = 768); + + DO_TEST_FIND_BY_VENDOR_AND_PORT("Nexus", 0x046d, 0xc069, 1, "1.5.3.3"); + DO_TEST_FIND_BY_VENDOR_AND_PORT_FAIL("Bogus vendor and product", 0xf00= d, 0xbeef, 1, "1.5.3.3"); + DO_TEST_FIND_BY_VENDOR_AND_PORT_FAIL("Nexus wrong port", 0x18d1, 0x4e2= 2, 1, "8.2.5"); + DO_TEST_FIND_BY_VENDOR_AND_PORT_FAIL("Bogus", 0xf00d, 0xbeef, 1024, "1= .1.1.1"); + if (virTestRun("USB List test", testUSBList, NULL) < 0) rv =3D -1; =20 --=20 2.39.5 From nobody Thu Apr 16 00:35:40 2026 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=1745264370; cv=none; d=zohomail.com; s=zohoarc; b=lbIpi7wfEFOsatf+Hw5OJzw+yo81puKK2v6oeBiXMWXk8RZrJ/S7twX1um6QZClbWl6Lveq5qIOvZyXeAZqWw5d1qGYyvusuepsNiD/NOzIJXtjHnTwoWDnuPYErh8JAywKL/WlsC/b6EAlAzbk0K85bhrbicV0kPQFN3MwYHAM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745264370; 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=xwruTXCb+iVzbinXWWbgNySHFeR0uia1PfG1Srn51/M=; b=mT5K6MVht7X5vDIqdHJkWjQsAJg5QVv1/Tf/HePG0UuQkZhKF013fxmE2GVm0zF7urmu+pJSO9MGoCKcTy7PUUSMTg3QIf0f22nYv+5R84lm8Xujt3zxMC4NoKKF878zSlMyqeS+SMKp3M47vO4vfLto5KuLf6LzXKM6g4e0Vv0= 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 1745264370953792.140875161218; Mon, 21 Apr 2025 12:39:30 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 07D64CAA; Mon, 21 Apr 2025 15:39:29 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 18152CDC; Mon, 21 Apr 2025 15:39:05 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D9D27C9B; Mon, 21 Apr 2025 15:38:58 -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 9E8ABC93 for ; Mon, 21 Apr 2025 15:38:48 -0400 (EDT) Received: from cu-host.fritz.box ([185.17.205.183]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MUXpK-1uXS3b1wAK-00ORf0; Mon, 21 Apr 2025 21:38:47 +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=1745264327; x=1745869127; i=maximilian_martin@gmx.de; bh=xwruTXCb+iVzbinXWWbgNySHFeR0uia1PfG1Srn51/M=; 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=R+2jrvLtHGxoKKOT8Uy4KcXUsXzhs3NM7AKbsTbXqNphwbGDq3QU2bPaLxd+RTxQ EXQdMfOZhNFgpuBMzOFjIOJ0aSumpk8vwuwo+NgK3BowrV/a7m6MGgXd+zHSGwc3s 4rhZXtNzX/hNnN8VtKjLl6Py7FMX2U1Pdtbb7UXIK7uCfT93TaMJQDtl/9oPTK5U9 5wwC/3rai4IARXZkLOohHRUaK3ZBqwsN3kF5yu3m0NOaakHtXjusr6iFsNUfxivxU Zg7nSHmKFbRo66OTUMZe0zUHyeUmgcqyABNlHUzW1z/Xf3+X4UCGdW3K18XYz6ChW Kyp13ZjDv74QjHAPhQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a To: devel@lists.libvirt.org Subject: [PATCH 3/4] schema: add USB port attribute Date: Mon, 21 Apr 2025 21:38:37 +0200 Message-Id: <20250421193838.1934-4-maximilian_martin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250421193838.1934-1-maximilian_martin@gmx.de> References: <20250421193838.1934-1-maximilian_martin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:gEJJ8DgRewX6u+o0af421nHrwuOMBuVpRRqM552mENRZ78o3gz1 /i5TnywjjavL8/nD+TtIDIzVrsR8/wJ57ygoupzaauQfh8DoeZ3aqOMv1Mhz+AsMGZuOqT1 aFdFRlvgHV0pW2UXNo8ygxOe1QBErCqQmvAO1QQAa7fo+FmPNJBq5vS1j+HGLtYsIY1H1RX Y4I0qTniUEA8LElgsny9g== UI-OutboundReport: notjunk:1;M01:P0:nmQ1S7vpJlg=;qFmjjcM/mEAe8WL3aF/bnmKv1uy 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 Message-ID-Hash: AOFBNCXCGUQR52IQGFUBLX4FZ3F3IXBI X-Message-ID-Hash: AOFBNCXCGUQR52IQGFUBLX4FZ3F3IXBI 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: 1745264372196019100 Content-Type: text/plain; charset="utf-8" From: Maximilian Martin Adds USB bus/port addressing the domain XML file schema. Optionally, the physical USB port can be declared instead of the USB device address. Signed-off-by: Maximilian Martin --- src/conf/schemas/domaincommon.rng | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 5597d5a66b..da6cf69efb 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6709,9 +6709,14 @@ - - - + + + + + + + + --=20 2.39.5 From nobody Thu Apr 16 00:35:40 2026 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=1745264538; cv=none; d=zohomail.com; s=zohoarc; b=I5FVAOU5iZmAGHPfNm+hwV71WDYqA35Merm87El3PukLrIll/BTaehP62K7jUMDb3UO81avL8WMf6c93s1TFY7d+RnVOBXfDqkm5cEWX0E76c9uYTii1p6ndvpCMhiJUXurzjy6ZabTLp0KQxWl6io+Kzmg0znR+VsmoWKcxsFU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745264538; 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=QOR4o/PDBh2tGXp1SOadH+BLLl+Kp3nPWs5VXq6ed5o=; b=ikrCs3BZyvRQmKJoYTui/OJctSQMqP+GQhoLgDICGRAXPZNSDSEcAACkJSFtoFUQHsD3a00IzVc4JydTORzXE/p5yxX6xIj9ZJsauF+lRfFVqXI1Ctbdvd/CdQKYRZO4CnQJD+kaNTHrBUdN3DPnw8yQyOUaln0vIeuI+xaaVnE= 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 174526453790472.28326053426838; Mon, 21 Apr 2025 12:42:17 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D2482A77; Mon, 21 Apr 2025 15:42:16 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A225711E2; Mon, 21 Apr 2025 15:39:15 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 475A4CAA; Mon, 21 Apr 2025 15:39:09 -0400 (EDT) Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (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 653DF1182 for ; Mon, 21 Apr 2025 15:38:55 -0400 (EDT) Received: from cu-host.fritz.box ([185.17.205.183]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MeCtZ-1ued6V2S0d-00qWRJ; Mon, 21 Apr 2025 21:38:48 +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_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=1745264328; x=1745869128; i=maximilian_martin@gmx.de; bh=QOR4o/PDBh2tGXp1SOadH+BLLl+Kp3nPWs5VXq6ed5o=; 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=MqNVvffeHUagWbKv+N/OvE+SaK6mF1ag2LYlwulYzIT5KLzfWA4cENvYyaxR11U7 SGL1R6nhWcTf7HLNzz72E8PY9A9hIXuw6ua3QZjdrUiuKE2Fum1cKBGN3qeb2IFWm tvy2Eh5lQVqU6qoX38R7axdSL/w8uH+dkmA9XyNUWjSmAxUKSkqHpJ6a9fuJBz6H0 lfOJrg/Cn0IBiU6gRSaipvpvLD0SoHAIDdj/wbQh7XURUO6JK1kWW1myr5tmRMpx4 7QhA6S2pRm8xe01G43SHVYwmqM2Pvh+nT/Clnyc/gU0yLNLgdzXvHPsgbik3AMrLf er6ipQqbqAk7tkxznw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a To: devel@lists.libvirt.org Subject: [PATCH 4/4] docs: add description for USB port matching Date: Mon, 21 Apr 2025 21:38:38 +0200 Message-Id: <20250421193838.1934-5-maximilian_martin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250421193838.1934-1-maximilian_martin@gmx.de> References: <20250421193838.1934-1-maximilian_martin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Sb45b9yFc1M/pV+udvugUXccdOhqcWDpx9ZkFKu+KEP3H+SZ0ml AStlwd2tJV0wUGcwV1HRe/3UrDFmlzCkyqNW8Xcoznf6rTNDtHcuVcbXnSG87OOxaDyypmy a8pY9i0EnKzVpzp58lWIkM2mlbTZKeru8cbU9yh6tJGp7KK1XAerduQcRTTroj5KsE7Nuix omEIm7Zd9+SFcZxDSmMYw== UI-OutboundReport: notjunk:1;M01:P0:vuHa6qec2kM=;p2DzfTGpXtGBrd7sQVvodOg2UFx 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 A== Message-ID-Hash: AJMP2QDWQ6LFAZU4S45XIO7JO4KQAZIE X-Message-ID-Hash: AJMP2QDWQ6LFAZU4S45XIO7JO4KQAZIE 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: 1745264540266019100 Content-Type: text/plain; charset="utf-8" From: Maximilian Martin Adds documentation for the new USB bus/port addressing. The new "port" attribute is explained. Signed-off-by: Maximilian Martin --- docs/formatdomain.rst | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index c7c75ae219..3cc0bb0533 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -4784,19 +4784,22 @@ or: tweak the loading process further using the ``bar`` or ``file`` attribu= tes will be rejected. :since:`Since 4.3.0 (QEMU and KVM only)`. ``address`` - The ``address`` element for USB devices has a ``bus`` and ``device`` - attribute to specify the USB bus and device number the device appears a= t on - the host. The values of these attributes can be given in decimal, hexad= ecimal - (starting with 0x) or octal (starting with 0) form. For PCI devices the - element carries 4 attributes allowing to designate the device as can be= found - with the ``lspci`` or with ``virsh nodedev-list``. For SCSI devices a '= drive' - address type must be used. For mediated devices, which are software-only - devices defining an allocation of resources on the physical parent devi= ce, - the address type used must conform to the ``model`` attribute of element - ``hostdev``, e.g. any address type other than PCI for ``vfio-pci`` devi= ce API - or any address type other than CCW for ``vfio-ccw`` device API will res= ult in - an error. See the `Device Addresses`_ section for more details on the a= ddress - element. + The ``address`` element for USB devices has a ``bus`` attribute to spec= ify + the USB bus. In addition, either a ``device`` attribute or a ``port`` + attribute is required to identify the device on the host. While the dev= ice + number is assigned upon connection of the device, the port number is a + stable identifier of the physical host port. Bus and device number can = be + given in decimal, hexadecimal (starting with 0x) or octal (starting wit= h 0) + form. The port number is a dotted path (examples: ``2``, ``1.2.5``). Fo= r PCI + devices the element carries 4 attributes allowing to designate the devi= ce as + can be found with the ``lspci`` or with ``virsh nodedev-list``. For SCSI + devices a 'drive' address type must be used. For mediated devices, whic= h are + software-only devices defining an allocation of resources on the physic= al + parent device, the address type used must conform to the ``model`` attr= ibute + of element ``hostdev``, e.g. any address type other than PCI for ``vfio= -pci`` + device API or any address type other than CCW for ``vfio-ccw`` device A= PI + will result in an error. See the `Device Addresses`_ section for more d= etails + on the address element. ``driver`` PCI hostdev devices can have an optional ``driver`` subelement that specifies which host driver to bind to the device when preparing it --=20 2.39.5