UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StatelessConnectHandlerComponent.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "PacketHandler.h"
6#include "IPAddress.h"
7
8
10
11
12// Forward Declarations
13class UNetConnection;
14class UNetDriver;
16
17
18// Defines
19#define SECRET_BYTE_SIZE 64
20#define SECRET_COUNT 2
21#define COOKIE_BYTE_SIZE 20
22
23
24namespace UE::Net
25{
30 {
31 Original = 0, // The original/unversioned handshake protocol
32 Randomized = 1, // The version of the handshake protocol with randomization, versioning and debug/diagnostic tweaks
33 NetCLVersion = 2, // Added Network CL version, for optional extra-early client rejection
34
37 SessionClientId = 3, // Added SessionId (index of server game session) and ClientId (clientside index of NetConnection)
38 NetCLUpgradeMessage = 4, // Added stateless handshake level NMT_Upgrade message, to allow Network CL checks to be permanently enabled
39
41 };
42
44 static constexpr EHandshakeVersion HandshakeCompatibilityBreaks[] = { EHandshakeVersion::SessionClientId };
45
46
51 {
52 InitialPacket = 0,
53 Challenge = 1,
54 Response = 2,
55 Ack = 3,
59
61 };
62
67 {
68 None = 0x00,
69 RestartHandshake = 0x01 // Restart handshake packet
70 };
71
73
74
79 {
80 None,
81 WrongVersion // Client/Server have incompatible versions
82 };
83
103
110}
111
112
119{
124
125private:
127 struct FCommonSendToClientParams
128 {
130 const TSharedPtr<const FInternetAddr>& ClientAddress;
131
133 EHandshakeVersion HandshakeVersion;
134
136 uint32 ClientID;
137
138
139 public:
141 };
142
143public:
148
149 ENGINE_API virtual void CountBytes(FArchive& Ar) const override;
150
151 virtual bool IsValid() const override { return true; }
152
153 ENGINE_API virtual void NotifyHandshakeBegin() override;
154
162
169
170private:
176 void SendInitialPacket(EHandshakeVersion HandshakeVersion);
177
184 void SendConnectChallenge(FCommonSendToClientParams CommonParams, uint8 ClientSentHandshakePacketCount);
185
194 void SendChallengeResponse(EHandshakeVersion HandshakeVersion, uint8 InSecretId, double InTimestamp, uint8 InCookie[COOKIE_BYTE_SIZE]);
195
203 void SendChallengeAck(FCommonSendToClientParams CommonParams, uint8 ClientSentHandshakePacketCount, uint8 InCookie[COOKIE_BYTE_SIZE]);
204
210 void SendRestartHandshakeRequest(FCommonSendToClientParams CommonParams);
211
217 void SendVersionUpgradeMessage(FCommonSendToClientParams CommonParams);
218
219
230 void BeginHandshakePacket(FBitWriter& HandshakePacket, EHandshakePacketType HandshakePacketType, EHandshakeVersion HandshakeVersion,
232 EHandshakePacketModifier HandshakePacketModifier=EHandshakePacketModifier::None);
233
234
242 void SendToServer(EHandshakeVersion HandshakeVersion, EHandshakePacketType PacketType, FBitWriter& Packet);
243
251 void SendToClient(FCommonSendToClientParams CommonParams, EHandshakePacketType PacketType, FBitWriter& Packet);
252
253
260 void CapHandshakePacket(FBitWriter& HandshakePacket, EHandshakeVersion HandshakeVersion);
261
262public:
270 {
271 bOutRestartedHandshake = bRestartedHandshake;
272
273 return (LastChallengeSuccessAddress.IsValid() && Address.IsValid()) ? *LastChallengeSuccessAddress == *Address : false;
274 }
275
276
284 {
285 OutServerSequence = LastServerSequence;
286 OutClientSequence = LastClientSequence;
287 }
288
296 {
297 return FMemory::Memcmp(AuthorisedCookie, NetConnComponent.AuthorisedCookie, COOKIE_BYTE_SIZE) == 0;
298 }
299
303 inline void ResetChallengeData()
304 {
305 LastChallengeSuccessAddress = nullptr;
306 bRestartedHandshake = false;
307 LastServerSequence = 0;
308 LastClientSequence = 0;
309 FMemory::Memzero(AuthorisedCookie, COOKIE_BYTE_SIZE);
310 }
311
312
319
320
321protected:
322 ENGINE_API virtual void Initialize() override;
323
324 ENGINE_API virtual void Incoming(FBitReader& Packet) override;
325
326 ENGINE_API virtual void Outgoing(FBitWriter& Packet, FOutPacketTraits& Traits) override;
327
329
330 virtual bool CanReadUnaligned() const override
331 {
332 return true;
333 }
334
335 ENGINE_API virtual int32 GetReservedPacketBits() const override;
336
337 ENGINE_API virtual void Tick(float DeltaTime) override;
338
339private:
340
344 struct FParsedHandshakeData
345 {
347 EHandshakeVersion RemoteMinVersion = EHandshakeVersion::Latest;
348
350 EHandshakeVersion RemoteCurVersion = EHandshakeVersion::Latest;
351
353 uint32 RemoteNetworkVersion = 0;
354
356 EEngineNetworkRuntimeFeatures RemoteNetworkFeatures;
357
360
362 uint8 RemoteSentHandshakePacketCount = 0;
363
365 bool bRestartHandshake = false;
366
368 uint8 SecretId = 0;
369
371 double Timestamp = 0.0;
372
374 uint8 Cookie[COOKIE_BYTE_SIZE] = {};
375
377 uint8 OrigCookie[COOKIE_BYTE_SIZE] = {};
378
379
380 public:
381 FParsedHandshakeData();
382 };
383
384
392 bool ParseHandshakePacket(FBitReader& Packet, FParsedHandshakeData& OutResult) const;
393
394 bool ParseHandshakePacketOriginal(FBitReader& Packet, FParsedHandshakeData& OutResult) const;
395
403 bool CheckVersion(const FParsedHandshakeData& HandshakeData, EHandshakeVersion& OutTargetVersion) const;
404
413 void GenerateCookie(const TSharedPtr<const FInternetAddr>& ClientAddress, uint8 SecretId, double Timestamp, uint8 (&OutCookie)[COOKIE_BYTE_SIZE]) const;
414
418 void UpdateSecret();
419
423 int32 GetAdjustedSizeBits(int32 InSizeBits, EHandshakeVersion HandshakeVersion) const;
424
425#if !UE_BUILD_SHIPPING
431 bool TrackValidationLogs();
432#endif
433
434
435private:
437 UNetDriver* Driver;
438
440 FBitWriter OldPacket;
441
445 TArray<uint8> HandshakeSecret[SECRET_COUNT];
446
448 uint8 ActiveSecret;
449
451 double LastSecretUpdateTimestamp;
452
454 double LastInitTimestamp = 0.0;
455
457 TSharedPtr<const FInternetAddr> LastChallengeSuccessAddress;
458
460 int32 LastServerSequence;
461
463 int32 LastClientSequence;
464
466 EHandshakeVersion MinClientHandshakeVersion;
467
468#if !UE_BUILD_SHIPPING
470 double LastValidationLogPeriodStart = 0.0;
471
473 uint32 ValidationLogCounter = 0;
474#endif
475
477 double LastUpgradeMessagePeriodStart = 0.0;
478
480 uint32 UpgradeMessageCounter = 0;
481
483 FHandshakeFailureFunc HandshakeFailureCallback;
484
485
489 double LastClientSendTimestamp;
490
491
493 double LastChallengeTimestamp;
494
496 double LastRestartPacketTimestamp;
497
499 uint8 LastSecretId;
500
502 double LastTimestamp;
503
505 uint8 LastCookie[COOKIE_BYTE_SIZE];
506
507
511 bool bRestartedHandshake;
512
514 uint8 AuthorisedCookie[COOKIE_BYTE_SIZE];
515
517 TBitArray<> MagicHeader;
518
520 uint32 MagicHeaderUint = 0;
521
523 uint8 SentHandshakePacketCount = 0;
524
526 EHandshakeVersion LastRemoteHandshakeVersion;
527
529 uint32 CachedGlobalNetTravelCount = 0;
530
532 uint32 CachedClientID = 0;
533
535 static constexpr uint32 SessionIDSizeBits = 2;
536
538 static constexpr uint32 ClientIDSizeBits = 3;
539};
540
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
EEngineNetworkRuntimeFeatures
Definition NetworkVersion.h:45
#define COOKIE_BYTE_SIZE
Definition StatelessConnectHandlerComponent.h:21
#define SECRET_COUNT
Definition StatelessConnectHandlerComponent.h:20
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition PacketHandler.h:728
Definition StatelessConnectHandlerComponent.h:119
virtual bool IsValid() const override
Definition StatelessConnectHandlerComponent.h:151
ENGINE_API StatelessConnectHandlerComponent()
Definition StatelessConnectHandlerComponent.cpp:384
virtual ENGINE_API void Initialize() override
Definition StatelessConnectHandlerComponent.cpp:883
virtual ENGINE_API void CountBytes(FArchive &Ar) const override
Definition StatelessConnectHandlerComponent.cpp:446
virtual ENGINE_API int32 GetReservedPacketBits() const override
Definition StatelessConnectHandlerComponent.cpp:1794
virtual bool CanReadUnaligned() const override
Definition StatelessConnectHandlerComponent.h:330
virtual ENGINE_API void NotifyHandshakeBegin() override
Definition StatelessConnectHandlerComponent.cpp:458
virtual ENGINE_API void IncomingConnectionless(FIncomingPacketRef PacketRef) override
Definition StatelessConnectHandlerComponent.cpp:1281
ENGINE_API void InitFromConnectionless(StatelessConnectHandlerComponent *InConnectionlessHandler)
Definition StatelessConnectHandlerComponent.cpp:930
ENGINE_API void SetHandshakeFailureCallback(FHandshakeFailureFunc &&InHandshakeFailureFunc)
Definition StatelessConnectHandlerComponent.cpp:942
void GetChallengeSequence(int32 &OutServerSequence, int32 &OutClientSequence) const
Definition StatelessConnectHandlerComponent.h:283
void ResetChallengeData()
Definition StatelessConnectHandlerComponent.h:303
bool DoesRestartedHandshakeMatch(StatelessConnectHandlerComponent &NetConnComponent) const
Definition StatelessConnectHandlerComponent.h:295
ENGINE_API void SetDriver(UNetDriver *InDriver)
Definition StatelessConnectHandlerComponent.cpp:830
bool HasPassedChallenge(const TSharedPtr< const FInternetAddr > &Address, bool &bOutRestartedHandshake) const
Definition StatelessConnectHandlerComponent.h:269
Definition Array.h:670
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointer.h:1085
Definition FunctionFwd.h:19
Definition NetConnection.h:284
Definition NetDriver.h:799
@ None
Definition ReplicationDataStreamDebug.h:25
Definition NetworkVersion.cpp:28
TUniqueFunction< void(FStatelessHandshakeFailureInfo HandshakeFailureInfo)> FHandshakeFailureFunc
Definition StatelessConnectHandlerComponent.h:109
EHandshakePacketType
Definition StatelessConnectHandlerComponent.h:51
EHandshakeVersion
Definition StatelessConnectHandlerComponent.h:30
EHandshakePacketModifier
Definition StatelessConnectHandlerComponent.h:67
EHandshakeFailureReason
Definition StatelessConnectHandlerComponent.h:79
Definition BitReader.h:25
Definition BitWriter.h:22
Definition PacketHandler.h:230
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
Definition PacketTraits.h:21
Definition StatelessConnectHandlerComponent.h:89
uint32 RemoteNetworkVersion
Definition StatelessConnectHandlerComponent.h:94
EHandshakeFailureReason FailureReason
Definition StatelessConnectHandlerComponent.h:91
FStatelessHandshakeFailureInfo()
Definition StatelessConnectHandlerComponent.cpp:360
EEngineNetworkRuntimeFeatures RemoteNetworkFeatures
Definition StatelessConnectHandlerComponent.h:97