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
|
/* SPDX-License-Identifier: GPL-2.0
*
* Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
*/
#pragma once
#include "allowedips.h"
#include "containers.h"
#include "cookie.h"
#include "noise.h"
#include "peerlookup.h"
#include "rcu.h"
#include "logging.h"
#include <ntifs.h> /* Must be included before <wdm.h> */
#include <wdm.h>
typedef struct _PREV_QUEUE
{
NET_BUFFER_LIST *Head, *Tail, *Peeked;
NET_BUFFER_LIST Empty;
LONG Count;
} PREV_QUEUE;
// Would be nice to have the MULTICORE_* stuff in queueing.h where it belongs.
typedef struct _MULTICORE_WORKTHREAD MULTICORE_WORKTHREAD;
typedef struct _MULTICORE_WORKQUEUE MULTICORE_WORKQUEUE;
typedef _Function_class_(MULTICORE_WORKQUEUE_ROUTINE)
_IRQL_requires_max_(PASSIVE_LEVEL)
VOID
MULTICORE_WORKQUEUE_ROUTINE(_In_ MULTICORE_WORKQUEUE *);
typedef MULTICORE_WORKQUEUE_ROUTINE *PMULTICORE_WORKQUEUE_ROUTINE;
struct _MULTICORE_WORKTHREAD
{
SLIST_ENTRY Entry;
PKTHREAD Thread;
PROCESSOR_NUMBER Processor;
MULTICORE_WORKTHREAD *NextThread;
MULTICORE_WORKQUEUE *WorkQueue;
};
struct _MULTICORE_WORKQUEUE
{
MULTICORE_WORKTHREAD *FirstThread;
KEVENT NewWork, NewCpus, Dead;
PMULTICORE_WORKQUEUE_ROUTINE Func;
PVOID NewCpuNotifier;
PKTHREAD WorkerSpawnerThread;
};
typedef struct _SOCKET SOCKET;
typedef struct _PEER_SERIAL_ENTRY PEER_SERIAL_ENTRY;
struct _PEER_SERIAL_ENTRY
{
PEER_SERIAL_ENTRY *Next;
SHORT Requeue;
};
typedef struct _PEER_SERIAL
{
PEER_SERIAL_ENTRY *First, **Last;
KSPIN_LOCK Lock;
} PEER_SERIAL;
typedef struct _WG_DEVICE
{
NDIS_HANDLE MiniportAdapterHandle; /* This is actually a pointer to NDIS_MINIPORT_BLOCK struct. */
DEVICE_OBJECT *FunctionalDeviceObject;
NDIS_STATISTICS_INFO Statistics;
EX_RUNDOWN_REF ItemsInFlight;
PTR_RING EncryptQueue, DecryptQueue, HandshakeRxQueue;
PEER_SERIAL TxQueue, RxQueue, HandshakeTxQueue;
MULTICORE_WORKQUEUE EncryptThreads, DecryptThreads;
MULTICORE_WORKQUEUE HandshakeTxThreads, HandshakeRxThreads;
SOCKET __rcu *Sock4, *Sock6;
NOISE_STATIC_IDENTITY StaticIdentity;
COOKIE_CHECKER CookieChecker;
PUBKEY_HASHTABLE *PeerHashtable;
INDEX_HASHTABLE *IndexHashtable;
ALLOWEDIPS_TABLE PeerAllowedIps;
EX_PUSH_LOCK DeviceUpdateLock, SocketUpdateLock;
LIST_ENTRY PeerList;
ULONG NumPeers;
NET_IFINDEX InterfaceIndex;
NET_LUID InterfaceLuid;
PEPROCESS SocketOwnerProcess;
UINT16 IncomingPort;
BOOLEAN IsUp, IsDeviceRemoving;
ULONG Mtu4, Mtu6;
ULONG HandshakeRxQueueLen;
LOG_RING Log;
LIST_ENTRY DeviceList;
KEVENT DeviceRemoved;
} WG_DEVICE;
_Requires_lock_held_(Wg->DeviceUpdateLock)
VOID
DeviceStart(_Inout_ WG_DEVICE *Wg);
_IRQL_requires_max_(APC_LEVEL)
_Requires_lock_held_(Wg->DeviceUpdateLock)
VOID
DeviceStop(_Inout_ WG_DEVICE *Wg);
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
DeviceIndicateConnectionStatus(_In_ NDIS_HANDLE MiniportAdapterHandle, _In_ NDIS_MEDIA_CONNECT_STATE MediaConnectState);
DRIVER_INITIALIZE DeviceDriverEntry;
VOID DeviceUnload(VOID);
|