@@ -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
@@ -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,
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 <svinturis@cloudbasesolutions.com> --- datapath-windows/ovsext/Vport.c | 89 ++++++++++++++++++++--------------------- datapath-windows/ovsext/Vport.h | 5 --- 2 files changed, 43 insertions(+), 51 deletions(-)