[libvirt] [PATCH v5] ESX: Add routines to interface driver

Ata E Husain Bohra ata.husain at hotmail.com
Thu Aug 2 06:14:39 UTC 2012


Add following routines to esx_interface_driver:
    esxNumOfInterfaces,
    esxNumOfDefinedInterfaces,
    esxListInterfaces,
    esxListDefinedInterfaces,
    esxInterfaceLookupByMACString,
    esxInterfaceGetXMLDesc,
    esxInterfaceUndefine,
    esxInterfaceCreate,
    esxInterfaceDestroy

Signed-off-by: Ata E Husain Bohra <ata.husain at hotmail.com>
---
 src/esx/esx_interface_driver.c |  551 +++++++++++++++++++++++++++++++++++++++-
 src/esx/esx_vi.c               |  125 +++++++++
 src/esx/esx_vi.h               |   10 +
 src/esx/esx_vi_generator.input |  227 +++++++++++++++++
 src/esx/esx_vi_generator.py    |   23 ++
 src/esx/esx_vi_types.c         |    2 -
 6 files changed, 934 insertions(+), 4 deletions(-)

diff --git a/src/esx/esx_interface_driver.c b/src/esx/esx_interface_driver.c
index 501409a..e9f0d4a 100644
--- a/src/esx/esx_interface_driver.c
+++ b/src/esx/esx_interface_driver.c
@@ -23,6 +23,9 @@
  */
 
 #include <config.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include "internal.h"
 #include "util.h"
@@ -34,6 +37,7 @@
 #include "esx_vi.h"
 #include "esx_vi_methods.h"
 #include "esx_util.h"
+#include "interface_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_ESX
 
@@ -67,10 +71,553 @@ esxInterfaceClose(virConnectPtr conn)
 
 
 
