blob: 3ed87429de01cc5415f2ad7002a4902f459d79a0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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;
|