10#include "RPCDoSDetection.generated.h"
16#define RPC_QUOTA_DEBUG 0
19#define RPC_DOS_DEV_STATS 0
22#define RPC_DOS_SCOPE_DEBUG 1
49#if RPC_DOS_SCOPE_DEBUG
180 bool bSendEscalateAnalytics =
false;
195 int16 EscalateQuotaRPCsPerFrame = -1;
199 int16 EscalateTimeQuotaMSPerFrame = -1;
203 int16 EscalateQuotaRPCsPerPeriod = -1;
207 int16 EscalateTimeQuotaMSPerPeriod = -1;
211 int8 EscalateQuotaTimePeriod = -1;
218 int8 EscalationCountTolerance = 1;
222 int16 EscalationTimeToleranceMS = -1;
233 int16 RPCRepeatLimitMSPerPeriod = -1;
237 int8 RPCRepeatLimitTimePeriod = -1;
252 double EscalateTimeQuotaSecsPerFrame = 0.0;
255 double EscalateTimeQuotaSecsPerPeriod = 0.0;
258 double RPCRepeatLimitSecsPerPeriod = 0.0;
261 double EscalationTimeToleranceSeconds = 0.0;
302 FString SeverityCategory;
309 int8 HighestTimePeriod = 0;
341 void ValidateConfig();
348 int8 GetHighestTimePeriod() const;
355 const
TArray<
int8>& GetAllTimePeriods() const;
425 struct FLightweightRPCTracking
428 static constexpr int32 TrackingNum = 256;
474 UE_DEPRECATED(5.1,
"UpdateSeverity will be made private soon.")
477 UpdateSeverity_Private(
Update, Reason);
501#if RPC_DOS_SCOPE_DEBUG
502 ensure(GRPCDoSScopeDebugging == 0 || TickScopePrivate.IsActive());
503 ensure(GRPCDoSScopeDebugging == 0 || !SequentialRPCScopePrivate.IsActive());
506 PacketScopePrivate.SetActive(
true);
514 SequentialRPCScopePrivate.Reset();
537 if (bRPCDoSDetection && !bHitchSuspendDetection)
539 if (!SequentialRPCScopePrivate.IsActive())
544 if (bRPCTrackingEnabled)
576 if (bRPCDoSDetection && !bHitchSuspendDetection)
578 if (!SequentialRPCScopePrivate.IsActive())
583 if (
UNLIKELY(ForcedRPCTracking == FunctionName && FMath::FRand() <= ForcedRPCTrackingChance))
590 FLightweightRPCTracking& LightweightRPCTracking =
SequentialRPCScope.LightweightRPCTracking;
613 FrameCounter.DebugAccumRPCTime += (
PacketScope.DebugReceivedRPCEndTime -
PacketScope.DebugReceivedRPCStartTime);
617 if (bRPCDoSDetection && !bHitchSuspendDetection)
625 RPCIntervalCounter++;
657 if (GetPacketScope().bPacketContainsRPC)
662 ReceivedPacketEndTime = TimeSeconds;
664 PacketScopePrivate.SetActive(
false);
666#if RPC_DOS_SCOPE_DEBUG
667 ensure(GRPCDoSScopeDebugging == 0 || !SequentialRPCScopePrivate.IsActive());
668 ensure(GRPCDoSScopeDebugging == 0 || TickScopePrivate.IsActive());
702 return bRPCTrackingEnabled;
710 return bRPCDoSDetection;
739 void PreSequentialRPC()
743#if RPC_DOS_SCOPE_DEBUG
744 ensure(GRPCDoSScopeDebugging == 0 || TickScopePrivate.IsActive());
745 ensure(GRPCDoSScopeDebugging == 0 || PacketScopePrivate.IsActive());
748 SequentialRPCScopePrivate.SetActive(
true);
764 void InitState(
double TimeSeconds);
769 void CondCheckCountQuota()
772 if ((RPCIntervalCounter & 0x3F) == 0)
788 void CondCheckTimeQuota(
double TimeSeconds)
790 if (TimeSeconds > NextTimeQuotaCheck)
794 NextTimeQuotaCheck = TimeSeconds + TimeQuotaCheckInterval;
829 void EnableRPCTracking(
double TimeSeconds);
845 void DisableRPCTracking(
double TimeSeconds);
875 void ClearStaleRPCTracking(
double TimeSeconds);
881 void CachePlayerAddress();
886 void CachePlayerUID();
893 const FString& GetPlayerAddress()
895 return CachedAddress;
903 const FString& GetPlayerUID()
905 return CachedPlayerUID;
916 inline void SetActive(
bool bInVal)
920#if RPC_DOS_SCOPE_DEBUG
921 ensure(GRPCDoSScopeDebugging == 0 || bScopeActive !=
bInVal);
938 static_cast<T*
>(
this)->
Reset();
943 bool bScopeActive =
false;
947 class FTickScope :
public TScopeBase<FTickScope>
959 This.CondCheckCountQuota();
965 This.CondCheckTimeQuota(TimeSeconds);
970 FrameCounter.ResetRPCCounters();
979 FTickScope TickScopePrivate;
983 inline FTickScope& GetTickScope()
987#if RPC_DOS_SCOPE_DEBUG
988 ensure(GRPCDoSScopeDebugging == 0 || TickScopePrivate.IsActive());
991 return TickScopePrivate;
996 class FPacketScope :
public TScopeBase<FPacketScope>
1000 bool bPacketContainsRPC =
false;
1003 double ReceivedPacketStartTime = 0.0;
1009 bPacketContainsRPC =
false;
1010 ReceivedPacketStartTime = 0.0;
1015 FPacketScope PacketScopePrivate;
1019 inline FPacketScope& GetPacketScope()
1023#if RPC_DOS_SCOPE_DEBUG
1024 ensure(GRPCDoSScopeDebugging == 0 || PacketScopePrivate.IsActive());
1027 return PacketScopePrivate;
1031 class FSequentialRPCScope :
public TScopeBase<FSequentialRPCScope>
1037 This.CondCheckCountQuota();
1043 This.CondCheckTimeQuota(TimeSeconds);
1060 bReceivedPacketRPCUnique =
true;
1061 ReceivedPacketRPCCount = 0;
1062 LightweightRPCTracking.Count = 0;
1064 PostReceivedRPCTracking =
nullptr;
1065 PostReceivedRPCCounter =
nullptr;
1066 PostReceivedRPCBlockCount = 0;
1067 LastReceivedRPCTimeCache = 0.0;
1077 bool bReceivedPacketRPCUnique =
true;
1080 int32 ReceivedPacketRPCCount = 0;
1083 FLightweightRPCTracking LightweightRPCTracking;
1087 FName PostReceivedRPCName;
1096 int32 PostReceivedRPCBlockCount = 0;
1099 double LastReceivedRPCTimeCache = 0.0;
1111 FSequentialRPCScope SequentialRPCScopePrivate;
1114 inline FSequentialRPCScope& GetSequentialRPCScope()
1118#if RPC_DOS_SCOPE_DEBUG
1119 ensure(GRPCDoSScopeDebugging == 0 || SequentialRPCScopePrivate.IsActive());
1122 return SequentialRPCScopePrivate;
1128 bool bRPCDoSDetection =
false;
1131 bool bRPCDoSAnalytics =
false;
1134 int32 HitchTimeQuotaMS = 0;
1137 int32 HitchSuspendDetectionTimeMS = 0;
1143 FName ForcedRPCTracking;
1146 double ForcedRPCTrackingChance = 1.0;
1149 double ForcedRPCTrackingLength = 0.0;
1152 double ForcedRPCTrackingEndTime = 0.0;
1159 FString CachedAddress;
1165 FString CachedPlayerUID;
1175 int8 ActiveState = 0;
1178 int8 WorstActiveState = 0;
1181 int8 WorstAnalyticsState = 0;
1184 double LastMetEscalationConditions = 0.0;
1187 bool bHitchSuspendDetection =
false;
1190 double HitchSuspendDetectionStartTime = 0.0;
1197 double LastPerSecQuotaBegin = 0.0;
1203 int32 LastCounterPerSecHistoryIdx = 0;
1209 uint8 SecondsIncrementer = 0;
1213 double ReceivedPacketEndTime = 0.0;
1216 double LastPreTickDispatchTime = 0.0;
1219 uint32 RPCIntervalCounter = 0;
1222 double NextTimeQuotaCheck = 0.0;
1225 static constexpr double TimeQuotaCheckInterval = 0.005;
1229 bool bRPCTrackingEnabled =
false;
1232 int8 MaxRPCTrackingPeriod = 0;
1241 static constexpr int32 DefaultActiveRPCTrackingSize = 128;
1244 double LastRPCTrackingClean = 0.0;
1254 double AnalyticsMinTimePerSecThreshold = 0.0;
1257 double LastAnalyticsThresholdRecalc = 0.0;
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define CSV_SCOPED_TIMING_STAT_EXCLUSIVE(StatName)
Definition CsvProfiler.h:152
void Init()
Definition LockFreeList.h:4
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
ERPCBlockState
Definition RPCDoSDetection.h:111
ERPCDoSSeverityUpdate
Definition RPCDoSDetection.h:381
ERPCNotifyResult
Definition RPCDoSDetection.h:372
EPostSequentialRPCType
Definition RPCDoSDetection.h:402
ERPCDoSEscalateReason
Definition RPCDoSDetection.h:391
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
Definition NameTypes.h:617
Definition RPCDoSDetection.h:419
void PostSequentialRPC(EPostSequentialRPCType SequenceType, double TimeSeconds, FRPCDoSCounters *RPCCounter, FRPCTrackingInfo *RPCTrackingInfo)
Definition RPCDoSDetection.cpp:870
void LightweightReceivedRPC(UFunction *Function, FName FunctionName)
Definition RPCDoSDetection.h:570
void InitConfig(FName NetDriverName)
Definition RPCDoSDetection.cpp:368
void PostReceivedRPCPacket(double TimeSeconds)
Definition RPCDoSDetection.cpp:984
bool ShouldMonitorReceivedRPC() const
Definition RPCDoSDetection.h:696
void PreReceivedPacket(double TimeSeconds)
Definition RPCDoSDetection.h:493
void PostReceivedPacket(double TimeSeconds)
Definition RPCDoSDetection.h:649
void NotifyClose()
Definition RPCDoSDetection.cpp:1041
void PreTickDispatch(double TimeSeconds)
Definition RPCDoSDetection.cpp:755
void PostTickDispatch()
Definition RPCDoSDetection.cpp:1024
void SetPlayerUIDFunc(FGetRPCDoSPlayerUID &&InPlayerUIDFunc)
Definition RPCDoSDetection.cpp:1386
void SetAddressFunc(FGetRPCDoSAddress &&InAddressFunc)
Definition RPCDoSDetection.cpp:1374
void UpdateSeverity(ERPCDoSSeverityUpdate Update, ERPCDoSEscalateReason Reason)
Definition RPCDoSDetection.h:475
void PostReceivedRPC()
Definition RPCDoSDetection.h:602
void SetKickPlayerFunc(FRPCDoSKickPlayer &&InKickPlayerFunc)
Definition RPCDoSDetection.cpp:1398
bool IsRPCDoSDetectionEnabled() const
Definition RPCDoSDetection.h:708
ERPCNotifyResult NotifyReceivedRPC(FNetBitReader &Reader, TSet< FNetworkGUID > &UnmappedGuids, UObject *Object, UFunction *Function, FName FunctionName)
Definition RPCDoSDetection.h:528
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition NetworkVersion.cpp:28
int32 GRPCDoSScopeDebugging
@ false
Definition radaudio_common.h:23
Definition RPCDoSDetection.h:157
void * Key
Definition RPCDoSDetection.h:159
const FRPCTrackingInfo * TrackingInfo
Definition RPCDoSDetection.h:162
static double Seconds()
Definition AndroidPlatformTime.h:20
Definition RPCDoSDetectionAnalytics.h:152
Definition RPCDoSDetection.h:64
double AccumRPCTime
Definition RPCDoSDetection.h:69
void AccumulateCounter(const FRPCDoSCounters &InCounter)
Definition RPCDoSDetection.h:96
void ResetRPCCounters()
Definition RPCDoSDetection.h:81
int32 RPCCounter
Definition RPCDoSDetection.h:66
Definition RPCDoSDetection.h:431
UFunction * Function
Definition RPCDoSDetection.h:433
FName Name
Definition RPCDoSDetection.h:436
Definition RPCDoSDetection.h:298
Definition RPCDoSDetection.h:171
bool HasHitQuota_Time(const FRPCDoSCounters(&PerPeriodHistory)[16], FRPCDoSCounters &InFrameCounter) const
Definition RPCDoSDetection.cpp:161
bool HasHitQuota_Count(const FRPCDoSCounters(&PerPeriodHistory)[16], FRPCDoSCounters &InFrameCounter) const
Definition RPCDoSDetection.cpp:137
Definition RPCDoSDetection.h:122
uint8 LastTrackedSecondIncrement
Definition RPCDoSDetection.h:130
TSharedPtr< FRPCAnalytics > RPCTrackingAnalyticsEntry
Definition RPCDoSDetection.h:136
ERPCBlockState BlockState
Definition RPCDoSDetection.h:133
FRPCDoSCounters PerPeriodHistory[16]
Definition RPCDoSDetection.h:124
uint8 HistoryCount
Definition RPCDoSDetection.h:127
uint8 GetCurrentHistoryIdx() const
Definition RPCDoSDetection.h:145