2
0
mirror of https://github.com/rehlds/rehlds.git synced 2024-12-27 23:25:45 +03:00

Fix build

This commit is contained in:
s1lentq 2024-12-09 01:21:00 +07:00
parent 64c684af4a
commit e83b324301
4 changed files with 37 additions and 24 deletions

View File

@ -276,15 +276,6 @@ typedef struct flow_s
float avgkbytespersec; float avgkbytespersec;
} flow_t; } flow_t;
const int NET_DECOMPRESS_MAX_TIMES = 10;
typedef struct frag_decomp_failure_s
{
float failure_times[NET_DECOMPRESS_MAX_TIMES];
// Count of abnormal fragment decompressions in a time window
int num_failures;
} frag_decomp_failure_t;
const int FRAGMENT_C2S_MIN_SIZE = 16; const int FRAGMENT_C2S_MIN_SIZE = 16;
const int FRAGMENT_S2C_MIN_SIZE = 256; const int FRAGMENT_S2C_MIN_SIZE = 256;
const int FRAGMENT_S2C_MAX_SIZE = 1024; const int FRAGMENT_S2C_MAX_SIZE = 1024;
@ -432,9 +423,6 @@ typedef struct netchan_s
// Incoming and outgoing flow metrics // Incoming and outgoing flow metrics
flow_t flow[MAX_FLOWS]; flow_t flow[MAX_FLOWS];
// Stats for decompression of incoming fragments
frag_decomp_failure_t frag_decompress[MAX_STREAMS];
} netchan_t; } netchan_t;
#ifdef REHLDS_FIXES #ifdef REHLDS_FIXES

View File

