Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions network/netadaptercx/netvadapterlibrary/Interface/netvadapter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// Copyright (c) Microsoft Corporation. All rights reserved
#pragma once

#define MAX_MULTICAST_LIST_SIZE 32
#define MAC_ADDR_LEN 6
#define MAX_RX_QUEUES 1
#define MAX_TX_QUEUES 1
#define MTU_SIZE 1500

#define NETV_NUMBER_OF_QUEUES 1

//#define NETV_SUPPORT_RSS // RSS not supported due to ENL limitations
//#define NETV_SUPPORT_TX_DEMUXING // TX Demuxing not supported due to ENL limitations

// supported filters
#define NETV_SUPPORTED_FILTERS ( \
NetPacketFilterFlagDirected | \
NetPacketFilterFlagMulticast | \
NetPacketFilterFlagBroadcast | \
NetPacketFilterFlagPromiscuous | \
NetPacketFilterFlagAllMulticast)


EVT_NET_ADAPTER_CREATE_TXQUEUE
CreateTxQueue;
EVT_NET_ADAPTER_CREATE_RXQUEUE
CreateRxQueue;

typedef enum _NETV_FLOW_CONTROL
{
NetvFlowControlDisabled = 0,
NetvFlowControlTxEnabled = 1,
NetvFlowControlRxEnabled = 2,
NetvFlowControlTxRxEnabled = 3,
} NETV_FLOW_CONTROL;

typedef NTSTATUS(EVT_PDO_WAKE_SIGNAL)(_In_ void* Context);

class NetvAdapter
{

public:

NetvAdapter(
NETADAPTER Handle,
WDFDEVICE Device
) noexcept;

// Public API
void Destroy();
NTSTATUS Initialize();
NTSTATUS CreateRxQueue(_Inout_ NETRXQUEUE_INIT* NetRxQueueInit);
NTSTATUS CreateTxQueue(_Inout_ NETTXQUEUE_INIT* NetTxQueueInit);

// Former INetvAdapter method (kept as regular method)
NTSTATUS ConfigureDataCapabilities();

// Existing public API
void SetPdoWakeSignalCallback(_In_ EVT_PDO_WAKE_SIGNAL* evtPdoWakeSignal, _In_ void* context);
void ArmWakeFromS0(void);
void DisarmWakeFromS0(void);

NETADAPTER m_handle = WDF_NO_HANDLE;

WDFDEVICE m_device = WDF_NO_HANDLE;

// configuration
NET_ADAPTER_LINK_LAYER_ADDRESS PermanentAddress;
NET_ADAPTER_LINK_LAYER_ADDRESS CurrentAddress;
ULONG MACLastByte;
BOOLEAN S0Idle;
BOOLEAN EnableUsoUro;

// Packet Filter and look ahead size.
NET_PACKET_FILTER_FLAGS PacketFilter;

bool LinkAutoNeg{false};
NETV_FLOW_CONTROL FlowControl;

ULONG MtuSize;
ULONG CurrentPacketFilter;
ULONG NumMulticastAddresses;
NET_ADAPTER_LINK_LAYER_ADDRESS MulticastAddressList[MAX_MULTICAST_LIST_SIZE];

//ENL
LIST_ENTRY AdapterListLink;
ULONG LinkCount{1};
ULONG LinkProcIndex;
ULONG EnlIndex;
ULONG EnlPortIndex;
BOOLEAN EnlIndexValid;
BOOLEAN EnlPortCreated;
BOOLEAN LinkPoll;
ULONG64 EnlTxDrops;

// Offloads
bool UsoEnabled;
bool UroEnabled;

private:

_IRQL_requires_(PASSIVE_LEVEL)
void
SetLinkState(
void
) const;


NTSTATUS NetvAdapterReadAddress();
};

extern NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter);

typedef struct _GLOBAL_CONTEXT
{
} GLOBAL_CONTEXT;

extern GLOBAL_CONTEXT NetvGlobalContext;
Loading
Loading