aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2019-06-12 15:27:07 +0200
committerSimon Rozman <simon@rozman.si>2019-06-20 11:54:56 +0200
commit47cde0f3401350385921b9b8a8b3363ba11a1f91 (patch)
tree30cee4828598d902b723793d9ec26ccf92bb2d8f
parentUse more appropriate status when rejecting NBLs with no client connected (diff)
downloadwintun-47cde0f3401350385921b9b8a8b3363ba11a1f91.tar.xz
wintun-47cde0f3401350385921b9b8a8b3363ba11a1f91.zip
Cleanup adapter power monitoring
Wintun adapter is always paused before transition to a low-power state. Even on NDIS 6.30 we do not specify the NDIS_MINIPORT_ATTRIBUTES_NO_- PAUSE_ON_SUSPEND flag. Since OID_PNP_SET_POWER does not do anything else that TunPause() already takes care of it is redundant. The TUN_FLAGS_ENABLED and TUN_FLAGS_POWERED were also mostly identical. Signed-off-by: Simon Rozman <simon@rozman.si>
-rw-r--r--wintun.c17
1 files changed, 2 insertions, 15 deletions
diff --git a/wintun.c b/wintun.c
index 3786dc4..2cd52f9 100644
--- a/wintun.c
+++ b/wintun.c
@@ -57,8 +57,7 @@ typedef struct _TUN_PACKET {
typedef enum _TUN_FLAGS {
TUN_FLAGS_ENABLED = 1 << 0, // Toggles between paused and running state
- TUN_FLAGS_POWERED = 1 << 1, // Toggles between D1-4 (powered off) and D0 (powered on)
- TUN_FLAGS_PRESENT = 1 << 2, // Toggles between removal pending and being present
+ TUN_FLAGS_PRESENT = 1 << 1, // Toggles between removal pending and being present
} TUN_FLAGS;
typedef struct _TUN_CTX {
@@ -164,7 +163,6 @@ static NTSTATUS TunCheckForPause(_Inout_ TUN_CTX *ctx)
LONG flags = InterlockedGet(&ctx->Flags);
return
!(flags & TUN_FLAGS_PRESENT) ? STATUS_NDIS_ADAPTER_REMOVED :
- !(flags & TUN_FLAGS_POWERED) ? STATUS_NDIS_LOW_POWER_STATE :
!(flags & TUN_FLAGS_ENABLED) ? STATUS_NDIS_PAUSED :
InterlockedGet64(&ctx->Device.RefCount) <= 0 ? STATUS_NDIS_MEDIA_DISCONNECTED :
STATUS_SUCCESS;
@@ -1212,7 +1210,7 @@ static NDIS_STATUS TunInitializeEx(NDIS_HANDLE MiniportAdapterHandle, NDIS_HANDL
TunIndicateStatus(MiniportAdapterHandle, MediaConnectStateDisconnected);
ASSERT(InterlockedGet64(&AdapterCount) < MAXLONG64);
InterlockedIncrement64(&AdapterCount);
- InterlockedOr(&ctx->Flags, TUN_FLAGS_POWERED | TUN_FLAGS_PRESENT);
+ InterlockedOr(&ctx->Flags, TUN_FLAGS_PRESENT);
return NDIS_STATUS_SUCCESS;
cleanup_NdisFreeNetBufferListPool:
@@ -1493,17 +1491,6 @@ static NDIS_STATUS TunOidSet(_Inout_ TUN_CTX *ctx, _Inout_ NDIS_OID_REQUEST *Oid
return NDIS_STATUS_INVALID_LENGTH;
}
OidRequest->DATA.SET_INFORMATION.BytesRead = sizeof(NDIS_DEVICE_POWER_STATE);
-
- BOOLEAN powered = *(NDIS_DEVICE_POWER_STATE *)OidRequest->DATA.SET_INFORMATION.InformationBuffer < NdisDeviceStateD1;
- KIRQL irql = ExAcquireSpinLockExclusive(&ctx->TransitionLock);
- if (powered)
- InterlockedOr (&ctx->Flags, TUN_FLAGS_POWERED);
- else
- InterlockedAnd(&ctx->Flags, ~TUN_FLAGS_POWERED);
- ExReleaseSpinLockExclusive(&ctx->TransitionLock, irql);
- if (!powered)
- TunQueueClear(ctx, STATUS_NDIS_LOW_POWER_STATE);
-
return NDIS_STATUS_SUCCESS;
}