+static int
+esxNumOfInterfaces(virConnectPtr conn)
+{
+    bool success = false;
+    esxPrivate *priv = conn->interfacePrivateData;
+    esxVI_HostVirtualNic *hostVirtualNicList = NULL;
+    const esxVI_HostVirtualNic *hostVirtualNic = NULL;
+    int count = 0;
+
+    if (esxVI_EnsureSession(priv->primary) < 0 ||
+        esxVI_LookupHostVirtualNicList(priv->primary,
+            &hostVirtualNicList) < 0) {
+        goto cleanup;
+    }
+
+    if (hostVirtualNicList == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+          _("Could not retrieve HostVirtualNic List"));
+
+        goto cleanup;
+    }
+
+    for (hostVirtualNic = hostVirtualNicList;
+         hostVirtualNic != NULL;
+         hostVirtualNic = hostVirtualNic->_next) {
+        count++;
+    }
+
+    success = true;
+
+cleanup:
+
+    esxVI_HostVirtualNic_Free(&hostVirtualNicList);
+
+    return success ? count : -1;
+
+}
+
+
+
+static int
+esxNumOfDefinedInterfaces(virConnectPtr conn ATTRIBUTE_UNUSED)
+{
+    // ESX interfaces are always active
+    return 0;
+
+}
+
+
+
+static int
+esxListInterfaces(virConnectPtr conn, char **names, int maxnames)
+{
+    int result = -1;
+    esxPrivate *priv = conn->interfacePrivateData;
+    esxVI_HostVirtualNic *hostVirtualNicList = NULL;
+    const esxVI_HostVirtualNic *hostVirtualNic = NULL;
+    int i = 0;
+
+    if (esxVI_EnsureSession(priv->primary) < 0 ||
+        esxVI_LookupHostVirtualNicList(priv->primary,
+                                   &hostVirtualNicList) < 0) {
+        goto cleanup;
+    }
+
+    if (hostVirtualNicList == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                        _("Could not retrieve vNIC List"));
+        goto cleanup;
+    }
+
+    for (i= 0, hostVirtualNic = hostVirtualNicList;
+         hostVirtualNic != NULL && i < maxnames;
+         ++i, hostVirtualNic = hostVirtualNic->_next) {
+        names[i] = strdup(hostVirtualNic->device);
+
+        if (names[i] == NULL) {
+            for(;i >=0;--i) {
+                VIR_FREE(names[i]);
+            }
+            virReportOOMError();
+            goto cleanup;
+        }
+    }
+
+    result = i;
+
+ cleanup:
+
+    esxVI_HostVirtualNic_Free(&hostVirtualNicList);
+
+    return result;
+
+}
+
+
+
+static int
+esxListDefinedInterfaces(virConnectPtr conn ATTRIBUTE_UNUSED,
+                         char **names ATTRIBUTE_UNUSED,
+                         int maxnames ATTRIBUTE_UNUSED)
+{
+    // ESX interfaces are always active
+    return 0;
+
+}
+
+
+
+static virInterfacePtr
+esxInterfaceLookupByName(virConnectPtr conn, const char *name)
+{
+    virInterfacePtr ret = NULL;
+    esxPrivate *priv = conn->interfacePrivateData;
+    esxVI_HostVirtualNic *hostVirtualNicList = NULL;
+    const esxVI_HostVirtualNic *hostVirtualNic = NULL;
+
+    if (esxVI_EnsureSession(priv->primary) < 0 ||
+        esxVI_LookupHostVirtualNicList(priv->primary,
+                                   &hostVirtualNicList) < 0) {
+        goto cleanup;
+    }
+
+    if (hostVirtualNicList == 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+          _("Could not retrieve HostVirtualNic List"));
+        goto cleanup;
+    }
+
+
+    for(hostVirtualNic = hostVirtualNicList;
+        hostVirtualNic != NULL;
+        hostVirtualNic = hostVirtualNic->_next) {
+        if (STREQ(hostVirtualNic->device, name)) {
+            if (hostVirtualNic->spec == NULL ||
+                hostVirtualNic->spec->mac == NULL) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("Malformed HostVirtualNicSpec"));
+                goto cleanup;
+            }
+
+            ret = virGetInterface(conn, hostVirtualNic->device,
+                                        hostVirtualNic->spec->mac);
+            break;
+        }
+    }
+
+ cleanup:
+
+    esxVI_HostVirtualNic_Free(&hostVirtualNicList);
+
+    return ret;
+
+}
+
+
+
+static virInterfacePtr
+esxInterfaceLookupByMACString(virConnectPtr conn, const char *mac)
+{
+    virInterfacePtr ret = NULL;
+    esxPrivate *priv = conn->interfacePrivateData;
+    esxVI_HostVirtualNic *hostVirtualNicList = NULL;
+    const esxVI_HostVirtualNic *hostVirtualNic = NULL;
+
+    if (esxVI_EnsureSession(priv->primary) < 0 ||
+        esxVI_LookupHostVirtualNicList(priv->primary,
+                                   &hostVirtualNicList) < 0) {
+        goto cleanup;
+    }
+
+    if (hostVirtualNicList == 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+          _("Could not retrieve HostVirtualNic List"));
+        goto cleanup;
+    }
+
+
+    for(hostVirtualNic = hostVirtualNicList;
+        hostVirtualNic != NULL;
+        hostVirtualNic = hostVirtualNic->_next) {
+        if (hostVirtualNic->spec == NULL ||
+            hostVirtualNic->spec->mac == NULL) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+              _("Malformed HostVirtualNicSpec"));
+            goto cleanup;
+        }
+
+        if (STREQ(hostVirtualNic->spec->mac, mac)) {
+            ret = virGetInterface(conn, hostVirtualNic->device,
+                                        hostVirtualNic->spec->mac);
+            break;
+        }
+    }
+
+ cleanup:
+
+    esxVI_HostVirtualNic_Free(&hostVirtualNicList);
+
+    return ret;
+
+}
+
+
+
+static char*
+esxInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)
+{
+    char *ret = NULL;
+    esxPrivate *priv = iface->conn->interfacePrivateData;
+    esxVI_HostVirtualNic *hostVirtualNicList = NULL;
+    const esxVI_HostVirtualNic *hostVirtualNic = NULL;
+    esxVI_PhysicalNic *physicalNicList = NULL;
+    const esxVI_PhysicalNic *physicalNic = NULL;
+    esxVI_PhysicalNic *matchingPhysicalNicList = NULL;
+    esxVI_HostIpRouteConfig *ipRouteConfig = NULL;
+    esxVI_HostPortGroup *hostPortGroupList = NULL;
+    esxVI_HostVirtualSwitch *hostVirtualSwitchList = NULL;
+    esxVI_String *propertyNameList = NULL;
+    esxVI_ObjectContent *hostSystem = NULL;
+    esxVI_DynamicProperty *dynamicProperty = NULL;
+    virInterfaceDefPtr def = NULL;
+    virInterfaceDefPtr itf = NULL;
+    int use_static = 0;
+    struct in_addr addr;
+    uint32_t host_addr = 0;
+    int zero_count = 0;
+    int masklen = 0;
+    int i = 0;
+
+    if (VIR_INTERFACE_XML_INACTIVE & flags) {
+        use_static = 1;
+    }
+
+    if (esxVI_EnsureSession(priv->primary) < 0 ||
+        esxVI_String_AppendValueListToList(&propertyNameList,
+                              "config.network.vnic\0"
+                              "config.network.ipRouteConfig\0"
+                              "config.network.vswitch\0"
+                              "config.network.pnic\0"
+                              "config.network.portgroup\0") < 0 ||
+        esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
+                                         &hostSystem) < 0) {
+        goto cleanup;
+    }
+
+    for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL;
+         dynamicProperty = dynamicProperty->_next) {
+        if (STREQ(dynamicProperty->name, "config.network.vnic")) {
+            if (esxVI_HostVirtualNic_CastListFromAnyType(
+                  dynamicProperty->val, &hostVirtualNicList) < 0) {
+                goto cleanup;
+            }
+        } else if (STREQ(dynamicProperty->name,
+              "config.network.ipRouteConfig")) {
+            if (esxVI_HostIpRouteConfig_CastFromAnyType(
+                  dynamicProperty->val, &ipRouteConfig)) {
+                goto cleanup;
+            }
+        } else if (STREQ(dynamicProperty->name, "config.network.vswitch")) {
+            if (esxVI_HostVirtualSwitch_CastListFromAnyType
+              (dynamicProperty->val, &hostVirtualSwitchList) < 0) {
+                goto cleanup;
+            }
+        } else if (STREQ(dynamicProperty->name, "config.network.pnic")) {
+            if (esxVI_PhysicalNic_CastListFromAnyType(
+                  dynamicProperty->val, &physicalNicList) < 0) {
+                goto cleanup;
+            }
+        } else if (STREQ(dynamicProperty->name, "config.network.portgroup")) {
+            if (esxVI_HostPortGroup_CastListFromAnyType(
+                  dynamicProperty->val, &hostPortGroupList) < 0) {
+                goto cleanup;
+            }
+        } else {
+            VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
+        }
+    }
+
+    if (!hostVirtualNicList ||
+        !ipRouteConfig ||
+        !hostVirtualSwitchList ||
+        !hostPortGroupList) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("Unable to retrieve network parameters"));
+
+        goto cleanup;
+    }
+
+    for (hostVirtualNic = hostVirtualNicList;
+         hostVirtualNic != NULL;
+         hostVirtualNic = hostVirtualNic->_next) {
+        if (STREQ(hostVirtualNic->device, iface->name)) {
+            break;
+        }
+    }
+
+    if (hostVirtualNic == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+          _("Could not find HostVirtual Nic"));
+        goto cleanup;
+    }
+
+    if (esxVI_LookupPhysicalNicFromHostPortGroup(
+          hostVirtualNic->portgroup, hostPortGroupList,
+          hostVirtualSwitchList, physicalNicList,
+          &matchingPhysicalNicList) < 0) {
+        goto cleanup;
+    }
+
+    /*
+     * populate virInterfaceDef object to obtain
+     * libvirt interface domain xml.
+     */
+    if (VIR_ALLOC(def) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    def->type = VIR_INTERFACE_TYPE_BRIDGE;
+    def->name = strdup(hostVirtualNic->device);
+    if (def->name == NULL) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if (hostVirtualNic->spec->mtu && hostVirtualNic->spec->mtu->value) {
+        def->mtu = hostVirtualNic->spec->mtu->value;
+    } else {
+        def->mtu = 1500;
+    }
+
+    def->startmode = VIR_INTERFACE_START_ONBOOT;
+
+    if (!use_static && hostVirtualNic->spec->mac) {
+        def->mac = strdup(hostVirtualNic->spec->mac);
+        if (def->mac == NULL) {
+            virReportOOMError();
+            goto cleanup;
+        }
+    }
+
+    /* TODO - Handle VLAN (via portgroup?) */
+    if (hostVirtualNic->spec->ip->subnetMask &&
+        *hostVirtualNic->spec->ip->subnetMask &&
+        inet_aton(hostVirtualNic->spec->ip->subnetMask, &addr) == 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("Error parsing netmask"));
+        goto cleanup;
+    }
+
+    host_addr = ntohl(addr.s_addr);
+    /* Calculate masklen */
+    for (i = 0; i < 32; ++i) {
+        if (host_addr & 0x01) {
+             break;
+        }
+        zero_count++;
+        host_addr >>= 1;
+    }
+    masklen = 32 - zero_count;
+
+    /* append protocol field */
+    def->nprotos = 1;
+    if (VIR_ALLOC_N(def->protos, def->nprotos) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    /* TODO - Add IPv6 Support */
+    for (i = 0; i < def->nprotos; ++i) {
+        if (VIR_ALLOC(def->protos[i]) < 0) {
+            goto cleanup;
+        }
+
+        def->protos[i]->family = strdup("ipv4");
+        if (def->protos[i]->family == NULL) {
+            virReportOOMError();
+            goto cleanup;
+        }
+
+        if (hostVirtualNic->spec->ip->dhcp == 1) {
+            def->protos[i]->dhcp = 1;
+        }
+
+        def->protos[i]->nips = 1;
+        if (hostVirtualNic->spec->ip->dhcp != 1 || !use_static) {
+            if (hostVirtualNic->spec->ip->ipAddress &&
+              *hostVirtualNic->spec->ip->ipAddress) {
+                int j =0;
+                if (VIR_ALLOC_N(def->protos[i]->ips,
+                                def->protos[i]->nips) < 0) {
+                    virReportOOMError();
+                    goto cleanup;
+                }
+
+                for (j=0; j < def->protos[i]->nips; ++j) {
+                    if (VIR_ALLOC(def->protos[i]->ips[j]) < 0) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+
+                    def->protos[i]->ips[0]->address =
+                        strdup(hostVirtualNic->spec->ip->ipAddress);
+                    if (def->protos[i]->ips[0] == NULL) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+
+                    def->protos[i]->ips[0]->prefix = masklen;
+
+                    def->protos[i]->gateway =
+                        strdup(ipRouteConfig->defaultGateway);
+                    if (def->protos[i]->gateway == NULL) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+                }
+            }
+        }
+    }
+
+    /* Add bridge information */
+    def->data.bridge.stp = 0; /* off */
+
+    /**
+     * traversing physical nic list twice, first to get total
+     * interfaces and second to populate interface items.
+     * Total Complexity ~= O(N); N should not be a large number.
+     */
+    for (physicalNic = matchingPhysicalNicList, i = 0; physicalNic != NULL;
+         physicalNic = physicalNic->_next, ++i) {
+    }
+
+    if ( i > 0) {
+        if (VIR_ALLOC_N(def->data.bridge.itf, i) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
+
+        def->data.bridge.nbItf = i;
+        for (physicalNic = matchingPhysicalNicList, i = 0;
+             physicalNic != NULL;
+             physicalNic = physicalNic->_next, ++i) {
+            virInterfaceDefFree(itf);
+            if (VIR_ALLOC(itf) < 0) {
+                virReportOOMError();
+                goto cleanup;
+            }
+
+            itf->type = VIR_INTERFACE_TYPE_ETHERNET;
+            itf->name = strdup(physicalNic->device);
+            if (itf->name == NULL) {
+                virReportOOMError();
+                goto cleanup;
+            }
+
+            itf->mac = strdup(physicalNic->mac);
+            if (itf->mac == NULL) {
+                virReportOOMError();
+                goto cleanup;
+            }
+
+            def->data.bridge.itf[i] = itf;
+            itf = NULL; /* avoid double free */
+        }
+    }
+
+    ret = virInterfaceDefFormat(def);
+
+ cleanup:
+
+    esxVI_HostVirtualNic_Free(&hostVirtualNicList);
+    esxVI_PhysicalNic_Free(&physicalNicList);
+    esxVI_PhysicalNic_Free(&matchingPhysicalNicList);
+    esxVI_HostPortGroup_Free(&hostPortGroupList);
+    esxVI_HostVirtualSwitch_Free(&hostVirtualSwitchList);
+    esxVI_HostIpRouteConfig_Free(&ipRouteConfig);
+    esxVI_ObjectContent_Free(&hostSystem);
+    esxVI_String_Free(&propertyNameList);
+    virInterfaceDefFree(def);
+    virInterfaceDefFree(itf);
+
+    return ret;
+
+}
+
+
+
+static int
+esxInterfaceUndefine(virInterfacePtr iface)
+{
+    esxPrivate *priv = iface->conn->interfacePrivateData;
+
+    if (esxVI_RemoveVirtualNic(
+          priv->primary,
+          priv->primary->hostSystem->configManager->networkSystem,
+          iface->name) < 0) {
+        return -1;
+    }
+
+    return 0;
+
+}
+
+
+
+static int
+esxInterfaceCreate(virInterfacePtr iface ATTRIBUTE_UNUSED,
+                   unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    /* ESX interfaces are always active */
+    return 0;
+
+}
+
+
+
+static int
+esxInterfaceDestroy(virInterfacePtr iface ATTRIBUTE_UNUSED,
+                    unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    /* ESX interfaces can not be deactivated */
+    return 1;
+
+}
+
+
+
 static virInterfaceDriver esxInterfaceDriver = {
     .name = "ESX",
-    .open = esxInterfaceOpen, /* 0.7.6 */
-    .close = esxInterfaceClose, /* 0.7.6 */
+    .open = esxInterfaceOpen,                   /* 0.7.6 */
+    .close = esxInterfaceClose,                 /* 0.7.6 */
+    .numOfInterfaces = esxNumOfInterfaces,      /* 0.9.x */
+    .numOfDefinedInterfaces = esxNumOfDefinedInterfaces, /* 0.9.x */
+    .listInterfaces = esxListInterfaces,        /* 0.9.x */
+    .listDefinedInterfaces = esxListDefinedInterfaces, /* 0.9.x */
+    .interfaceLookupByName = esxInterfaceLookupByName, /* 0.9.x */
+    .interfaceLookupByMACString = esxInterfaceLookupByMACString, /* 0.9.x */
+    .interfaceGetXMLDesc = esxInterfaceGetXMLDesc, /* 0.9.x */
+    .interfaceUndefine = esxInterfaceUndefine, /* 0.9.x */
+    .interfaceCreate = esxInterfaceCreate, /* 0.9.x */
+    .interfaceDestroy = esxInterfaceDestroy, /* 0.9.x */
 };
 
 
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index 2c789e1..962c9c2 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -4569,6 +4569,131 @@ esxVI_LookupManagedObjectHelper(esxVI_Context *ctx,
     return result;
 }
 
+int
+esxVI_LookupHostVirtualNicList(esxVI_Context* ctx,
+                               esxVI_HostVirtualNic** virtualNicList)
+{
+    int result = -1;
+    esxVI_String *propertyNameList = NULL;
+    esxVI_DynamicProperty *dynamicProperty = NULL;
+    esxVI_ObjectContent* hostSystem = NULL;
+
+    if (esxVI_String_AppendValueListToList(
+          &propertyNameList, "config.network.vnic\0") < 0 ||
+        esxVI_LookupHostSystemProperties(ctx, propertyNameList,
+            &hostSystem) < 0) {
+        goto cleanup;
+    }
+
+    if (hostSystem == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                        _("Could not retrieve the HostSystem object"));
+
+        goto cleanup;
+    }
+
+    for (dynamicProperty = hostSystem->propSet;
+         dynamicProperty != NULL;
+         dynamicProperty = dynamicProperty->_next) {
+        if (STREQ(dynamicProperty->name, "config.network.vnic")) {
+            if (esxVI_HostVirtualNic_CastListFromAnyType(
+                  dynamicProperty->val, virtualNicList) < 0) {
+                goto cleanup;
+            }
+            break;
+        } else {
+            VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
+        }
+    }
+
+    result = 0;
+
+cleanup:
+    esxVI_String_Free(&propertyNameList);
+    esxVI_ObjectContent_Free(&hostSystem);
+
+    return result;
+}
+
+int
+esxVI_LookupPhysicalNicFromHostPortGroup(
+    const char *portgroup,
+    const esxVI_HostPortGroup *hostPortGroupList,
+    const esxVI_HostVirtualSwitch *hostVirtualSwitchList,
+    const esxVI_PhysicalNic *physicalNicList,
+    esxVI_PhysicalNic **ret_physicalNicList)
+{
+    int result = -1;
+    const esxVI_HostPortGroup *hostPortGroup = NULL;
+    const esxVI_HostVirtualSwitch *hostVirtualSwitch = NULL;
+    const esxVI_PhysicalNic *physicalNic = NULL;
+    esxVI_PhysicalNic *tempPhysicalNic = NULL;
+    const esxVI_String *pnicKey = NULL;
 
+    if (portgroup == NULL) {
+        goto cleanup;
+    }
+
+    /* Go through all the port groups to find the one that matches. */
+    for (hostPortGroup = hostPortGroupList;
+         hostPortGroup != NULL;
+         hostPortGroup = hostPortGroup->_next) {
+        if (STREQ(hostPortGroup->spec->name, portgroup)) {
+            break;
+        }
+    }
+
+    if (hostPortGroup == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("Could not find Host port group"));
+        goto cleanup;
+    }
+
+    /* Go through all the virtual switches to find the one that matches */
+    for (hostVirtualSwitch = hostVirtualSwitchList;
+         hostVirtualSwitch != NULL;
+         hostVirtualSwitch = hostVirtualSwitch->_next) {
+        if (STREQ(hostPortGroup->spec->vswitchName, hostVirtualSwitch->name)) {
+            break;
+        }
+    }
+
+    if (hostVirtualSwitch == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("Could not find Virtual Switch"));
+        goto cleanup;
+    }
+
+    /* Go through all physical nics */
+    for (pnicKey = hostVirtualSwitch->pnic;
+         pnicKey != NULL;
+         pnicKey = pnicKey->_next) {
+        /* O(n^2), but probably faster than a hash due to small N */
+        for (physicalNic = physicalNicList;
+             physicalNic != NULL;
+             physicalNic = physicalNic->_next) {
+
+            esxVI_PhysicalNic_Free(&tempPhysicalNic);
+
+            if (STREQ(pnicKey->value, physicalNic->key)) {
+                if (esxVI_PhysicalNic_DeepCopy(
+                      &tempPhysicalNic, (esxVI_PhysicalNic *)physicalNic) < 0 ||
+                    esxVI_PhysicalNic_AppendToList(
+                       ret_physicalNicList, tempPhysicalNic) < 0) {
+                    goto cleanup;
+                }
+                tempPhysicalNic = NULL;
+            }
+        }
+    }
+
+    result = 0;
+
+ cleanup:
+
+    esxVI_PhysicalNic_Free(&tempPhysicalNic);
+
+    return result;
+}
 
 #include "esx_vi.generated.c"
diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
index 4b84be8..0eb9a99 100644
--- a/src/esx/esx_vi.h
+++ b/src/esx/esx_vi.h
@@ -499,6 +499,16 @@ int esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo,
 
 int esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductVersion productVersion);
 
+int esxVI_LookupHostVirtualNicList(esxVI_Context* ctx,
+                                   esxVI_HostVirtualNic** virtualNicList);
+
+int esxVI_LookupPhysicalNicFromHostPortGroup(
+        const char *portgroup,
+        const esxVI_HostPortGroup *portGroupList,
+        const esxVI_HostVirtualSwitch *virtualSwitchList,
+        const esxVI_PhysicalNic *physicalNicList,
+        esxVI_PhysicalNic **ret_physicalNicList);
+
 # include "esx_vi.generated.h"
 
 #endif /* __ESX_VI_H__ */
diff --git a/src/esx/esx_vi_generator.input b/src/esx/esx_vi_generator.input
index 1a67a8c..64f8389 100644
--- a/src/esx/esx_vi_generator.input
+++ b/src/esx/esx_vi_generator.input
@@ -57,6 +57,29 @@ enum AutoStartWaitHeartbeatSetting
     systemDefault
 end
 
+enum HostConfigChangeOperation
+    add
+    edit
+    remove
+end
+
+enum HostIpConfigIpV6AdressStatus
+    deprecated
+    duplicate
+    inaccessible
+    invalid
+    preferred
+    tentative
+    unknown
+end
+
+enum HostIpConfigV6AdressConfigType
+    dhcp
+    linklayer
+    manual
+    other
+    random
+end
 
 enum ManagedEntityStatus
     gray
