summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Vport.c
diff options
context:
space:
mode:
authorAlin Serdean <aserdean@cloudbasesolutions.com>2014-10-09 17:46:58 +0000
committerBen Pfaff <blp@nicira.com>2014-10-09 15:48:13 -0700
commit1b859c583a543fd740ef5b8a4716155f14bd78bf (patch)
treeb1000ce897552a0644444163d161ca9b832fcbf9 /datapath-windows/ovsext/Vport.c
parent429d455615b010cebe9cf1fbcb10b5e20c08c21f (diff)
downloadopenvswitch-1b859c583a543fd740ef5b8a4716155f14bd78bf.tar.gz
datapath-windows: Add port friendly name to OVS_VPORT_ENTRY
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>
Diffstat (limited to 'datapath-windows/ovsext/Vport.c')
-rw-r--r--datapath-windows/ovsext/Vport.c58
1 files changed, 56 insertions, 2 deletions
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index c26ee0fbe..f2dbbc97c 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -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