From: Maximilian Martin <maximilian_martin@gmx.de>
This adds the physical USB port to the capabilities of a
USB device in nodedev XML.
example: <port>1.4</port>
Signed-off-by: Maximilian Martin <maximilian_martin@gmx.de>
---
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, "<bus>%d</bus>\n", data->usb_dev.bus);
virBufferAsprintf(buf, "<device>%d</device>\n",
data->usb_dev.device);
+ if (data->usb_dev.port)
+ virBufferEscapeString(buf, "<port>%s</port>\n",
+ data->usb_dev.port);
virBufferAsprintf(buf, "<product id='0x%04x'",
data->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 2931e316b7..7d0361b413 100644
--- a/src/conf/schemas/basictypes.rng
+++ b/src/conf/schemas/basictypes.rng
@@ -378,6 +378,37 @@
</choice>
</define>
+ <define name="usbIdDefault">
+ <data type="string">
+ <param name="pattern">-1</param>
+ </data>
+ </define>
+ <define name="usbId">
+ <data type="string">
+ <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
+ </data>
+ </define>
+ <define name="usbVersion">
+ <data type="string">
+ <param name="pattern">[0-9]{1,2}.[0-9]{1,2}</param>
+ </data>
+ </define>
+ <define name="usbAddr">
+ <data type="string">
+ <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
+ </data>
+ </define>
+ <define name="usbClass">
+ <data type="string">
+ <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
+ </data>
+ </define>
+ <define name="usbPort">
+ <data type="string">
+ <param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
+ </data>
+ </define>
+
<define name="wwn">
<data type="string">
<param name="pattern">(0x)?[0-9a-fA-F]{16}</param>
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 438bdc6ef6..ee91bf7133 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -8686,36 +8686,6 @@
<ref name="dnsName"/>
</choice>
</define>
- <define name="usbIdDefault">
- <data type="string">
- <param name="pattern">-1</param>
- </data>
- </define>
- <define name="usbId">
- <data type="string">
- <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
- </data>
- </define>
- <define name="usbVersion">
- <data type="string">
- <param name="pattern">[0-9]{1,2}.[0-9]{1,2}</param>
- </data>
- </define>
- <define name="usbAddr">
- <data type="string">
- <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
- </data>
- </define>
- <define name="usbClass">
- <data type="string">
- <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
- </data>
- </define>
- <define name="usbPort">
- <data type="string">
- <param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
- </data>
- </define>
<define name="driveController">
<data type="string">
<param name="pattern">[0-9]{1,2}</param>
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 @@
<element name="device">
<ref name="unsignedLong"/>
</element>
+ <element name="port">
+ <ref name="unsignedLong"/>
+ </element>
<element name="product">
<attribute name="id">
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_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);
+ }
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 @@
<capability type='usb_device'>
<bus>2</bus>
<device>1</device>
+ <port>3</port>
<product id='0x0001'>1.1 root hub</product>
<vendor id='0x1d6b'>Linux Foundation</vendor>
</capability>
--
2.39.5
© 2016 - 2025 Red Hat, Inc.