@@ -197,6 +220,12 @@ object DeviceBackedVirtualDiskSpec   extends VirtualDiskSpec
     String                                   device                         r
 end
 
+object DistributedVirtualSwitchPortConnection
+    Int                                      connectionCookie               o
+    String                                   portgroupKey                   o
+    String                                   portKey                        o
+    String                                   switchUuid                     r
+end
 
 object DynamicProperty
     String                                   name                           r
@@ -316,6 +345,34 @@ object HostFileSystemVolume
     Long                                     capacity                       r
 end
 
+object HostIpConfig
+    Boolean                                  dhcp                           r
+    String                                   ipAddress                      o
+    HostIpConfigIpV6AddressConfiguration     ipV6Config                     o
+    String                                   subnetMask                     o
+end
+
+object HostIpConfigIpV6Address
+    String                                   dadState                       o
+    String                                   ipAddress                      r
+    DateTime                                 lifetime                       o
+    String                                   operation                      o
+    String                                   origin                         o
+    Int                                      prefixLength                   r
+end
+
+object HostIpConfigIpV6AddressConfiguration
+    Boolean                                  autoConfigurationEnabled       o
+    Boolean                                  dhcpV6Enabled                  o
+    HostIpConfigIpV6Address                  ipV6Address                    ol
+end
+
+object HostIpRouteConfig
+    String                                   defaultGateway                 o
+    String                                   gatewayDevice                  o
+    String                                   ipV6DefaultGateway             o
+    String                                   ipV6GatewayDevice              o
+end
 
 object HostMountInfo
     String                                   path                           o
