From af4dcc93ed04c4f2219c14821b25cb9efeb7e781 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 12 Nov 2024 13:54:43 +0100 Subject: Core/Networking: Support IPv6 --- src/server/game/Server/WorldSession.cpp | 19 +++++++++++++++++-- src/server/game/Server/WorldSocket.cpp | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'src/server/game/Server') diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 55cd3379a58..0f19c3115aa 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -818,8 +818,23 @@ void WorldSession::SendConnectToInstance(WorldPackets::Auth::ConnectToSerial ser } else { - memcpy(connectTo.Payload.Where.Address.V6.data(), instanceAddress.to_v6().to_bytes().data(), 16); - connectTo.Payload.Where.Type = WorldPackets::Auth::ConnectTo::IPv6; + // client always uses v4 address for loopback and v4 mapped addresses + boost::asio::ip::address_v6 v6 = instanceAddress.to_v6(); + if (v6.is_loopback()) + { + memcpy(connectTo.Payload.Where.Address.V4.data(), boost::asio::ip::address_v4::loopback().to_bytes().data(), 4); + connectTo.Payload.Where.Type = WorldPackets::Auth::ConnectTo::IPv4; + } + else if (v6.is_v4_mapped()) + { + memcpy(connectTo.Payload.Where.Address.V4.data(), Trinity::Net::make_address_v4(boost::asio::ip::v4_mapped, v6).to_bytes().data(), 4); + connectTo.Payload.Where.Type = WorldPackets::Auth::ConnectTo::IPv4; + } + else + { + memcpy(connectTo.Payload.Where.Address.V6.data(), v6.to_bytes().data(), 16); + connectTo.Payload.Where.Type = WorldPackets::Auth::ConnectTo::IPv6; + } } connectTo.Con = CONNECTION_TYPE_INSTANCE; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 601cb950af5..359482110d6 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -445,7 +445,7 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() return ReadDataHandlerResult::Error; case CMSG_LOG_DISCONNECT: LogOpcodeText(opcode, sessionGuard); - packet.rfinish(); // contains uint32 disconnectReason; + TC_LOG_DEBUG("network", "WorldSocket::ReadDataHandler: client {} sent CMSG_LOG_DISCONNECT reason {}", GetRemoteIpAddress().to_string(), packet.read()); break; case CMSG_ENABLE_NAGLE: LogOpcodeText(opcode, sessionGuard); -- cgit v1.2.3