diff options
Diffstat (limited to 'datapath-windows/ovsext/Vport.c')
-rw-r--r-- | datapath-windows/ovsext/Vport.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index e8c4d7f9b..57e75109d 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -100,6 +100,12 @@ static NTSTATUS GetNICAlias(PNDIS_SWITCH_NIC_PARAMETERS nicParam, static NTSTATUS OvsConvertIfCountedStrToAnsiStr(PIF_COUNTED_STRING wStr, CHAR *str, UINT16 maxStrLen); +_Requires_lock_held_(switchContext->dispatchLock) +static VOID OvsBindVportWithIpHelper(POVS_VPORT_ENTRY vport, + POVS_SWITCH_CONTEXT switchContext); +_Requires_lock_held_(switchContext->dispatchLock) +static VOID OvsUnBindVportWithIpHelper(POVS_VPORT_ENTRY vport, + POVS_SWITCH_CONTEXT switchContext); /* * -------------------------------------------------------------------------- @@ -453,7 +459,7 @@ HvConnectNic(POVS_SWITCH_CONTEXT switchContext, vport->nicState = NdisSwitchNicStateConnected; if (nicParam->NicType == NdisSwitchNicTypeInternal) { - OvsInternalAdapterUp(vport->portNo, &vport->netCfgInstanceId); + OvsBindVportWithIpHelper(vport, switchContext); } NdisReleaseRWLock(switchContext->dispatchLock, &lockState); @@ -633,7 +639,7 @@ HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, } if (isInternalPort) { - OvsInternalAdapterDown(vport->portNo, vport->netCfgInstanceId); + OvsUnBindVportWithIpHelper(vport, switchContext); OvsRemoveAndDeleteVport(NULL, switchContext, vport, TRUE, TRUE); OvsPostVportEvent(&event); } @@ -1308,7 +1314,7 @@ OvsRemoveAndDeleteVport(PVOID usrParamsContext, if (hvDelete && vport->isAbsentOnHv == FALSE) { switchContext->countInternalVports--; ASSERT(switchContext->countInternalVports >= 0); - OvsInternalAdapterDown(vport->portNo, vport->netCfgInstanceId); + OvsUnBindVportWithIpHelper(vport, switchContext); } hvSwitchPort = TRUE; break; @@ -2814,3 +2820,25 @@ OvsTunnelVportPendingInit(PVOID context, ASSERT(*replyLen != 0); } } + +_Use_decl_annotations_ +static VOID +OvsBindVportWithIpHelper(POVS_VPORT_ENTRY vport, + POVS_SWITCH_CONTEXT switchContext) +{ + OVS_LOG_TRACE("OvsBindVportWithIpHelper: %d", vport->portNo); + ASSERT(switchContext->ipHelperBoundVportNo == 0); + switchContext->ipHelperBoundVportNo = vport->portNo; + OvsInternalAdapterUp(vport->portNo, &vport->netCfgInstanceId); +} + +_Use_decl_annotations_ +static VOID +OvsUnBindVportWithIpHelper(POVS_VPORT_ENTRY vport, + POVS_SWITCH_CONTEXT switchContext) +{ + OVS_LOG_TRACE("OvsUnBindVportWithIpHelper: %d", vport->portNo); + ASSERT(switchContext->ipHelperBoundVportNo == vport->portNo); + switchContext->ipHelperBoundVportNo = 0; + OvsInternalAdapterDown(vport->portNo, vport->netCfgInstanceId); +} |