Acked-by: Ankur Sharma <ankursha...@vmware.com> ________________________________________ From: dev <dev-boun...@openvswitch.org> on behalf of Nithin Raju <nit...@vmware.com> Sent: Tuesday, November 11, 2014 7:04 PM To: dev@openvswitch.org Subject: [ovs-dev] [PATCH 5/7] datapath-windows: Changes to InitOvsVportCommon()
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 <nit...@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 a850b15..57e4c1e 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); @@ -206,7 +210,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; @@ -553,6 +557,7 @@ OvsFindVportByHvNameA(POVS_SWITCH_CONTEXT switchContext, OvsFreeMemory(wsName); return vport; } + POVS_VPORT_ENTRY OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext, NDIS_SWITCH_PORT_ID portId, @@ -818,12 +823,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: @@ -872,7 +877,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; } @@ -916,8 +923,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; } @@ -1067,7 +1075,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; @@ -1126,7 +1134,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 bd9cec2..e90d97e 100644 --- a/datapath-windows/ovsext/Vport.h +++ b/datapath-windows/ovsext/Vport.h @@ -209,8 +209,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 _______________________________________________ dev mailing list dev@openvswitch.org https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailman_listinfo_dev&d=AAIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=RDZsrBxhAiOewDSD-jiF-W03FqHevF2o7haW6eQzmtA&m=hHCPcKximHo818epob_ojBCm1YbFZXVgpngS9BScpLs&s=ah4G6Dwu1JQiY8eTzE0FjmhkBcHZJ-bt_1E2kAEt_XQ&e= _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev