[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