|
@@ -44,6 +44,7 @@
|
|
|
#include "Packet.hpp"
|
|
|
#include "Switch.hpp"
|
|
|
#include "Node.hpp"
|
|
|
+#include "Network.hpp"
|
|
|
#include "Array.hpp"
|
|
|
|
|
|
namespace ZeroTier {
|
|
@@ -469,6 +470,15 @@ void Cluster::handleIncomingStateMessage(const void *msg,unsigned int len)
|
|
|
RR->sw->send(outp,true);
|
|
|
//TRACE("[%u] proxy send %s to %s length %u",(unsigned int)fromMemberId,Packet::verbString(verb),rcpt.toString().c_str(),len);
|
|
|
} break;
|
|
|
+
|
|
|
+ case CLUSTER_MESSAGE_NETWORK_CONFIG: {
|
|
|
+ const SharedPtr<Network> network(RR->node->network(dmsg.at<uint64_t>(ptr)));
|
|
|
+ if (network) {
|
|
|
+ // Copy into a Packet just to conform to Network API. Eventually
|
|
|
+ // will want to refactor.
|
|
|
+ network->handleConfigChunk(Packet(dmsg),ptr);
|
|
|
+ }
|
|
|
+ } break;
|
|
|
}
|
|
|
} catch ( ... ) {
|
|
|
TRACE("invalid message of size %u type %d (inner decode), discarding",mlen,mtype);
|
|
@@ -494,6 +504,15 @@ void Cluster::broadcastHavePeer(const Identity &id)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Cluster::broadcastNetworkConfigChunk(const void *chunk,unsigned int len)
|
|
|
+{
|
|
|
+ Mutex::Lock _l(_memberIds_m);
|
|
|
+ for(std::vector<uint16_t>::const_iterator mid(_memberIds.begin());mid!=_memberIds.end();++mid) {
|
|
|
+ Mutex::Lock _l2(_members[*mid].lock);
|
|
|
+ _send(*mid,CLUSTER_MESSAGE_NETWORK_CONFIG,chunk,len);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void Cluster::sendViaCluster(const Address &fromPeerAddress,const Address &toPeerAddress,const void *data,unsigned int len,bool unite)
|
|
|
{
|
|
|
if (len > ZT_PROTO_MAX_PACKET_LENGTH) // sanity check
|