summaryrefslogtreecommitdiff
path: root/datapath-windows
diff options
context:
space:
mode:
authorSairam Venugopal via dev <ovs-dev@openvswitch.org>2019-03-13 15:37:29 -0700
committerAlin Gabriel Serdean <aserdean@ovn.org>2019-04-03 18:37:51 +0300
commit63c71537edfa115f7c0da5d18b8e4b56d220810d (patch)
tree93422c9cc460b8d45126d8be5c65e28ace2c5889 /datapath-windows
parent241bc88a2dd76a80b9f8dcc572e82ebe1a265b29 (diff)
downloadopenvswitch-63c71537edfa115f7c0da5d18b8e4b56d220810d.tar.gz
datapath-windows: Add guards around IpHelper adapter binding calls
Protect internal adapter up/down calls with a dispatch lock. It was observed that the InternalAdapter bind calls could happen out of order thereby causing encap packets to not be sent properly. Add assert around the IpHelper bind calls to ensure Up/Down gets called only for the appropriate vports. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Signed-off-by: Alin Gabriel Serdean <aserdean@ovn.org>
Diffstat (limited to 'datapath-windows')
-rw-r--r--datapath-windows/ovsext/Switch.h2
-rw-r--r--datapath-windows/ovsext/Vport.c34
2 files changed, 33 insertions, 3 deletions
diff --git a/datapath-windows/ovsext/Switch.h b/datapath-windows/ovsext/Switch.h
index 18a9ec6ad..806ee7820 100644
--- a/datapath-windows/ovsext/Switch.h
+++ b/datapath-windows/ovsext/Switch.h
@@ -131,6 +131,8 @@ typedef struct _OVS_SWITCH_CONTEXT
* vport */
INT32 countInternalVports; /* the number of internal
* vports */
+ UINT32 ipHelperBoundVportNo; /* vportNo bound to
+ * IpHelper */
/*
* 'portIdHashArray' ONLY contains ports that exist on the Hyper-V switch,
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);
+}