diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index b19e913825..77b6aba947 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -134,6 +134,7 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) /* Is this packet sent? */ if (p->RemainingBytesToTransfer() == 0) { /* Go to the next packet */ + if (_debug_net_level >= 3) this->LogSentPacket(*p); this->packet_queue.pop_front(); } else { return SPS_PARTLY_SENT; @@ -216,6 +217,8 @@ std::unique_ptr NetworkTCPSocketHandler::ReceivePacket() return std::move(this->packet_recv); } +void NetworkTCPSocketHandler::LogSentPacket(const Packet &pkt) {} + /** * Check whether this socket can send or receive something. * @return \c true when there is something to receive. diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index 7bdc5693cb..201b36e4ab 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -54,6 +54,7 @@ public: SendPacketsState SendPackets(bool closing_down = false); virtual std::unique_ptr ReceivePacket(); + virtual void LogSentPacket(const Packet &pkt); bool CanSendReceive(); diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 0904a54017..38d52b3753 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -20,6 +20,65 @@ #include "../../safeguards.h" +static const char* _packet_game_type_names[] { + "SERVER_FULL", + "SERVER_BANNED", + "CLIENT_JOIN", + "SERVER_ERROR", + "CLIENT_COMPANY_INFO", + "SERVER_COMPANY_INFO", + "SERVER_CHECK_NEWGRFS", + "CLIENT_NEWGRFS_CHECKED", + "SERVER_NEED_GAME_PASSWORD", + "CLIENT_GAME_PASSWORD", + "SERVER_NEED_COMPANY_PASSWORD", + "CLIENT_COMPANY_PASSWORD", + "CLIENT_SETTINGS_PASSWORD", + "SERVER_SETTINGS_ACCESS", + "SERVER_WELCOME", + "SERVER_CLIENT_INFO", + "CLIENT_GETMAP", + "SERVER_WAIT", + "SERVER_MAP_BEGIN", + "SERVER_MAP_SIZE", + "SERVER_MAP_DATA", + "SERVER_MAP_DONE", + "CLIENT_MAP_OK", + "SERVER_JOIN", + "SERVER_FRAME", + "CLIENT_ACK", + "SERVER_SYNC", + "CLIENT_COMMAND", + "SERVER_COMMAND", + "CLIENT_CHAT", + "SERVER_CHAT", + "CLIENT_RCON", + "SERVER_RCON", + "CLIENT_MOVE", + "SERVER_MOVE", + "CLIENT_SET_PASSWORD", + "CLIENT_SET_NAME", + "SERVER_COMPANY_UPDATE", + "SERVER_CONFIG_UPDATE", + "SERVER_NEWGAME", + "SERVER_SHUTDOWN", + "CLIENT_QUIT", + "SERVER_QUIT", + "CLIENT_ERROR", + "SERVER_ERROR_QUIT", + "CLIENT_DESYNC_LOG", + "SERVER_DESYNC_LOG", + "CLIENT_DESYNC_MSG", +}; +static_assert(lengthof(_packet_game_type_names) == PACKET_END); + +const char *GetPacketGameTypeName(PacketGameType type) +{ + if (type >= PACKET_END) return "[invalid packet type]"; + + return _packet_game_type_names[type]; +} + /** * Create a new socket for the game connection. * @param s The socket to connect with. @@ -69,7 +128,7 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p) this->last_packet = std::chrono::steady_clock::now(); this->last_pkt_type = type; - DEBUG(net, 3, "[tcp/game] received packet type %d from client %d, %s", type, this->client_id, this->GetDebugInfo().c_str()); + DEBUG(net, 3, "[tcp/game] received packet type %d (%s) from client %d, %s", type, GetPacketGameTypeName(type), this->client_id, this->GetDebugInfo().c_str()); switch (this->HasClientQuit() ? PACKET_END : type) { case PACKET_SERVER_FULL: return this->Receive_SERVER_FULL(p); @@ -212,3 +271,9 @@ NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *p) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); } std::string NetworkGameSocketHandler::GetDebugInfo() const { return ""; } + +void NetworkGameSocketHandler::LogSentPacket(const Packet &pkt) +{ + PacketGameType type = (PacketGameType)pkt.GetPacketType(); + DEBUG(net, 3, "[tcp/game] sent packet type %d (%s) to client %d, %s", type, GetPacketGameTypeName(type), this->client_id, this->GetDebugInfo().c_str()); +} diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 4f9277cafa..da44d3eead 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -129,6 +129,8 @@ enum PacketGameType { PACKET_END, ///< Must ALWAYS be on the end of this list!! (period) }; +const char *GetPacketTypeName(PacketGameType type); + /** Packet that wraps a command */ struct CommandPacket; @@ -584,6 +586,7 @@ public: void SendCommand(Packet *p, const CommandPacket *cp); virtual std::string GetDebugInfo() const; + virtual void LogSentPacket(const Packet &pkt); }; #endif /* NETWORK_CORE_TCP_GAME_H */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 81fe1a2af3..481e59ffb1 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -1362,9 +1362,28 @@ void ClientNetworkGameSocketHandler::CheckConnection() ShowErrorMessage(STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION, STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION, WL_INFO); } +const char *ClientNetworkGameSocketHandler::GetServerStatusName(ServerStatus status) +{ + static const char* _server_status_names[] { + "INACTIVE", + "COMPANY_INFO", + "JOIN", + "NEWGRFS_CHECK", + "AUTH_GAME", + "AUTH_COMPANY", + "AUTHORIZED", + "MAP_WAIT", + "MAP", + "ACTIVE", + "CLOSING", + }; + static_assert(lengthof(_server_status_names) == STATUS_END); + return status < STATUS_END ? _server_status_names[status] : "[invalid status]"; +} + std::string ClientNetworkGameSocketHandler::GetDebugInfo() const { - return stdstr_fmt("status: %d", this->status); + return stdstr_fmt("status: %d (%s)", this->status, GetServerStatusName(this->status)); } diff --git a/src/network/network_client.h b/src/network/network_client.h index fe18c49ecc..224e521448 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -40,6 +40,8 @@ private: std::string server_desync_log; bool emergency_save_done = false; + static const char *GetServerStatusName(ServerStatus status); + protected: friend void NetworkExecuteLocalCommandQueue(); friend void NetworkClose(bool close_admins); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index eb5fa7e6bb..f9d6ac6982 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1584,9 +1584,28 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p) return NETWORK_RECV_STATUS_OKAY; } +const char *ServerNetworkGameSocketHandler::GetClientStatusName(ClientStatus status) +{ + static const char* _client_status_names[] { + "INACTIVE", + "NEWGRFS_CHECK", + "AUTH_GAME", + "AUTH_COMPANY", + "AUTHORIZED", + "MAP_WAIT", + "MAP", + "DONE_MAP", + "PRE_ACTIVE", + "ACTIVE", + "CLOSE_PENDING", + }; + static_assert(lengthof(_client_status_names) == STATUS_END); + return status < STATUS_END ? _client_status_names[status] : "[invalid status]"; +} + std::string ServerNetworkGameSocketHandler::GetDebugInfo() const { - return stdstr_fmt("status: %d", this->status); + return stdstr_fmt("status: %d (%s)", this->status, GetClientStatusName(this->status)); } /** diff --git a/src/network/network_server.h b/src/network/network_server.h index 618c0d4793..3a0c2def2e 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -66,6 +66,8 @@ public: STATUS_END, ///< Must ALWAYS be on the end of this list!! (period). }; + static const char *GetClientStatusName(ClientStatus status); + byte lag_test; ///< Byte used for lag-testing the client byte last_token; ///< The last random token we did send to verify the client is listening uint32 last_token_frame; ///< The last frame we received the right token