mirror of
https://github.com/espressif/openthread.git
synced 2026-08-06 18:57:47 +00:00
Windows: Remove Unnecessary code from otLwf (#1255)
* Remove unnecessary OID code from otLwf * Remove Sleep capability
This commit is contained in:
@@ -94,7 +94,6 @@
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\settings.c" />
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\thread.c" />
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\tunnel.c" />
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\oid.c" />
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\precomp.c">
|
||||
<AdditionalIncludeDirectories>..;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreProcessorDefinitions>%(PreProcessorDefinitions);NDIS_WDM=1</PreProcessorDefinitions>
|
||||
@@ -109,7 +108,6 @@
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\driver.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\nsihelper.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\oid.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\radio.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\thread.h" />
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h" />
|
||||
|
||||
@@ -39,9 +39,6 @@
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\nsihelper.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\oid.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -54,6 +51,9 @@
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\command.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\filter.c">
|
||||
@@ -74,9 +74,6 @@
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\driver.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\oid.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\iocontrol.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@@ -124,8 +124,8 @@ Return Value:
|
||||
FilterCancelSendNetBufferLists,
|
||||
FilterReceiveNetBufferLists,
|
||||
FilterReturnNetBufferLists,
|
||||
FilterOidRequest,
|
||||
FilterOidRequestComplete,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -36,20 +36,20 @@ GetInterfaceCompartmentID(
|
||||
)
|
||||
{
|
||||
COMPARTMENT_ID CompartmentID = UNSPECIFIED_COMPARTMENT_ID;
|
||||
|
||||
NTSTATUS Status =
|
||||
NsiGetParameter(
|
||||
NsiActive,
|
||||
&NPI_MS_NDIS_MODULEID,
|
||||
NdisNsiObjectInterfaceInformation,
|
||||
pNetLuid, sizeof(*pNetLuid),
|
||||
NsiStructRoDynamic,
|
||||
&CompartmentID, sizeof(CompartmentID),
|
||||
|
||||
NTSTATUS Status =
|
||||
NsiGetParameter(
|
||||
NsiActive,
|
||||
&NPI_MS_NDIS_MODULEID,
|
||||
NdisNsiObjectInterfaceInformation,
|
||||
pNetLuid, sizeof(*pNetLuid),
|
||||
NsiStructRoDynamic,
|
||||
&CompartmentID, sizeof(CompartmentID),
|
||||
FIELD_OFFSET(NDIS_NSI_INTERFACE_INFORMATION_ROD, CompartmentId)
|
||||
);
|
||||
|
||||
return (NT_SUCCESS(Status) ? CompartmentID : DEFAULT_COMPARTMENT_ID);
|
||||
}
|
||||
);
|
||||
|
||||
return (NT_SUCCESS(Status) ? CompartmentID : DEFAULT_COMPARTMENT_ID);
|
||||
}
|
||||
|
||||
_Use_decl_annotations_
|
||||
NDIS_STATUS
|
||||
@@ -192,9 +192,6 @@ N.B.: FILTER can use NdisRegisterDeviceEx to create a device, so the upper
|
||||
// Filter initially in Paused state
|
||||
pFilter->State = FilterPaused;
|
||||
|
||||
// Initialize PendingOidRequest lock
|
||||
NdisAllocateSpinLock(&pFilter->PendingOidRequestLock);
|
||||
|
||||
// Initialize rundowns to disabled with no active references
|
||||
pFilter->ExternalRefs.Count = EX_RUNDOWN_ACTIVE;
|
||||
pFilter->cmdRundown.Count = EX_RUNDOWN_ACTIVE;
|
||||
|
||||
@@ -93,10 +93,6 @@ typedef enum OTLWF_DEVICE_CAPABILITY
|
||||
// Device supports the energy scan command.
|
||||
OTLWF_DEVICE_CAP_RADIO_ENERGY_SCAN = 1 << 3,
|
||||
|
||||
// Device supports sleeping. If the device supports sleeping, it is assumed to
|
||||
// default to the sleep state on bring up.
|
||||
OTLWF_DEVICE_CAP_RADIO_SLEEP = 1 << 4,
|
||||
|
||||
// Device support Net & Thread commands.
|
||||
OTLWF_DEVICE_CAP_THREAD_1_0 = 1 << 16,
|
||||
|
||||
@@ -148,12 +144,6 @@ typedef struct _MS_FILTER
|
||||
// Miniport Link State
|
||||
//
|
||||
NDIS_LINK_STATE MiniportLinkState;
|
||||
|
||||
//
|
||||
// Pending OID Handling
|
||||
//
|
||||
NDIS_SPIN_LOCK PendingOidRequestLock;
|
||||
PNDIS_OID_REQUEST PendingOidRequest;
|
||||
|
||||
//
|
||||
// External references management
|
||||
|
||||
@@ -1,581 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016, The OpenThread Authors.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holder nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
#include "oid.tmh"
|
||||
|
||||
_Use_decl_annotations_
|
||||
NDIS_STATUS
|
||||
FilterOidRequest(
|
||||
NDIS_HANDLE FilterModuleContext,
|
||||
PNDIS_OID_REQUEST Request
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Request handler
|
||||
Handle requests from upper layers
|
||||
|
||||
Arguments:
|
||||
|
||||
FilterModuleContext - our filter
|
||||
Request - the request passed down
|
||||
|
||||
|
||||
Return Value:
|
||||
|
||||
NDIS_STATUS_SUCCESS
|
||||
NDIS_STATUS_PENDING
|
||||
NDIS_STATUS_XXX
|
||||
|
||||
NOTE: Called at <= DISPATCH_LEVEL (unlike a miniport's MiniportOidRequest)
|
||||
|
||||
--*/
|
||||
{
|
||||
PMS_FILTER pFilter = (PMS_FILTER)FilterModuleContext;
|
||||
NDIS_STATUS Status;
|
||||
PNDIS_OID_REQUEST ClonedRequest=NULL;
|
||||
BOOLEAN bSubmitted = FALSE;
|
||||
POTLWF_REQUEST_CONTEXT Context;
|
||||
BOOLEAN bFalse = FALSE;
|
||||
|
||||
LogFuncEntryMsg(DRIVER_OID, "Request %p", Request);
|
||||
|
||||
//
|
||||
// Most of the time, a filter will clone the OID request and pass down
|
||||
// the clone. When the clone completes, the filter completes the original
|
||||
// OID request.
|
||||
//
|
||||
// If your filter needs to modify a specific request, it can modify the
|
||||
// request before or after sending down the cloned request. Or, it can
|
||||
// complete the original request on its own without sending down any
|
||||
// clone at all.
|
||||
//
|
||||
// If your filter driver does not need to modify any OID requests, then
|
||||
// you may simply omit this routine entirely; NDIS will pass OID requests
|
||||
// down on your behalf. This is more efficient than implementing a
|
||||
// routine that does nothing but clone all requests, as in the sample here.
|
||||
//
|
||||
|
||||
do
|
||||
{
|
||||
Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
|
||||
Request,
|
||||
OTLWF_CLONED_OID_TAG,
|
||||
&ClonedRequest);
|
||||
if (Status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
LogWarning(DRIVER_OID, "Failed to Clone Request, %!NDIS_STATUS!", Status);
|
||||
break;
|
||||
}
|
||||
|
||||
Context = (POTLWF_REQUEST_CONTEXT)(&ClonedRequest->SourceReserved[0]);
|
||||
*Context = Request;
|
||||
|
||||
bSubmitted = TRUE;
|
||||
|
||||
//
|
||||
// Use same request ID
|
||||
//
|
||||
ClonedRequest->RequestId = Request->RequestId;
|
||||
|
||||
pFilter->PendingOidRequest = ClonedRequest;
|
||||
|
||||
LogVerbose(DRIVER_OID, "Sending (cloned) Oid Request %p", ClonedRequest);
|
||||
|
||||
Status = NdisFOidRequest(pFilter->FilterHandle, ClonedRequest);
|
||||
|
||||
if (Status != NDIS_STATUS_PENDING)
|
||||
{
|
||||
FilterOidRequestComplete(pFilter, ClonedRequest, Status);
|
||||
Status = NDIS_STATUS_PENDING;
|
||||
}
|
||||
|
||||
} while(bFalse);
|
||||
|
||||
if (bSubmitted == FALSE)
|
||||
{
|
||||
switch(Request->RequestType)
|
||||
{
|
||||
case NdisRequestMethod:
|
||||
Request->DATA.METHOD_INFORMATION.BytesRead = 0;
|
||||
Request->DATA.METHOD_INFORMATION.BytesNeeded = 0;
|
||||
Request->DATA.METHOD_INFORMATION.BytesWritten = 0;
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
Request->DATA.SET_INFORMATION.BytesRead = 0;
|
||||
Request->DATA.SET_INFORMATION.BytesNeeded = 0;
|
||||
break;
|
||||
|
||||
case NdisRequestQueryInformation:
|
||||
case NdisRequestQueryStatistics:
|
||||
default:
|
||||
Request->DATA.QUERY_INFORMATION.BytesWritten = 0;
|
||||
Request->DATA.QUERY_INFORMATION.BytesNeeded = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LogFuncExitNDIS(DRIVER_OID, Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
_Use_decl_annotations_
|
||||
VOID
|
||||
FilterCancelOidRequest(
|
||||
NDIS_HANDLE FilterModuleContext,
|
||||
PVOID RequestId
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Cancels an OID request
|
||||
|
||||
If your filter driver does not intercept and hold onto any OID requests,
|
||||
then you do not need to implement this routine. You may simply omit it.
|
||||
Furthermore, if the filter only holds onto OID requests so it can pass
|
||||
down a clone (the most common case) the filter does not need to implement
|
||||
this routine; NDIS will then automatically request that the lower-level
|
||||
filter/miniport cancel your cloned OID.
|
||||
|
||||
Most filters do not need to implement this routine.
|
||||
|
||||
Arguments:
|
||||
|
||||
FilterModuleContext - our filter
|
||||
RequestId - identifies the request(s) to cancel
|
||||
|
||||
--*/
|
||||
{
|
||||
PMS_FILTER pFilter = (PMS_FILTER)FilterModuleContext;
|
||||
PNDIS_OID_REQUEST Request = NULL;
|
||||
POTLWF_REQUEST_CONTEXT Context;
|
||||
PNDIS_OID_REQUEST OriginalRequest = NULL;
|
||||
BOOLEAN bFalse = FALSE;
|
||||
|
||||
LogFuncEntryMsg(DRIVER_OID, "Filter: %p, RequestId: %p", FilterModuleContext, RequestId);
|
||||
|
||||
FILTER_ACQUIRE_LOCK(&pFilter->PendingOidRequestLock, bFalse);
|
||||
|
||||
Request = pFilter->PendingOidRequest;
|
||||
|
||||
if (Request != NULL)
|
||||
{
|
||||
Context = (POTLWF_REQUEST_CONTEXT)(&Request->SourceReserved[0]);
|
||||
|
||||
OriginalRequest = (*Context);
|
||||
}
|
||||
|
||||
if ((OriginalRequest != NULL) && (OriginalRequest->RequestId == RequestId))
|
||||
{
|
||||
FILTER_RELEASE_LOCK(&pFilter->PendingOidRequestLock, bFalse);
|
||||
|
||||
NdisFCancelOidRequest(pFilter->FilterHandle, RequestId);
|
||||
}
|
||||
else
|
||||
{
|
||||
FILTER_RELEASE_LOCK(&pFilter->PendingOidRequestLock, bFalse);
|
||||
}
|
||||
|
||||
LogFuncExit(DRIVER_OID);
|
||||
}
|
||||
|
||||
_Use_decl_annotations_
|
||||
VOID
|
||||
FilterOidRequestComplete(
|
||||
NDIS_HANDLE FilterModuleContext,
|
||||
PNDIS_OID_REQUEST Request,
|
||||
NDIS_STATUS Status
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Notification that an OID request has been completed
|
||||
|
||||
If this filter sends a request down to a lower layer, and the request is
|
||||
pended, the FilterOidRequestComplete routine is invoked when the request
|
||||
is complete. Most requests we've sent are simply clones of requests
|
||||
received from a higher layer; all we need to do is complete the original
|
||||
higher request.
|
||||
|
||||
However, if this filter driver sends original requests down, it must not
|
||||
attempt to complete a pending request to the higher layer.
|
||||
|
||||
Arguments:
|
||||
|
||||
FilterModuleContext - our filter context area
|
||||
NdisRequest - the completed request
|
||||
Status - completion status
|
||||
|
||||
--*/
|
||||
{
|
||||
PMS_FILTER pFilter = (PMS_FILTER)FilterModuleContext;
|
||||
PNDIS_OID_REQUEST OriginalRequest;
|
||||
POTLWF_REQUEST_CONTEXT Context;
|
||||
BOOLEAN bFalse = FALSE;
|
||||
|
||||
LogFuncEntryMsg(DRIVER_OID, "Filter: %p, Request %p", FilterModuleContext, Request);
|
||||
|
||||
Context = (POTLWF_REQUEST_CONTEXT)(&Request->SourceReserved[0]);
|
||||
OriginalRequest = (*Context);
|
||||
|
||||
//
|
||||
// This is an internal request
|
||||
//
|
||||
if (OriginalRequest == NULL)
|
||||
{
|
||||
otLwfInternalRequestComplete(pFilter, Request, Status);
|
||||
LogFuncExit(DRIVER_OID);
|
||||
return;
|
||||
}
|
||||
|
||||
FILTER_ACQUIRE_LOCK(&pFilter->PendingOidRequestLock, bFalse);
|
||||
|
||||
ASSERT(pFilter->PendingOidRequest == Request);
|
||||
pFilter->PendingOidRequest = NULL;
|
||||
|
||||
FILTER_RELEASE_LOCK(&pFilter->PendingOidRequestLock, bFalse);
|
||||
|
||||
//
|
||||
// Copy the information from the returned request to the original request
|
||||
//
|
||||
switch(Request->RequestType)
|
||||
{
|
||||
case NdisRequestMethod:
|
||||
OriginalRequest->DATA.METHOD_INFORMATION.OutputBufferLength = Request->DATA.METHOD_INFORMATION.OutputBufferLength;
|
||||
OriginalRequest->DATA.METHOD_INFORMATION.BytesRead = Request->DATA.METHOD_INFORMATION.BytesRead;
|
||||
OriginalRequest->DATA.METHOD_INFORMATION.BytesNeeded = Request->DATA.METHOD_INFORMATION.BytesNeeded;
|
||||
OriginalRequest->DATA.METHOD_INFORMATION.BytesWritten = Request->DATA.METHOD_INFORMATION.BytesWritten;
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
OriginalRequest->DATA.SET_INFORMATION.BytesRead = Request->DATA.SET_INFORMATION.BytesRead;
|
||||
OriginalRequest->DATA.SET_INFORMATION.BytesNeeded = Request->DATA.SET_INFORMATION.BytesNeeded;
|
||||
break;
|
||||
|
||||
case NdisRequestQueryInformation:
|
||||
case NdisRequestQueryStatistics:
|
||||
default:
|
||||
OriginalRequest->DATA.QUERY_INFORMATION.BytesWritten = Request->DATA.QUERY_INFORMATION.BytesWritten;
|
||||
OriginalRequest->DATA.QUERY_INFORMATION.BytesNeeded = Request->DATA.QUERY_INFORMATION.BytesNeeded;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
(*Context) = NULL;
|
||||
|
||||
LogVerbose(DRIVER_OID, "Freeing (cloned) Oid Request %p", Request);
|
||||
|
||||
NdisFreeCloneOidRequest(pFilter->FilterHandle, Request);
|
||||
|
||||
LogVerbose(DRIVER_OID, "Completing (external) Oid Request %p", OriginalRequest);
|
||||
|
||||
NdisFOidRequestComplete(pFilter->FilterHandle, OriginalRequest, Status);
|
||||
|
||||
LogFuncExit(DRIVER_OID);
|
||||
}
|
||||
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NDIS_STATUS
|
||||
otLwfSendInternalRequest(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ NDIS_REQUEST_TYPE RequestType,
|
||||
_In_ NDIS_OID Oid,
|
||||
_Inout_updates_bytes_to_(InformationBufferLength, *pBytesProcessed)
|
||||
PVOID InformationBuffer,
|
||||
_In_ ULONG InformationBufferLength,
|
||||
_Out_ PULONG pBytesProcessed
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Utility routine that forms and sends an NDIS_OID_REQUEST to the
|
||||
miniport, waits for it to complete, and returns status
|
||||
to the caller.
|
||||
|
||||
NOTE: this assumes that the calling routine ensures validity
|
||||
of the filter handle until this returns.
|
||||
|
||||
Arguments:
|
||||
|
||||
FilterModuleContext - pointer to our filter module context
|
||||
RequestType - NdisRequest[Set|Query]Information
|
||||
Oid - the object being set/queried
|
||||
InformationBuffer - data for the request
|
||||
InformationBufferLength - length of the above
|
||||
OutputBufferLength - valid only for method request
|
||||
MethodId - valid only for method request
|
||||
pBytesProcessed - place to return bytes read/written
|
||||
|
||||
Return Value:
|
||||
|
||||
Status of the set/query request
|
||||
|
||||
--*/
|
||||
{
|
||||
LogFuncEntryMsg(DRIVER_OID, "Filter: %p, OID = 0x%u", FilterModuleContext, Oid);
|
||||
|
||||
// Build the request structure
|
||||
OTLWF_REQUEST FilterRequest = { 0 };
|
||||
FilterRequest.Signature = OTLWF_REQUEST_TAG;
|
||||
FilterRequest.Request.Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
|
||||
FilterRequest.Request.Header.Revision = NDIS_OID_REQUEST_REVISION_1;
|
||||
FilterRequest.Request.Header.Size = sizeof(NDIS_OID_REQUEST);
|
||||
FilterRequest.Request.RequestType = RequestType;
|
||||
FilterRequest.Request.RequestId = (PVOID)OTLWF_REQUEST_ID;
|
||||
FilterRequest.FreeOnCompletion = FALSE;
|
||||
FilterRequest.Callback = otLwfInternalSyncRequestComplete;
|
||||
NdisInitializeEvent(&FilterRequest.ReqEvent);
|
||||
|
||||
*pBytesProcessed = 0;
|
||||
|
||||
switch (RequestType)
|
||||
{
|
||||
case NdisRequestQueryInformation:
|
||||
FilterRequest.Request.DATA.QUERY_INFORMATION.Oid = Oid;
|
||||
FilterRequest.Request.DATA.QUERY_INFORMATION.InformationBuffer = InformationBuffer;
|
||||
FilterRequest.Request.DATA.QUERY_INFORMATION.InformationBufferLength = InformationBufferLength;
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
FilterRequest.Request.DATA.SET_INFORMATION.Oid = Oid;
|
||||
FilterRequest.Request.DATA.SET_INFORMATION.InformationBuffer = InformationBuffer;
|
||||
FilterRequest.Request.DATA.SET_INFORMATION.InformationBufferLength = InformationBufferLength;
|
||||
break;
|
||||
|
||||
default:
|
||||
NT_ASSERT(FALSE);
|
||||
break;
|
||||
}
|
||||
|
||||
LogVerbose(DRIVER_OID, "Sending (internal, sync) Oid Request %p", &FilterRequest.Request);
|
||||
|
||||
// Send off the OID request
|
||||
NT_ASSERT(FilterRequest.Signature == OTLWF_REQUEST_TAG);
|
||||
NDIS_STATUS Status = NdisFOidRequest(FilterModuleContext->FilterHandle, &FilterRequest.Request);
|
||||
|
||||
// If pending, wait for completion
|
||||
if (Status == NDIS_STATUS_PENDING)
|
||||
{
|
||||
NdisWaitEvent(&FilterRequest.ReqEvent, 0);
|
||||
Status = FilterRequest.Status;
|
||||
}
|
||||
|
||||
if (Status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
if (RequestType == NdisRequestSetInformation)
|
||||
{
|
||||
*pBytesProcessed = FilterRequest.Request.DATA.SET_INFORMATION.BytesRead;
|
||||
}
|
||||
|
||||
if (RequestType == NdisRequestQueryInformation)
|
||||
{
|
||||
*pBytesProcessed = FilterRequest.Request.DATA.QUERY_INFORMATION.BytesWritten;
|
||||
}
|
||||
}
|
||||
|
||||
LogFuncExitNDIS(DRIVER_OID, Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
NDIS_STATUS
|
||||
otLwfSendInternalRequestAsync(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ NDIS_REQUEST_TYPE RequestType,
|
||||
_In_ NDIS_OID Oid,
|
||||
_Inout_updates_(InformationBufferLength)
|
||||
PVOID InformationBuffer,
|
||||
_In_ ULONG InformationBufferLength,
|
||||
_In_opt_ otLwfInternalRequestCallback Callback
|
||||
)
|
||||
{
|
||||
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
|
||||
|
||||
LogFuncEntryMsg(DRIVER_OID, "OID = 0x%u", Oid);
|
||||
|
||||
// Build the request structure
|
||||
POTLWF_REQUEST_ASYNC FilterRequest = FILTER_ALLOC_MEM(FilterModuleContext->FilterHandle, sizeof(OTLWF_REQUEST_ASYNC));
|
||||
if (FilterRequest == NULL)
|
||||
{
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
LogWarning(DRIVER_OID, "Failed to allocate async internal request structure");
|
||||
goto error;
|
||||
}
|
||||
RtlZeroMemory(FilterRequest, sizeof(OTLWF_REQUEST_ASYNC));
|
||||
FilterRequest->Signature = OTLWF_ASYNC_REQUEST_TAG;
|
||||
|
||||
FilterRequest->Request.Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
|
||||
FilterRequest->Request.Header.Revision = NDIS_OID_REQUEST_REVISION_1;
|
||||
FilterRequest->Request.Header.Size = sizeof(NDIS_OID_REQUEST);
|
||||
FilterRequest->Request.RequestType = RequestType;
|
||||
FilterRequest->Request.RequestId = (PVOID)OTLWF_REQUEST_ID;
|
||||
FilterRequest->FreeOnCompletion = TRUE;
|
||||
FilterRequest->Callback = Callback;
|
||||
|
||||
switch (RequestType)
|
||||
{
|
||||
case NdisRequestQueryInformation:
|
||||
FilterRequest->Request.DATA.QUERY_INFORMATION.Oid = Oid;
|
||||
FilterRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer = InformationBuffer;
|
||||
FilterRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength = InformationBufferLength;
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
FilterRequest->Request.DATA.SET_INFORMATION.Oid = Oid;
|
||||
FilterRequest->Request.DATA.SET_INFORMATION.InformationBuffer = InformationBuffer;
|
||||
FilterRequest->Request.DATA.SET_INFORMATION.InformationBufferLength = InformationBufferLength;
|
||||
break;
|
||||
|
||||
default:
|
||||
NT_ASSERT(FALSE);
|
||||
break;
|
||||
}
|
||||
|
||||
LogVerbose(DRIVER_OID, "Sending (internal, async) Oid Request %p", &FilterRequest->Request);
|
||||
|
||||
// Send the OID request off
|
||||
NT_ASSERT(FilterRequest->Signature == OTLWF_ASYNC_REQUEST_TAG);
|
||||
Status = NdisFOidRequest(FilterModuleContext->FilterHandle, &FilterRequest->Request);
|
||||
|
||||
// Treat pending as success
|
||||
if (Status == NDIS_STATUS_PENDING)
|
||||
{
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
if (Status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
NdisFreeMemory(FilterRequest, 0, 0);
|
||||
}
|
||||
|
||||
LogFuncExitNDIS(DRIVER_OID, Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Callback for synchronous OID requests
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
VOID
|
||||
otLwfInternalSyncRequestComplete(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ PNDIS_OID_REQUEST NdisRequest,
|
||||
_In_ NDIS_STATUS Status
|
||||
)
|
||||
{
|
||||
// Get at the request context.
|
||||
POTLWF_REQUEST FilterRequest = CONTAINING_RECORD(NdisRequest, OTLWF_REQUEST, Request);
|
||||
|
||||
UNREFERENCED_PARAMETER(FilterModuleContext);
|
||||
|
||||
// Save away the completion status.
|
||||
FilterRequest->Status = Status;
|
||||
|
||||
LogVerbose(DRIVER_OID, "Setting completion event for (internal, sync) Oid Request %p", NdisRequest);
|
||||
|
||||
// Wake up the thread blocked for this request to complete.
|
||||
NdisSetEvent(&FilterRequest->ReqEvent);
|
||||
}
|
||||
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
VOID
|
||||
otLwfInternalRequestComplete(
|
||||
_In_ NDIS_HANDLE FilterModuleContext,
|
||||
_In_ PNDIS_OID_REQUEST NdisRequest,
|
||||
_In_ NDIS_STATUS Status
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
NDIS entry point indicating completion of a pended NDIS_OID_REQUEST.
|
||||
|
||||
Arguments:
|
||||
|
||||
FilterModuleContext - pointer to filter module context
|
||||
NdisRequest - pointer to NDIS request
|
||||
Status - status of request completion
|
||||
|
||||
Return Value:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
// Get at the request context.
|
||||
POTLWF_REQUEST_ASYNC FilterRequest = CONTAINING_RECORD(NdisRequest, OTLWF_REQUEST_ASYNC, Request);
|
||||
|
||||
NT_ASSERT(FilterRequest->Signature == OTLWF_REQUEST_TAG || FilterRequest->Signature == OTLWF_ASYNC_REQUEST_TAG);
|
||||
if (FilterRequest->Signature != OTLWF_REQUEST_TAG && FilterRequest->Signature != OTLWF_ASYNC_REQUEST_TAG) return;
|
||||
FilterRequest->Signature = (ULONG)(-1); // Prevent further calls into here
|
||||
|
||||
BOOLEAN FreeOnCompletion = FilterRequest->FreeOnCompletion;
|
||||
|
||||
// Invoke the callback or free the payload if there is no callback
|
||||
if (FilterRequest->Callback)
|
||||
{
|
||||
LogVerbose(DRIVER_OID, "Invoking callback for (internal) Oid Request %p", NdisRequest);
|
||||
|
||||
FilterRequest->Callback((PMS_FILTER)FilterModuleContext, NdisRequest, Status);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (NdisRequest->RequestType)
|
||||
{
|
||||
case NdisRequestQueryInformation:
|
||||
NdisFreeMemory(NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer, 0, 0);
|
||||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
NdisFreeMemory(NdisRequest->DATA.SET_INFORMATION.InformationBuffer, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
NT_ASSERT(FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Free the request if necessary
|
||||
if (FreeOnCompletion)
|
||||
{
|
||||
LogVerbose(DRIVER_OID, "Freeing (internal) Oid Request %p", NdisRequest);
|
||||
|
||||
NdisFreeMemory(FilterRequest, 0, 0);
|
||||
}
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016, The OpenThread Authors.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holder nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief
|
||||
* This file defines the structures and functions for sending and processing
|
||||
* NDIS OIDs.
|
||||
*/
|
||||
|
||||
#ifndef _OID_H
|
||||
#define _OID_H
|
||||
|
||||
// Allocation tag for OID requests sent from the filter, 'TOID'
|
||||
#define OTLWF_REQUEST_ID 'DIOT'
|
||||
|
||||
// Allocation tag for cloned OIDs, 'TCOD'
|
||||
#define OTLWF_CLONED_OID_TAG 'DOCT'
|
||||
|
||||
// The context inside a cloned request
|
||||
typedef struct _NDIS_OID_REQUEST *OTLWF_REQUEST_CONTEXT, **POTLWF_REQUEST_CONTEXT;
|
||||
|
||||
// Callback to set a new list of Keys to the MAC layer
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
typedef VOID
|
||||
(*otLwfInternalRequestCallback)(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ PNDIS_OID_REQUEST Request,
|
||||
_In_ NDIS_STATUS Status
|
||||
);
|
||||
|
||||
#define OTLWF_ASYNC_REQUEST_TAG 'aRIT'
|
||||
#define OTLWF_REQUEST_TAG 'sRIT'
|
||||
|
||||
// Used for sending internal OID requests
|
||||
typedef struct _OTLWF_REQUEST_ASYNC
|
||||
{
|
||||
ULONG Signature; // equals OTLWF_ASYNC_REQUEST_TAG or OTLWF_REQUEST_TAG
|
||||
NDIS_OID_REQUEST Request;
|
||||
BOOLEAN FreeOnCompletion;
|
||||
otLwfInternalRequestCallback Callback;
|
||||
} OTLWF_REQUEST_ASYNC, *POTLWF_REQUEST_ASYNC;
|
||||
|
||||
// Used for sending internal OID requests
|
||||
typedef struct _OTLWF_REQUEST
|
||||
{
|
||||
OTLWF_REQUEST_ASYNC;
|
||||
NDIS_EVENT ReqEvent;
|
||||
NDIS_STATUS Status;
|
||||
} OTLWF_REQUEST, *POTLWF_REQUEST;
|
||||
|
||||
FILTER_OID_REQUEST FilterOidRequest;
|
||||
|
||||
FILTER_CANCEL_OID_REQUEST FilterCancelOidRequest;
|
||||
|
||||
FILTER_OID_REQUEST_COMPLETE FilterOidRequestComplete;
|
||||
|
||||
// Sends an internal OID request down and waits
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NDIS_STATUS
|
||||
otLwfSendInternalRequest(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ NDIS_REQUEST_TYPE RequestType,
|
||||
_In_ NDIS_OID Oid,
|
||||
_Inout_updates_bytes_to_(InformationBufferLength, *pBytesProcessed)
|
||||
PVOID InformationBuffer,
|
||||
_In_ ULONG InformationBufferLength,
|
||||
_Out_ PULONG pBytesProcessed
|
||||
);
|
||||
|
||||
// Sends an internal OID request down. When complete it fires the callback,
|
||||
// or if the callback isn't set, frees the InformationBuffer.
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
NDIS_STATUS
|
||||
otLwfSendInternalRequestAsync(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ NDIS_REQUEST_TYPE RequestType,
|
||||
_In_ NDIS_OID Oid,
|
||||
_Inout_updates_(InformationBufferLength)
|
||||
PVOID InformationBuffer,
|
||||
_In_ ULONG InformationBufferLength,
|
||||
_In_opt_ otLwfInternalRequestCallback Callback
|
||||
);
|
||||
|
||||
// Callback for synchronous OID requests
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
VOID
|
||||
otLwfInternalSyncRequestComplete(
|
||||
_In_ PMS_FILTER FilterModuleContext,
|
||||
_In_ PNDIS_OID_REQUEST NdisRequest,
|
||||
_In_ NDIS_STATUS Status
|
||||
);
|
||||
|
||||
// Callback when the internal OID request completes
|
||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||
VOID
|
||||
otLwfInternalRequestComplete(
|
||||
_In_ NDIS_HANDLE FilterModuleContext,
|
||||
_In_ PNDIS_OID_REQUEST NdisRequest,
|
||||
_In_ NDIS_STATUS Status
|
||||
);
|
||||
|
||||
#endif //_OID_H
|
||||
|
||||
|
||||
@@ -113,7 +113,6 @@ typedef struct UDPHeader
|
||||
#include "driver.h"
|
||||
#include "device.h"
|
||||
#include "iocontrol.h"
|
||||
#include "oid.h"
|
||||
#include "radio.h"
|
||||
#include "filter.h"
|
||||
#include "command.h"
|
||||
|
||||
@@ -126,7 +126,6 @@ otLwfRadioInit(
|
||||
LogFuncEntry(DRIVER_DEFAULT);
|
||||
|
||||
NT_ASSERT(pFilter->DeviceStatus == OTLWF_DEVICE_STATUS_RADIO_MODE);
|
||||
//NT_ASSERT((pFilter->DeviceCapabilities & OTLWF_DEVICE_CAP_RADIO_SLEEP) != 0);
|
||||
|
||||
// Initialize the OpenThread radio capability flags
|
||||
pFilter->otRadioCapabilities = 0;
|
||||
@@ -348,29 +347,6 @@ ThreadError otPlatRadioSleep(_In_ otInstance *otCtx)
|
||||
pFilter->otPhyState = kStateSleep;
|
||||
LogInfo(DRIVER_DEFAULT, "Filter %p PhyState = kStateSleep.", pFilter);
|
||||
|
||||
if ((pFilter->DeviceCapabilities & OTLWF_DEVICE_CAP_RADIO_SLEEP) != 0)
|
||||
{
|
||||
/* TODO
|
||||
NDIS_STATUS status;
|
||||
ULONG bytesProcessed;
|
||||
OT_SLEEP_MODE OidBuffer = { {NDIS_OBJECT_TYPE_DEFAULT, OT_SLEEP_MODE_REVISION_1, SIZEOF_OT_SLEEP_MODE_REVISION_1}, TRUE };
|
||||
|
||||
// Indicate to the miniport
|
||||
status =
|
||||
otLwfSendInternalRequest(
|
||||
pFilter,
|
||||
NdisRequestSetInformation,
|
||||
OID_OT_SLEEP_MODE,
|
||||
&OidBuffer,
|
||||
sizeof(OidBuffer),
|
||||
&bytesProcessed
|
||||
);
|
||||
if (status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
LogError(DRIVER_DEFAULT, "Set for OID_OT_SLEEP_MODE failed, %!NDIS_STATUS!", status);
|
||||
}*/
|
||||
}
|
||||
|
||||
// Indicate to the miniport
|
||||
NTSTATUS status =
|
||||
otLwfCmdSetProp(
|
||||
@@ -397,34 +373,6 @@ ThreadError otPlatRadioReceive(_In_ otInstance *otCtx, uint8_t aChannel)
|
||||
if (pFilter->otPhyState == kStateDisabled) return kThreadError_Busy;
|
||||
|
||||
LogFuncEntryMsg(DRIVER_DATA_PATH, "Filter: %p", pFilter);
|
||||
|
||||
// If we are currently in the sleep state and the minport supports sleep
|
||||
// mode, come out of sleep mode now.
|
||||
if (pFilter->otPhyState == kStateSleep)
|
||||
{
|
||||
if ((pFilter->DeviceCapabilities & OTLWF_DEVICE_CAP_RADIO_SLEEP) != 0)
|
||||
{
|
||||
/* TODO
|
||||
NDIS_STATUS status;
|
||||
ULONG bytesProcessed;
|
||||
OT_SLEEP_MODE OidBuffer = { {NDIS_OBJECT_TYPE_DEFAULT, OT_SLEEP_MODE_REVISION_1, SIZEOF_OT_SLEEP_MODE_REVISION_1}, FALSE };
|
||||
|
||||
// Indicate to the miniport
|
||||
status =
|
||||
otLwfSendInternalRequest(
|
||||
pFilter,
|
||||
NdisRequestSetInformation,
|
||||
OID_OT_SLEEP_MODE,
|
||||
&OidBuffer,
|
||||
sizeof(OidBuffer),
|
||||
&bytesProcessed
|
||||
);
|
||||
if (status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
LogError(DRIVER_DEFAULT, "Set for OID_OT_SLEEP_MODE failed, %!NDIS_STATUS!", status);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
// Update current channel if different
|
||||
if (pFilter->otCurrentListenChannel != aChannel)
|
||||
@@ -450,7 +398,7 @@ ThreadError otPlatRadioReceive(_In_ otInstance *otCtx, uint8_t aChannel)
|
||||
}
|
||||
}
|
||||
|
||||
// Only transition to the receive state if we were sleeping; otherwise we
|
||||
// Only transition to the receive state if we were sleeping; otherwise we
|
||||
// are already in receive or transmit state.
|
||||
if (pFilter->otPhyState == kStateSleep)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user