diff options
| author | 5an7y-Microsoft <[email protected]> | 2026-07-09 14:59:40 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-07-09 14:59:40 -0700 |
| commit | 15640356a5a6eeafefff403f6d287821213635cd (patch) | |
| tree | 49e5fcd168d50912decc42dda76767b3566887b1 /network/netadaptercx/netvadapter/drivercode/device.cpp | |
| parent | 7c8087c61eb674e321458f935b6676652c39924d (diff) | |
| parent | 2ee527bfeb0aeb6be11f0a8b6dce4011b358ce89 (diff) | |
Merge pull request #1402 from microsoft/main
FI: Main -> Develop
Diffstat (limited to 'network/netadaptercx/netvadapter/drivercode/device.cpp')
| -rw-r--r-- | network/netadaptercx/netvadapter/drivercode/device.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapter/drivercode/device.cpp b/network/netadaptercx/netvadapter/drivercode/device.cpp new file mode 100644 index 00000000..6cbad327 --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/device.cpp @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" + +#include <wil/resource.h> + +#include "netvadapter.h" +#include "device.h" +#include "trace.h" +#include "device.tmh" +#include "power.h" + +static +EVT_NET_ADAPTER_CREATE_TXQUEUE + EvtAdapterCreateTxQueue; + +static +EVT_NET_ADAPTER_CREATE_RXQUEUE + EvtAdapterCreateRxQueue; + +NetvDevice::NetvDevice( + WDFDEVICE Handle +) + : m_triage(WdfGetTriageInfo()) + , m_handle(Handle) +{ +} + +_Use_decl_annotations_ +NTSTATUS +NetvDevice::Initialize( + void +) +{ + using unique_adapterinit = wil::unique_any<NETADAPTER_INIT*, + decltype(&::NetAdapterInitFree), + ::NetAdapterInitFree>; + + unique_adapterinit adapterInit{NetAdapterInitAllocate(m_handle)}; + RETURN_NTSTATUS_IF( + STATUS_INSUFFICIENT_RESOURCES, + ! adapterInit); + + NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks; + NET_ADAPTER_DATAPATH_CALLBACKS_INIT( + &datapathCallbacks, + EvtAdapterCreateTxQueue, + EvtAdapterCreateRxQueue); + + NetAdapterInitSetDatapathCallbacks( + adapterInit.get(), + &datapathCallbacks); + + WDF_OBJECT_ATTRIBUTES adapterAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, NetvAdapter); + adapterAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) { + NetvAdapterGetContext(static_cast<NETADAPTER>(Handle))->Destroy(); + }; + + NETADAPTER netAdapter; + RETURN_IF_NOT_STATUS_SUCCESS( + NetAdapterCreate(adapterInit.get(), &adapterAttributes, &netAdapter)); + + m_adapter = new (NetvAdapterGetContext(netAdapter)) NetvAdapter(netAdapter, m_handle); + + RETURN_IF_NOT_STATUS_SUCCESS( + m_adapter->Initialize()); + + RETURN_STATUS_SUCCESS(); +} + +NTSTATUS +NetvDevice::PrepareHardware( + WDFCMRESLIST ResourcesRaw, + WDFCMRESLIST ResourcesTranslated +) +{ + UNREFERENCED_PARAMETER(ResourcesRaw); + UNREFERENCED_PARAMETER(ResourcesTranslated); + + NetvDeviceInitializePowerManagement(this); + + RETURN_IF_NOT_STATUS_SUCCESS( + m_adapter->ConfigureDataCapabilities()); + + RETURN_IF_NOT_STATUS_SUCCESS( + NetAdapterStart(m_adapter->m_handle)); + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +NTSTATUS +EvtDevicePrepareHardware( + WDFDEVICE Device, + WDFCMRESLIST ResourcesRaw, + WDFCMRESLIST ResourcesTranslated + ) +{ + return NetvDeviceGetContext(Device)->PrepareHardware(ResourcesRaw, ResourcesTranslated); +} + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateTxQueue( + NETADAPTER Adapter, + NETTXQUEUE_INIT * Init +) +{ + return NetvAdapterGetContext(Adapter)->CreateTxQueue(Init); +} + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateRxQueue( + NETADAPTER Adapter, + NETRXQUEUE_INIT * Init +) +{ + return NetvAdapterGetContext(Adapter)->CreateRxQueue(Init); +} + +NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter) +{ + return NetvAdapterGetContext(netAdapter); +} |
