Browse Source

Some cleanup, and use VERB_PUSH_DIRECT_PATHS to redirect newer peers.

Adam Ierymenko 9 years ago
parent
commit
9617208e40
3 changed files with 36 additions and 19 deletions
  1. 1 1
      node/IncomingPacket.cpp
  2. 0 3
      node/Packet.hpp
  3. 35 15
      node/Peer.cpp

+ 1 - 1
node/IncomingPacket.cpp

@@ -280,8 +280,8 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR)
 
 		// VALID -- if we made it here, packet passed identity and authenticity checks!
 
-		peer->received(RR,_localAddress,_remoteAddress,hops(),pid,Packet::VERB_HELLO,0,Packet::VERB_NOP);
 		peer->setRemoteVersion(protoVersion,vMajor,vMinor,vRevision);
+		peer->received(RR,_localAddress,_remoteAddress,hops(),pid,Packet::VERB_HELLO,0,Packet::VERB_NOP);
 
 		if (destAddr)
 			RR->sa->iam(id.address(),_remoteAddress,destAddr,RR->topology->isRoot(id),RR->node->now());

+ 0 - 3
node/Packet.hpp

@@ -924,9 +924,6 @@ public:
 		 *   0x04 - Disable encryption (trust: privacy)
 		 *   0x08 - Disable encryption and authentication (trust: ultimate)
 		 *
-		 * Address types and addresses are of the same format as the destination
-		 * address type and address in HELLO.
-		 *
 		 * The receiver may, upon receiving a push, attempt to establish a
 		 * direct link to one or more of the indicated addresses. It is the
 		 * responsibility of the sender to limit which peers it pushes direct

+ 35 - 15
node/Peer.cpp

@@ -85,23 +85,43 @@ void Peer::received(
 	bool redirected = false;
 	if ((RR->cluster)&&(hops == 0)&&(verb != Packet::VERB_OK)&&(verb != Packet::VERB_ERROR)&&(verb != Packet::VERB_RENDEZVOUS)&&(verb != Packet::VERB_PUSH_DIRECT_PATHS)) {
 		InetAddress redirectTo(RR->cluster->findBetterEndpoint(_id.address(),remoteAddr,false));
-		if (redirectTo) {
-			// For older peers we send RENDEZVOUS with ourselves. This will only work if we are
-			// a root server.
-			Packet outp(_id.address(),RR->identity.address(),Packet::VERB_RENDEZVOUS);
-			outp.append((uint8_t)0); // no flags
-			RR->identity.address().appendTo(outp);
-			outp.append((uint16_t)redirectTo.port());
-			if (redirectTo.ss_family == AF_INET) {
-				outp.append((uint8_t)4);
-				outp.append(redirectTo.rawIpData(),4);
+		if ((redirectTo.ss_family == AF_INET)||(redirectTo.ss_family == AF_INET6)) {
+			if (_vProto >= 5) {
+				// For newer peers we can send a more idiomatic verb: PUSH_DIRECT_PATHS.
+				Packet outp(_id.address(),RR->identity.address(),Packet::VERB_PUSH_DIRECT_PATHS);
+				outp.append((uint16_t)1); // count == 1
+				outp.append((uint8_t)0); // no flags
+				outp.append((uint16_t)0); // no extensions
+				if (redirectTo.ss_family == AF_INET) {
+					outp.append((uint8_t)4);
+					outp.append((uint8_t)6);
+					outp.append(redirectTo.rawIpData(),4);
+				} else {
+					outp.append((uint8_t)6);
+					outp.append((uint8_t)18);
+					outp.append(redirectTo.rawIpData(),16);
+				}
+				outp.append((uint16_t)redirectTo.port());
+				outp.armor(_key,true);
+				RR->antiRec->logOutgoingZT(outp.data(),outp.size());
+				RR->node->putPacket(localAddr,remoteAddr,outp.data(),outp.size());
 			} else {
-				outp.append((uint8_t)16);
-				outp.append(redirectTo.rawIpData(),16);
+				// For older peers we use RENDEZVOUS to coax them into contacting us elsewhere.
+				Packet outp(_id.address(),RR->identity.address(),Packet::VERB_RENDEZVOUS);
+				outp.append((uint8_t)0); // no flags
+				RR->identity.address().appendTo(outp);
+				outp.append((uint16_t)redirectTo.port());
+				if (redirectTo.ss_family == AF_INET) {
+					outp.append((uint8_t)4);
+					outp.append(redirectTo.rawIpData(),4);
+				} else {
+					outp.append((uint8_t)16);
+					outp.append(redirectTo.rawIpData(),16);
+				}
+				outp.armor(_key,true);
+				RR->antiRec->logOutgoingZT(outp.data(),outp.size());
+				RR->node->putPacket(localAddr,remoteAddr,outp.data(),outp.size());
 			}
-			outp.armor(_key,true);
-			RR->antiRec->logOutgoingZT(outp.data(),outp.size());
-			RR->node->putPacket(localAddr,remoteAddr,outp.data(),outp.size());
 			redirected = true;
 		}
 	}