[ovs-dev] [PATCH 10/10] datapath-windows: Add port friendly name to OVS_VPORT_ENTRY

Alin Serdean aserdean at cloudbasesolutions.com
Thu Oct 9 00:21:10 UTC 2014


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 at cloudbasesolutions.com>
Co-authored-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
---
 datapath-windows/ovsext/Vport.c | 58 +++++++++++++++++++++++++++++++++++++++--
 datapath-windows/ovsext/Vport.h |  5 +++-
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 6760066..e23b27d 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -489,6 +489,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;
+    SIZE_T length = sizeof(name);
+    SIZE_T wstrSize = length * sizeof(WORD);
+
+    PWSTR wsName = OvsAllocateMemory(wstrSize);
+    if (!wsName) {
+        vport = NULL;
+        goto Cleanup;
+    }
+    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,
@@ -556,8 +601,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;
@@ -632,8 +681,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
diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h
index 077df77..462c5b7 100644
--- a/datapath-windows/ovsext/Vport.h
+++ b/datapath-windows/ovsext/Vport.h
@@ -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);
-- 
1.9.4.msysgit.1



More information about the dev mailing list