| 
					
				 | 
			
			
				@@ -468,7 +468,7 @@ static const config_var_t testing_tor_network_defaults[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(V3AuthVotingInterval,        INTERVAL, "5 minutes"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(V3AuthVoteDelay,             INTERVAL, "20 seconds"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(V3AuthDistDelay,             INTERVAL, "20 seconds"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  V(TestingV3AuthInitialVotingInterval, INTERVAL, "150 seconds"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   V(TestingV3AuthVotingStartOffset, INTERVAL, "0"), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3397,19 +3397,68 @@ options_validate(or_options_t *old_options, or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       options->V3AuthVotingInterval/2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           "V3AuthVotingInterval"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    This doesn't work, but it seems like it should: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     what code is preventing the interval being less than twice the lead-up? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (options->TestingTorNetwork) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          options->V3AuthVotingInterval) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               "V3AuthVotingInterval"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        COMPLAIN("V3AuthVoteDelay plus V3AuthDistDelay is more than half " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 "V3AuthVotingInterval. This may lead to " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 "consensus instability, particularly if clocks drift."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "V3AuthVotingInterval"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (options->TestingTorNetwork) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS_TESTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        REJECT("V3AuthVoteDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        COMPLAIN("V3AuthVoteDelay is very low. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 "This may lead to failure to vote for a consensus."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      REJECT("V3AuthVoteDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (options->V3AuthDistDelay < MIN_DIST_SECONDS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (options->TestingTorNetwork) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (options->V3AuthDistDelay < MIN_DIST_SECONDS_TESTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        REJECT("V3AuthDistDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        COMPLAIN("V3AuthDistDelay is very low. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 "This may lead to missing votes in a consensus."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      REJECT("V3AuthDistDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    REJECT("V3AuthVoteDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (options->V3AuthDistDelay < MIN_DIST_SECONDS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    REJECT("V3AuthDistDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->V3AuthNIntervalsValid < 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("V3AuthNIntervalsValid must be at least 2."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    REJECT("V3AuthVotingInterval is insanely low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (options->TestingTorNetwork) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL_TESTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        REJECT("V3AuthVotingInterval is insanely low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        COMPLAIN("V3AuthVotingInterval is very low. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 "This may lead to failure to synchronise for a consensus."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      REJECT("V3AuthVotingInterval is insanely low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else if (options->V3AuthVotingInterval > 24*60*60) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("V3AuthVotingInterval is insanely high."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3484,26 +3533,27 @@ options_validate(or_options_t *old_options, or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   CHECK_DEFAULT(TestingCertMaxDownloadTries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #undef CHECK_DEFAULT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (options->TestingV3AuthInitialVotingInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      < MIN_VOTE_INTERVAL_TESTING_INITIAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthInitialVotingInterval is insanely low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "30 minutes."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS_TESTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthInitialVoteDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS_TESTING) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthInitialDistDelay is way too low."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->TestingV3AuthInitialVoteDelay + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       options->TestingV3AuthInitialDistDelay >= 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      options->TestingV3AuthInitialVotingInterval/2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      options->TestingV3AuthInitialVotingInterval) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           "must be less than half TestingV3AuthInitialVotingInterval"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           "must be less than TestingV3AuthInitialVotingInterval"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->TestingV3AuthVotingStartOffset > 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3511,6 +3561,8 @@ options_validate(or_options_t *old_options, or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           options->V3AuthVotingInterval)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     REJECT("TestingV3AuthVotingStartOffset is higher than the voting " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "interval."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else if (options->TestingV3AuthVotingStartOffset < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    REJECT("TestingV3AuthVotingStartOffset must be non-negative."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (options->TestingAuthDirTimeToLearnReachability < 0) { 
			 |