On Fri, Jan 08, 2010 at 05:22:58PM +0000, Daniel P. Berrange wrote:
All guest devices now use a common device address structure
summarized by:
enum virDomainDeviceAddressType {
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI,
};
struct _virDomainDevicePCIAddress {
unsigned int domain;
unsigned int bus;
unsigned int slot;
unsigned int function;
};
struct _virDomainDeviceInfo {
int type;
union {
virDomainDevicePCIAddress pci;
} addr;
};
This replaces the anonymous structs in Disk/Net/Hostdev data
structures. Where available, the address is *always* printed
in the XML file, instead of being hidden in the internal state
file.
<address type='pci' domain='0x0000' bus='0x1e'
slot='0x07' function='0x0'/>
The structure definition is based on Wolfgang Mauerer's disk
controller patch series.
* docs/schemas/domain.rng: Define the <address> syntax and
associate it with disk/net/hostdev devices
* src/conf/domain_conf.h, src/conf/domain_conf.c,
src/libvirt_private.syms: APIs for parsing/formatting address
information. Also remove the QEMU specific 'pci_addr' attributes
* src/qemu/qemu_driver.c: Replace use of 'pci_addr' attrs with
new standardized format.
---
docs/schemas/domain.rng | 55 +++++--
src/conf/domain_conf.c | 420 +++++++++++++++++++++++++++++++++-------------
src/conf/domain_conf.h | 84 +++++-----
src/libvirt_private.syms | 6 +
src/qemu/qemu_driver.c | 64 ++++---
5 files changed, 428 insertions(+), 201 deletions(-)
[...]
+int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
+ int type)
+{
+ if (info->type != type)
+ return 0;
+
+ switch (info->type) {
+ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
+ return virDomainDevicePCIAddressIsValid(&info->addr.pci);
+ }
Hum, a switch without default and not handling all cases may generate
a warning with some compiler options (I find this useful when extending
the union) maybe we should explicitely return 0 with _NONE
+static int
+virDomainDevicePCIAddressParseXML(virConnectPtr conn,
+ xmlNodePtr node,
+ virDomainDevicePCIAddressPtr addr)
+{
+ char *domain, *slot, *bus, *function;
+ int ret = -1;
+
+ memset(addr, 0, sizeof(*addr));
+
+ domain = virXMLPropString(node, "domain");
+ bus = virXMLPropString(node, "bus");
+ slot = virXMLPropString(node, "slot");
+ function = virXMLPropString(node, "function");
+
+ if (domain &&
+ virStrToLong_ui(domain, NULL, 16, &addr->domain) < 0) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse <address> 'domain'
attribute"));
+ goto cleanup;
+ }
Hum, there is a small mismatch between the parsing function and the
validation, virStrToLong_ uses strtol like function decoding 0 leading
numbers as octal, but we don't match octal in the Relax-NG associated
functions:
<define name="pciDomain">
<data type="string">
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
</data>
</define>
Do we really intent to allow 0 started octal values ? I guess in octal
we would need more than 4 digit to cover the address range.
But it's a minor point, we could fix the RNG later
ACK, the new routines are nice and the refactoring is a good cleanup !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/