@@ -331,11 +388,131 @@ object HostNasVolume                 extends HostFileSystemVolume
 end
 
 
+object HostNicTeamingPolicy
+    String                                   policy                         o
+    Boolean                                  reversePolicy                  o
+    Boolean                                  notifySwitches                 o
+    Boolean                                  rollingOrder                   o
+    HostNicFailureCriteria                   failureCriteria                o
+    HostNicOrderPolicy                       nicOrder                       o
+end
+
+object HostNetOffloadCapabilities
+    Boolean                                  csumOffload                    o
+    Boolean                                  tcpSegmentation                o
+    Boolean                                  zeroCopyXmit                   o
+end
+
+object HostNetworkSecurityPolicy
+    Boolean                                  allowPromiscuous               o
+    Boolean                                  macChanges                     o
+    Boolean                                  forgedTransmits                o
+end
+
+object HostNetworkPolicy
+    HostNetworkSecurityPolicy                security                       o
+    HostNicTeamingPolicy                     nicTeaming                     o
+    HostNetOffloadCapabilities               offloadPolicy                  o
+    HostNetworkTrafficShapingPolicy          shapingPolicy                  o
+end
+
+object HostNetworkTrafficShapingPolicy
+    Boolean                                  enabled                        o
+end
+
+object HostNicFailureCriteria
+    String                                   checkSpeed                     o
+    Int                                      speed                          o
+    Boolean                                  checkDuplex                    o
+    Boolean                                  fullDuplex                     o
+    Boolean                                  checkErrorPercent              o
+    Int                                      percentage                     o
+    Boolean                                  checkBeacon                    o
+end
+
+object HostNicOrderPolicy
+    String                                   activeNic                     ol
+    String                                   standbyNic                    ol
+end
+
+object HostPortGroup
+    String                                   key                            r
+    HostPortGroupPort                        port                           ol
+    String                                   vswitch                        r
+    HostNetworkPolicy                        computedPolicy                 r
+    HostPortGroupSpec                        spec                           r
+end
+
+object HostPortGroupPort
+    String                                   key                            o
+    String                                   mac                            ol
+    String                                   type                           r
+end
+
+object HostPortGroupSpec
+    String                                   name                           r
+    Int                                      vlanId                         r
+    String                                   vswitchName                    r
+    HostNetworkPolicy                        policy                         r
+end
+
 object HostScsiDiskPartition
     String                                   diskName                       r
     Int                                      partition                      r
 end
 
+object HostVirtualNic
+    String                                   device                         r
+    String                                   key                            r
+    String                                   port                           o
+    String                                   portgroup                      r
+    HostVirtualNicSpec                       spec                           r
+end
+
+object HostVirtualNicSpec
+   DistributedVirtualSwitchPortConnection    distributedVirtualPort         o
+   HostIpConfig                              ip                             o
+   String                                    mac                            o
+   Int                                       mtu                            o
+   String                                    portgroup                      o
+   Boolean                                   tsoEnabled                     o
+end
+
+
+object HostVirtualSwitch
+   String                                    key                            r
+   Int                                       mtu                            o
+   String                                    name                           r
+   Int                                       numPorts                       r
+   Int                                       numPortsAvailable              r
+   String                                    pnic                           ol
+   String                                    portgroup                      ol
+   HostVirtualSwitchSpec                     spec                           r
+end
+
+object HostVirtualSwitchBridge
+end
+
+object HostVirtualSwitchAutoBridge extends HostVirtualSwitchBridge
+   String                                    excludedNicDevice              ol
+end
+
+object HostVirtualSwitchBeaconBridge extends HostVirtualSwitchBridge
+   Int                                       interval                       r
+end
+
+object HostVirtualSwitchBondBridge extends HostVirtualSwitchBridge
+   HostVirtualSwitchBeaconBridge             beacon                         o
+   LinkDiscoveryProtocolConfig               linkDiscoveryProtocolConfig    o
+   String                                    nicDevice                      rl
+end
+
+object HostVirtualSwitchSpec
+  HostVirtualSwitchBridge                    bridge                         o
+  Int                                        mtu                            o
+  Int                                        numPorts                       r
+  HostNetworkPolicy                          policy                         o
+end
 
 object HostVmfsVolume                extends HostFileSystemVolume
     Int                                      blockSizeMb                    r
