From f0cdc0fca4da6319829359e8eea8d4a85cd44515 Mon Sep 17 00:00:00 2001 From: Maximilian Martin Date: Mon, 18 Aug 2025 16:34:16 +0200 Subject: [PATCH] nodedev: add USB port to nodedev XML MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This adds the physical USB port to the capabilities of a USB device in nodedev XML. example: 1.4 Reviewed-by: Daniel P. Berrangé 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; + usb_dev->port = virXPathString("string(./port[1])", ctxt); usb_dev->vendor_name = virXPathString("string(./vendor[1])", ctxt); usb_dev->product_name = virXPathString("string(./product[1])", ctxt); @@ -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 381e0ac24f..a2ecfd3514 100644 --- a/src/conf/schemas/basictypes.rng +++ b/src/conf/schemas/basictypes.rng @@ -378,6 +378,37 @@ + + + -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/domaincommon.rng index bd6b88b429..bf37c5332c 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -8754,36 +8754,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 @@ + + + diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 20a525bcec..89aca2d4d6 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); + } udevGetStringProperty(device, "ID_VENDOR_FROM_DATABASE", diff --git a/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml b/tests/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 -- 2.47.3