<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>