
On 23/06/16 09:45, Ján Tomko wrote:
A new type to track USB addresses.
Every <controller type='usb' index='i'/> is represented by as a virDomainUSBAddressHub at buses[i].
"represented by as..", I'd say something like "is represented by an object of type virDomainUSBAddressHub where each of such objects can be located at buses[i]" or something similar...
Each of these hubs has up to 'nports' ports. If a port is occupied, it has the corresponding bit set in the 'ports' bitmap, e.g. port 1 would have the 0th bit set. If there is a hub on this port, then hubs[i] will point to this hub. --- src/conf/domain_addr.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_addr.h | 22 ++++++++++++++++++++++ src/libvirt_private.syms | 2 ++ 3 files changed, 70 insertions(+)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 1f5193c..a43657b 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -1277,3 +1277,49 @@ virDomainUSBAddressPortFormat(unsigned int *port) return NULL; return virBufferContentAndReset(&buf); } + + +virDomainUSBAddressSetPtr +virDomainUSBAddressSetCreate(void) +{ + virDomainUSBAddressSetPtr addrs; + + if (VIR_ALLOC(addrs) < 0) + return NULL; + + return addrs; +} + + +static void +virDomainUSBAddressHubFree(virDomainUSBAddressHubPtr hub) +{ + size_t i; + + if (!hub) + return; + + for (i = 0; i < hub->nports; i++) { + if (hub->hubs[i]) + virDomainUSBAddressHubFree(hub->hubs[i]); + } + virBitmapFree(hub->ports); + VIR_FREE(hub); +} + + +void +virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs) +{ + size_t i; + + if (!addrs) + return; + + for (i = 0; i < addrs->nbuses; i++) { + if (addrs->buses[i]) + virDomainUSBAddressHubFree(addrs->buses[i]); + } + VIR_FREE(addrs->buses); + VIR_FREE(addrs); +} diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 8efd512..51bbb61 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -245,4 +245,26 @@ char * virDomainUSBAddressPortFormat(unsigned int *port) ATTRIBUTE_NONNULL(1);
+typedef struct _virDomainUSBAddressHub virDomainUSBAddressHub; +typedef virDomainUSBAddressHub *virDomainUSBAddressHubPtr; +struct _virDomainUSBAddressHub { + /* indexes are shifted by one: + * ports[0] represents port 1, because ports are numbered from 1 */ + virBitmapPtr ports; + size_t nports; + virDomainUSBAddressHubPtr *hubs; +}; + +struct _virDomainUSBAddressSet { + /* every <controller type='usb' index='i'> is represented + * as a hub at buses[i] */ + virDomainUSBAddressHubPtr *buses; + size_t nbuses; +};
At first, I wasn't really convinced by the data type name "virDomainUSBAddressSet", but unfortunately I couldn't come up with anything more descriptive, so I guess I'm okay with it.
+typedef struct _virDomainUSBAddressSet virDomainUSBAddressSet; +typedef virDomainUSBAddressSet *virDomainUSBAddressSetPtr; + +virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void); +void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs); + #endif /* __DOMAIN_ADDR_H__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 414d990..9e1bad7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -111,6 +111,8 @@ virDomainPCIAddressValidate; virDomainPCIControllerModelToConnectType; virDomainUSBAddressPortFormat; virDomainUSBAddressPortFormatBuf; +virDomainUSBAddressSetCreate; +virDomainUSBAddressSetFree; virDomainVirtioSerialAddrAssign; virDomainVirtioSerialAddrAutoAssign; virDomainVirtioSerialAddrIsComplete;
ACK Erik