The internal/external vports will have the actual OS-based names, which represent the NIC interface alias that is displayed by running 'Get-NetAdapter' Hyper-V PS command.
Signed-off-by: Sorin Vinturis <svintu...@cloudbasesolutions.com> --- datapath-windows/ovsext/Vport.c | 89 ++++++++++++++++++++--------------------- datapath-windows/ovsext/Vport.h | 5 --- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index ea10692..74d7e07 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -95,7 +95,7 @@ static VOID OvsTunnelVportPendingInit(PVOID context, static VOID OvsTunnelVportPendingRemove(PVOID context, NTSTATUS status, UINT32 *replyLen); - +static VOID AssignNicNameSpecial(POVS_VPORT_ENTRY vport); /* * Functions implemented in relaton to NDIS port manipulation. @@ -191,10 +191,8 @@ HvUpdatePort(POVS_SWITCH_CONTEXT switchContext, portParam->PortId, 0); /* * Update properties only for NETDEV ports for supprting PS script - * We don't allow changing the names of the internal or external ports */ - if (vport == NULL || (( vport->portType != NdisSwitchPortTypeSynthetic) && - ( vport->portType != NdisSwitchPortTypeEmulated))) { + if (vport == NULL) { goto update_port_done; } @@ -436,6 +434,10 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext, } switch (nicParam->NicType) { case NdisSwitchNicTypeExternal: + RtlCopyMemory(&vport->netCfgInstanceId, &nicParam->NetCfgInstanceId, + sizeof(GUID)); + AssignNicNameSpecial(vport); + break; case NdisSwitchNicTypeInternal: RtlCopyMemory(&vport->netCfgInstanceId, &nicParam->NetCfgInstanceId, sizeof (GUID)); @@ -890,6 +892,10 @@ OvsInitPhysNicVport(POVS_VPORT_ENTRY physExtVport, &virtExtVport->portFriendlyName, sizeof(NDIS_SWITCH_PORT_FRIENDLYNAME)); + RtlCopyMemory(&physExtVport->netCfgInstanceId, + &virtExtVport->netCfgInstanceId, + sizeof(physExtVport->netCfgInstanceId)); + physExtVport->ovsState = OVS_STATE_PORT_CREATED; } @@ -968,36 +974,47 @@ OvsInitBridgeInternalVport(POVS_VPORT_ENTRY vport) /* * -------------------------------------------------------------------------- - * For external vports 'portFriendlyName' provided by Hyper-V is over-written - * by synthetic names. + * For external vport 'portFriendlyName' parameter, provided by Hyper-V, is + * overwritten with the interface alias name. * -------------------------------------------------------------------------- */ static VOID AssignNicNameSpecial(POVS_VPORT_ENTRY vport) { - size_t len; + NTSTATUS status = STATUS_SUCCESS; + WCHAR interfaceName[IF_MAX_STRING_SIZE] = { 0 }; + NET_LUID interfaceLuid = { 0 }; + size_t len = 0; - if (vport->portType == NdisSwitchPortTypeExternal) { - if (vport->nicIndex == 0) { - ASSERT(vport->nicIndex == 0); - RtlStringCbPrintfW(vport->portFriendlyName.String, - IF_MAX_STRING_SIZE, - L"%s.virtualAdapter", OVS_DPPORT_EXTERNAL_NAME_W); + ASSERT(vport->portType == NdisSwitchPortTypeExternal || + vport->portType == NdisSwitchPortTypeInternal); + + status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId, + &interfaceLuid); + if (status == STATUS_SUCCESS) { + status = ConvertInterfaceLuidToAlias(&interfaceLuid, interfaceName, + IF_MAX_STRING_SIZE + 1); + if (status == STATUS_SUCCESS) { + if (vport->portType == NdisSwitchPortTypeExternal && + vport->nicIndex == 0) { + RtlStringCbPrintfW(vport->portFriendlyName.String, IF_MAX_STRING_SIZE, + L"%s.virtualAdapter", interfaceName); + } else { + RtlStringCbPrintfW(vport->portFriendlyName.String, + IF_MAX_STRING_SIZE, L"%s", interfaceName); + } + + RtlStringCbLengthW(vport->portFriendlyName.String, IF_MAX_STRING_SIZE, + &len); + vport->portFriendlyName.Length = (USHORT)len; } else { - RtlStringCbPrintfW(vport->portFriendlyName.String, - IF_MAX_STRING_SIZE, - L"%s.%lu", OVS_DPPORT_EXTERNAL_NAME_W, - (UINT32)vport->nicIndex); + OVS_LOG_INFO("Fail to convert interface LUID to alias, status: %x", + status); } } else { - RtlStringCbPrintfW(vport->portFriendlyName.String, - IF_MAX_STRING_SIZE, - L"%s", OVS_DPPORT_INTERNAL_NAME_W); + OVS_LOG_INFO("Fail to convert interface GUID to LUID, status: %x", + status); } - - RtlStringCbLengthW(vport->portFriendlyName.String, IF_MAX_STRING_SIZE, - &len); - vport->portFriendlyName.Length = (USHORT)len; } @@ -1038,8 +1055,6 @@ InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext, case NdisSwitchPortTypeInternal: ASSERT(vport->isBridgeInternal == FALSE); - /* Overwrite the 'portFriendlyName' of the internal vport. */ - AssignNicNameSpecial(vport); switchContext->internalPortId = vport->portId; switchContext->internalVport = vport; break; @@ -2093,9 +2108,7 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, PCHAR portName; ULONG portNameLen; UINT32 portType; - BOOLEAN isBridgeInternal = FALSE; BOOLEAN vportAllocated = FALSE, vportInitialized = FALSE; - BOOLEAN addInternalPortAsNetdev = FALSE; static const NL_POLICY ovsVportPolicy[] = { [OVS_VPORT_ATTR_PORT_NO] = { .type = NL_A_U32, .optional = TRUE }, @@ -2138,24 +2151,12 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, goto Cleanup; } - if (portName && portType == OVS_VPORT_TYPE_NETDEV && - !strcmp(OVS_DPPORT_INTERNAL_NAME_A, portName)) { - addInternalPortAsNetdev = TRUE; - } - - if (portName && portType == OVS_VPORT_TYPE_INTERNAL && - strcmp(OVS_DPPORT_INTERNAL_NAME_A, portName)) { - isBridgeInternal = TRUE; - } - - if (portType == OVS_VPORT_TYPE_INTERNAL && !isBridgeInternal) { - vport = gOvsSwitchContext->internalVport; - } else if (portType == OVS_VPORT_TYPE_NETDEV) { + if (portType == OVS_VPORT_TYPE_NETDEV) { /* External ports can also be looked up like VIF ports. */ vport = OvsFindVportByHvNameA(gOvsSwitchContext, portName); } else { ASSERT(OvsIsTunnelVportType(portType) || - (portType == OVS_VPORT_TYPE_INTERNAL && isBridgeInternal)); + portType == OVS_VPORT_TYPE_INTERNAL); vport = (POVS_VPORT_ENTRY)OvsAllocateVport(); if (vport == NULL) { @@ -2221,10 +2222,6 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, goto Cleanup; } - /* Initialize the vport with OVS specific properties. */ - if (addInternalPortAsNetdev != TRUE) { - vport->ovsType = portType; - } if (vportAttrs[OVS_VPORT_ATTR_PORT_NO] != NULL) { /* * XXX: when we implement the limit for ovs port number to be diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h index ba21c62..ead55a9 100644 --- a/datapath-windows/ovsext/Vport.h +++ b/datapath-windows/ovsext/Vport.h @@ -34,11 +34,6 @@ */ #define OVS_DPPORT_NUMBER_LOCAL 0 -#define OVS_DPPORT_INTERNAL_NAME_A "internal" -#define OVS_DPPORT_INTERNAL_NAME_W L"internal" -#define OVS_DPPORT_EXTERNAL_NAME_A "external" -#define OVS_DPPORT_EXTERNAL_NAME_W L"external" - /* * A Vport, or Virtual Port, is a port on the OVS. It can be one of the * following types. Some of the Vports are "real" ports on the hyper-v switch, -- 1.9.0.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev