Merge branch 'netlimit' into DDRace

This commit is contained in:
def 2013-08-04 04:32:44 +02:00
commit 84e7bb5658
5 changed files with 44 additions and 11 deletions

View file

@ -446,6 +446,8 @@ int CServer::Init()
m_aClients[i].m_aClan[0] = 0; m_aClients[i].m_aClan[0] = 0;
m_aClients[i].m_Country = -1; m_aClients[i].m_Country = -1;
m_aClients[i].m_Snapshots.Init(); m_aClients[i].m_Snapshots.Init();
m_aClients[i].m_Traffic = 0;
m_aClients[i].m_TrafficSince = 0;
} }
m_CurrentGameTick = 0; m_CurrentGameTick = 0;
@ -556,7 +558,7 @@ int CServer::SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System)
Packet.m_Flags |= NETSENDFLAG_FLUSH; Packet.m_Flags |= NETSENDFLAG_FLUSH;
// write message to demo recorder // write message to demo recorder
if(!(Flags&MSGFLAG_NORECORD)) if(m_DemoRecorder.IsRecording() && !(Flags&MSGFLAG_NORECORD))
m_DemoRecorder.RecordMessage(pMsg->Data(), pMsg->Size()); m_DemoRecorder.RecordMessage(pMsg->Data(), pMsg->Size());
if(!(Flags&MSGFLAG_NOSEND)) if(!(Flags&MSGFLAG_NOSEND))
@ -843,6 +845,26 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
if(Unpacker.Error()) if(Unpacker.Error())
return; return;
int64 Now = time_get();
if(Msg != NETMSG_REQUEST_MAP_DATA)
{
if (Now - m_aClients[ClientID].m_TrafficSince > time_freq() * 5)
{
m_aClients[ClientID].m_Traffic = 0;
m_aClients[ClientID].m_TrafficSince = Now;
}
else
{
if ((Now - m_aClients[ClientID].m_TrafficSince) / time_freq() > 0 && m_aClients[ClientID].m_Traffic / ((Now - m_aClients[ClientID].m_TrafficSince) / time_freq()) > g_Config.m_SvNetlimit)
{
m_NetServer.NetBan()->BanAddr(&pPacket->m_Address, 60, "Stressing network");
return;
}
m_aClients[ClientID].m_Traffic += pPacket->m_DataSize;
}
}
if(Sys) if(Sys)
{ {
// system message // system message

View file

@ -118,6 +118,9 @@ public:
int m_Latency; int m_Latency;
int m_SnapRate; int m_SnapRate;
int64 m_Traffic;
int64 m_TrafficSince;
int m_LastAckedSnapshot; int m_LastAckedSnapshot;
int m_LastInputTick; int m_LastInputTick;
CSnapshotStorage m_Snapshots; CSnapshotStorage m_Snapshots;

View file

@ -221,4 +221,7 @@ MACRO_CONFIG_INT(SvGlobalBantime, sv_global_ban_time, 60, 0, 1440, CFGFLAG_SERVE
MACRO_CONFIG_INT(SvEvents, sv_events, 1, 0, 1, CFGFLAG_SERVER, "Enable triggering of server events, like the happy eyeemotes on some holidays.") MACRO_CONFIG_INT(SvEvents, sv_events, 1, 0, 1, CFGFLAG_SERVER, "Enable triggering of server events, like the happy eyeemotes on some holidays.")
// netlimit
MACRO_CONFIG_INT(SvNetlimit, sv_netlimit, 10000, 1000, 1000000, CFGFLAG_SERVER, "Netlimit: Maximum amount of traffic a client is allowed to use (in kb/s)")
#endif #endif

View file

@ -183,6 +183,9 @@ void CDemoRecorder::Write(int Type, const void *pData, int Size)
if(!m_File) if(!m_File)
return; return;
if(Size > 64*1024)
return;
/* pad the data with 0 so we get an alignment of 4, /* pad the data with 0 so we get an alignment of 4,
else the compression won't work and miss some bytes */ else the compression won't work and miss some bytes */
mem_copy(aBuffer2, pData, Size); mem_copy(aBuffer2, pData, Size);

View file

@ -105,17 +105,19 @@ int CNetServer::Recv(CNetChunk *pChunk)
if(Bytes <= 0) if(Bytes <= 0)
break; break;
// check if we just should drop the packet
char aBuf[128];
if(NetBan() && NetBan()->IsBanned(&Addr, aBuf, sizeof(aBuf)))
{
// banned, reply with a message
CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, str_length(aBuf)+1);
continue;
}
bool Found = false;
if(CNetBase::UnpackPacket(m_RecvUnpacker.m_aBuffer, Bytes, &m_RecvUnpacker.m_Data) == 0) if(CNetBase::UnpackPacket(m_RecvUnpacker.m_aBuffer, Bytes, &m_RecvUnpacker.m_Data) == 0)
{ {
// check if we just should drop the packet
char aBuf[128];
if(NetBan() && NetBan()->IsBanned(&Addr, aBuf, sizeof(aBuf)))
{
// banned, reply with a message
CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, str_length(aBuf)+1);
continue;
}
if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS) if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS)
{ {
pChunk->m_Flags = NETSENDFLAG_CONNLESS; pChunk->m_Flags = NETSENDFLAG_CONNLESS;
@ -130,7 +132,7 @@ int CNetServer::Recv(CNetChunk *pChunk)
// TODO: check size here // TODO: check size here
if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL && m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_CONNECT) if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL && m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_CONNECT)
{ {
bool Found = false; Found = false;
// check if we already got this client // check if we already got this client
for(int i = 0; i < MaxClients(); i++) for(int i = 0; i < MaxClients(); i++)