aboutsummaryrefslogtreecommitdiffstats
path: root/wintun.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-07-05 14:32:13 +0000
committerJason A. Donenfeld <Jason@zx2c4.com>2019-07-05 16:29:00 +0000
commit17a0e2647aade6ae179d9b15f0e630520c373035 (patch)
tree24a6d7397c35054732ffa8efecdc15c592e50d10 /wintun.c
parentRename NBL -> Nbl (diff)
downloadwintun-17a0e2647aade6ae179d9b15f0e630520c373035.tar.xz
wintun-17a0e2647aade6ae179d9b15f0e630520c373035.zip
Simplify ActiveNblCount decrement
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'wintun.c')
-rw-r--r--wintun.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/wintun.c b/wintun.c
index 149183a..511defb 100644
--- a/wintun.c
+++ b/wintun.c
@@ -196,18 +196,12 @@ TunCompleteRequest(_Inout_ TUN_CTX *Ctx, _Inout_ IRP *Irp, _In_ NTSTATUS Status,
}
_IRQL_requires_max_(DISPATCH_LEVEL)
-static NDIS_STATUS
-TunCompletePause(_Inout_ TUN_CTX *Ctx, _In_ BOOLEAN AsyncCompletion)
+static void
+TunDecrementActiveNblCount(_Inout_ TUN_CTX *Ctx)
{
ASSERT(InterlockedGet64(&Ctx->ActiveNblCount) > 0);
if (InterlockedDecrement64(&Ctx->ActiveNblCount) <= 0)
- {
- if (AsyncCompletion)
- NdisMPauseComplete(Ctx->MiniportAdapterHandle);
- return NDIS_STATUS_SUCCESS;
- }
-
- return NDIS_STATUS_PENDING;
+ NdisMPauseComplete(Ctx->MiniportAdapterHandle);
}
static IO_CSQ_INSERT_IRP_EX TunCsqInsertIrpEx;
@@ -459,7 +453,7 @@ TunNblRefDec(_Inout_ TUN_CTX *Ctx, _Inout_ NET_BUFFER_LIST *Nbl, _In_ ULONG Send
NdisMSendNetBufferListsComplete(Ctx->MiniportAdapterHandle, Nbl, SendCompleteFlags);
ASSERT(InterlockedGet(&Ctx->PacketQueue.NumNbl) > 0);
InterlockedDecrement(&Ctx->PacketQueue.NumNbl);
- TunCompletePause(Ctx, TRUE);
+ TunDecrementActiveNblCount(Ctx);
return TRUE;
}
return FALSE;
@@ -787,7 +781,7 @@ TunReturnNetBufferLists(NDIS_HANDLE MiniportAdapterContext, PNET_BUFFER_LIST Net
else
StatPacketsError++;
- TunCompletePause(Ctx, TRUE);
+ TunDecrementActiveNblCount(Ctx);
LONG volatile *MdlRefCount = NET_BUFFER_LIST_MDL_REFCOUNT(Nbl);
ASSERT(InterlockedGet(MdlRefCount) > 0);
@@ -1118,7 +1112,8 @@ TunPause(NDIS_HANDLE MiniportAdapterContext, PNDIS_MINIPORT_PAUSE_PARAMETERS Min
ExAcquireSpinLockExclusive(&Ctx->TransitionLock)); /* Ensure above change is visible to all readers. */
TunQueueClear(Ctx, NDIS_STATUS_PAUSED);
- return TunCompletePause(Ctx, FALSE);
+ ASSERT(InterlockedGet64(&Ctx->ActiveNblCount) > 0);
+ return InterlockedDecrement64(&Ctx->ActiveNblCount) <= 0 ? NDIS_STATUS_SUCCESS : NDIS_STATUS_PENDING;
}
static MINIPORT_DEVICE_PNP_EVENT_NOTIFY TunDevicePnPEventNotify;