summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapterlibrary/Interface/netvadapter.h
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;