@ -174,10 +174,6 @@ void Netchan_Clear(netchan_t *chan)
chan->frag_startpos[i] = 0; chan->frag_startpos[i] = 0;
chan->frag_length[i] = 0; chan->frag_length[i] = 0;
chan->incomingready[i] = FALSE; chan->incomingready[i] = FALSE;
for (int j = 0; j < NET_DECOMPRESS_MAX_TIMES; j++)
chan->frag_decompress[i].failure_times[j] = 0;
chan->frag_decompress[i].num_failures = 0;
} }
if (chan->tempbuffer) if (chan->tempbuffer)
@ -191,6 +187,7 @@ void Netchan_Clear(netchan_t *chan)
void Netchan_Setup(netsrc_t socketnumber, netchan_t *chan, netadr_t adr, int player_slot, void *connection_status, qboolean(*pfnNetchan_Blocksize)(void *)) void Netchan_Setup(netsrc_t socketnumber, netchan_t *chan, netadr_t adr, int player_slot, void *connection_status, qboolean(*pfnNetchan_Blocksize)(void *))
{ {
Netchan_Clear(chan); Netchan_Clear(chan);
g_GameClients[player_slot]->NetchanClear();
Q_memset(chan, 0, sizeof(netchan_t)); Q_memset(chan, 0, sizeof(netchan_t));
@ -1460,7 +1457,6 @@ qboolean Netchan_ValidateDecompress(netchan_t *chan, int stream, unsigned int co
{ {
#ifdef REHLDS_FIXES #ifdef REHLDS_FIXES
int i; int i;
frag_decomp_failure_t *decomp;
if (sv_net_incoming_decompression_max_ratio.value <= 0) if (sv_net_incoming_decompression_max_ratio.value <= 0)
return TRUE; // validation is disabled return TRUE; // validation is disabled
@ -1477,24 +1473,24 @@ qboolean Netchan_ValidateDecompress(netchan_t *chan, int stream, unsigned int co
Netchan_DecompressionCvarsBounds(); Netchan_DecompressionCvarsBounds();
decomp = &chan->frag_decompress[stream]; FragStats_t &stats = g_GameClients[chan->player_slot - 1]->GetFragStats(stream);
// check if the client should be rejected based on total failed decompress // check if the client should be rejected based on total failed decompress
if (decomp->num_failures >= sv_net_incoming_decompression_max_failures.value) if (stats.num_decompress_failures >= sv_net_incoming_decompression_max_failures.value)
{ {
for (i = 0; i < sv_net_incoming_decompression_max_failures.value - 1; i++) for (i = 0; i < sv_net_incoming_decompression_max_failures.value - 1; i++)
decomp->failure_times[i] = decomp->failure_times[i + 1]; stats.decompress_failure_times[i] = stats.decompress_failure_times[i + 1];
decomp->num_failures = sv_net_incoming_decompression_max_failures.value - 1; stats.num_decompress_failures = sv_net_incoming_decompression_max_failures.value - 1;
} }
decomp->failure_times[decomp->num_failures++] = realtime; stats.decompress_failure_times[stats.num_decompress_failures++] = realtime;
// check if the client should be rejected based on recent failed decompress // check if the client should be rejected based on recent failed decompress
int recent_failures = 0; int recent_failures = 0;
for (i = 0; i < decomp->num_failures; i++) for (i = 0; i < stats.num_decompress_failures; i++)
{ {
if ((realtime - decomp->failure_times[i]) <= sv_net_incoming_decompression_min_failuretime.value) if ((realtime - stats.decompress_failure_times[i]) <= sv_net_incoming_decompression_min_failuretime.value)
recent_failures++; recent_failures++;
} }

View File

@ -530,6 +530,15 @@ netchan_t* EXT_FUNC CNetChan::GetChan()
return m_pNetChan; return m_pNetChan;
} }
void CNetChan::Clear()
{
for (int i = 0; i < MAX_STREAMS; i++)
{
for (int j = 0; j < NET_DECOMPRESS_MAX_TIMES; j++)
m_FragStats[i].decompress_failure_times[j] = 0;
m_FragStats[i].num_decompress_failures = 0;
}
}
int EXT_FUNC CRehldsServerStatic::GetMaxClients() int EXT_FUNC CRehldsServerStatic::GetMaxClients()

View File

@ -30,6 +30,16 @@
#include "rehlds_interfaces.h" #include "rehlds_interfaces.h"
#include "server.h" #include "server.h"
const int NET_DECOMPRESS_MAX_TIMES = 10;
struct FragStats_t
{
float decompress_failure_times[NET_DECOMPRESS_MAX_TIMES];
// Count of abnormal fragment decompressions in a time window
int num_decompress_failures;
};
class CNetChan : public INetChan class CNetChan : public INetChan
{ {
private: private:
@ -38,6 +48,10 @@ private:
#ifdef REHLDS_FIXES #ifdef REHLDS_FIXES
uint8_t m_messageBuffer[NET_MAX_PAYLOAD]; uint8_t m_messageBuffer[NET_MAX_PAYLOAD];
#endif #endif
// Stats for decompression of incoming fragments
FragStats_t m_FragStats[MAX_STREAMS];
public: public:
CNetChan(netchan_t* chan); CNetChan(netchan_t* chan);
@ -46,10 +60,13 @@ public:
virtual netchan_t* GetChan(); virtual netchan_t* GetChan();
void Clear();
public: public:
#ifdef REHLDS_FIXES #ifdef REHLDS_FIXES
uint8_t* GetExtendedMessageBuffer() { return m_messageBuffer; }; uint8_t* GetExtendedMessageBuffer() { return m_messageBuffer; };
#endif #endif
FragStats_t &GetFragStats(int stream) { return m_FragStats[stream]; };
}; };
@ -247,6 +264,9 @@ public:
uint8_t* GetExtendedMessageBuffer() { return m_NetChan.GetExtendedMessageBuffer(); }; uint8_t* GetExtendedMessageBuffer() { return m_NetChan.GetExtendedMessageBuffer(); };
#endif #endif
void NetchanClear() { m_NetChan.Clear(); }
FragStats_t &GetFragStats(int stream) { return m_NetChan.GetFragStats(stream); };
#ifdef REHLDS_FIXES #ifdef REHLDS_FIXES
void SetupLocalGameTime() { m_localGameTimeBase = g_psv.time; } void SetupLocalGameTime() { m_localGameTimeBase = g_psv.time; }
double GetLocalGameTime() const { return g_psv.time - m_localGameTimeBase; } double GetLocalGameTime() const { return g_psv.time - m_localGameTimeBase; }