mirror of
https://github.com/espressif/openthread.git
synced 2026-09-14 21:20:11 +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\settings.c" />
|
||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\thread.c" />
|
<ClCompile Include="..\..\examples\drivers\windows\otLwf\thread.c" />
|
||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\tunnel.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">
|
<ClCompile Include="..\..\examples\drivers\windows\otLwf\precomp.c">
|
||||||
<AdditionalIncludeDirectories>..;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreProcessorDefinitions>%(PreProcessorDefinitions);NDIS_WDM=1</PreProcessorDefinitions>
|
<PreProcessorDefinitions>%(PreProcessorDefinitions);NDIS_WDM=1</PreProcessorDefinitions>
|
||||||
@@ -109,7 +108,6 @@
|
|||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\driver.h" />
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\driver.h" />
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h" />
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h" />
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\nsihelper.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\radio.h" />
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\thread.h" />
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\thread.h" />
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h" />
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h" />
|
||||||
|
|||||||
@@ -39,9 +39,6 @@
|
|||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\nsihelper.h">
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\nsihelper.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\oid.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h">
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\iocontrol.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -54,6 +51,9 @@
|
|||||||
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h">
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\tunnel.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\examples\drivers\windows\otLwf\command.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\filter.c">
|
<ClCompile Include="..\..\examples\drivers\windows\otLwf\filter.c">
|
||||||
@@ -74,9 +74,6 @@
|
|||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\driver.c">
|
<ClCompile Include="..\..\examples\drivers\windows\otLwf\driver.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\oid.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\examples\drivers\windows\otLwf\iocontrol.c">
|
<ClCompile Include="..\..\examples\drivers\windows\otLwf\iocontrol.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -124,8 +124,8 @@ Return Value:
|
|||||||
FilterCancelSendNetBufferLists,
|
FilterCancelSendNetBufferLists,
|
||||||
FilterReceiveNetBufferLists,
|
FilterReceiveNetBufferLists,
|
||||||
FilterReturnNetBufferLists,
|
FilterReturnNetBufferLists,
|
||||||
FilterOidRequest,
|
NULL,
|
||||||
FilterOidRequestComplete,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -36,20 +36,20 @@ GetInterfaceCompartmentID(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
COMPARTMENT_ID CompartmentID = UNSPECIFIED_COMPARTMENT_ID;
|
COMPARTMENT_ID CompartmentID = UNSPECIFIED_COMPARTMENT_ID;
|
||||||
|
|
||||||
NTSTATUS Status =
|
NTSTATUS Status =
|
||||||
NsiGetParameter(
|
NsiGetParameter(
|
||||||
NsiActive,
|
NsiActive,
|
||||||
&NPI_MS_NDIS_MODULEID,
|
&NPI_MS_NDIS_MODULEID,
|
||||||
NdisNsiObjectInterfaceInformation,
|
NdisNsiObjectInterfaceInformation,
|
||||||
pNetLuid, sizeof(*pNetLuid),
|
pNetLuid, sizeof(*pNetLuid),
|
||||||
NsiStructRoDynamic,
|
NsiStructRoDynamic,
|
||||||
&CompartmentID, sizeof(CompartmentID),
|
&CompartmentID, sizeof(CompartmentID),
|
||||||
FIELD_OFFSET(NDIS_NSI_INTERFACE_INFORMATION_ROD, 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_
|
_Use_decl_annotations_
|
||||||
NDIS_STATUS
|
NDIS_STATUS
|
||||||
@@ -192,9 +192,6 @@ N.B.: FILTER can use NdisRegisterDeviceEx to create a device, so the upper
|
|||||||
// Filter initially in Paused state
|
// Filter initially in Paused state
|
||||||
pFilter->State = FilterPaused;
|
pFilter->State = FilterPaused;
|
||||||
|
|
||||||
// Initialize PendingOidRequest lock
|
|
||||||
NdisAllocateSpinLock(&pFilter->PendingOidRequestLock);
|
|
||||||
|
|
||||||
// Initialize rundowns to disabled with no active references
|
// Initialize rundowns to disabled with no active references
|
||||||
pFilter->ExternalRefs.Count = EX_RUNDOWN_ACTIVE;
|
pFilter->ExternalRefs.Count = EX_RUNDOWN_ACTIVE;
|
||||||
pFilter->cmdRundown.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.
|
// Device supports the energy scan command.
|
||||||
OTLWF_DEVICE_CAP_RADIO_ENERGY_SCAN = 1 << 3,
|
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.
|
// Device support Net & Thread commands.
|
||||||
OTLWF_DEVICE_CAP_THREAD_1_0 = 1 << 16,
|
OTLWF_DEVICE_CAP_THREAD_1_0 = 1 << 16,
|
||||||
|
|
||||||
@@ -148,12 +144,6 @@ typedef struct _MS_FILTER
|
|||||||
// Miniport Link State
|
// Miniport Link State
|
||||||
//
|
//
|
||||||
NDIS_LINK_STATE MiniportLinkState;
|
NDIS_LINK_STATE MiniportLinkState;
|
||||||
|
|
||||||
//
|
|
||||||
// Pending OID Handling
|
|
||||||
//
|
|
||||||
NDIS_SPIN_LOCK PendingOidRequestLock;
|
|
||||||
PNDIS_OID_REQUEST PendingOidRequest;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// External references management
|
// 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 "driver.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "iocontrol.h"
|
#include "iocontrol.h"
|
||||||
#include "oid.h"
|
|
||||||
#include "radio.h"
|
#include "radio.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ otLwfRadioInit(
|
|||||||
LogFuncEntry(DRIVER_DEFAULT);
|
LogFuncEntry(DRIVER_DEFAULT);
|
||||||
|
|
||||||
NT_ASSERT(pFilter->DeviceStatus == OTLWF_DEVICE_STATUS_RADIO_MODE);
|
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
|
// Initialize the OpenThread radio capability flags
|
||||||
pFilter->otRadioCapabilities = 0;
|
pFilter->otRadioCapabilities = 0;
|
||||||
@@ -348,29 +347,6 @@ ThreadError otPlatRadioSleep(_In_ otInstance *otCtx)
|
|||||||
pFilter->otPhyState = kStateSleep;
|
pFilter->otPhyState = kStateSleep;
|
||||||
LogInfo(DRIVER_DEFAULT, "Filter %p PhyState = kStateSleep.", pFilter);
|
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
|
// Indicate to the miniport
|
||||||
NTSTATUS status =
|
NTSTATUS status =
|
||||||
otLwfCmdSetProp(
|
otLwfCmdSetProp(
|
||||||
@@ -397,34 +373,6 @@ ThreadError otPlatRadioReceive(_In_ otInstance *otCtx, uint8_t aChannel)
|
|||||||
if (pFilter->otPhyState == kStateDisabled) return kThreadError_Busy;
|
if (pFilter->otPhyState == kStateDisabled) return kThreadError_Busy;
|
||||||
|
|
||||||
LogFuncEntryMsg(DRIVER_DATA_PATH, "Filter: %p", pFilter);
|
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
|
// Update current channel if different
|
||||||
if (pFilter->otCurrentListenChannel != aChannel)
|
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.
|
// are already in receive or transmit state.
|
||||||
if (pFilter->otPhyState == kStateSleep)
|
if (pFilter->otPhyState == kStateSleep)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user