summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Vport.c
diff options
context:
space:
mode:
Diffstat (limited to 'datapath-windows/ovsext/Vport.c')
-rw-r--r--datapath-windows/ovsext/Vport.c34
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);
+}