Acked-by: Sairam Venugopal <vsai...@vmware.com>

On 11/18/15, 8:13 AM, "Nithin Raju" <nit...@vmware.com> wrote:

>If the name of an internal or external NIC changes, we need to
>disconnect the NIC from OVS since the name is the key. In this
>change, we generate a link down event. It is as though we got a
>call to HvDisconnectNic() for the old name and got a HvConnectNic()
>for the new name.
>
>Also, HvCreateNic() has been cleaned up to remove the code to look
>for existing vport. We won't have a vport now since we'd have deleted
>the vport in HvDeleteNic().
>
>Signed-off-by: Nithin Raju <nit...@vmware.com>
>---
> datapath-windows/ovsext/Vport.c | 100
>++++++++++++++++++++--------------------
> datapath-windows/ovsext/Vport.h |  34 ++++++++++++--
> 2 files changed, 80 insertions(+), 54 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Vport.c
>b/datapath-windows/ovsext/Vport.c
>index ef21fca..a7576d3 100644
>--- a/datapath-windows/ovsext/Vport.c
>+++ b/datapath-windows/ovsext/Vport.c
>@@ -327,9 +327,8 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>         goto done;
>     }
> 
>-    if (nicParam->NicType == NdisSwitchNicTypeInternal ||
>-        (nicParam->NicType == NdisSwitchNicTypeExternal &&
>-         nicParam->NicIndex != 0)) {
>+    if (OvsIsInternalNIC(nicParam->NicType) ||
>+        OvsIsRealExternalNIC(nicParam->NicType, nicParam->NicIndex)) {
>         GetNICAlias(&nicParam->NetCfgInstanceId, &portFriendlyName);
>     }
> 
>@@ -339,44 +338,22 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>      * structure for each such NIC, and each NIC inherits a lot of
>properties
>      * from the parent external port.
>      */
>-    if (nicParam->NicType == NdisSwitchNicTypeExternal &&
>-        nicParam->NicIndex != 0) {
>+    if (OvsIsRealExternalNIC(nicParam->NicType, nicParam->NicIndex)) {
>+        NDIS_SWITCH_PORT_PARAMETERS portParam;
>         POVS_VPORT_ENTRY virtExtVport =
>             (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
> 
>-        vport = OvsFindVportByPortIdAndNicIndex(switchContext,
>-                                                nicParam->PortId,
>-                                                nicParam->NicIndex);
>-        if (vport == NULL) {
>-            NDIS_SWITCH_PORT_PARAMETERS portParam;
>-            /* Find by interface name */
>-            WCHAR interfaceName[IF_MAX_STRING_SIZE] = { 0 };
>-            NET_LUID interfaceLuid = { 0 };
>-            size_t len = 0;
>-            status =
>ConvertInterfaceGuidToLuid(&nicParam->NetCfgInstanceId,
>-                                                &interfaceLuid);
>-            if (status == STATUS_SUCCESS) {
>-                status = ConvertInterfaceLuidToAlias(&interfaceLuid,
>-                                                     interfaceName,
>-                                                     IF_MAX_STRING_SIZE
>+ 1);
>-                if (status == STATUS_SUCCESS) {
>-                    RtlStringCbLengthW(interfaceName,
>-                                       IF_MAX_STRING_SIZE,
>-                                       &len);
>-                    vport = OvsFindVportByHvNameW(switchContext,
>-                                                  interfaceName,
>-                                                  len);
>-                }
>-            }
>-
>-            OvsCopyPortParamsFromVport(virtExtVport, &portParam);
>-            NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>-            status = HvCreatePort(switchContext, &portParam,
>-                                  nicParam->NicIndex);
>-            NdisAcquireRWLockWrite(switchContext->dispatchLock,
>&lockState, 0);
>-            if (status != NDIS_STATUS_SUCCESS) {
>-                goto add_nic_done;
>-            }
>+        ASSERT(virtExtVport);
>+        ASSERT(OvsFindVportByPortIdAndNicIndex(switchContext,
>+                                               nicParam->PortId,
>+                                               nicParam->NicIndex) ==
>NULL);
>+        OvsCopyPortParamsFromVport(virtExtVport, &portParam);
>+        NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>+        status = HvCreatePort(switchContext, &portParam,
>+                              nicParam->NicIndex);
>+        NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState,
>0);
>+        if (status != NDIS_STATUS_SUCCESS) {
>+            goto add_nic_done;
>         }
>     }
> 
>@@ -390,9 +367,8 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>         goto add_nic_done;
>     }
>     OvsInitVportWithNicParam(switchContext, vport, nicParam);
>-    if (nicParam->NicType == NdisSwitchNicTypeInternal ||
>-        (nicParam->NicType == NdisSwitchNicTypeExternal &&
>-         nicParam->NicIndex != 0)) {
>+    if (OvsIsInternalNIC(nicParam->NicType) ||
>+        OvsIsRealExternalNIC(nicParam->NicType, nicParam->NicIndex)) {
>         RtlCopyMemory(&vport->portFriendlyName, &portFriendlyName,
>                       sizeof portFriendlyName);
>     }
>@@ -470,6 +446,8 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
>     LOCK_STATE_EX lockState;
>     UINT32 event = 0;
>     IF_COUNTED_STRING portFriendlyName = {0};
>+    BOOLEAN nameChanged = FALSE;
>+    BOOLEAN aliasLookup = FALSE;
> 
>     VPORT_NIC_ENTER(nicParam);
> 
>@@ -483,9 +461,9 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
> 
>     /* GetNICAlias() must be called outside of a lock. */
>     if (nicParam->NicType == NdisSwitchNicTypeInternal ||
>-        (nicParam->NicType == NdisSwitchNicTypeExternal &&
>-         nicParam->NicIndex != 0)) {
>+        OvsIsRealExternalNIC(nicParam->NicType, nicParam->NicIndex)) {
>         GetNICAlias(&nicParam->NetCfgInstanceId, &portFriendlyName);
>+        aliasLookup = TRUE;
>     }
> 
>     NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState, 0);
>@@ -502,8 +480,15 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
>     case NdisSwitchNicTypeInternal:
>         RtlCopyMemory(&vport->netCfgInstanceId,
>&nicParam->NetCfgInstanceId,
>                       sizeof (GUID));
>-        RtlCopyMemory(&vport->portFriendlyName, &portFriendlyName,
>-                      sizeof portFriendlyName);
>+        if (aliasLookup) {
>+            if (RtlCompareMemory(&vport->portFriendlyName,
>+                    &portFriendlyName, vport->portFriendlyName.Length) !=
>+                    vport->portFriendlyName.Length) {
>+                RtlCopyMemory(&vport->portFriendlyName,
>&portFriendlyName,
>+                    sizeof portFriendlyName);
>+                nameChanged = TRUE;
>+            }
>+        }
>         break;
>     case NdisSwitchNicTypeSynthetic:
>     case NdisSwitchNicTypeEmulated:
>@@ -536,6 +521,17 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
>     }
>     vport->numaNodeId = nicParam->NumaNodeId;
> 
>+    if (nameChanged) {
>+        OVS_EVENT_ENTRY event;
>+        event.portNo = vport->portNo;
>+        event.ovsType = vport->ovsType;
>+        event.upcallPid = vport->upcallPid;
>+        RtlCopyMemory(&event.ovsName, &vport->ovsName, sizeof
>event.ovsName);
>+        event.type = OVS_EVENT_LINK_DOWN;
>+        OvsRemoveAndDeleteVport(NULL, switchContext, vport, FALSE, TRUE);
>+        OvsPostEvent(&event);
>+    }
>+
>     NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
> 
>     /*
>@@ -598,14 +594,15 @@ HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
>     RtlCopyMemory(&event.ovsName, &vport->ovsName, sizeof event.ovsName);
>     event.type = OVS_EVENT_LINK_DOWN;
> 
>-    NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>-
>     /*
>      * Delete the port from the hash tables accessible to userspace.
>After this
>      * point, userspace should not be able to access this port.
>      */
>-    OvsRemoveAndDeleteVport(NULL, switchContext, vport, FALSE, TRUE);
>-    OvsPostEvent(&event);
>+    if (OvsIsRealExternalVport(vport)) {
>+        OvsRemoveAndDeleteVport(NULL, switchContext, vport, FALSE, TRUE);
>+        OvsPostEvent(&event);
>+    }
>+    NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
> 
>     if (isInternalPort) {
>         OvsInternalAdapterDown();
>@@ -650,8 +647,8 @@ HvDeleteNic(POVS_SWITCH_CONTEXT switchContext,
>     vport->nicState = NdisSwitchNicStateUnknown;
>     vport->ovsState = OVS_STATE_PORT_CREATED;
> 
>-    if (vport->portType == NdisSwitchPortTypeExternal &&
>-        vport->nicIndex != 0) {
>+    if (OvsIsRealExternalVport(vport)) {
>+        /* This vport was created in HvCreateNic(). */
>         OvsRemoveAndDeleteVport(NULL, switchContext, vport, TRUE, FALSE);
>     }
> 
>@@ -926,6 +923,7 @@ OvsInitVportWithNicParam(POVS_SWITCH_CONTEXT
>switchContext,
>     vport->mtu = nicParam->MTU;
>     vport->nicState = nicParam->NicState;
>     vport->nicIndex = nicParam->NicIndex;
>+    vport->nicType = nicParam->NicType;
>     vport->numaNodeId = nicParam->NumaNodeId;
> 
>     switch (vport->nicState) {
>diff --git a/datapath-windows/ovsext/Vport.h
>b/datapath-windows/ovsext/Vport.h
>index 0d56484..75ad898 100644
>--- a/datapath-windows/ovsext/Vport.h
>+++ b/datapath-windows/ovsext/Vport.h
>@@ -95,6 +95,7 @@ typedef struct _OVS_VPORT_ENTRY {
>     PVOID                  priv;
>     NDIS_SWITCH_PORT_ID    portId;
>     NDIS_SWITCH_NIC_INDEX  nicIndex;
>+    NDIS_SWITCH_NIC_TYPE   nicType;
>     UINT16                 numaNodeId;
>     NDIS_SWITCH_PORT_STATE portState;
>     NDIS_SWITCH_NIC_STATE  nicState;
>@@ -194,14 +195,41 @@ OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
> }
> 
> static __inline BOOLEAN
>+OvsIsVirtualExternalVport(POVS_VPORT_ENTRY vport)
>+{
>+    return vport->nicType == NdisSwitchNicTypeExternal &&
>+           vport->nicIndex == 0;
>+}
>+
>+static __inline BOOLEAN
>+OvsIsRealExternalVport(POVS_VPORT_ENTRY vport)
>+{
>+    return vport->nicType == NdisSwitchNicTypeExternal &&
>+           vport->nicIndex == 0;
>+}
>+
>+static __inline BOOLEAN
> OvsIsBridgeInternalVport(POVS_VPORT_ENTRY vport)
> {
>-    if (vport->isBridgeInternal) {
>-       ASSERT(vport->ovsType == OVS_VPORT_TYPE_INTERNAL);
>-    }
>+    ASSERT(vport->isBridgeInternal != TRUE ||
>+           vport->ovsType == OVS_VPORT_TYPE_INTERNAL);
>     return vport->isBridgeInternal == TRUE;
> }
> 
>+static __inline BOOLEAN
>+OvsIsInternalNIC(NDIS_SWITCH_NIC_TYPE   nicType)
>+{
>+    return nicType == NdisSwitchNicTypeInternal;
>+}
>+
>+static __inline BOOLEAN
>+OvsIsRealExternalNIC(NDIS_SWITCH_NIC_TYPE   nicType,
>+                     NDIS_SWITCH_NIC_INDEX  nicIndex)
>+{
>+    return nicType == NdisSwitchNicTypeExternal &&
>+           nicIndex != 0;
>+}
>+
> NTSTATUS OvsRemoveAndDeleteVport(PVOID usrParamsCtx,
>                                  POVS_SWITCH_CONTEXT switchContext,
>                                  POVS_VPORT_ENTRY vport,
>-- 
>1.8.5.6
>
>_______________________________________________
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=8G2K6C4aCyXStZk559MPGdNfBVTlL2
>ELIjYR51RimTE&s=3Pq4WJOANQoBBRSKuQsgz2czVHwKIgKC9n_D4eRmj0U&e= 

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to