datapath-windows: Add port friendly name to OVS_VPORT_ENTRY
authorAlin Serdean <aserdean@cloudbasesolutions.com>
Thu, 9 Oct 2014 17:46:58 +0000 (17:46 +0000)
committerBen Pfaff <blp@nicira.com>
Thu, 9 Oct 2014 22:48:13 +0000 (15:48 -0700)
The port friendly name will be set by WMI / powershell script.
It will be used from within the netlink command vport new to
identify the hyper-v switch port it represents.

This patch also adds a function to lookup a vport by the
port friendly name.

Signed-off-by: Samuel Ghinet <sghinet@cloudbasesolutions.com>
Co-authored-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Acked-by: Ankur Sharma <ankursharma@vmware.com>
Acked-by: Eitan Eliahu <eliahue@vmware.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Tested-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
datapath-windows/ovsext/Vport.c
datapath-windows/ovsext/Vport.h

index c26ee0f..f2dbbc9 100644 (file)
@@ -491,6 +491,51 @@ OvsFindVportByOvsName(POVS_SWITCH_CONTEXT switchContext,
     return NULL;
 }
 
+/* OvsFindVportByHvName: "name" is assumed to be null-terminated */
+POVS_VPORT_ENTRY
+OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext,
+                     PSTR name)
+{
+    POVS_VPORT_ENTRY vport = NULL;
+    PLIST_ENTRY head, link;
+    /* 'portFriendlyName' is not NUL-terminated. */
+    SIZE_T length = strlen(name);
+    SIZE_T wstrSize = length * sizeof(WCHAR);
+
+    PWSTR wsName = OvsAllocateMemory(wstrSize);
+    if (!wsName) {
+        return NULL;
+    }
+    for (UINT i = 0; i < length; i) {
+        wsName[i] = name[i];
+    }
+
+    for (UINT32 i = 0; i < OVS_MAX_VPORT_ARRAY_SIZE; i) {
+        head = &(switchContext->portIdHashArray[i]);
+        LIST_FORALL(head, link) {
+            vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portIdLink);
+
+            /*
+             * NOTE about portFriendlyName:
+             * If the string is NULL-terminated, the Length member does not
+             * include the terminating NULL character.
+             */
+            if (vport->portFriendlyName.Length == wstrSize &&
+                RtlEqualMemory(wsName, vport->portFriendlyName.String,
+                               vport->portFriendlyName.Length)) {
+                goto Cleanup;
+            }
+
+            vport = NULL;
+        }
+    }
+
+Cleanup:
+    OvsFreeMemory(wsName);
+
+    return vport;
+}
+
 POVS_VPORT_ENTRY
 OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext,
                                 NDIS_SWITCH_PORT_ID portId,
@@ -558,8 +603,12 @@ OvsInitVportWithPortParam(POVS_VPORT_ENTRY vport,
         vport->ovsType = OVS_VPORT_TYPE_NETDEV;
         break;
     }
-    RtlCopyMemory(&vport->portName, &portParam->PortName,
+    RtlCopyMemory(&vport->hvPortName, &portParam->PortName,
                   sizeof (NDIS_SWITCH_PORT_NAME));
+
+    RtlCopyMemory(&vport->portFriendlyName, &portParam->PortFriendlyName,
+                  sizeof(NDIS_SWITCH_PORT_FRIENDLYNAME));
+
     switch (vport->portState) {
     case NdisSwitchPortStateCreated:
         vport->ovsState = OVS_STATE_PORT_CREATED;
@@ -634,8 +683,13 @@ OvsInitPhysNicVport(POVS_VPORT_ENTRY vport,
     vport->ovsType = OVS_VPORT_TYPE_NETDEV;
     vport->isExternal = TRUE;
     vport->nicIndex = (NDIS_SWITCH_NIC_INDEX)nicIndex;
-    RtlCopyMemory(&vport->portName, &virtVport->portName,
+
+    RtlCopyMemory(&vport->hvPortName, &virtVport->hvPortName,
                   sizeof (NDIS_SWITCH_PORT_NAME));
+
+    RtlCopyMemory(&vport->portFriendlyName, &virtVport->portFriendlyName,
+                  sizeof(NDIS_SWITCH_PORT_FRIENDLYNAME));
+
     vport->ovsState = OVS_STATE_PORT_CREATED;
 }
 static NDIS_STATUS
index 077df77..462c5b7 100644 (file)
@@ -101,7 +101,8 @@ typedef struct _OVS_VPORT_ENTRY {
     UINT8                  currMacAddress[MAC_ADDRESS_LEN];
     UINT8                  vmMacAddress[MAC_ADDRESS_LEN];
 
-    NDIS_SWITCH_PORT_NAME  portName;
+    NDIS_SWITCH_PORT_NAME  hvPortName;
+    IF_COUNTED_STRING      portFriendlyName;
     NDIS_SWITCH_NIC_NAME   nicName;
     NDIS_VM_NAME           vmName;
     GUID                   netCfgInstanceId;
@@ -118,6 +119,8 @@ POVS_VPORT_ENTRY
 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
                       CHAR *name, UINT32 length);
 POVS_VPORT_ENTRY
+OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext, PSTR name);
+POVS_VPORT_ENTRY
 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
                                 NDIS_SWITCH_PORT_ID portId,
                                 NDIS_SWITCH_NIC_INDEX index);