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 <sghi...@cloudbasesolutions.com> --- datapath-windows/ovsext/Vport.c | 53 +++++++++++++++++++++++++++++++++++++++-- datapath-windows/ovsext/Vport.h | 7 +++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 443e71e..5de17fc 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -483,6 +483,47 @@ 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); + 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, @@ -550,8 +591,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; @@ -626,8 +671,12 @@ 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 678c7c5..79b1c72 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; @@ -117,6 +118,10 @@ OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext, POVS_VPORT_ENTRY OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext, CHAR *name, UINT32 length); + +POVS_VPORT_ENTRY +OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext, PCHAR name); + POVS_VPORT_ENTRY OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext, NDIS_SWITCH_PORT_ID portId, -- 1.8.3.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev