summaryrefslogtreecommitdiff
path: root/src/net/packetlimiter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/packetlimiter.cpp')
-rw-r--r--src/net/packetlimiter.cpp323
1 files changed, 0 insertions, 323 deletions
diff --git a/src/net/packetlimiter.cpp b/src/net/packetlimiter.cpp
deleted file mode 100644
index ba87badc7..000000000
--- a/src/net/packetlimiter.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2011-2017 The ManaPlus Developers
- *
- * This file is part of The ManaPlus Client.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "net/packetlimiter.h"
-
-#include "configuration.h"
-#include "settings.h"
-
-#include "utils/cast.h"
-#include "utils/checkutils.h"
-#include "utils/timer.h"
-
-#include <sys/stat.h>
-
-#include "debug.h"
-
-struct PacketLimit final
-{
- A_DEFAULT_COPY(PacketLimit)
-
- int lastTime;
- int timeLimit;
- int cnt;
- int cntLimit;
-};
-
-PacketLimit mPacketLimits[CAST_SIZE(PacketType::PACKET_SIZE) + 1];
-
-void PacketLimiter::initPacketLimiter()
-{
- // here i setting packet limits. but current server is broken,
- // and this limits may not help.
-
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_CHAT)].timeLimit = 10 + 5;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_CHAT)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_CHAT)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_CHAT)].cnt = 0;
-
- // 10
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_PICKUP)].timeLimit = 10 + 5;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_PICKUP)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_PICKUP)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_PICKUP)].cnt = 0;
-
- // 10 5
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DROP)].timeLimit = 5;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DROP)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DROP)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DROP)].cnt = 0;
-
- // 100
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_NEXT)].timeLimit = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_NEXT)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_NEXT)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_NEXT)].cnt = 0;
-
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_INPUT)].timeLimit = 100;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_INPUT)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_INPUT)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_INPUT)].cnt = 0;
-
- // 50
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_TALK)].timeLimit = 60;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_TALK)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_TALK)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_NPC_TALK)].cnt = 0;
-
- // 10
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_EMOTE)].timeLimit = 10 + 5;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_EMOTE)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_EMOTE)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_EMOTE)].cnt = 0;
-
- // 100
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_SIT)].timeLimit = 100;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_SIT)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_SIT)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_SIT)].cnt = 0;
-
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DIRECTION)].timeLimit = 50;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DIRECTION)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DIRECTION)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_DIRECTION)].cnt = 0;
-
- // 2+
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ATTACK)].timeLimit = 2 + 10;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ATTACK)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ATTACK)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ATTACK)].cnt = 0;
-
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_STOPATTACK)].timeLimit = 2 + 10;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_STOPATTACK)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_STOPATTACK)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_STOPATTACK)].cnt = 0;
-
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ONLINELIST)].timeLimit = 1800;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ONLINELIST)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ONLINELIST)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_ONLINELIST)].cnt = 0;
-
- // 300ms + 50 fix
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_WHISPER)].timeLimit = 30 + 5;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_WHISPER)].lastTime = 0;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_WHISPER)].cntLimit = 1;
- mPacketLimits[CAST_SIZE(
- PacketType::PACKET_WHISPER)].cnt = 0;
-
- if (!settings.serverConfigDir.empty())
- {
- const std::string packetLimitsName = settings.serverConfigDir
- + "/packetlimiter.txt";
-
- std::ifstream inPacketFile;
- struct stat statbuf;
-
- if ((stat(packetLimitsName.c_str(), &statbuf) != 0)
- || !S_ISREG(statbuf.st_mode))
- {
- // wtiting new file
- writePacketLimits(packetLimitsName);
- }
- else
- { // reading existent file
- inPacketFile.open(packetLimitsName.c_str(), std::ios::in);
- char line[101];
-
- if (!inPacketFile.is_open() || !inPacketFile.getline(line, 100))
- {
- inPacketFile.close();
- return;
- }
-
- const int ver = atoi(line);
-
- for (int f = 0;
- f < CAST_S32(PacketType::PACKET_SIZE);
- f ++)
- {
- if (!inPacketFile.getline(line, 100))
- break;
-
- if (!(ver == 1 &&
- (static_cast<PacketTypeT>(f) == PacketType::PACKET_DROP ||
- static_cast<PacketTypeT>(f)
- == PacketType::PACKET_NPC_NEXT)))
- {
- mPacketLimits[f].timeLimit = atoi(line);
- }
- }
- inPacketFile.close();
- if (ver < 5)
- writePacketLimits(packetLimitsName);
- }
- }
-}
-
-void PacketLimiter::writePacketLimits(const std::string &packetLimitsName)
-{
- std::ofstream outPacketFile;
- outPacketFile.open(packetLimitsName.c_str(), std::ios::out);
- if (!outPacketFile.is_open())
- {
- reportAlways("Error opening file for writing: %s",
- packetLimitsName.c_str());
- outPacketFile.close();
- return;
- }
- outPacketFile << "4" << std::endl;
- for (int f = 0; f < CAST_S32(PacketType::PACKET_SIZE); f ++)
- {
- outPacketFile << toString(mPacketLimits[f].timeLimit)
- << std::endl;
- }
-
- outPacketFile.close();
-}
-
-bool PacketLimiter::checkPackets(const PacketTypeT type)
-{
- if (type > PacketType::PACKET_SIZE)
- return false;
-
- if (!serverConfig.getValueBool("enableBuggyServers", true))
- return true;
-
- const PacketLimit &limit = mPacketLimits[CAST_SIZE(type)];
- const int timeLimit = limit.timeLimit;
-
- if (timeLimit == 0)
- return true;
-
- const int time = tick_time;
- const int lastTime = limit.lastTime;
- const int cnt = limit.cnt;
- const int cntLimit = limit.cntLimit;
-
- if (lastTime > tick_time)
- {
-// instance()->mPacketLimits[type].lastTime = time;
-// instance()->mPacketLimits[type].cnt = 0;
-
- return true;
- }
- else if (lastTime + timeLimit > time)
- {
- if (cnt >= cntLimit)
- {
- return false;
- }
-// instance()->mPacketLimits[type].cnt ++;
- return true;
- }
-// instance()->mPacketLimits[type].lastTime = time;
-// instance()->mPacketLimits[type].cnt = 1;
- return true;
-}
-
-bool PacketLimiter::limitPackets(const PacketTypeT type)
-{
- if (CAST_S32(type) < 0 || type > PacketType::PACKET_SIZE)
- return false;
-
- if (!serverConfig.getValueBool("enableBuggyServers", true))
- return true;
-
- PacketLimit &pack = mPacketLimits[CAST_SIZE(type)];
- const int timeLimit = pack.timeLimit;
-
- if (timeLimit == 0)
- return true;
-
- const int time = tick_time;
- const int lastTime = pack.lastTime;
- const int cnt = pack.cnt;
- const int cntLimit = pack.cntLimit;
-
- if (lastTime > tick_time)
- {
- pack.lastTime = time;
- pack.cnt = 0;
- return true;
- }
- else if (lastTime + timeLimit > time)
- {
- if (cnt >= cntLimit)
- {
- return false;
- }
- pack.cnt ++;
- return true;
- }
- pack.lastTime = time;
- pack.cnt = 1;
- return true;
-}