
On 06/11/2012 01:14 PM, Laine Stump wrote:
On 06/11/2012 11:50 AM, Daniel P. Berrange wrote:
On Fri, Jun 08, 2012 at 04:29:14PM +0100, Shradha Shah wrote:
@@ -925,6 +931,44 @@ error: return result; }
+/* Function to compare strings with wildcard strings*/ +/* When editing this function also edit the one in src/network/bridge_driver.c*/ +static int +wildcmp(const char *wild, const char *string) +{ +/* Written by Jack Handy - <A href="mailto:jakkhandy@hotmail.com">jakkhandy@hotmail.com</A>*/ Isn't this just reimplementing the Glibc 'fnmatch' function that we already use ? Beyond that, this is being used to support another case of crowding multiple data items into a single attribute, which we actively discourage (see the current thread about dhcpsnoop :-).
Instead of re-purposing the singular char *dev, it would be better to follow the example of, e.g., virDomainDeviceInfo, and have a union like this:
int type; union { virDomainDevicePCIAddress pci; char *dev; } addr;
or just put both directly in the struct if you might want both to be populated at the same time for some reason (maybe you want to derive all the PCI addresses from the netdev name, or vice versa, and cache them here. Or maybe you don't, I don't have an opinion).
The XML for this would then look something like this:
<network> <name>hostdev-network</name> <forward mode="hostdev"> <interface type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x01'/> <interface type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x02'/> <interface type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x03'/> </forward> </network>
Or maybe, for consistency with source addresses in domain device definitions, it should be:
<network> <name>hostdev-network</name> <forward mode="hostdev"> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x01'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x02'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x03'/> </forward> </network>
Also, about the "managed" attribute you introduced in PATCH 5/5 (which I suggested you should add at the same time as the rest of the new XML): Do you really think anyone will ever want some of the interfaces to be managed='yes' and some managed='no'? If you rework the XML as I suggest above, you would be able to reuse the same function to parse and format pci addresses; if you add a "managed" attribute to each address element, you would no longer be able to do that. Alternately, if you just add a single managed attribute to <forward>, the <address> sub-element would remain identical to the <address> in the domain devices' <source> element, so the parse/format functions could be shared (and the consistency would also make mixups less likely). Something like this: <network> <name>hostdev-network</name> <forward mode="hostdev" managed="yes"> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x01'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x02'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x03'/> </forward> </network You lose some flexibility, but are able to re-use more code. If it never makes sense to mix managed and un-managed (I don't know enough about the topic to have the answer to that), then the lost flexibility is meaningless.
(anyone else have an opinion on this?)
The same question holds for this new addition :-)
As a preparation for this, you should probably have a prerequisite patch that renames virDomainDevicePCIAddress to virDevicePCIAddress, moves it to the new file device_conf.h, and also moves virDomainDevicePCIAddressParseXML into device_conf.c (renaming it on the way). Similarly, the part of virDomainHostdevSourceFormat that formats a pci address could/should be moved into its own function in device_conf.c.
(I'm suggesting the name "device_conf.c" rather than "pci_device_conf.c" because I'm thinking it might be good to rename/move the other virDomainDevice*Address structs and functions to the same place. Before taking the time to make this reorganization, it might be good to get feedback from some other people.)