iw4x-client/src/Components/Modules/Node.hpp

103 lines
2.7 KiB
C++
Raw Normal View History

#define NODE_QUERY_INTERVAL 1000 * 60 * 2 // Query nodelist from nodes evry 2 minutes
#define NODE_QUERY_TIMEOUT 1000 * 30 * 1 // Invalidate nodes after 30 seconds without query response
#define NODE_INVALID_DELETE 1000 * 60 * 10 // Delete invalidated nodes after 10 minutes
#define NODE_FRAME_QUERY_LIMIT 1 // Limit of nodes to be queried per frame
#define NODE_PACKET_LIMIT 111 // Send 111 nodes per synchronization packet
#define NODE_STORE_INTERVAL 1000 * 60* 1 // Store nodes every minute
#define SESSION_TIMEOUT 1000 * 10 // 10 seconds session timeout
2016-02-06 18:48:39 -05:00
2016-01-28 10:19:43 -05:00
namespace Components
{
class Node : public Component
{
public:
Node();
~Node();
const char* GetName() { return "Node"; };
bool UnitTest();
2016-01-28 15:37:48 -05:00
static std::vector<Network::Address> GetDediList();
2016-01-28 10:19:43 -05:00
private:
enum EntryState
{
STATE_UNKNOWN,
STATE_NEGOTIATING,
2016-01-28 10:19:43 -05:00
STATE_VALID,
2016-02-01 15:59:45 -05:00
STATE_INVALID,
2016-01-28 10:19:43 -05:00
};
struct NodeEntry
{
Network::Address address;
std::string challenge;
2016-02-08 12:43:31 -05:00
Utils::Cryptography::ECDSA::Key publicKey;
2016-01-28 10:19:43 -05:00
EntryState state;
bool registered; // Do we consider this node as registered?
int lastTime; // Last time we heard anything from the server itself
int lastHeard; // Last time we heard something of the server at all (refs form other nodes)
int lastListQuery; // Last time we got the list of the node
// This is only relevant for clients
// Other nodes or dedis don't need to know if the entry is a dedi or not.
bool isDedi;
2016-01-28 10:19:43 -05:00
};
struct ClientSession
2016-01-28 10:19:43 -05:00
{
Network::Address address;
2016-01-28 15:37:48 -05:00
std::string challenge;
bool valid;
bool terminated;
2016-01-28 21:49:51 -05:00
int lastTime;
2016-01-28 10:19:43 -05:00
};
#pragma pack(push, 1)
struct AddressEntry
{
Game::netIP_t ip;
unsigned short port;
Network::Address toNetAddress()
{
Network::Address address;
address.SetIP(this->ip);
2016-01-28 19:53:17 -05:00
address.SetPort(ntohs(this->port));
2016-01-28 10:19:43 -05:00
address.SetType(Game::netadrtype_t::NA_IP);
return address;
}
void fromNetAddress(Network::Address address)
{
this->ip = address.GetIP();
2016-01-28 19:53:17 -05:00
this->port = htons(address.GetPort());
2016-01-28 10:19:43 -05:00
}
};
#pragma pack(pop)
2016-02-08 12:43:31 -05:00
static Utils::Cryptography::ECDSA::Key SignatureKey;
2016-01-28 10:19:43 -05:00
static std::vector<NodeEntry> Nodes;
static std::vector<ClientSession> Sessions;
2016-01-28 10:19:43 -05:00
static void LoadNodes();
2016-02-06 18:48:39 -05:00
static void StoreNodes(bool force);
2016-01-28 10:19:43 -05:00
static void AddNode(Network::Address address);
static void SendNodeList(Network::Address address);
static NodeEntry* FindNode(Network::Address address);
static ClientSession* FindSession(Network::Address address);
static void DeleteInvalidNodes();
static void DeleteInvalidSessions();
static void FrameHandler();
static const char* GetStateName(EntryState state);
2016-01-28 10:19:43 -05:00
};
}