summaryrefslogtreecommitdiff
path: root/network/wlan/wificx/drivercode/wifirequest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'network/wlan/wificx/drivercode/wifirequest.cpp')
-rw-r--r--network/wlan/wificx/drivercode/wifirequest.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/network/wlan/wificx/drivercode/wifirequest.cpp b/network/wlan/wificx/drivercode/wifirequest.cpp
new file mode 100644
index 00000000..c84c1d97
--- /dev/null
+++ b/network/wlan/wificx/drivercode/wifirequest.cpp
@@ -0,0 +1,98 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+#include "precomp.h"
+#include "wifitransition.h"
+#include "wifirequest.h"
+#include "wifirequest.tmh"
+
+_Use_decl_annotations_
+void EvtWifiDeviceSendCommand(WDFDEVICE Device, WIFIREQUEST SendRequest)
+{
+ UINT InBufferLen = 0;
+ UINT OutBufferLen = 0;
+ void* Buffer = WifiRequestGetInOutBuffer(SendRequest, &InBufferLen, &OutBufferLen);
+ UINT16 MessageId = WifiRequestGetMessageId(SendRequest);
+
+ TransitionContext tctx{
+ Device,
+ WifiGetIhvDeviceContext(Device),
+ SendRequest,
+ static_cast<PWDI_MESSAGE_HEADER>(Buffer),
+ Buffer,
+ InBufferLen,
+ OutBufferLen
+ };
+
+ if(!NT_SUCCESS(RunTransitionByMessage(tctx, MessageId)))
+ {
+ WFCError("RunTransitionByMessage failed for MessageId: 0x%04X", MessageId);
+ return;
+ }
+}
+
+void WifiIhvSendIndicationToOs(
+ _In_ WDFDEVICE Device,
+ _In_ const PWDI_MESSAGE_HEADER pOriginalWdiHeader,
+ _In_ UINT16 WifiRequestMessageId,
+ _In_ UINT32 WifiRequestTransactionId,
+ _In_ NTSTATUS WifiRquestM4Status,
+ _In_opt_bytecount_(TlvDataSize) PUCHAR pTlvData,
+ _In_ UINT32 TlvDataSize)
+{
+ WDFMEMORY data = WDF_NO_HANDLE;
+ PUCHAR pIndicationBuffer = nullptr;
+ PWDI_MESSAGE_HEADER pIndicationHeader = nullptr;
+ SIZE_T indicationSize = sizeof(WDI_MESSAGE_HEADER) + TlvDataSize;
+ WDF_OBJECT_ATTRIBUTES objectAttribs;
+
+ WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs);
+ objectAttribs.ParentObject = Device;
+
+ if(!NT_SUCCESS(WdfMemoryCreate(&objectAttribs, NonPagedPoolNx, 0, indicationSize, &data, reinterpret_cast<void**>(&pIndicationBuffer))))
+ {
+ WFCError("Failed to create indication buffer");
+ return;
+ }
+
+ RtlZeroMemory(pIndicationBuffer, indicationSize);
+ pIndicationHeader = reinterpret_cast<PWDI_MESSAGE_HEADER>(pIndicationBuffer);
+ pIndicationHeader->PortId = pOriginalWdiHeader->PortId;
+ pIndicationHeader->Reserved = pOriginalWdiHeader->Reserved;
+ pIndicationHeader->Status = Wifi::ConvertNDISSTATUSToNTSTATUS(WifiRquestM4Status);
+ pIndicationHeader->TransactionId = WifiRequestTransactionId;
+ pIndicationHeader->IhvSpecificId = pOriginalWdiHeader->IhvSpecificId;
+
+ if (TlvDataSize > 0 && pTlvData != nullptr)
+ {
+ RtlCopyMemory(pIndicationBuffer + sizeof(WDI_MESSAGE_HEADER), pTlvData, TlvDataSize);
+ }
+
+ // Send the indication up to WifiCx
+ WifiDeviceReceiveIndication(Device, WifiRequestMessageId, data);
+
+ // Don't need to keep this around
+ WdfObjectDelete(data);
+}
+
+_Use_decl_annotations_
+void WifiIhvSendUnsolicitedIndicationToOs(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, UINT16 MessageId, PUCHAR pTlvData, UINT32 TlvDataSize)
+{
+ WifiIhvSendIndicationToOs(Device, pWdiHeader, MessageId, 0, STATUS_SUCCESS, pTlvData, TlvDataSize); //TransactionId required to be 0 for unsolicited indications.
+}
+_Use_decl_annotations_
+void WifiIhvNotifyM3Completion(WIFIREQUEST Request, NTSTATUS WifiRequestM3Status, UINT BytesWritten)
+{
+ if(!NT_SUCCESS(WifiRequestM3Status))
+ {
+ WFCError("WifiRequest M3 failed: %!STATUS!, BytesWritten: %d\n", WifiRequestM3Status, BytesWritten);
+ }
+ // Report the M3 status back to OS
+ // OS expects M3 before the M4
+ WifiRequestComplete(Request, WifiRequestM3Status, BytesWritten);
+}
+
+_Use_decl_annotations_
+void WifiIhvSendM4IndicationToOs(WDFDEVICE Device, UINT16 WifiRequestMessageId, const PWDI_MESSAGE_HEADER pWdiHeader, NTSTATUS WifiRequestM4Status)
+{
+ WifiIhvSendIndicationToOs(Device, pWdiHeader, WifiRequestMessageId, pWdiHeader->TransactionId, WifiRequestM4Status, nullptr, 0);
+}