From 5426a647c3f86885e4b9d8679d4a4c108933b5ee Mon Sep 17 00:00:00 2001 From: Alex Bozhko Date: Thu, 11 Jun 2026 16:13:41 -0700 Subject: Netvadapter: virtual NIC sample for KMDF and UMDF --- .../netadaptercx/netvadapter/drivercode/power.cpp | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 network/netadaptercx/netvadapter/drivercode/power.cpp (limited to 'network/netadaptercx/netvadapter/drivercode/power.cpp') diff --git a/network/netadaptercx/netvadapter/drivercode/power.cpp b/network/netadaptercx/netvadapter/drivercode/power.cpp new file mode 100644 index 00000000..68b057ff --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/power.cpp @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" +#include "netvadapter.h" +#include "device.h" +#include "trace.h" +#include "power.h" +#include "power.tmh" + +void +NetvDeviceInitializePowerManagement( + _In_ NetvDevice * Device +) +{ +#ifdef _KERNEL_MODE + WDFDEVICE wdfDevice = Device->m_handle; + NetvAdapter * adapter = Device->m_adapter; + + if (!adapter->S0Idle) + { + return; + } + + WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; + WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT( + &idleSettings, + IdleCanWakeFromS0); + + idleSettings.IdleTimeout = 3000; + idleSettings.IdleTimeoutType = SystemManagedIdleTimeoutWithHint; + + NTSTATUS ntStatus = WdfDeviceAssignS0IdleSettings( + wdfDevice, + &idleSettings); + + if (ntStatus != STATUS_SUCCESS) + { + // MSDN says we should ignore error codes from assign S0 idle settings, do that + return; + } + + // Now tell NetAdapterCx we support wake on packet filter match + NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES wakeOnPacketFilterMatch; + NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES_INIT(&wakeOnPacketFilterMatch); + wakeOnPacketFilterMatch.PacketFilterMatch = TRUE; + + NetAdapterWakeSetPacketFilterCapabilities(adapter->m_handle, &wakeOnPacketFilterMatch); +#else + UNREFERENCED_PARAMETER(Device); +#endif +} + +_Use_decl_annotations_ +NTSTATUS +EvtDeviceArmWakeFromS0( + WDFDEVICE Device +) +{ + auto adapter = NetvDeviceGetContext(Device)->m_adapter; + adapter->ArmWakeFromS0(); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +void +EvtDeviceDisarmWakeFromS0( + WDFDEVICE Device +) +{ + auto adapter = NetvDeviceGetContext(Device)->m_adapter; + adapter->DisarmWakeFromS0(); +} -- cgit v1.3.1