Index: src/network/core/tcp_admin.cpp =================================================================== --- src/network/core/tcp_admin.cpp (revision 25578) +++ src/network/core/tcp_admin.cpp (working copy) @@ -61,6 +61,7 @@ case ADMIN_PACKET_ADMIN_CHAT: return this->Receive_ADMIN_CHAT(p); case ADMIN_PACKET_ADMIN_RCON: return this->Receive_ADMIN_RCON(p); case ADMIN_PACKET_ADMIN_GAMESCRIPT: return this->Receive_ADMIN_GAMESCRIPT(p); + case ADMIN_PACKET_ADMIN_PING: return this->Receive_ADMIN_PING(p); case ADMIN_PACKET_SERVER_FULL: return this->Receive_SERVER_FULL(p); case ADMIN_PACKET_SERVER_BANNED: return this->Receive_SERVER_BANNED(p); @@ -87,6 +88,8 @@ case ADMIN_PACKET_SERVER_CONSOLE: return this->Receive_SERVER_CONSOLE(p); case ADMIN_PACKET_SERVER_CMD_NAMES: return this->Receive_SERVER_CMD_NAMES(p); case ADMIN_PACKET_SERVER_CMD_LOGGING: return this->Receive_SERVER_CMD_LOGGING(p); + case ADMIN_PACKET_SERVER_PONG: return this->Receive_SERVER_PONG(p); + case ADMIN_PACKET_SERVER_RCON_END: return this->Receive_SERVER_RCON_END(p); default: if (this->HasClientQuit()) { @@ -136,6 +139,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); } @@ -162,5 +166,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); } #endif /* ENABLE_NETWORK */ Index: src/network/core/tcp_admin.h =================================================================== --- src/network/core/tcp_admin.h (revision 25578) +++ src/network/core/tcp_admin.h (working copy) @@ -33,6 +33,7 @@ ADMIN_PACKET_ADMIN_CHAT, ///< The admin sends a chat message to be distributed. ADMIN_PACKET_ADMIN_RCON, ///< The admin sends a remote console command. ADMIN_PACKET_ADMIN_GAMESCRIPT, ///< The admin sends a JSON string for the GameScript. + ADMIN_PACKET_ADMIN_PING, ///< The admin sends a PING request. ADMIN_PACKET_SERVER_FULL = 100, ///< The server tells the admin it cannot accept the admin. ADMIN_PACKET_SERVER_BANNED, ///< The server tells the admin it is banned. @@ -60,6 +61,8 @@ ADMIN_PACKET_SERVER_CMD_NAMES, ///< The server sends out the names of the DoCommands to the admins. ADMIN_PACKET_SERVER_CMD_LOGGING, ///< The server gives the admin copies of incoming command packets. ADMIN_PACKET_SERVER_GAMESCRIPT, ///< The server gives the admin information from the GameScript in JSON. + ADMIN_PACKET_SERVER_PONG, ///< The server gives a PONG response to a PING request. + ADMIN_PACKET_SERVER_RCON_END, ///< The server indicates that the remote console command has completed. INVALID_ADMIN_PACKET = 0xFF, ///< An invalid marker for admin packets. }; Index: src/network/network_admin.cpp =================================================================== --- src/network/network_admin.cpp (revision 25578) +++ src/network/network_admin.cpp (working copy) @@ -496,6 +496,20 @@ return NETWORK_RECV_STATUS_OKAY; } +/** + * Send the reply of an rcon command. + * @param command The original command sent. + */ +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const char *command) +{ + Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON_END); + + p->Send_string(command); + this->SendPacket(p); + + return NETWORK_RECV_STATUS_OKAY; +} + NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); @@ -509,7 +523,8 @@ _redirect_console_to_admin = this->index; IConsoleCmdExec(command); _redirect_console_to_admin = INVALID_ADMIN_ID; - return NETWORK_RECV_STATUS_OKAY; + + return this->SendRconEnd(command); } NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p) @@ -620,6 +635,20 @@ return NETWORK_RECV_STATUS_OKAY; } +/** + * Send a pong response + * @param payload The payload originally sent by the client. + */ +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32 payload) +{ + Packet *p = new Packet(ADMIN_PACKET_SERVER_PONG); + + p->Send_uint32(payload); + this->SendPacket(p); + + return NETWORK_RECV_STATUS_OKAY; +} + /*********** * Receiving functions ************/ @@ -771,6 +800,15 @@ return NETWORK_RECV_STATUS_OKAY; } +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p) +{ + if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + + uint32 payload = p->Recv_uint32(); + + return this->SendPong(payload); +} + /* * Useful wrapper functions */ Index: src/network/network_admin.h =================================================================== --- src/network/network_admin.h (revision 25578) +++ src/network/network_admin.h (working copy) @@ -35,6 +35,7 @@ virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p); virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet *p); virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_PING(Packet *p); NetworkRecvStatus SendProtocol(); public: @@ -65,10 +66,12 @@ NetworkRecvStatus SendChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data); NetworkRecvStatus SendRcon(uint16 colour, const char *command); + NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const char *command) NetworkRecvStatus SendConsole(const char *origin, const char *command); NetworkRecvStatus SendGameScript(const char *json); NetworkRecvStatus SendCmdNames(); NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp); + NetworkRecvStatus SendPong(uint32 payload); static void Send(); static void AcceptConnection(SOCKET s, const NetworkAddress &address);