[ovs-dev] [PATCH 5/7 v2] datapath-windows: Changes to InitOvsVportCommon()

Nithin Raju nithin at vmware.com
Wed Nov 19 01:37:03 UTC 2014


If a Hyper-V port (for which there exists an OVS port), gets deleted and
re-added, we'll call into InitOvsVportCommon() for the port to insert
the port into the 'portIdHashArray' as well as do a few other
initialization in the switch ocntext.

We should not be incrementing 'numHvPorts' at this point since this
vport has been counted before when it was first allocated. To account
for this, we add a new parameter to InitOvsVportCommon(). The arguments
passed by some of the callers are not 100% correct, and will be fixed in
future commit in the series.

Signed-off-by: Nithin Raju <nithin at vmware.com>
Acked-by: Ankur Sharma <ankursharma at vmware.com>
---
 datapath-windows/ovsext/Vport.c |   28 ++++++++++++++++++----------
 datapath-windows/ovsext/Vport.h |    2 --
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index a740b31..d92d93a 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -67,6 +67,9 @@ static NTSTATUS CreateNetlinkMesgForNetdev(POVS_VPORT_EXT_INFO info,
                                            int dpIfIndex);
 static POVS_VPORT_ENTRY OvsFindVportByHvNameW(POVS_SWITCH_CONTEXT switchContext,
                                               PWSTR wsName, SIZE_T wstrSize);
+static NDIS_STATUS InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
+                                     POVS_VPORT_ENTRY vport,
+                                     BOOLEAN newPort);
 
 /*
  * Functions implemented in relaton to NDIS port manipulation.
@@ -96,7 +99,8 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
     }
 
     OvsInitVportWithPortParam(vport, portParam);
-    InitHvVportCommon(switchContext, vport);
+    /* XXX: Dummy argument to InitHvVportCommon(). */
+    InitHvVportCommon(switchContext, vport, TRUE);
 
 create_port_done:
     NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
@@ -263,7 +267,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
             goto add_nic_done;
         }
         OvsInitPhysNicVport(vport, virtExtVport, nicParam->NicIndex);
-        status = InitHvVportCommon(switchContext, vport);
+        status = InitHvVportCommon(switchContext, vport, TRUE);
         if (status != NDIS_STATUS_SUCCESS) {
             OvsFreeMemory(vport);
             goto add_nic_done;
@@ -610,6 +614,7 @@ OvsFindVportByHvNameA(POVS_SWITCH_CONTEXT switchContext,
     OvsFreeMemory(wsName);
     return vport;
 }
+
 POVS_VPORT_ENTRY
 OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext,
                                 NDIS_SWITCH_PORT_ID portId,
@@ -875,12 +880,12 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY vport)
  * For external NIC, assigns the name for the NIC.
  * --------------------------------------------------------------------------
  */
-NDIS_STATUS
+static NDIS_STATUS
 InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
-                  POVS_VPORT_ENTRY vport)
+                  POVS_VPORT_ENTRY vport,
+                  BOOLEAN newPort)
 {
     UINT32 hash;
-    ASSERT(vport->portNo == OVS_DPPORT_NUMBER_INVALID);
 
     switch (vport->portType) {
     case NdisSwitchPortTypeExternal:
@@ -929,7 +934,9 @@ InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
     hash = OvsJhashWords(&vport->portId, 1, OVS_HASH_BASIS);
     InsertHeadList(&switchContext->portIdHashArray[hash & OVS_VPORT_MASK],
                    &vport->portIdLink);
-    switchContext->numHvVports++;
+    if (newPort) {
+        switchContext->numHvVports++;
+    }
     return NDIS_STATUS_SUCCESS;
 }
 
@@ -973,8 +980,9 @@ InitOvsVportCommon(POVS_SWITCH_CONTEXT switchContext,
 
     hash = OvsJhashBytes(vport->ovsName, strlen(vport->ovsName) + 1,
                          OVS_HASH_BASIS);
-    InsertHeadList(&gOvsSwitchContext->ovsPortNameHashArray[hash & OVS_VPORT_MASK],
-                   &vport->ovsNameLink);
+    InsertHeadList(
+        &gOvsSwitchContext->ovsPortNameHashArray[hash & OVS_VPORT_MASK],
+        &vport->ovsNameLink);
 
     return STATUS_SUCCESS;
 }
@@ -1124,7 +1132,7 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)
              goto cleanup;
          }
          OvsInitVportWithPortParam(vport, portParam);
-         status = InitHvVportCommon(switchContext, vport);
+         status = InitHvVportCommon(switchContext, vport, TRUE);
          if (status != NDIS_STATUS_SUCCESS) {
              OvsFreeMemory(vport);
              goto cleanup;
@@ -1183,7 +1191,7 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
             if (vport) {
                 OvsInitPhysNicVport(vport, virtExtVport,
                                     nicParam->NicIndex);
-                status = InitHvVportCommon(switchContext, vport);
+                status = InitHvVportCommon(switchContext, vport, TRUE);
                 if (status != NDIS_STATUS_SUCCESS) {
                     OvsFreeMemory(vport);
                     vport = NULL;
diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h
index 4ee41e4..9110292 100644
--- a/datapath-windows/ovsext/Vport.h
+++ b/datapath-windows/ovsext/Vport.h
@@ -211,8 +211,6 @@ VOID OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext,
                              BOOLEAN hvDelete, BOOLEAN ovsDelete,
                              BOOLEAN *vportDeallocated);
 
-NDIS_STATUS InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
-                              POVS_VPORT_ENTRY vport);
 NDIS_STATUS InitOvsVportCommon(POVS_SWITCH_CONTEXT switchContext,
                                POVS_VPORT_ENTRY vport);
 NTSTATUS OvsInitTunnelVport(POVS_VPORT_ENTRY vport, OVS_VPORT_TYPE ovsType,
-- 
1.7.4.1




More information about the dev mailing list