From: Maximilian Martin <maximilian_mar...@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_mar...@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