aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-08-22 20:06:24 +0200
committerShauren <shauren.trinity@gmail.com>2014-08-22 20:06:24 +0200
commitf2cb5061618367d6d4c07dee40eb9c6ecaed5d03 (patch)
treec9e3ee9d3e66739d7cbd0f4d908b7eaa5a94eaca /src
parentb8b24a26f67e90ff8090a798b3509a513318c174 (diff)
Core/NetworkIO: Removed MSG_VERIFY_CONNECTIVITY as an opcode
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1
-rw-r--r--src/server/game/Server/WorldSocket.cpp140
-rw-r--r--src/server/game/Server/WorldSocket.h23
4 files changed, 89 insertions, 76 deletions
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index cc5e9413b7a..63fe4dd3743 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -612,7 +612,6 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(MSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRaidDifficultyOpcode );
DEFINE_OPCODE_HANDLER(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode);
DEFINE_OPCODE_HANDLER(MSG_TALENT_WIPE_CONFIRM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTalentWipeConfirmOpcode );
- DEFINE_OPCODE_HANDLER(MSG_VERIFY_CONNECTIVITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 4047b1b42c5..c26f018eabf 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -653,7 +653,6 @@ enum Opcodes
MSG_START_MOVE_FORWARD = 0x0000,
MSG_TABARDVENDOR_ACTIVATE = 0x6926,
MSG_TALENT_WIPE_CONFIRM = 0x0107,
- MSG_VERIFY_CONNECTIVITY = 0x4F57,
SMSG_ACCOUNT_DATA_TIMES = 0x4B05,
SMSG_ACCOUNT_INFO_RESPONSE = 0x10A7,
SMSG_ACCOUNT_RESTRICTED_WARNING = 0x51A7,
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 4e7ad6590a8..df1a072b81d 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -28,21 +28,23 @@
using boost::asio::ip::tcp;
-WorldSocket::WorldSocket(tcp::socket&& socket)
- : Socket(std::move(socket), sizeof(ClientPktHeader)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr)
+std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT");
+
+std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER");
+
+WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket), sizeof(ClientPktHeader)),
+ _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr), _initialized(false)
{
}
void WorldSocket::Start()
{
sScriptMgr->OnSocketOpen(shared_from_this());
- AsyncReadHeader();
- // not an opcode. this packet sends raw string WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"
- // because of our implementation of WorldPacket sending, bytes "WO" become the opcode
- WorldPacket packet(MSG_VERIFY_CONNECTIVITY);
- packet << "RLD OF WARCRAFT CONNECTION - SERVER TO CLIENT";
- AsyncWrite(packet);
+ AsyncReadData(ClientConnectionInitialize.length() + 2 /*sizeof(ClientPktHeader::size)*/ + 1 /*null terminator*/);
+
+ _writeQueue.emplace(ServerConnectionInitialize);
+ AsyncWrite(_writeQueue.front());
}
void WorldSocket::HandleSendAuthSession()
@@ -90,84 +92,84 @@ void WorldSocket::ReadHeaderHandler()
void WorldSocket::ReadDataHandler()
{
- ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetHeaderBuffer());
+ if (_initialized)
+ {
+ ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetHeaderBuffer());
Opcodes opcode = PacketFilter::DropHighBytes(Opcodes(header->cmd));
- std::string opcodeName = GetOpcodeNameForLogging(opcode);
+ std::string opcodeName = GetOpcodeNameForLogging(opcode);
- WorldPacket packet(opcode, MoveData());
+ WorldPacket packet(opcode, MoveData());
- if (sPacketLog->CanLogPacket())
- sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort());
+ if (sPacketLog->CanLogPacket())
+ sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort());
- TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), opcodeName.c_str());
+ TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), opcodeName.c_str());
- switch (opcode)
- {
- case CMSG_PING:
- HandlePing(packet);
- break;
- case CMSG_AUTH_SESSION:
- if (_worldSession)
- {
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ switch (opcode)
+ {
+ case CMSG_PING:
+ HandlePing(packet);
break;
- }
+ case CMSG_AUTH_SESSION:
+ if (_worldSession)
+ {
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ break;
+ }
- HandleAuthSession(packet);
- break;
- case CMSG_KEEP_ALIVE:
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(_worldSession, packet);
- break;
- case CMSG_LOG_DISCONNECT:
- packet.rfinish(); // contains uint32 disconnectReason;
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(_worldSession, packet);
- return;
- // not an opcode, client sends string "WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER" without opcode
- // first 4 bytes become the opcode (2 dropped)
- case MSG_VERIFY_CONNECTIVITY:
- {
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(_worldSession, packet);
- std::string str;
- packet >> str;
- if (str != "D OF WARCRAFT CONNECTION - CLIENT TO SERVER")
+ HandleAuthSession(packet);
+ break;
+ case CMSG_KEEP_ALIVE:
+ TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ sScriptMgr->OnPacketReceive(_worldSession, packet);
+ break;
+ case CMSG_LOG_DISCONNECT:
+ packet.rfinish(); // contains uint32 disconnectReason;
+ TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ sScriptMgr->OnPacketReceive(_worldSession, packet);
+ return;
+ case CMSG_ENABLE_NAGLE:
{
- CloseSocket();
+ TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ sScriptMgr->OnPacketReceive(_worldSession, packet);
+ if (_worldSession)
+ _worldSession->HandleEnableNagleAlgorithm();
break;
}
+ default:
+ {
+ if (!_worldSession)
+ {
+ TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
+ CloseSocket();
+ return;
+ }
- HandleSendAuthSession();
- break;
+ // Our Idle timer will reset on any non PING opcodes.
+ // Catches people idling on the login screen and any lingering ingame connections.
+ _worldSession->ResetTimeOutTime();
+
+ // Copy the packet to the heap before enqueuing
+ _worldSession->QueuePacket(new WorldPacket(std::move(packet)));
+ break;
+ }
}
- case CMSG_ENABLE_NAGLE:
+ }
+ else
+ {
+ ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(GetDataBuffer());
+
+ std::string initializer(reinterpret_cast<char const*>(header) + sizeof(header->size));
+ if (initializer != ClientConnectionInitialize)
{
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(_worldSession, packet);
- if (_worldSession)
- _worldSession->HandleEnableNagleAlgorithm();
- break;
+ CloseSocket();
+ return;
}
- default:
- {
- if (!_worldSession)
- {
- TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
- CloseSocket();
- return;
- }
- // Our Idle timer will reset on any non PING opcodes.
- // Catches people idling on the login screen and any lingering ingame connections.
- _worldSession->ResetTimeOutTime();
-
- // Copy the packet to the heap before enqueuing
- _worldSession->QueuePacket(new WorldPacket(std::move(packet)));
- break;
- }
+ _initialized = true;
+ HandleSendAuthSession();
}
AsyncReadHeader();
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 16f9d8a43c7..9e5f785d939 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -49,7 +49,7 @@ struct ClientPktHeader
uint16 size;
uint32 cmd;
- bool IsValid() const { return size >= 4 && size < 10240 && (cmd < NUM_OPCODE_HANDLERS || (cmd >> 16) == 0x4C52); }
+ bool IsValid() const { return size >= 4 && size < 10240 && cmd < NUM_OPCODE_HANDLERS; }
};
#pragma pack(pop)
@@ -60,11 +60,18 @@ struct WorldPacketBuffer
typedef boost::asio::const_buffer const* const_iterator;
- WorldPacketBuffer(ServerPktHeader header, WorldPacket const& packet) : _header(header), _packet(packet)
+ WorldPacketBuffer(ServerPktHeader header, WorldPacket const& packet) : _header(header), _packet(packet), _bufferCount(0)
{
- _buffers[0] = boost::asio::const_buffer(_header.header, _header.getHeaderLength());
+ _buffers[_bufferCount++] = boost::asio::const_buffer(_header.header, _header.getHeaderLength());
if (!_packet.empty())
- _buffers[1] = boost::asio::const_buffer(_packet.contents(), _packet.size());
+ _buffers[_bufferCount++] = boost::asio::const_buffer(_packet.contents(), _packet.size());
+ }
+
+ WorldPacketBuffer(std::string const& str) : _header(str.length() + 1 /*null terminator*/, 0), _packet(), _bufferCount(0)
+ {
+ _buffers[_bufferCount++] = boost::asio::const_buffer(_header.header, _header.getHeaderLength() - 2 /*sizeof(opcode)*/);
+ if (!str.empty())
+ _buffers[_bufferCount++] = boost::asio::const_buffer(str.c_str(), _header.size);
}
const_iterator begin() const
@@ -74,13 +81,14 @@ struct WorldPacketBuffer
const_iterator end() const
{
- return _buffers + (_packet.empty() ? 1 : 2);
+ return _buffers + _bufferCount;
}
private:
boost::asio::const_buffer _buffers[2];
ServerPktHeader _header;
WorldPacket _packet;
+ uint32 _bufferCount;
};
namespace boost
@@ -98,6 +106,10 @@ class WorldSocket : public Socket<WorldSocket, WorldPacketBuffer>
{
typedef Socket<WorldSocket, WorldPacketBuffer> Base;
+ static std::string const ServerConnectionInitialize;
+
+ static std::string const ClientConnectionInitialize;
+
public:
WorldSocket(tcp::socket&& socket);
@@ -129,6 +141,7 @@ private:
uint32 _OverSpeedPings;
WorldSession* _worldSession;
+ bool _initialized;
};
#endif