blob: d5d14d7854a0e2922ce7d8d25e5a6eb02827c71f (
plain) (
blame)
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
|
/* SPDX-License-Identifier: GPL-2.0
*
* Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
*/
#pragma once
#include "interlocked.h"
#include "cookie.h"
#include "device.h"
#include "noise.h"
#include "rcu.h"
#include "timers.h"
typedef struct _ENDPOINT
{
SOCKADDR_INET Addr;
struct
{
WSACMSGHDR Cmsg;
union
{
struct
{
IN_PKTINFO Src4;
WSACMSGHDR CmsgHack4;
};
struct
{
IN6_PKTINFO Src6;
WSACMSGHDR CmsgHack6;
};
};
};
UINT32 RoutingGeneration;
UINT32 UpdateGeneration;
} ENDPOINT;
typedef enum _HANDSHAKE_TX_ACTION
{
HANDSHAKE_TX_NONE = 0,
HANDSHAKE_TX_CLEAR,
HANDSHAKE_TX_SEND
} HANDSHAKE_TX_ACTION;
typedef struct _WG_PEER
{
WG_DEVICE *Device;
PREV_QUEUE TxQueue, RxQueue;
PEER_SERIAL_ENTRY TxSerialEntry, RxSerialEntry, HandshakeTxSerialEntry;
NET_BUFFER_LIST_QUEUE StagedPacketQueue;
EX_RUNDOWN_REF InUse;
NOISE_KEYPAIRS Keypairs;
ENDPOINT Endpoint;
EX_SPIN_LOCK EndpointLock;
NOISE_HANDSHAKE Handshake;
LONG64 LastSentHandshake;
COOKIE LatestCookie;
HLIST_NODE PubkeyHash;
UINT64 RxBytes, TxBytes;
TIMER TimerRetransmitHandshake, TimerSendKeepalive;
TIMER TimerNewHandshake, TimerZeroKeyMaterial;
TIMER TimerPersistentKeepalive;
ULONG TimerHandshakeAttempts;
UINT16 PersistentKeepaliveInterval;
SHORT HandshakeTxAction;
BOOLEAN TimerNeedAnotherKeepalive;
BOOLEAN SentLastminuteHandshake;
LARGE_INTEGER WalltimeLastHandshake;
KREF Refcount;
RCU_CALLBACK Rcu;
LIST_ENTRY PeerList;
LIST_ENTRY AllowedIpsList;
UINT64 InternalId;
} WG_PEER;
_IRQL_requires_max_(DISPATCH_LEVEL)
_Requires_lock_held_(Wg->DeviceUpdateLock)
_Must_inspect_result_
NTSTATUS
PeerCreate(
_In_ WG_DEVICE *Wg,
_In_ CONST UINT8 PublicKey[NOISE_PUBLIC_KEY_LEN],
_In_ CONST UINT8 PresharedKey[NOISE_SYMMETRIC_KEY_LEN],
_Out_ WG_PEER **Peer);
_Must_inspect_result_
_Post_maybenull_
WG_PEER *
PeerGetMaybeZero(_In_opt_ WG_PEER *Peer);
_Post_notnull_
static inline WG_PEER *
PeerGet(_In_ WG_PEER *Peer)
{
KrefGet(&Peer->Refcount);
return Peer;
}
VOID
PeerPut(_In_opt_ WG_PEER *Peer);
_IRQL_requires_max_(APC_LEVEL)
_Requires_lock_held_(Peer->Device->DeviceUpdateLock)
VOID
PeerRemove(_In_opt_ WG_PEER *Peer);
_IRQL_requires_max_(APC_LEVEL)
_Requires_lock_held_(Wg->DeviceUpdateLock)
VOID
PeerRemoveAll(_Inout_ WG_DEVICE *Wg);
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSTATUS
PeerDriverEntry(VOID);
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID PeerUnload(VOID);
|