From 197542c7ec19b41e865be1e84c6c6898de8514d1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 26 Nov 2012 09:49:07 +0200 Subject: New PROTOCOL_VERSION scheme (allow client to support a range of versions) --- src/server.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index ac243a29c..f4da73fa5 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2037,11 +2037,22 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) Read and check network protocol version */ - u16 net_proto_version = 0; + u16 min_net_proto_version = 0; if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2) - { - net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]); - } + min_net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]); + + // Use min if version field doesn't exist (backwards compatibility) + u16 max_net_proto_version = min_net_proto_version; + if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2+2) + max_net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2]); + + u16 net_proto_version = max_net_proto_version; + if(max_net_proto_version != SERVER_PROTOCOL_VERSION && min_net_proto_version <= SERVER_PROTOCOL_VERSION) + net_proto_version = SERVER_PROTOCOL_VERSION; + + verbosestream<<"Server: "<net_proto_version = net_proto_version; @@ -2059,7 +2070,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) if(g_settings->getBool("strict_protocol_version_checking")) { - if(net_proto_version != PROTOCOL_VERSION) + if(net_proto_version != SERVER_PROTOCOL_VERSION) { actionstream<<"Server: A mismatched client tried to connect" <<" from "<net_proto_version < PROTOCOL_VERSION) + if(getClient(peer_id)->net_proto_version < SERVER_PROTOCOL_VERSION) { SendChatMessage(peer_id, L"# Server: WARNING: YOUR CLIENT IS OLD AND MAY WORK PROPERLY WITH THIS SERVER!"); } -- cgit v1.2.3