@@ -355,6 +532,10 @@ end
 object IsoImageFileQuery             extends FileQuery
 end
 
+object LinkDiscoveryProtocolConfig
+    String                                    operation                     r
+    String                                    protocol                      r
+end
 
 object LocalDatastoreInfo            extends DatastoreInfo
     String                                   path                           o
@@ -398,6 +579,10 @@ object OptionType
     Boolean                                  valueIsReadonly                o
 end
 
+object OptionValue
+    String                                   key                            r
+    AnyType                                  value                          r
+end
 
 object PerfCounterInfo
     Int                                      key                            r
@@ -454,6 +639,27 @@ object PerfSampleInfo
     Int                                      interval                       r
 end
 
+object PhysicalNic
+    String                                   device                         r
+    String                                   driver                         o
+    String                                   key                            o
+    PhysicalNicInfo                          linkSpeed                      o
+    String                                   mac                            r
+    String                                   pci                            r
+    PhysicalNicSpec                          spec                           r
+    PhysicalNicInfo                          validLinkSpecification         ol
+    Boolean                                  wakeOnLanSupported             r
+end
+
+object PhysicalNicInfo
+   Boolean                                   duplex                         r
+   Int                                       speedMb                        r
+end
+
+object PhysicalNicSpec
+    HostIpConfig                             ip                             o
+    PhysicalNicInfo                          linkSpeed                      o
+end
 
 object PropertyChange
     String                                   name                           r
