summaryrefslogtreecommitdiff
path: root/node/Cluster.hpp
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2015-10-21 17:35:38 -0700
committerGrant Limberg <glimberg@gmail.com>2015-10-21 17:35:38 -0700
commit6471c1f4e26c0230b40bf0102a52493aa78236b9 (patch)
treeb8791931f4d4f6becbbab794f2a0d95d9363054d /node/Cluster.hpp
parent21ae423feb0e63cdbdd47be921e257c1d59de27a (diff)
parenta46514b397acdf42451d41398ef77eec60744256 (diff)
downloadinfinitytier-6471c1f4e26c0230b40bf0102a52493aa78236b9.tar.gz
infinitytier-6471c1f4e26c0230b40bf0102a52493aa78236b9.zip
Merge branch 'adamierymenko-dev' into windows-ui
Diffstat (limited to 'node/Cluster.hpp')
-rw-r--r--node/Cluster.hpp133
1 files changed, 67 insertions, 66 deletions
diff --git a/node/Cluster.hpp b/node/Cluster.hpp
index 016730e3..2e60fd6b 100644
--- a/node/Cluster.hpp
+++ b/node/Cluster.hpp
@@ -34,43 +34,38 @@
#include <algorithm>
#include "Constants.hpp"
+#include "../include/ZeroTierOne.h"
#include "Address.hpp"
#include "InetAddress.hpp"
#include "SHA512.hpp"
#include "Utils.hpp"
#include "Buffer.hpp"
#include "Mutex.hpp"
+#include "SharedPtr.hpp"
+#include "Hashtable.hpp"
/**
* Timeout for cluster members being considered "alive"
*/
-#define ZT_CLUSTER_TIMEOUT ZT_PEER_ACTIVITY_TIMEOUT
+#define ZT_CLUSTER_TIMEOUT 30000
/**
- * Maximum cluster message length in bytes
- *
- * Cluster nodes speak via TCP, with data encapsulated into individually
- * encrypted and authenticated messages. The maximum message size is
- * 65535 (0xffff) since the TCP stream uses 16-bit message size headers
- * (and this is a reasonable chunk size anyway).
- */
-#define ZT_CLUSTER_MAX_MESSAGE_LENGTH 65535
-
-/**
- * Maximum number of physical addresses we will cache for a cluster member
+ * How often should we announce that we have a peer?
*/
-#define ZT_CLUSTER_MEMBER_MAX_PHYSICAL_ADDRS 8
+#define ZT_CLUSTER_HAVE_PEER_ANNOUNCE_PERIOD 60000
/**
- * How frequently should doPeriodicTasks() be ideally called? (ms)
+ * Desired period between doPeriodicTasks() in milliseconds
*/
-#define ZT_CLUSTER_PERIODIC_TASK_DEADLINE 10
+#define ZT_CLUSTER_PERIODIC_TASK_PERIOD 50
namespace ZeroTier {
class RuntimeEnvironment;
class CertificateOfMembership;
class MulticastGroup;
+class Peer;
+class Identity;
/**
* Multi-homing cluster state replication and packet relaying
@@ -96,22 +91,6 @@ class Cluster
{
public:
/**
- * Which distance algorithm is this cluster using?
- */
- enum DistanceAlgorithm
- {
- /**
- * Simple linear distance in three dimensions
- */
- DISTANCE_SIMPLE = 0,
-
- /**
- * Haversine formula using X,Y as lat,long and ignoring Z
- */
- DISTANCE_HAVERSINE = 1
- };
-
- /**
* State message types
*/
enum StateMessageType
@@ -184,25 +163,18 @@ public:
/**
* Construct a new cluster
- *
- * @param renv Runtime environment
- * @param id This member's ID in the cluster
- * @param da Distance algorithm this cluster uses to compute distance and hand off peers
- * @param x My X
- * @param y My Y
- * @param z My Z
- * @param sendFunction Function to call to send messages to other cluster members
- * @param arg First argument to sendFunction
*/
Cluster(
const RuntimeEnvironment *renv,
uint16_t id,
- DistanceAlgorithm da,
+ const std::vector<InetAddress> &zeroTierPhysicalEndpoints,
int32_t x,
int32_t y,
int32_t z,
- void (*sendFunction)(void *,uint16_t,const void *,unsigned int),
- void *arg);
+ void (*sendFunction)(void *,unsigned int,const void *,unsigned int),
+ void *sendFunctionArg,
+ int (*addressToLocationFunction)(void *,const struct sockaddr_storage *,int *,int *,int *),
+ void *addressToLocationFunctionArg);
~Cluster();
@@ -220,11 +192,22 @@ public:
void handleIncomingStateMessage(const void *msg,unsigned int len);
/**
+ * Send this packet via another node in this cluster if another node has this peer
+ *
+ * @param fromPeerAddress Source peer address (if known, should be NULL for fragments)
+ * @param toPeerAddress Destination peer address
+ * @param data Packet or packet fragment data
+ * @param len Length of packet or fragment
+ * @return True if this data was sent via another cluster member, false if none have this peer
+ */
+ bool sendViaCluster(const Address &fromPeerAddress,const Address &toPeerAddress,const void *data,unsigned int len);
+
+ /**
* Advertise to the cluster that we have this peer
*
- * @param peerAddress Peer address that we have
+ * @param peerId Identity of peer that we have
*/
- void replicateHavePeer(const Address &peerAddress);
+ void replicateHavePeer(const Identity &peerId);
/**
* Advertise a multicast LIKE to the cluster
@@ -243,7 +226,7 @@ public:
void replicateCertificateOfNetworkMembership(const CertificateOfMembership &com);
/**
- * Call every ~ZT_CLUSTER_PERIODIC_TASK_DEADLINE milliseconds.
+ * Call every ~ZT_CLUSTER_PERIODIC_TASK_PERIOD milliseconds.
*/
void doPeriodicTasks();
@@ -254,52 +237,70 @@ public:
*/
void addMember(uint16_t memberId);
+ /**
+ * Remove a member ID from this cluster
+ *
+ * @param memberId Member ID to remove
+ */
+ void removeMember(uint16_t memberId);
+
+ /**
+ * Redirect this peer to a better cluster member if needed
+ *
+ * @param peerAddress Peer to (possibly) redirect
+ * @param peerPhysicalAddress Physical address of peer's current best path (where packet was most recently received or getBestPath()->address())
+ * @param offload Always redirect if possible -- can be used to offload peers during shutdown
+ * @return True if peer was redirected
+ */
+ bool redirectPeer(const Address &peerAddress,const InetAddress &peerPhysicalAddress,bool offload);
+
private:
- void _send(uint16_t memberId,const void *msg,unsigned int len);
+ void _send(uint16_t memberId,StateMessageType type,const void *msg,unsigned int len);
void _flush(uint16_t memberId);
// These are initialized in the constructor and remain static
uint16_t _masterSecret[ZT_SHA512_DIGEST_LEN / sizeof(uint16_t)];
unsigned char _key[ZT_PEER_SECRET_KEY_LENGTH];
const RuntimeEnvironment *RR;
- void (*_sendFunction)(void *,uint16_t,const void *,unsigned int);
- void *_arg;
+ void (*_sendFunction)(void *,unsigned int,const void *,unsigned int);
+ void *_sendFunctionArg;
+ int (*_addressToLocationFunction)(void *,const struct sockaddr_storage *,int *,int *,int *);
+ void *_addressToLocationFunctionArg;
const int32_t _x;
const int32_t _y;
const int32_t _z;
- const DistanceAlgorithm _da;
const uint16_t _id;
+ const std::vector<InetAddress> _zeroTierPhysicalEndpoints;
struct _Member
{
unsigned char key[ZT_PEER_SECRET_KEY_LENGTH];
- uint64_t lastReceivedFrom;
uint64_t lastReceivedAliveAnnouncement;
- uint64_t lastSentTo;
uint64_t lastAnnouncedAliveTo;
uint64_t load;
int32_t x,y,z;
- InetAddress physicalAddresses[ZT_CLUSTER_MEMBER_MAX_PHYSICAL_ADDRS];
- unsigned int physicalAddressCount;
+ std::vector<InetAddress> zeroTierPhysicalEndpoints;
Buffer<ZT_CLUSTER_MAX_MESSAGE_LENGTH> q;
Mutex lock;
- _Member() :
- lastReceivedFrom(0),
- lastReceivedAliveAnnouncement(0),
- lastSentTo(0),
- lastAnnouncedAliveTo(0),
- load(0),
- x(0),
- y(0),
- z(0),
- physicalAddressCount(0) {}
-
+ inline void clear()
+ {
+ lastReceivedAliveAnnouncement = 0;
+ lastAnnouncedAliveTo = 0;
+ load = 0;
+ x = 0;
+ y = 0;
+ z = 0;
+ zeroTierPhysicalEndpoints.clear();
+ q.clear();
+ }
+
+ _Member() { this->clear(); }
~_Member() { Utils::burn(key,sizeof(key)); }
};
@@ -308,7 +309,7 @@ private:
std::vector<uint16_t> _memberIds;
Mutex _memberIds_m;
- // Record tracking which members have which peers and how recently they claimed this
+ // Record tracking which members have which peers and how recently they claimed this -- also used to track our last claimed time
struct _PeerAffinity
{
_PeerAffinity(const Address &a,uint16_t mid,uint64_t ts) :