<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
<font size="3" face="Times New Roman">Thanks Daniel for sharing the link. I got the idea and will try to adhere to the standards. </font><BR><font size="3" face="Times New Roman"></font> <BR><font size="3" face="Times New Roman">One observation I want to share about "make check", with a fresh branch I see one failure:</font><BR><font size="3" face="Times New Roman">-----</font><BR><font size="3" face="Times New Roman"> .....!!!!!!...!!!!!!!!!!!!!!!!!!!!!!!!! 39 FAIL<br>FAIL: libvirtdconftest<br>TEST: capabilityschematest<br></font><BR><font size="3" face="Times New Roman">.</font><BR><font size="3" face="Times New Roman">.</font><BR><font size="3" face="Times New Roman">.</font><BR><font size="3" face="Times New Roman">=======================================<br>1 of 63 tests failed<br>Please report to <a href="mailto:libvir-list@redhat.com">libvir-list@redhat.com</a><br>=======================================<br>make[2]: *** [check-TESTS] Error 1<br>make[2]: Leaving directory `/home/abohra/libvirt_untouched/libvirt/tests'<br>make[1]: *** [check-am] Error 2<br>make[1]: Leaving directory `/home/abohra/libvirt_untouched/libvirt/tests'<br>make: *** [check-recursive] Error 1<br><BR>---------------------<BR> <BR>The branch with my patch also reports the same result, I have a feeling that this failure may not be because of my commit, but I will double check everything (so far in my test bed I can see new added functions working properly).<br id="FontBreak"><BR>About the make syntax-check, I will update with the modifications. <BR> <BR>Thanks!<BR>Ata</font><br> <BR><div>> Date: Mon, 9 Jul 2012 11:21:04 +0800<br>> From: veillard@redhat.com<br>> To: ata.husain@hotmail.com<br>> CC: libvir-list@redhat.com<br>> Subject: Re: [libvirt] [PATCH] ESX: Add routines to interface driver<br>> <br>> On Sun, Jul 08, 2012 at 11:36:47AM -0700, Ata Bohra wrote:<br>> > From: Ata E Husain <ata.husain@hotmail.com><br>> > <br>> > Includes most of the dirver routines except DefineXML, I am working on it and will update patch for it soon.<br>> <br>> typo s/dirver/driver/<br>> <br>> I guess you didn't really understand the reason why Doug asked you to<br>> go though git-send-email<br>> <br>> That part of the message is what will be recorded permanently in the<br>> git patch database and is supposed to explain why that patch is needed<br>> and how it does it. Comment about future patches are not supposed to<br>> go there, but explanation of why that patch is there, its function.<br>> <br>> I would suggest reading some of the rants from the kernel guys<br>> about why they get grumpy when receiving patches, this can be<br>> educational and even fun at times :-) For example James Bottomley<br>> https://events.linuxfoundation.org/images/stories/pdf/lcjp2012_bottomley.pdf<br>> around page 17 or one of the presentations from Greg Kroah-Hartman<br>> (but it's better to watch them than read them ;-)<br>> <br>> > diff --git a/src/esx/esx_interface_driver.c b/src/esx/esx_interface_driver.c<br>> > index 5713137..4feadc2 100644<br>> > --- a/src/esx/esx_interface_driver.c<br>> > +++ b/src/esx/esx_interface_driver.c<br>> > @@ -23,6 +23,10 @@<br>> > */<br>> > <br>> > #include <config.h><br>> > +#include <sys/socket.h><br>> > +#include <netinet/in.h><br>> > +#include <arpa/inet.h><br>> > +#include <libxml/parser.h><br>> > <br>> > #include "internal.h"<br>> > #include "util.h"<br>> > @@ -34,10 +38,10 @@<br>> > #include "esx_vi.h"<br>> > #include "esx_vi_methods.h"<br>> > #include "esx_util.h"<br>> > +#include "interface_conf.h"<br>> > <br>> > #define VIR_FROM_THIS VIR_FROM_ESX<br>> > -<br>> > -<br>> > +#define XML_CAST (const xmlChar*)<br>> > <br>> > static virDrvOpenStatus<br>> > esxInterfaceOpen(virConnectPtr conn,<br>> > @@ -67,10 +71,565 @@ esxInterfaceClose(virConnectPtr conn)<br>> > <br>> > <br>> > <br>> > +static int<br>> > +esxNumOfInterfaces(virConnectPtr conn)<br>> > +{<br>> > + esxPrivate *priv = conn->interfacePrivateData;<br>> > + esxVI_HostVirtualNic *virtualNicList = NULL;<br>> > + const esxVI_HostVirtualNic *virtualNic = NULL;<br>> > + int count = 0;<br>> > +<br>> > + if (esxVI_EnsureSession(priv->primary) < 0 ||<br>> > + esxVI_LookupVirtualNicList(priv->primary, &virtualNicList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (virtualNicList == NULL) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not retrieve vNic List"));<br>> > +<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + for (virtualNic = virtualNicList;<br>> > + virtualNic != NULL;<br>> > + virtualNic = virtualNic->_next) {<br>> > + count++;<br>> > + }<br>> > +<br>> > +cleanup:<br>> > + esxVI_HostVirtualNic_Free(&virtualNicList);<br>> > +<br>> > + return count;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static int<br>> > +esxNumOfDefinedInterfaces(virConnectPtr conn)<br>> > +{<br>> > + conn->interfacePrivateData = NULL;<br>> > +<br>> > + // ESX interfaces are always active<br>> > + return 0;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static int<br>> > +esxListInterfaces(virConnectPtr conn, char **names, int maxnames)<br>> > +{<br>> > + esxPrivate *priv = conn->interfacePrivateData;<br>> > + esxVI_HostVirtualNic *virtualNicList = NULL;<br>> > + const esxVI_HostVirtualNic *virtualNic = NULL;<br>> > + int result = -1;<br>> > + int i = 0;<br>> > +<br>> > + if (esxVI_EnsureSession(priv->primary) < 0 ||<br>> > + esxVI_LookupVirtualNicList(priv->primary,<br>> > + &virtualNicList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (virtualNicList == NULL) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not retrieve vNIC List"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + for (i= 0, virtualNic = virtualNicList;<br>> > + virtualNic != NULL && i < maxnames;<br>> > + ++i, virtualNic = virtualNic->_next) {<br>> > + names[i] = strdup(virtualNic->device);<br>> > +<br>> > + if (names[i] == NULL) {<br>> > + for(;i >=0;--i) {<br>> > + VIR_FREE(names[i]);<br>> > + }<br>> > + virReportOOMError();<br>> > + goto cleanup;<br>> > + }<br>> > + }<br>> > +<br>> > + result = i;<br>> > + cleanup:<br>> > + esxVI_HostVirtualNic_Free(&virtualNicList);<br>> > +<br>> > + return result;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static int<br>> > +esxListDefinedInterfaces(virConnectPtr conn, char **names, int maxnames)<br>> > +{<br>> > + conn->interfacePrivateData = NULL;<br>> > + *names = NULL;<br>> > +<br>> > + /* keeps compiler happy */<br>> > + VIR_DEBUG("Max Interfaces: %d", maxnames);<br>> > + /* ESX interfaces are always active */<br>> > + return 0;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static virInterfacePtr<br>> > +esxInterfaceLookupByName(virConnectPtr conn, const char *name)<br>> > +{<br>> > + esxPrivate *priv = conn->interfacePrivateData;<br>> > + esxVI_HostVirtualNic *virtualNicList = NULL;<br>> > + const esxVI_HostVirtualNic *virtualNic = NULL;<br>> > + virInterfacePtr ret = NULL;<br>> > +<br>> > + if (esxVI_EnsureSession(priv->primary) < 0 ||<br>> > + esxVI_LookupVirtualNicList(priv->primary,<br>> > + &virtualNicList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (virtualNicList == 0) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not retrieve vNIC List"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > +<br>> > + for(virtualNic = virtualNicList;<br>> > + virtualNic != NULL;<br>> > + virtualNic = virtualNic->_next) {<br>> > + if (STREQ(virtualNic->device, name)) {<br>> > + if (virtualNic->spec == NULL ||<br>> > + virtualNic->spec->mac == NULL) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Malformed HostVirtualNicSpec"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + ret = virGetInterface(conn, virtualNic->device, virtualNic->spec->mac);<br>> > + break;<br>> > + }<br>> > + }<br>> > +<br>> > + cleanup:<br>> > + esxVI_HostVirtualNic_Free(&virtualNicList);<br>> > +<br>> > + return ret;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static virInterfacePtr<br>> > +esxInterfaceLookupByMACString(virConnectPtr conn, const char *mac)<br>> > +{<br>> > + esxPrivate *priv = conn->interfacePrivateData;<br>> > + esxVI_HostVirtualNic *virtualNicList = NULL;<br>> > + const esxVI_HostVirtualNic *virtualNic = NULL;<br>> > + virInterfacePtr ret = NULL;<br>> > +<br>> > + if (esxVI_EnsureSession(priv->primary) < 0 ||<br>> > + esxVI_LookupVirtualNicList(priv->primary,<br>> > + &virtualNicList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (virtualNicList == 0) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not retrieve vNIC List"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > +<br>> > + for(virtualNic = virtualNicList;<br>> > + virtualNic != NULL;<br>> > + virtualNic = virtualNic->_next) {<br>> > + if (virtualNic->spec == NULL ||<br>> > + virtualNic->spec->mac == NULL) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Malformed HostVirtualNicSpec"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (STREQ(virtualNic->spec->mac, mac)) {<br>> > + ret =<br>> > + virGetInterface(conn, virtualNic->device, virtualNic->spec->mac);<br>> > + break;<br>> > + }<br>> > + }<br>> > +<br>> > + cleanup:<br>> > + esxVI_HostVirtualNic_Free(&virtualNicList);<br>> > +<br>> > + return ret;<br>> > +}<br>> > +<br>> > +<br>> > +/**<br>> > + * Generates native XML descritpor for a given interface.<br>> > + * For instance:<br>> > + * <interface type="bridge" name="%s"><br>> > + * <start mode="onboot"/>"<br>> > + * <mtu size="%d"/>"<br>> > + * <mac address="%s"/><br>> > + * <protocol family="ipv4"><br>> > + * <dhcp/><br>> > + * <ip address="%s" prefix="%d"/><br>> > + * <route gateway="%s"/><br>> > + * </protocol><br>> > + * <bridge stp="off"><br>> > + * <interface type="ethernet" name="%s"><br>> > + * <mac address="%s"/><br>> > + * </interface><br>> > + * </bridge><br>> > + * </interface><br>> > + */<br>> > +static char*<br>> > +esxGetNativeInterfaceXMLDesc(const esxVI_HostVirtualNic *virtualNic,<br>> > + const esxVI_HostIpRouteConfig *ipRouteConfig,<br>> > + const esxVI_PhysicalNic *physicalNicList,<br>> > + const unsigned int flags)<br>> > +{<br>> > + const esxVI_PhysicalNic *physicalNic = NULL;<br>> > + xmlDocPtr doc = NULL;<br>> > + xmlNodePtr root = NULL;<br>> > + xmlNodePtr startNode = NULL;<br>> > + xmlNodePtr mtuNode = NULL;<br>> > + xmlNodePtr protocolNode = NULL;<br>> > + xmlNodePtr bridgeNode = NULL;<br>> > + xmlNodePtr dhcpNode = NULL;<br>> > + xmlChar *xmlbuff = NULL;<br>> > + int use_static = 0;<br>> > + struct in_addr addr;<br>> > + uint32_t host_addr = 0;<br>> > + int zero_count = 0;<br>> > + int masklen = 0;<br>> > + int i = 0;<br>> > + virBuffer item = VIR_BUFFER_INITIALIZER;<br>> > + int bufferSize = 0;<br>> > + char *ret = NULL;<br>> > +<br>> > + if (VIR_INTERFACE_XML_INACTIVE & flags) {<br>> > + use_static = 1;<br>> > + }<br>> > +<br>> > + doc = xmlNewDoc(XML_CAST "1.0");<br>> > + root = xmlNewDocNode(doc, NULL, XML_CAST "interface", NULL);<br>> > +<br>> > + xmlNewProp(root, XML_CAST "type", XML_CAST "bridge");<br>> > + xmlNewProp(root, XML_CAST "name", XML_CAST virtualNic->device);<br>> > + xmlDocSetRootElement(doc, root);<br>> > +<br>> > + /* define boot start mode */<br>> > + startNode = xmlNewChild(root, NULL, XML_CAST "start", NULL);<br>> > + xmlNewProp(startNode, XML_CAST "mode", XML_CAST "onboot");<br>> > +<br>> > + /* append mtu value */<br>> > + mtuNode = xmlNewChild(root, NULL, XML_CAST "mtu", NULL);<br>> > + virBufferAsprintf(&item, "%d",virtualNic->spec->mtu &&<br>> > + virtualNic->spec->mtu->value ?<br>> > + virtualNic->spec->mtu->value :<br>> > + 1500);<br>> > + const char *mtustr = virBufferContentAndReset(&item);<br>> > + if (mtustr == NULL) {<br>> > + virReportOOMError();<br>> > + goto cleanup;<br>> > + }<br>> > + xmlNewProp(mtuNode, XML_CAST "size", XML_CAST mtustr);<br>> > +<br>> > + /* append mac address field */<br>> > + if (!use_static && virtualNic->spec->mac) {<br>> > + xmlNodePtr mac_node = xmlNewChild(root, NULL, XML_CAST "mac", NULL);<br>> > + xmlNewProp(mac_node, XML_CAST "address",<br>> > + XML_CAST virtualNic->spec->mac);<br>> > + }<br>> > +<br>> > + /* TODO - Handle VLAN (via portgroup?) */<br>> > + if (virtualNic->spec->ip->subnetMask &&<br>> > + *virtualNic->spec->ip->subnetMask &&<br>> > + inet_aton(virtualNic->spec->ip->subnetMask, &addr) == 0) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Error parsing netmask"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + host_addr = ntohl(addr.s_addr);<br>> > + /* Calculate masklen */<br>> > + for (i = 0; i < 32; ++i) {<br>> > + if (host_addr & 0x01) {<br>> > + break;<br>> > + }<br>> > + zero_count++;<br>> > + host_addr >>= 1;<br>> > + }<br>> > + masklen = 32 - zero_count;<br>> > +<br>> > + /* append protocol field */<br>> > + /* TODO - Add IPv6 Support */<br>> > + protocolNode = xmlNewChild(root, NULL, XML_CAST "protocol", NULL);<br>> > + xmlNewProp(protocolNode, XML_CAST "family", XML_CAST "ipv4");<br>> > + if (virtualNic->spec->ip->dhcp == 1) {<br>> > + dhcpNode = xmlNewChild(protocolNode, NULL, XML_CAST "dhcp", NULL);<br>> > + /* avoids compiler warning */<br>> > + VIR_DEBUG("dhcpNode name: %s", (char *)dhcpNode->name);<br>> > + }<br>> > +<br>> > + if (virtualNic->spec->ip->dhcp != 1 || !use_static) {<br>> > + if (virtualNic->spec->ip->ipAddress &&<br>> > + *virtualNic->spec->ip->ipAddress) {<br>> > + xmlNodePtr ipAddrNode =<br>> > + xmlNewChild(protocolNode, NULL, XML_CAST "ip", NULL);<br>> > + xmlNewProp(ipAddrNode, XML_CAST "address", XML_CAST<br>> > + virtualNic->spec->ip->ipAddress);<br>> > +<br>> > + virBufferAsprintf(&item, "%d", masklen);<br>> > + const char *maskstr = virBufferContentAndReset(&item);<br>> > + if (maskstr == NULL) {<br>> > + virReportOOMError();<br>> > + goto cleanup;<br>> > + }<br>> > + xmlNewProp(ipAddrNode, XML_CAST "prefix", XML_CAST maskstr);<br>> > +<br>> > + xmlNodePtr routeNode =<br>> > + xmlNewChild(protocolNode, NULL, XML_CAST "route", NULL);<br>> > + xmlNewProp(routeNode, XML_CAST "gateway",<br>> > + XML_CAST ipRouteConfig->defaultGateway);<br>> > + }<br>> > + }<br>> > +<br>> > + /* Add bridge information */<br>> > + bridgeNode = xmlNewChild(root, NULL, XML_CAST "bridge", NULL);<br>> > + xmlNewProp(bridgeNode, XML_CAST "stp", XML_CAST "off");<br>> > +<br>> > + for (physicalNic = physicalNicList;<br>> > + physicalNic != NULL;<br>> > + physicalNic = physicalNic->_next) {<br>> > + xmlNodePtr bridgeIfaceNode =<br>> > + xmlNewChild(bridgeNode, NULL, XML_CAST "interface", NULL);<br>> > + xmlNewProp(bridgeIfaceNode, XML_CAST "type", XML_CAST "ethernet");<br>> > + xmlNewProp(bridgeIfaceNode, XML_CAST "name",<br>> > + XML_CAST physicalNic->device);<br>> > +<br>> > + xmlNodePtr bridgeIfaceMacNode =<br>> > + xmlNewChild(bridgeIfaceNode, NULL, XML_CAST "mac", NULL);<br>> > + xmlNewProp(bridgeIfaceMacNode, XML_CAST "address",<br>> > + XML_CAST physicalNic->mac);<br>> > + }<br>> > +<br>> > + xmlDocDumpFormatMemory(doc, &xmlbuff, &bufferSize, 1);<br>> > + if (xmlbuff == NULL) {<br>> > + virReportOOMError();<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + ret = strdup((char *)xmlbuff);<br>> > + if (ret == NULL) {<br>> > + virReportOOMError();<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + cleanup:<br>> > + VIR_FREE(mtustr);<br>> > + if (xmlbuff != NULL) {<br>> > + xmlFree(xmlbuff);<br>> > + }<br>> <br>> That should not pass "make syntax-check" did you run that on your<br>> tree ? xmlFree will check for NULL no need to double the test.<br>> also none of the xmlNew... function are checked for return error,<br>> that should probably be added, they are allocating memory and they<br>> can fail.<br>> <br>> > + xmlFreeDoc(doc);<br>> > +<br>> > + return ret;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static char*<br>> > +esxInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)<br>> > +{<br>> > + esxPrivate *priv = iface->conn->interfacePrivateData;<br>> > + esxVI_HostVirtualNic *virtualNicList = NULL;<br>> > + esxVI_HostVirtualNic *virtualNic = NULL;<br>> > + esxVI_PhysicalNic *physicalNicList = NULL;<br>> > + esxVI_PhysicalNic *matchingPhysicalNicList = NULL;<br>> > + esxVI_HostIpRouteConfig *ipRouteConfig = NULL;<br>> > + esxVI_HostPortGroup *portGroupList = NULL;<br>> > + esxVI_HostVirtualSwitch *virtualSwitchList = NULL;<br>> > + esxVI_String *propertyNameList = NULL;<br>> > + esxVI_ObjectContent *hostSystem = NULL;<br>> > + esxVI_DynamicProperty *dynamicProperty = NULL;<br>> > + virInterfaceDefPtr def = NULL;<br>> > + char *xmlstr = NULL;<br>> > + char *ret = NULL;<br>> > +<br>> > + if (esxVI_EnsureSession(priv->primary) < 0 ||<br>> > + esxVI_String_AppendValueListToList(&propertyNameList,<br>> > + "config.network.vnic\0"<br>> > + "config.network.ipRouteConfig\0"<br>> > + "config.network.vswitch\0"<br>> > + "config.network.pnic\0"<br>> > + "config.network.portgroup\0") < 0 ||<br>> > + esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,<br>> > + &hostSystem) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL;<br>> > + dynamicProperty = dynamicProperty->_next) {<br>> > + if (STREQ(dynamicProperty->name, "config.network.vnic")) {<br>> > + if (esxVI_HostVirtualNic_CastListFromAnyType(dynamicProperty->val,<br>> > + &virtualNicList)<br>> > + < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + } else if (STREQ(dynamicProperty->name, "config.network.ipRouteConfig")) {<br>> > + if (esxVI_HostIpRouteConfig_CastFromAnyType(dynamicProperty->val,<br>> > + &ipRouteConfig)) {<br>> > + goto cleanup;<br>> > + }<br>> > + } else if (STREQ(dynamicProperty->name, "config.network.vswitch")) {<br>> > + if (esxVI_HostVirtualSwitch_CastListFromAnyType<br>> > + (dynamicProperty->val, &virtualSwitchList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + } else if (STREQ(dynamicProperty->name, "config.network.pnic")) {<br>> > + if (esxVI_PhysicalNic_CastListFromAnyType(dynamicProperty->val,<br>> > + &physicalNicList)<br>> > + < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + } else if (STREQ(dynamicProperty->name, "config.network.portgroup")) {<br>> > + if (esxVI_HostPortGroup_CastListFromAnyType(dynamicProperty->val,<br>> > + &portGroupList)<br>> > + < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + } else {<br>> > + VIR_WARN("Unexpected '%s' property", dynamicProperty->name);<br>> > + }<br>> > + }<br>> > +<br>> > + if (!virtualNicList ||<br>> > + !ipRouteConfig ||<br>> > + !virtualSwitchList ||<br>> > + !portGroupList) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Unable to retrieve network parameters"));<br>> > +<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + for (virtualNic = virtualNicList;<br>> > + virtualNic != NULL;<br>> > + virtualNic = virtualNic->_next) {<br>> > + if (STREQ(virtualNic->device, iface->name)) {<br>> > + break;<br>> > + }<br>> > + }<br>> > +<br>> > + if (virtualNic == NULL) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not find Interface"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (esxVI_LookupPhysicalNicFromPortGroup(virtualNic->portgroup,<br>> > + portGroupList,<br>> > + virtualSwitchList,<br>> > + physicalNicList,<br>> > + &matchingPhysicalNicList) < 0) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("No Physical NIC found matching Virtual NIC's portgroup"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + /* create a xml descriptor and parse it using virInterfaceDefParseString */<br>> > + xmlstr = esxGetNativeInterfaceXMLDesc(virtualNic,<br>> > + ipRouteConfig,<br>> > + matchingPhysicalNicList,<br>> > + flags);<br>> > + if (xmlstr == NULL) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + def = virInterfaceDefParseString(xmlstr);<br>> > + if (!def) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + ret = virInterfaceDefFormat(def);<br>> > + if (!ret) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + cleanup:<br>> > + esxVI_HostVirtualNic_Free(&virtualNicList);<br>> > + esxVI_PhysicalNic_Free(&physicalNicList);<br>> > + esxVI_PhysicalNic_Free(&matchingPhysicalNicList);<br>> > + esxVI_HostPortGroup_Free(&portGroupList);<br>> > + esxVI_HostVirtualSwitch_Free(&virtualSwitchList);<br>> > + esxVI_HostIpRouteConfig_Free(&ipRouteConfig);<br>> > + esxVI_ObjectContent_Free(&hostSystem);<br>> > + esxVI_String_Free(&propertyNameList);<br>> > + virInterfaceDefFree(def);<br>> > + VIR_FREE(xmlstr);<br>> > +<br>> > + return ret;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static int<br>> > +esxInterfaceUndefine(virInterfacePtr iface)<br>> > +{<br>> > + esxPrivate *priv = iface->conn->interfacePrivateData;<br>> > +<br>> > + if (esxVI_RemoveVirtualNic(<br>> > + priv->primary,<br>> > + priv->primary->hostSystem->configManager->networkSystem,<br>> > + iface->name) < 0) {<br>> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Error deleting interface"));<br>> > + return -1;<br>> > + }<br>> > +<br>> > + return 0;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +static int<br>> > +esxInterfaceCreate(virInterfacePtr iface, unsigned int flags)<br>> > +{<br>> > + iface->conn->interfacePrivateData = NULL;<br>> > +<br>> > + virCheckFlags(0, -1);<br>> > +<br>> > + /* ESX interfaces are always active */<br>> > + return 0;<br>> > +}<br>> > +<br>> > +<br>> > +static int<br>> > +esxInterfaceDestroy(virInterfacePtr iface, unsigned int flags)<br>> > +{<br>> > + iface->conn->privateData = NULL;<br>> > +<br>> > + virCheckFlags(0, -1);<br>> > +<br>> > + /* ESX does not support deactivating interfaces */<br>> > + return 1;<br>> > +}<br>> > +<br>> > static virInterfaceDriver esxInterfaceDriver = {<br>> > .name = "ESX",<br>> > - .open = esxInterfaceOpen, /* 0.7.6 */<br>> > - .close = esxInterfaceClose, /* 0.7.6 */<br>> > + .open = esxInterfaceOpen, /* 0.7.6 */<br>> > + .close = esxInterfaceClose, /* 0.7.6 */<br>> > + .numOfInterfaces = esxNumOfInterfaces, /* 0.9.x */<br>> > + .numOfDefinedInterfaces = esxNumOfDefinedInterfaces, /* 0.9.x */<br>> > + .listInterfaces = esxListInterfaces, /* 0.9.x */<br>> > + .listDefinedInterfaces = esxListDefinedInterfaces, /* 0.9.x */<br>> > + .interfaceLookupByName = esxInterfaceLookupByName, /* 0.9.x */<br>> > + .interfaceLookupByMACString = esxInterfaceLookupByMACString, /* 0.9.x */<br>> > + .interfaceGetXMLDesc = esxInterfaceGetXMLDesc, /* 0.9.x */<br>> > + .interfaceUndefine = esxInterfaceUndefine, /* 0.9.x */<br>> > + .interfaceCreate = esxInterfaceCreate, /* 0.9.x */<br>> > + .interfaceDestroy = esxInterfaceDestroy, /* 0.9.x */<br>> > };<br>> > <br>> > <br>> > diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c<br>> > index 5b5ab69..df9f8df 100644<br>> > --- a/src/esx/esx_vi.c<br>> > +++ b/src/esx/esx_vi.c<br>> > @@ -4414,4 +4414,134 @@ esxVI_LookupManagedObjectHelper(esxVI_Context *ctx,<br>> > <br>> > <br>> > <br>> > +int<br>> > +esxVI_LookupVirtualNicList(esxVI_Context* ctx,<br>> > + esxVI_HostVirtualNic** virtualNicList)<br>> > +{<br>> > + int result = -1;<br>> > + esxVI_String *propertyNameList = NULL;<br>> > + esxVI_DynamicProperty *dynamicProperty = NULL;<br>> > + esxVI_ObjectContent* hostSystem = NULL;<br>> > +<br>> > + if (esxVI_String_AppendValueListToList(<br>> > + &propertyNameList, "config.network.vnic\0") < 0 ||<br>> > + esxVI_LookupHostSystemProperties(ctx, propertyNameList, &hostSystem) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + if (hostSystem == NULL) {<br>> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not retrieve the HostSystem object"));<br>> > +<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + for (dynamicProperty = hostSystem->propSet;<br>> > + dynamicProperty != NULL;<br>> > + dynamicProperty = dynamicProperty->_next) {<br>> > + if (STREQ(dynamicProperty->name, "config.network.vnic")) {<br>> > + if (esxVI_HostVirtualNic_CastListFromAnyType(dynamicProperty->val,<br>> > + virtualNicList) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + break;<br>> > + } else {<br>> > + VIR_WARN("Unexpected '%s' property", dynamicProperty->name);<br>> > + }<br>> > + }<br>> > +<br>> > + result = 0;<br>> > +<br>> > +cleanup:<br>> > + esxVI_String_Free(&propertyNameList);<br>> > + esxVI_ObjectContent_Free(&hostSystem);<br>> > +<br>> > + return result;<br>> > +}<br>> > +<br>> > +<br>> > +<br>> > +int<br>> > +esxVI_LookupPhysicalNicFromPortGroup(<br>> > + const char *portgroup,<br>> > + const esxVI_HostPortGroup *portGroupList,<br>> > + const esxVI_HostVirtualSwitch *virtualSwitchList,<br>> > + const esxVI_PhysicalNic *physicalNicList,<br>> > + esxVI_PhysicalNic **ret_physicalNicList)<br>> > +{<br>> > + int result = -1;<br>> > + const esxVI_HostPortGroup *portGroup = NULL;<br>> > + const esxVI_HostVirtualSwitch *virtualSwitch = NULL;<br>> > + esxVI_PhysicalNic *matchingPhysicalNicList = NULL;<br>> > + const esxVI_PhysicalNic *physicalNic = NULL;<br>> > + esxVI_PhysicalNic *tempPhysicalNic = NULL;<br>> > + const esxVI_String *pnicKey = NULL;<br>> > +<br>> > + if (portgroup == NULL) {<br>> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("No Portgroup found!"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + /* Go through all the port groups to find the one that matches. */<br>> > + for (portGroup = portGroupList;<br>> > + portGroup != NULL;<br>> > + portGroup = portGroup->_next) {<br>> > + if (STREQ(portGroup->spec->name, portgroup)) {<br>> > + break;<br>> > + }<br>> > + }<br>> > +<br>> > + if (portGroup == NULL) {<br>> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not find Host port group"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + /* Go through all the virtual switches to find the one that matches */<br>> > + for (virtualSwitch = virtualSwitchList;<br>> > + virtualSwitch != NULL;<br>> > + virtualSwitch = virtualSwitch->_next) {<br>> > + if (STREQ(portGroup->spec->vswitchName, virtualSwitch->name)) {<br>> > + break;<br>> > + }<br>> > + }<br>> > +<br>> > + if (virtualSwitch == NULL) {<br>> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",<br>> > + _("Could not find Virtual Switch"));<br>> > + goto cleanup;<br>> > + }<br>> > +<br>> > + /* Go through all physical nics */<br>> > + for (pnicKey = virtualSwitch->pnic;<br>> > + pnicKey != NULL;<br>> > + pnicKey = pnicKey->_next) {<br>> > + /* O(n^2), but probably faster than a hash due to small N */<br>> > + for (physicalNic = physicalNicList;<br>> > + physicalNic != NULL;<br>> > + physicalNic = physicalNic->_next) {<br>> > +<br>> > + if (STREQ(pnicKey->value, physicalNic->key)) {<br>> > + if (esxVI_PhysicalNic_DeepCopy(&tempPhysicalNic,<br>> > + (esxVI_PhysicalNic *)physicalNic) < 0 ||<br>> > + esxVI_PhysicalNic_AppendToList(&matchingPhysicalNicList,<br>> > + tempPhysicalNic) < 0) {<br>> > + goto cleanup;<br>> > + }<br>> > + tempPhysicalNic = NULL;<br>> > + }<br>> > + }<br>> > + }<br>> > +<br>> > + *ret_physicalNicList = matchingPhysicalNicList;<br>> > + matchingPhysicalNicList = NULL; /* no cleanup needed */<br>> > + tempPhysicalNic = NULL; /* no cleanup needed */<br>> > + result = 0;<br>> > + cleanup:<br>> > + esxVI_PhysicalNic_Free(&matchingPhysicalNicList);<br>> > + esxVI_PhysicalNic_Free(&tempPhysicalNic);<br>> > + return result;<br>> > +}<br>> > +<br>> > #include "esx_vi.generated.c"<br>> > diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h<br>> > index 78d3986..11bc52e 100644<br>> > --- a/src/esx/esx_vi.h<br>> > +++ b/src/esx/esx_vi.h<br>> > @@ -487,6 +487,16 @@ int esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo,<br>> > <br>> > int esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductVersion productVersion);<br>> > <br>> > +int esxVI_LookupVirtualNicList(esxVI_Context* ctx,<br>> > + esxVI_HostVirtualNic** virtualNicList);<br>> > +<br>> > +int esxVI_LookupPhysicalNicFromPortGroup(<br>> > + const char *portgroup,<br>> > + const esxVI_HostPortGroup *portGroupList,<br>> > + const esxVI_HostVirtualSwitch *virtualSwitchList,<br>> > + const esxVI_PhysicalNic *physicalNicList,<br>> > + esxVI_PhysicalNic **ret_physicalNicList);<br>> > +<br>> > # include "esx_vi.generated.h"<br>> > <br>> > #endif /* __ESX_VI_H__ */<br>> > diff --git a/src/esx/esx_vi_generator.input b/src/esx/esx_vi_generator.input<br>> > index 1a67a8c..b99fee6 100644<br>> > --- a/src/esx/esx_vi_generator.input<br>> > +++ b/src/esx/esx_vi_generator.input<br>> > @@ -57,6 +57,29 @@ enum AutoStartWaitHeartbeatSetting<br>> > systemDefault<br>> > end<br>> > <br>> > +enum HostConfigChangeOperation<br>> > + add<br>> > + edit<br>> > + remove<br>> > +end<br>> > +<br>> > +enum HostIpConfigIpV6AdressStatus<br>> > + deprecated<br>> > + duplicate<br>> > + inaccessible<br>> > + invalid<br>> > + preferred<br>> > + tentative<br>> > + unknown<br>> > +end<br>> > +<br>> > +enum HostIpConfigV6AdressConfigType<br>> > + dhcp<br>> > + linklayer<br>> > + manual<br>> > + other<br>> > + random<br>> > +end<br>> > <br>> > enum ManagedEntityStatus<br>> > gray<br>> > @@ -89,6 +112,12 @@ enum PerfSummaryType<br>> > none<br>> > end<br>> > <br>> > +enum PortGroupConnecteeType<br>> > + host<br>> > + systemManagement<br>> > + unknown<br>> > + virtualMachine<br>> > +end<br>> > <br>> > enum PropertyChangeOp<br>> > add<br>> > @@ -197,6 +226,12 @@ object DeviceBackedVirtualDiskSpec extends VirtualDiskSpec<br>> > String device r<br>> > end<br>> > <br>> > +object DistributedVirtualSwitchPortConnection<br>> > + Int connectionCookie o<br>> > + String portgroupKey o<br>> > + String portKey o<br>> > + String switchUuid r<br>> > +end<br>> > <br>> > object DynamicProperty<br>> > String name r<br>> > @@ -316,6 +351,34 @@ object HostFileSystemVolume<br>> > Long capacity r<br>> > end<br>> > <br>> > +object HostIpConfig<br>> > + Boolean dhcp r<br>> > + String ipAddress o<br>> > + HostIpConfigIpV6AddressConfiguration ipV6Config o<br>> > + String subnetMask o<br>> > +end<br>> > +<br>> > +object HostIpConfigIpV6Address<br>> > + String dadState o<br>> > + String ipAddress r<br>> > + DateTime lifetime o<br>> > + String operation o<br>> > + String origin o<br>> > + Int prefixLength r<br>> > +end<br>> > +<br>> > +object HostIpConfigIpV6AddressConfiguration<br>> > + Boolean autoConfigurationEnabled o<br>> > + Boolean dhcpV6Enabled o<br>> > + HostIpConfigIpV6Address ipV6Address ol<br>> > +end<br>> > +<br>> > +object HostIpRouteConfig<br>> > + String defaultGateway o<br>> > + String gatewayDevice o<br>> > + String ipV6DefaultGateway o<br>> > + String ipV6GatewayDevice o<br>> > +end<br>> > <br>> > object HostMountInfo<br>> > String path o<br>> > @@ -331,11 +394,134 @@ object HostNasVolume extends HostFileSystemVolume<br>> > end<br>> > <br>> > <br>> > +object HostNicTeamingPolicy<br>> > + HostNicFailureCriteria failureCriteria o<br>> > + HostNicOrderPolicy nicOrder o<br>> > + Boolean notifySwitches o<br>> > + String policy o<br>> > + Boolean reversePolicy o<br>> > + Boolean rollingOrder o<br>> > +end<br>> > +<br>> > +object HostNetOffloadCapabilities<br>> > + Boolean csumOffload o<br>> > + Boolean tcpSegmentation o<br>> > + Boolean zeroCopyXmit o<br>> > +end<br>> > +<br>> > +object HostNetworkSecurityPolicy<br>> > + Boolean allowPromiscuous o<br>> > + Boolean forgedTransmits o<br>> > + Boolean macChanges o<br>> > +end<br>> > +<br>> > +object HostNetworkPolicy<br>> > + HostNicTeamingPolicy nicTeaming o<br>> > + HostNetOffloadCapabilities offloadPolicy o<br>> > + HostNetworkSecurityPolicy security o<br>> > + HostNetworkTrafficShapingPolicy shapingPolicy o<br>> > +end<br>> > +<br>> > +object HostNetworkTrafficShapingPolicy<br>> > + Long averageBandwidth o<br>> > + Long burstLong o<br>> > + Boolean enabled o<br>> > + Long peakBandwidth o<br>> > +end<br>> > +<br>> > +object HostNicFailureCriteria<br>> > + String checkSpeed o<br>> > + Int speed o<br>> > + Boolean checkDuplex o<br>> > + Boolean fullDuplex o<br>> > + Boolean checkErrorPercent o<br>> > + Int percentage o<br>> > + Boolean checkBeacon o<br>> > +end<br>> > +<br>> > +object HostNicOrderPolicy<br>> > + String activeNic ol<br>> > + String standbyNic ol<br>> > +end<br>> > +<br>> > +object HostPortGroup<br>> > + String key r<br>> > + HostPortGroupPort port ol<br>> > + String vswitch r<br>> > + HostNetworkPolicy computedPolicy r<br>> > + HostPortGroupSpec spec r<br>> > +end<br>> > +<br>> > +object HostPortGroupPort<br>> > + String key o<br>> > + String mac ol<br>> > + String type r<br>> > +end<br>> > +<br>> > +object HostPortGroupSpec<br>> > + String name r<br>> > + HostNetworkPolicy policy r<br>> > + Int vlanId r<br>> > + String vswitchName r<br>> > +end<br>> > +<br>> > object HostScsiDiskPartition<br>> > String diskName r<br>> > Int partition r<br>> > end<br>> > <br>> > +object HostVirtualNic<br>> > + String device r<br>> > + String key r<br>> > + String port o<br>> > + String portgroup r<br>> > + HostVirtualNicSpec spec r<br>> > +end<br>> > +<br>> > +object HostVirtualNicSpec<br>> > + DistributedVirtualSwitchPortConnection distributedVirtualPort o<br>> > + HostIpConfig ip o<br>> > + String mac o<br>> > + Int mtu o<br>> > + String portgroup o<br>> > + Boolean tsoEnabled o<br>> > +end<br>> > +<br>> > +<br>> > +object HostVirtualSwitch<br>> > + String key r<br>> > + Int mtu o<br>> > + String name r<br>> > + Int numPorts r<br>> > + Int numPortsAvailable r<br>> > + String pnic ol<br>> > + String portgroup ol<br>> > + HostVirtualSwitchSpec spec r<br>> > +end<br>> > +<br>> > +object HostVirtualSwitchBridge<br>> > +end<br>> > +<br>> > +object HostVirtualSwitchAutoBridge extends HostVirtualSwitchBridge<br>> > + String excludedNicDevice ol<br>> > +end<br>> > +<br>> > +object HostVirtualSwitchBeaconBridge extends HostVirtualSwitchBridge<br>> > + Int interval r<br>> > +end<br>> > +<br>> > +object HostVirtualSwitchBondBridge extends HostVirtualSwitchBridge<br>> > + HostVirtualSwitchBeaconBridge beacon o<br>> > + LinkDiscoveryProtocolConfig linkDiscoveryProtocolConfig o<br>> > + String nicDevice rl<br>> > +end<br>> > +<br>> > +object HostVirtualSwitchSpec<br>> > + HostVirtualSwitchBridge bridge o<br>> > + Int mtu o<br>> > + Int numPorts r<br>> > + HostNetworkPolicy policy o<br>> > +end<br>> > <br>> > object HostVmfsVolume extends HostFileSystemVolume<br>> > Int blockSizeMb r<br>> > @@ -355,6 +541,10 @@ end<br>> > object IsoImageFileQuery extends FileQuery<br>> > end<br>> > <br>> > +object LinkDiscoveryProtocolConfig<br>> > + String operation r<br>> > + String protocol r<br>> > +end<br>> > <br>> > object LocalDatastoreInfo extends DatastoreInfo<br>> > String path o<br>> > @@ -398,6 +588,10 @@ object OptionType<br>> > Boolean valueIsReadonly o<br>> > end<br>> > <br>> > +object OptionValue<br>> > + String key r<br>> > + AnyType value r<br>> > +end<br>> > <br>> > object PerfCounterInfo<br>> > Int key r<br>> > @@ -454,6 +648,27 @@ object PerfSampleInfo<br>> > Int interval r<br>> > end<br>> > <br>> > +object PhysicalNic<br>> > + String device r<br>> > + String driver o<br>> > + String key o<br>> > + PhysicalNicInfo linkSpeed o<br>> > + String mac r<br>> > + String pci r<br>> > + PhysicalNicSpec spec r<br>> > + PhysicalNicInfo validLinkSpecification ol<br>> > + Boolean wakeOnLanSupported r<br>> > +end<br>> > +<br>> > +object PhysicalNicInfo<br>> > + Boolean duplex r<br>> > + Int speedMb r<br>> > +end<br>> > +<br>> > +object PhysicalNicSpec<br>> > + HostIpConfig ip o<br>> > + PhysicalNicInfo linkSpeed o<br>> > +end<br>> > <br>> > object PropertyChange<br>> > String name r<br>> > @@ -490,7 +705,6 @@ object ResourceAllocationInfo<br>> > Long overheadLimit o<br>> > end<br>> > <br>> > -<br>> > object ResourcePoolResourceUsage<br>> > Long reservationUsed r<br>> > Long reservationUsedForVm r<br>> > @@ -954,6 +1168,10 @@ method RemoveSnapshot_Task returns ManagedObjectReference r<br>> > Boolean removeChildren r<br>> > end<br>> > <br>> > +method RemoveVirtualNic<br>> > + ManagedObjectReference _this r<br>> > + String device r<br>> > +end<br>> > <br>> > method RetrieveProperties returns ObjectContent ol<br>> > ManagedObjectReference _this:propertyCollector r<br>> > @@ -1002,6 +1220,16 @@ method UnregisterVM<br>> > ManagedObjectReference _this r<br>> > end<br>> > <br>> > +method UpdateIpRouteConfig<br>> > + ManagedObjectReference _this r<br>> > + HostIpRouteConfig config r<br>> > +end<br>> > +<br>> > +method UpdateVirtualNic<br>> > + ManagedObjectReference _this r<br>> > + String device r<br>> > + HostVirtualNicSpec nic r<br>> > +end<br>> > <br>> > method WaitForUpdates returns UpdateSet r<br>> > ManagedObjectReference _this:propertyCollector r<br>> > diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py<br>> > index 8a128df..787a28c 100755<br>> > --- a/src/esx/esx_vi_generator.py<br>> > +++ b/src/esx/esx_vi_generator.py<br>> > @@ -371,8 +371,12 @@ class Property(Member):<br>> > % self.name<br>> > elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,<br>> > OCCURRENCE__OPTIONAL_LIST]:<br>> > - return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" \<br>> > - % (self.type, self.name)<br>> > + if self.type == "String":<br>> > + return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_STRING_LIST(%s, %s)\n" \<br>> > + % (self.type, self.name)<br>> > + else:<br>> > + return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" \<br>> > + % (self.type, self.name)<br>> > elif self.type == "String":<br>> > return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, %s)\n" \<br>> > % self.name<br>> > @@ -1505,7 +1509,10 @@ predefined_objects = ["AnyType",<br>> > <br>> > additional_enum_features = { "ManagedEntityStatus" : Enum.FEATURE__ANY_TYPE,<br>> > "TaskInfoState" : Enum.FEATURE__ANY_TYPE,<br>> > - "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE }<br>> > + "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE ,<br>> > + "HostIpConfigIpV6AdressStatus" : Enum.FEATURE__ANY_TYPE,<br>> > + "HostIpConfigV6AdressConfigType" : Enum.FEATURE__ANY_TYPE,<br>> > + "PortGroupConnecteeType" : Enum.FEATURE__ANY_TYPE }<br>> > <br>> > additional_object_features = { "AutoStartDefaults" : Object.FEATURE__ANY_TYPE,<br>> > "AutoStartPowerInfo" : Object.FEATURE__ANY_TYPE,<br>> > @@ -1519,8 +1526,31 @@ additional_object_features = { "AutoStartDefaults" : Object.FEATURE__AN<br>> > Object.FEATURE__ANY_TYPE,<br>> > "HostDatastoreBrowserSearchResults" : Object.FEATURE__LIST |<br>> > Object.FEATURE__ANY_TYPE,<br>> > + "HostIpConfig" : Object.FEATURE__DEEP_COPY,<br>> > + "HostIpRouteConfig" : Object.FEATURE__ANY_TYPE,<br>> > + "HostIpConfigIpV6Address" : Object.FEATURE__LIST |<br>> > + Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__DEEP_COPY,<br>> > + "HostIpConfigIpV6AddressConfiguration" : Object.FEATURE__DEEP_COPY,<br>> > + "HostPortGroup" : Object.FEATURE__LIST |<br>> > + Object.FEATURE__ANY_TYPE,<br>> > + "HostVirtualNic" : Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__LIST,<br>> > + "HostVirtualSwitch" : Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__LIST,<br>> > + "KeyValue" : Object.FEATURE__ANY_TYPE,<br>> > "ManagedObjectReference" : Object.FEATURE__ANY_TYPE,<br>> > + "PhysicalNic" : Object.FEATURE__LIST |<br>> > + Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__DEEP_COPY,<br>> > "ObjectContent" : Object.FEATURE__DEEP_COPY,<br>> > + "OptionValue" : Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__LIST,<br>> > + "PhysicalNic" : Object.FEATURE__LIST |<br>> > + Object.FEATURE__ANY_TYPE |<br>> > + Object.FEATURE__DEEP_COPY,<br>> > + "PhysicalNicSpec" : Object.FEATURE__DEEP_COPY,<br>> > + "PhysicalNicLinkInfo" : Object.FEATURE__LIST,<br>> > "ResourcePoolResourceUsage" : Object.FEATURE__ANY_TYPE,<br>> > "ServiceContent" : Object.FEATURE__DESERIALIZE,<br>> > "SharesInfo" : Object.FEATURE__ANY_TYPE,<br>> > diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c<br>> > index bcc310f..f23af8d 100644<br>> > --- a/src/esx/esx_vi_types.c<br>> > +++ b/src/esx/esx_vi_types.c<br>> > @@ -475,7 +475,23 @@<br>> > continue; \<br>> > }<br>> > <br>> > -<br>> > +#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_STRING_LIST(_type, _name) \<br>> > + if (xmlStrEqual(childNode->name, BAD_CAST #_name)) { \<br>> > + char *value = NULL; \<br>> > + \<br>> > + if (esxVI_String_DeserializeValue(childNode, &value) < 0 || \<br>> > + value == NULL) { \<br>> > + goto failure; \<br>> > + } \<br>> > + \<br>> > + if (esxVI_##_type##_AppendValueToList(&(*ptrptr)->_name, \<br>> > + value) < 0) { \<br>> > + VIR_FREE(value); \<br>> > + goto failure; \<br>> > + } \<br>> > + \<br>> > + continue; \<br>> > + }<br>> > <br>> > /*<br>> > * A required property must be != 0 (NULL for pointers, "undefined" == 0 for<br>> > --<br>> > 1.7.9.5<br>> <br>> I think one more pass is needed at this, please make sure you<br>> run make check and make syntax-check on the tree before submitting<br>> your patch,<br>> <br>> thanks !<br>> <br>> Daniel<br>> <br>> -- <br>> Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/<br>> daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/<br>> http://veillard.com/ | virtualization library http://libvirt.org/<br></div> </div></body>
</html>