cyphesis/metaserverapi/MetaServerProtocol.hpp
Sean Ryan 88773d1e99 Install MetaServerAPI 1:0:0 and integrate.
Use of just MSP for packet wrangling, and then
using current form of commserver transport.  Also
added server attribute section to config.
2013-05-30 16:31:20 -04:00

273 lines
7.7 KiB
C++

/**
Worldforge Next Generation MetaServer
Copyright (C) 2011 Sean Ryan <sryan@evercrack.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/**
* Assumptions:
* 1) Any errors, or misbehaviour of any kind will be ignored / dropped
*
* NMT_NULL
* Description: empty packet
* Type Size: 4 bytes
* Value: 0
* Payload Size: 0
*
* NMT_SERVERKEEPALIVE
* Description: A game server keep-alive packet, part 1 of a 3-packet handshake
* Type Size: 4 bytes
* Value: 1 ( 00 00 00 01 )
* Payload Size: 0
*
* NMT_HANDSHAKE
* Description: The metaserver response to a SERVERKEEPALIVE or CLIENTKEEPALIVE, part 2 of 3-packet handshake
* Contains a random number.
* Type Size: 4 bytes
* Value: 3 ( 00 00 00 03 )
* Payload Size: 4 bytes ( a random int )
*
* NMT_SERVERSHAKE
* Description: The game server response to a HANDSHAKE, part 3 of 3-packet handshake.
* Triggers a new game server sesssion to be created, or updated.
* Type Size: 4 bytes
* Value: 4 ( 00 00 00 04 )
* Payload Size: 4 bytes ( random int )
*
* NMT_CLIENTKEEPALIVE
* Description: The game client keep-alive packet, part 1 of 3-packet handshake
* Type Size: 4 bytes
* Value: 2 ( 00 00 00 02 )
* Payload Size: 0
*
* NMT_CLIENTSHAKE
* Description: The game client response to a HANDSHAKE, part 3 of a 3-packet handshake
* Type Size: 4 bytes
* Value: 5 ( 00 00 00 05 )
* Payload Size: 4 bytes ( random int )
*
* NMT_LISTREQ
* Description: A client request to give a list of servers
* Type Size: 4 bytes
* Value: 7 ( 00 00 00 07 )
* Payload Size: 4 bytes ( int of the offset )
*
* NMT_LISTRESP
* Description: The metaserver response with the values of IPs.
* Type Size: 4 bytes
* Value: 8 ( 00 00 00 08 )
* Payload Size: Variable
* 4 bytes - int total servers sent
* 4 bytes - int packed servers sent
* 4 bytes - a 4 byte block representing EACH IP of the servers. So if packed was set to 6,
* this block would be 24 bytes long.
*
* NMT_DNSREQ
* Description: Non-authenticated query in order find the queried server
* Type Size: 4 bytes
* Value: 32 ( 00 00 00 32 )
* Payload Size: Variable
* 4 bytes - int size of the string
* n bytes - 4 bytes per n
*
* Note: response to this is going to be a dnsresp, almost identical to listresp.
*
* NMT_DNSRESP
* Description: packed response to a dnsreq
* Type Size: 4 bytes
* Value: 33 ( 00 00 00 33 )
* Payload Size: Variable
* 4 bytes - total server sent
* 4 bytes - packed server sent
* 4 bytes - length of string, one for each packed server, so 3 servers, has 12 (4*3)
* int bytes
* n bytes - entire concatenated msg that will be sum of the size of all packed server
* lengths
*
* E.g: 33 05 05 06 04 07 07 04 foobarwaka1.2.3.4a.b.c.dtest
*
* 33 (4) - for packet type
* 05 (4) - int total server count
* 05 (4) - int packed server count
* 06 (4) - length of resp 1
* 04 (4) - length 0f resp 2
* 07 (4) - length of resp 3
* 07 (4) - length of resp 4
* 04 (4) - length of resp 5
* foo(28) - message
* (6) foobar - server 1
* (4) waka - server 2
* (7) 1.2.3.4 - server 3
* (7) a.b.c.d - server 4
* (4) test - server 5
* Total: 32 + 28 == 60 bytes ( plus about 12 bytes overhead )
*
* Reasonably likely to fit 10 responses or so per packet, it's a bit heavier that the listresp
* because it's parsing IPs as strings ... so rather than 1.2.3.4 becoming 4 bytes, it's now
* 7 ... and 123.123.123.123 is 15 bytes, instead of 4.
*
*Example Use Cases:
*
* Use Case 1: Server Registration or Keep-alive. Only servers with sessions can perform additional
* requests, such as attribute registration/removal.
* 1) Game Server sends a NMT_SERVERKEEPALIVE
* 2) MS responds with a NMT_HANDSHAKE, contains a random number, creates a handshake
* 3) Game Server responds with NMT_SERVERSHAKE, contains same random number AND handshake exists,
* creates session ( if session exists, expiry time is adjusted )
*
* Use Case 2: Game Server Shutdown / Quit
* 1) Game Server sends a NMT_TERMINATE, if session exists, it is removed.
*
* Use Case 3: Client Registration or Keep-alive. Only clients with sessions can perform additional
* requests, such as LIST, FILTER, etc.
* 1) Game Client sends a NMT_CLIENTKEEPALIVE
* 2) MS responds with a NMT_HANDSHAKE, contains random number, creates a handshake
* 3) Game Client responds with NMT_CLIENTSHAKE, contains same random number AND handshake exists,
* creates a client session ( if session exists, expiry time is adjusted ).
*/
#ifndef METASERVERPROTOCOL_HPP_
#define METASERVERPROTOCOL_HPP_
#include <cstdint> // uint32_t
typedef uint32_t NetMsgType;
/*
* Original metaserver protocol
*/
const NetMsgType NMT_NULL = 0;
const NetMsgType NMT_SERVERKEEPALIVE = 1;
const NetMsgType NMT_CLIENTKEEPALIVE = 2;
const NetMsgType NMT_HANDSHAKE = 3;
const NetMsgType NMT_SERVERSHAKE = 4;
const NetMsgType NMT_CLIENTSHAKE = 5;
const NetMsgType NMT_TERMINATE = 6;
const NetMsgType NMT_LISTREQ = 7;
const NetMsgType NMT_LISTRESP = 8;
const NetMsgType NMT_PROTO_ERANGE = 9;
const NetMsgType NMT_LAST = 10;
/**
* Enhancements of the metaserver-ng
*/
const NetMsgType NMT_SERVERATTR = 11;
const NetMsgType NMT_CLIENTATTR = 12;
const NetMsgType NMT_CLIENTFILTER = 13;
const NetMsgType NMT_ATTRRESP = 14;
const NetMsgType NMT_SERVERCLEAR = 15;
const NetMsgType NMT_CLIENTCLEAR = 16;
/*
* Monitor Controls
*
* Intended as a read-only peek at the internals
* of the metaserver
*
* 0 VERSION
* 1 APIVERSION
* 2 PACKETS
* 3 STARTED
* 4 SERVERS
* 5 CLIENTS
* 6 MAXSERVERS
*
*/
const NetMsgType NMT_MONITOR = 21;
/*
* Administrator Controls
*
* Intended to provide the ability to affect the
* data inside the metaserver
*
* @TODO thing about whether we want just yes/no type responses from
* admin packets
*/
const NetMsgType NMT_ADMIN = 25;
/*
* DNS Hooks
*/
const NetMsgType NMT_DNSREQ = 32;
const NetMsgType NMT_DNSRESP = 33;
/*
* DNS Query Types
*
* Leaves options for future expansion by type.
*
* Future considerations to:
*
* TXT
* AXFR
*/
const NetMsgType DNS_TYPE_ALL = 0;
const NetMsgType DNS_TYPE_A = 1;
const NetMsgType DNS_TYPE_PTR = 2;
/*
* Convenience Printing
*/
const char DNS_PRETTY[][30] = {
"DNS_TYPE_ALL",
"DNS_TYPE_A",
"DNS_TYPE_PTR"
};
/**
* Convenience Printing
*/
const char NMT_PRETTY[][30] = {
"NMT_NULL",
"NMT_SERVERKEEPALIVE",
"NMT_CLIENTKEEPALIVE",
"NMT_HANDSHAKE",
"NMT_SERVERSHAKE",
"NMT_CLIENTSHAKE",
"NMT_TERMINATE",
"NMT_LISTREQ",
"NMT_LISTRESP",
"NMT_PROTO_ERANGE",
"NMT_LAST",
"NMT_SERVERATTR",
"NMT_CLIENTATTR",
"NMT_CLIENTFILTER",
"NMT_ATTRRESP",
"NMT_SERVERCLEAR",
"NMT_CLIENTCLEAR",
"RESERVED17",
"RESERVED18",
"RESERVED19",
"RESERVED20",
"RESERVED21",
"RESERVED22",
"RESERVED23",
"RESERVED24",
"RESERVED25",
"RESERVED26",
"RESERVED27",
"RESERVED28",
"RESERVED29",
"RESERVED30",
"RESERVED31",
"NMT_DNSREQ",
"NMT_DNSRESP"
};
#endif /* METASERVERPROTOCOL_HPP_ */