mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
Introduce virDomainUSBAddressSet
A new type to track USB addresses. Every <controller type='usb' index='i'/> is represented by an object of type virDomainUSBAddressHub located at buses[i]. 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.
This commit is contained in:
parent
b999ce97f3
commit
82c142b321
@ -1284,3 +1284,45 @@ 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++)
|
||||
virDomainUSBAddressHubFree(hub->ports[i]);
|
||||
virBitmapFree(hub->portmap);
|
||||
VIR_FREE(hub);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!addrs)
|
||||
return;
|
||||
|
||||
for (i = 0; i < addrs->nbuses; i++)
|
||||
virDomainUSBAddressHubFree(addrs->buses[i]);
|
||||
VIR_FREE(addrs->buses);
|
||||
VIR_FREE(addrs);
|
||||
}
|
||||
|
@ -249,4 +249,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 portmap;
|
||||
size_t nports;
|
||||
virDomainUSBAddressHubPtr *ports;
|
||||
};
|
||||
|
||||
struct _virDomainUSBAddressSet {
|
||||
/* every <controller type='usb' index='i'> is represented
|
||||
* as a hub at buses[i] */
|
||||
virDomainUSBAddressHubPtr *buses;
|
||||
size_t nbuses;
|
||||
};
|
||||
typedef struct _virDomainUSBAddressSet virDomainUSBAddressSet;
|
||||
typedef virDomainUSBAddressSet *virDomainUSBAddressSetPtr;
|
||||
|
||||
virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void);
|
||||
void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
|
||||
|
||||
#endif /* __DOMAIN_ADDR_H__ */
|
||||
|
@ -110,6 +110,8 @@ virDomainPCIControllerModelToConnectType;
|
||||
virDomainUSBAddressPortFormat;
|
||||
virDomainUSBAddressPortFormatBuf;
|
||||
virDomainUSBAddressPortIsValid;
|
||||
virDomainUSBAddressSetCreate;
|
||||
virDomainUSBAddressSetFree;
|
||||
virDomainVirtioSerialAddrAssign;
|
||||
virDomainVirtioSerialAddrAutoAssign;
|
||||
virDomainVirtioSerialAddrIsComplete;
|
||||
|
Loading…
Reference in New Issue
Block a user