summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/PacketIO.c
diff options
context:
space:
mode:
Diffstat (limited to 'datapath-windows/ovsext/PacketIO.c')
-rw-r--r--datapath-windows/ovsext/PacketIO.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c
index 57c583ccf..cc0840704 100644
--- a/datapath-windows/ovsext/PacketIO.c
+++ b/datapath-windows/ovsext/PacketIO.c
@@ -161,6 +161,16 @@ OvsSendNBLIngress(POVS_SWITCH_CONTEXT switchContext,
ASSERT(switchContext->dataFlowState == OvsSwitchRunning);
+ POVS_BUFFER_CONTEXT ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(netBufferLists);
+ LONG refCount = 1, exchange = 0;
+ InterlockedCompareExchange((LONG volatile *)&refCount, exchange, (LONG)ctx->refCount);
+ if (refCount != exchange) {
+ InterlockedExchange((LONG volatile *)&ctx->sendFlags, sendFlags);
+ InterlockedExchange16((SHORT volatile *)&ctx->pendingSend, 1);
+ return;
+ }
+
+ InterlockedExchange16((SHORT volatile *)&ctx->pendingSend, 0);
NdisFSendNetBufferLists(switchContext->NdisFilterHandle, netBufferLists,
NDIS_DEFAULT_PORT_NUMBER, sendFlags);
}