Browse Source

Almost all of GitHub issue #180

Adam Ierymenko 10 years ago
parent
commit
fad9dff2db
4 changed files with 26 additions and 1 deletions
  1. 6 0
      node/IncomingPacket.cpp
  2. 1 0
      node/IncomingPacket.hpp
  3. 10 0
      node/Node.hpp
  4. 9 1
      node/Switch.cpp

+ 6 - 0
node/IncomingPacket.cpp

@@ -84,6 +84,7 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR)
 				case Packet::VERB_NETWORK_CONFIG_REFRESH:         return _doNETWORK_CONFIG_REFRESH(RR,peer);
 				case Packet::VERB_NETWORK_CONFIG_REFRESH:         return _doNETWORK_CONFIG_REFRESH(RR,peer);
 				case Packet::VERB_MULTICAST_GATHER:               return _doMULTICAST_GATHER(RR,peer);
 				case Packet::VERB_MULTICAST_GATHER:               return _doMULTICAST_GATHER(RR,peer);
 				case Packet::VERB_MULTICAST_FRAME:                return _doMULTICAST_FRAME(RR,peer);
 				case Packet::VERB_MULTICAST_FRAME:                return _doMULTICAST_FRAME(RR,peer);
+				case Packet::VERB_PUSH_DIRECT_PATHS:              return _doPUSH_DIRECT_PATHS(RR,peer);
 			}
 			}
 		} else {
 		} else {
 			RR->sw->requestWhois(source());
 			RR->sw->requestWhois(source());
@@ -882,6 +883,11 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,const Share
 	return true;
 	return true;
 }
 }
 
 
+bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer)
+{
+	return true;
+}
+
 void IncomingPacket::_sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid)
 void IncomingPacket::_sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid)
 {
 {
 	Packet outp(source(),RR->identity.address(),Packet::VERB_ERROR);
 	Packet outp(source(),RR->identity.address(),Packet::VERB_ERROR);

+ 1 - 0
node/IncomingPacket.hpp

@@ -121,6 +121,7 @@ private:
 	bool _doNETWORK_CONFIG_REFRESH(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 	bool _doNETWORK_CONFIG_REFRESH(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 	bool _doMULTICAST_GATHER(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 	bool _doMULTICAST_GATHER(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 	bool _doMULTICAST_FRAME(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 	bool _doMULTICAST_FRAME(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
+	bool _doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
 
 
 	// Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join
 	// Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join
 	void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);
 	void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);

+ 10 - 0
node/Node.hpp

@@ -43,6 +43,7 @@
 #include "Mutex.hpp"
 #include "Mutex.hpp"
 #include "MAC.hpp"
 #include "MAC.hpp"
 #include "Network.hpp"
 #include "Network.hpp"
+#include "Path.hpp"
 
 
 #undef TRACE
 #undef TRACE
 #ifdef ZT_TRACE
 #ifdef ZT_TRACE
@@ -171,6 +172,12 @@ public:
 		return nw;
 		return nw;
 	}
 	}
 
 
+	inline std::vector<Path> directPaths() const
+	{
+		Mutex::Lock _l(_directPaths_m);
+		return _directPaths;
+	}
+
 	inline bool dataStorePut(const char *name,const void *data,unsigned int len,bool secure) { return (_dataStorePutFunction(reinterpret_cast<ZT1_Node *>(this),_uPtr,name,data,len,(int)secure) == 0); }
 	inline bool dataStorePut(const char *name,const void *data,unsigned int len,bool secure) { return (_dataStorePutFunction(reinterpret_cast<ZT1_Node *>(this),_uPtr,name,data,len,(int)secure) == 0); }
 	inline bool dataStorePut(const char *name,const std::string &data,bool secure) { return dataStorePut(name,(const void *)data.data(),(unsigned int)data.length(),secure); }
 	inline bool dataStorePut(const char *name,const std::string &data,bool secure) { return dataStorePut(name,(const void *)data.data(),(unsigned int)data.length(),secure); }
 	inline void dataStoreDelete(const char *name) { _dataStorePutFunction(reinterpret_cast<ZT1_Node *>(this),_uPtr,name,(const void *)0,0,0); }
 	inline void dataStoreDelete(const char *name) { _dataStorePutFunction(reinterpret_cast<ZT1_Node *>(this),_uPtr,name,(const void *)0,0,0); }
@@ -236,6 +243,9 @@ private:
 	std::vector< std::pair< uint64_t, SharedPtr<Network> > > _networks;
 	std::vector< std::pair< uint64_t, SharedPtr<Network> > > _networks;
 	Mutex _networks_m;
 	Mutex _networks_m;
 
 
+	std::vector<Path> _directPaths;
+	Mutex _directPaths_m;
+
 	Mutex _backgroundTasksLock;
 	Mutex _backgroundTasksLock;
 
 
 	uint64_t _now;
 	uint64_t _now;

+ 9 - 1
node/Switch.cpp

@@ -733,10 +733,16 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
 	if (peer) {
 	if (peer) {
 		const uint64_t now = RR->node->now();
 		const uint64_t now = RR->node->now();
 
 
+		if (nwid) {
+			// If this packet has an associated network, give the peer additional hints for direct connectivity
+			peer->pushDirectPaths(RR,RR->node->directPaths(),now,false);
+		}
+
 		RemotePath *viaPath = peer->getBestPath(now);
 		RemotePath *viaPath = peer->getBestPath(now);
 		if (!viaPath) {
 		if (!viaPath) {
 			SharedPtr<Peer> relay;
 			SharedPtr<Peer> relay;
 
 
+			// See if this network has a preferred relay (if packet has an associated network)
 			if (nwid) {
 			if (nwid) {
 				SharedPtr<Network> network(RR->node->network(nwid));
 				SharedPtr<Network> network(RR->node->network(nwid));
 				if (network) {
 				if (network) {
@@ -754,6 +760,7 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
 				}
 				}
 			}
 			}
 
 
+			// Otherwise relay off a root server
 			if (!relay)
 			if (!relay)
 				relay = RR->topology->getBestRoot();
 				relay = RR->topology->getBestRoot();
 
 
@@ -770,7 +777,7 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
 
 
 		if (viaPath->send(RR,tmp.data(),chunkSize,now)) {
 		if (viaPath->send(RR,tmp.data(),chunkSize,now)) {
 			if (chunkSize < tmp.size()) {
 			if (chunkSize < tmp.size()) {
-				// Too big for one bite, fragment the rest
+				// Too big for one packet, fragment the rest
 				unsigned int fragStart = chunkSize;
 				unsigned int fragStart = chunkSize;
 				unsigned int remaining = tmp.size() - chunkSize;
 				unsigned int remaining = tmp.size() - chunkSize;
 				unsigned int fragsRemaining = (remaining / (ZT_UDP_DEFAULT_PAYLOAD_MTU - ZT_PROTO_MIN_FRAGMENT_LENGTH));
 				unsigned int fragsRemaining = (remaining / (ZT_UDP_DEFAULT_PAYLOAD_MTU - ZT_PROTO_MIN_FRAGMENT_LENGTH));
@@ -786,6 +793,7 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
 					remaining -= chunkSize;
 					remaining -= chunkSize;
 				}
 				}
 			}
 			}
+
 			return true;
 			return true;
 		}
 		}
 	} else {
 	} else {