From e3b1fc2ac060408b1c0ec61aa3215bc03ef18848 Mon Sep 17 00:00:00 2001
From: Adam Ierymenko <adam.ierymenko@gmail.com>
Date: Fri, 10 Mar 2017 19:52:08 -0800
Subject: [PATCH] Tweak WHOIS path for federation.

---
 node/Constants.hpp | 7 ++++++-
 node/Peer.hpp      | 2 +-
 node/Switch.cpp    | 4 ++--
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/node/Constants.hpp b/node/Constants.hpp
index 3bda3805b..c2961f122 100644
--- a/node/Constants.hpp
+++ b/node/Constants.hpp
@@ -202,7 +202,7 @@
 /**
  * Maximum identity WHOIS retries (each attempt tries consulting a different peer)
  */
-#define ZT_MAX_WHOIS_RETRIES 3
+#define ZT_MAX_WHOIS_RETRIES 4
 
 /**
  * Transmit queue entry timeout
@@ -390,6 +390,11 @@
  */
 #define ZT_PEER_CREDEITIALS_CUTOFF_LIMIT 15
 
+/**
+ * WHOIS rate limit (we allow these to be pretty fast)
+ */
+#define ZT_PEER_WHOIS_RATE_LIMIT 50
+
 /**
  * General rate limit for other kinds of rate-limited packets (HELLO, credential request, etc.) both inbound and outbound
  */
diff --git a/node/Peer.hpp b/node/Peer.hpp
index 783f48b8f..72040b1d0 100644
--- a/node/Peer.hpp
+++ b/node/Peer.hpp
@@ -370,7 +370,7 @@ public:
 	 */
 	inline bool rateGateInboundWhoisRequest(const uint64_t now)
 	{
-		if ((now - _lastWhoisRequestReceived) >= ZT_PEER_GENERAL_RATE_LIMIT) {
+		if ((now - _lastWhoisRequestReceived) >= ZT_PEER_WHOIS_RATE_LIMIT) {
 			_lastWhoisRequestReceived = now;
 			return true;
 		}
diff --git a/node/Switch.cpp b/node/Switch.cpp
index 0392aec10..85103aa59 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -688,9 +688,9 @@ unsigned long Switch::doTimerTasks(uint64_t now)
 					_outstandingWhoisRequests.erase(*a);
 				} else {
 					r->lastSent = now;
-					r->peersConsulted[r->retries] = _sendWhoisRequest(*a,r->peersConsulted,r->retries);
-					++r->retries;
+					r->peersConsulted[r->retries] = _sendWhoisRequest(*a,r->peersConsulted,(r->retries > 1) ? r->retries : 0);
 					TRACE("WHOIS %s (retry %u)",a->toString().c_str(),r->retries);
+					++r->retries;
 					nextDelay = std::min(nextDelay,(unsigned long)ZT_WHOIS_RETRY_DELAY);
 				}
 			} else {