blob: fc51171aa26dae3ec7a34dcb1117d32daf08849b [file] [log] [blame]
/*
* 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
* Header file for the routines related to NETADAPTER Object for the
* Network Adapter
*/
#define NIC_TAG_RECV_NBL ((ULONG)'rMVT') // TVMr
#define OTTMP_ADAPTER_CONTEXT_SIGNATURE 'pdAt'
// The maximum size of one Spinel command / serial packet
#define MAX_SPINEL_COMMAND_LENGTH 1300
typedef struct _SERIAL_SEND_ITEM
{
LIST_ENTRY Link;
PNET_BUFFER_LIST NetBufferList;
WDFMEMORY WdfMemory;
ULONG EncodedBufferLength;
_Field_size_bytes_(EncodedBufferLength)
UCHAR EncodedBuffer[0];
} SERIAL_SEND_ITEM, *PSERIAL_SEND_ITEM;
const ULONG SERIAL_SEND_ITEM_SIZE = FIELD_OFFSET(SERIAL_SEND_ITEM, EncodedBuffer);
typedef struct _OTTMP_ADAPTER_CONTEXT {
ULONG Signature;
#ifdef OTTMP_LEGACY
NDIS_HANDLE Adapter;
#else
//
// Handle to the NETADAPTER object for this context
//
NETADAPTER Adapter;
#endif
//
// Handle to the corresponding WDFDEVICE
//
WDFDEVICE Device;
// Flag to indicate if the data path is enabled
bool IsConnected;
// Flag to indicate if the Adapter has been started or not
bool IsRunning;
#ifdef OTTMP_LEGACY
PGLOBALS pGlobals;
#else
// Receive packet pool
NETBUFFERLISTCOLLECTION ReceiveCollection;
#endif
ULONGLONG ExtendedAddress; // TODO - Cache
//
// Serial Device
//
WDFIOTARGET WdfIoTarget;
WDFSPINLOCK SendLock;
_Guarded_by_(SendLock)
LIST_ENTRY SendQueue;
bool SendQueueRunning;
WDFWORKITEM SendWorkItem;
WDFWORKITEM RecvWorkItem;
WDFREQUEST RecvReadRequest;
UCHAR RecvBuffer[MAX_SPINEL_COMMAND_LENGTH * 2];
ULONG RecvBufferLength;
//
// NIC configuration - This information is queried by the protocol drivers.
// Since this sample focuses on demonstrating the NDIS WDF model,
// it doesn't modify any these values during runtime.
// Please look at the netvmini630 sample to see how these values can be set
// and updated
// -------------------------------------------------------------------------
//
ULONG PacketFilter;
ULONG ulLookahead;
ULONG64 ulLinkSendSpeed;
ULONG64 ulLinkRecvSpeed;
ULONG ulMaxBusySends;
ULONG ulMaxBusyRecvs;
//
// Statistics -
// Since this sample focuses on demonstrating the NDIS WDF model,
// it doesn't modify any these values during runtime.
// Please look at the netvmini630 sample to see how these values can be set
// and updated
// -------------------------------------------------------------------------
//
// Packet counts
ULONG64 FramesRxDirected;
ULONG64 FramesRxMulticast;
ULONG64 FramesRxBroadcast;
ULONG64 FramesTxDirected;
ULONG64 FramesTxMulticast;
ULONG64 FramesTxBroadcast;
// Byte counts
ULONG64 BytesRxDirected;
ULONG64 BytesRxMulticast;
ULONG64 BytesRxBroadcast;
ULONG64 BytesTxDirected;
ULONG64 BytesTxMulticast;
ULONG64 BytesTxBroadcast;
// Count of transmit errors
ULONG TxAbortExcessCollisions;
ULONG TxLateCollisions;
ULONG TxDmaUnderrun;
ULONG TxLostCRS;
ULONG TxOKButDeferred;
ULONG OneRetry;
ULONG MoreThanOneRetry;
ULONG TotalRetries;
ULONG TransmitFailuresOther;
// Count of receive errors
ULONG RxCrcErrors;
ULONG RxAlignmentErrors;
ULONG RxResourceErrors;
ULONG RxDmaOverrunErrors;
ULONG RxCdtFrames;
ULONG RxRuntErrors;
} OTTMP_ADAPTER_CONTEXT, *POTTMP_ADAPTER_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(OTTMP_ADAPTER_CONTEXT, GetAdapterContext);
typedef struct _WDF_DEVICE_INFO
{
POTTMP_ADAPTER_CONTEXT AdapterContext;
} WDF_DEVICE_INFO, *PWDF_DEVICE_INFO;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WDF_DEVICE_INFO, GetWdfDeviceInfo);
#ifdef OTTMP_LEGACY
PAGED MINIPORT_PAUSE MPPause;
PAGED MINIPORT_RESTART MPRestart;
MINIPORT_SEND_NET_BUFFER_LISTS MPSendNetBufferLists;
MINIPORT_RETURN_NET_BUFFER_LISTS MPReturnNetBufferLists;
MINIPORT_CANCEL_SEND MPCancelSend;
PAGED
_IRQL_requires_max_(PASSIVE_LEVEL)
NDIS_STATUS
AdapterInitialize(
_In_ NDIS_HANDLE MiniportAdapterHandle,
_In_ POTTMP_ADAPTER_CONTEXT AdapterContext
);
PAGED
_IRQL_requires_(PASSIVE_LEVEL)
VOID
AdapterUninitialize(
_In_ POTTMP_ADAPTER_CONTEXT AdapterContext
);
#else
PAGED EVT_NET_ADAPTER_SET_CAPABILITIES EvtAdapterSetCapabilities;
PAGED EVT_NET_ADAPTER_START EvtAdapterStart;
PAGED EVT_NET_ADAPTER_PAUSE EvtAdapterPause;
EVT_NET_ADAPTER_SEND_NET_BUFFER_LISTS EvtAdapterSendNetBufferLists;
PAGED
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
AdapterInitialize(
_In_ NETADAPTER Adapter,
_In_ POTTMP_ADAPTER_CONTEXT AdapterContext,
_In_ POTTMP_DEVICE_CONTEXT DeviceContext
);
#endif
_IRQL_requires_max_(PASSIVE_LEVEL)
VOID
AdapterIndicateEnergyScanComplete(
_In_ POTTMP_ADAPTER_CONTEXT AdapterContext,
_In_ NDIS_STATUS Status
);
EXT_CALLBACK AdapterEnergyScanTimerCallback;