@@ -773,6 +979,13 @@ end
 # Methods
 #
 
+method AddVirtualNic                 returns String                         r
+    ManagedObjectReference                   _this                          r
+    String                                   portgroup                      r
+    HostVirtualNicSpec                       nic                            r
+end
+
+
 method AnswerVM
     ManagedObjectReference                   _this                          r
     String                                   questionId                     r
@@ -954,6 +1167,10 @@ method RemoveSnapshot_Task           returns ManagedObjectReference         r
     Boolean                                  removeChildren                 r
 end
 
+method RemoveVirtualNic
+   ManagedObjectReference                    _this                          r
+   String                                    device                         r
+end
 
 method RetrieveProperties            returns ObjectContent                  ol
     ManagedObjectReference                   _this:propertyCollector        r
@@ -1002,6 +1219,16 @@ method UnregisterVM
     ManagedObjectReference                   _this                          r
 end
 
+method UpdateIpRouteConfig
+    ManagedObjectReference                   _this                          r
+    HostIpRouteConfig                        config                         r
+end
+
+method UpdateVirtualNic
+    ManagedObjectReference                   _this                          r
+    String                                   device                         r
+    HostVirtualNicSpec                       nic                            r
+end
 
 method WaitForUpdates                returns UpdateSet                      r
     ManagedObjectReference                   _this:propertyCollector        r
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index 910478c..26ae62e 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -1519,8 +1519,31 @@ additional_object_features = { "AutoStartDefaults"          : Object.FEATURE__AN
                                                               Object.FEATURE__ANY_TYPE,
                                "HostDatastoreBrowserSearchResults" : Object.FEATURE__LIST |
                                                               Object.FEATURE__ANY_TYPE,
+                               "HostIpConfig"               : Object.FEATURE__DEEP_COPY,
+                               "HostIpRouteConfig"          : Object.FEATURE__ANY_TYPE,
+                               "HostIpConfigIpV6Address"    : Object.FEATURE__LIST |
+                                                              Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__DEEP_COPY,
+                               "HostIpConfigIpV6AddressConfiguration"  : Object.FEATURE__DEEP_COPY,
+                               "HostPortGroup"              : Object.FEATURE__LIST |
+                                                              Object.FEATURE__ANY_TYPE,
+                               "HostVirtualNic"             : Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__LIST,
+                               "HostVirtualSwitch"          : Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__LIST,
+                               "KeyValue"                   : Object.FEATURE__ANY_TYPE,
                                "ManagedObjectReference"     : Object.FEATURE__ANY_TYPE,
+                               "PhysicalNic"                : Object.FEATURE__LIST |
+                                                              Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__DEEP_COPY,
                                "ObjectContent"              : Object.FEATURE__DEEP_COPY,
+                               "OptionValue"                : Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__LIST,
+                               "PhysicalNic"                : Object.FEATURE__LIST |
+                                                              Object.FEATURE__ANY_TYPE |
+                                                              Object.FEATURE__DEEP_COPY,
+                               "PhysicalNicSpec"            : Object.FEATURE__DEEP_COPY,
+                               "PhysicalNicLinkInfo"        : Object.FEATURE__LIST,
                                "ResourcePoolResourceUsage"  : Object.FEATURE__ANY_TYPE,
                                "ServiceContent"             : Object.FEATURE__DESERIALIZE,
                                "SharesInfo"                 : Object.FEATURE__ANY_TYPE,
diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c
index 708aeda..d074e69 100644
--- a/src/esx/esx_vi_types.c
+++ b/src/esx/esx_vi_types.c
@@ -475,8 +475,6 @@
         continue;                                                             \
     }
 
-
-
 /*
  * A required property must be != 0 (NULL for pointers, "undefined" == 0 for
  * enumeration values).
-- 
1.7.9.5




More information about the libvir-list mailing list