summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-06-14 16:01:29 +0000
committerNick Mathewson <nickm@torproject.org>2008-06-14 16:01:29 +0000
commit0831cc3dbcb89fc356c69ced54374aaebbb4fd39 (patch)
treeddaef3136993718975581cb0dbaeb95307c0c72f /src
parent97c06691b9f4a30db21fcba41c17b95e268b24a0 (diff)
downloadtor-0831cc3dbcb89fc356c69ced54374aaebbb4fd39.tar.gz
tor-0831cc3dbcb89fc356c69ced54374aaebbb4fd39.zip
Patch from Karsten to implement proposal 135 ("Testing Tor Networks").
svn:r15253
Diffstat (limited to 'src')
-rw-r--r--src/or/config.c144
-rw-r--r--src/or/dirserv.c8
-rw-r--r--src/or/dirvote.c5
-rw-r--r--src/or/or.h28
-rw-r--r--src/or/routerlist.c6
5 files changed, 175 insertions, 16 deletions
diff --git a/src/or/config.c b/src/or/config.c
index 6072c808a4..0cd40a3985 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -174,6 +174,7 @@ static config_var_t _option_vars[] = {
V(DataDirectory, STRING, NULL),
OBSOLETE("DebugLogFile"),
V(DirAllowPrivateAddresses, BOOL, NULL),
+ V(DirTimeToLearnReachability, INTERVAL, "30 minutes"),
V(DirListenAddress, LINELIST, NULL),
OBSOLETE("DirFetchPeriod"),
V(DirPolicy, LINELIST, NULL),
@@ -188,6 +189,7 @@ static config_var_t _option_vars[] = {
V(DownloadExtraInfo, BOOL, "0"),
V(EnforceDistinctSubnets, BOOL, "1"),
V(EntryNodes, STRING, NULL),
+ V(EstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"),
V(ExcludeNodes, STRING, NULL),
V(ExitNodes, STRING, NULL),
V(ExitPolicy, LINELIST, NULL),
@@ -252,6 +254,7 @@ static config_var_t _option_vars[] = {
V(OutboundBindAddress, STRING, NULL),
OBSOLETE("PathlenCoinWeight"),
V(PidFile, STRING, NULL),
+ V(TestingTorNetwork, BOOL, "0"),
V(PreferTunneledDirConns, BOOL, "1"),
V(ProtocolWarnings, BOOL, "0"),
V(PublishServerDescriptor, CSV, "1"),
@@ -306,6 +309,9 @@ static config_var_t _option_vars[] = {
VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir, "0"),
VAR("V2AuthoritativeDirectory",BOOL, V2AuthoritativeDir, "0"),
VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir, "0"),
+ V(V3AuthInitialVotingInterval, INTERVAL, "30 minutes"),
+ V(V3AuthInitialVoteDelay, INTERVAL, "5 minutes"),
+ V(V3AuthInitialDistDelay, INTERVAL, "5 minutes"),
V(V3AuthVotingInterval, INTERVAL, "1 hour"),
V(V3AuthVoteDelay, INTERVAL, "5 minutes"),
V(V3AuthDistDelay, INTERVAL, "5 minutes"),
@@ -322,6 +328,27 @@ static config_var_t _option_vars[] = {
V(MinUptimeHidServDirectoryV2, INTERVAL, "24 hours"),
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
};
+
+/* Keep defaults synchronous with man page and config value check. */
+static config_var_t testing_tor_network_defaults[] = {
+ V(ServerDNSAllowBrokenResolvConf, BOOL, "1"),
+ V(DirAllowPrivateAddresses, BOOL, "1"),
+ V(EnforceDistinctSubnets, BOOL, "0"),
+ V(AssumeReachable, BOOL, "1"),
+ V(AuthDirMaxServersPerAddr, UINT, "0"),
+ V(AuthDirMaxServersPerAuthAddr,UINT, "0"),
+ V(ClientDNSRejectInternalAddresses, BOOL,"0"),
+ V(ExitPolicyRejectPrivate, BOOL, "0"),
+ V(V3AuthVotingInterval, INTERVAL, "5 minutes"),
+ V(V3AuthVoteDelay, INTERVAL, "20 seconds"),
+ V(V3AuthDistDelay, INTERVAL, "20 seconds"),
+ V(V3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
+ V(V3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
+ V(V3AuthInitialDistDelay, INTERVAL, "20 seconds"),
+ V(DirTimeToLearnReachability, INTERVAL, "0 minutes"),
+ V(EstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"),
+ { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
+};
#undef VAR
#define VAR(name,conftype,member,initvalue) \
@@ -3350,6 +3377,73 @@ options_validate(or_options_t *old_options, or_options_t *options,
});
}
+ if (options->TestingTorNetwork && !options->DirServers) {
+ REJECT("TestingTorNetwork may only be configured in combination with "
+ "a non-default set of DirServers.");
+ }
+
+ /* Keep changes to hard-coded values synchronous to man page and default
+ * values table. */
+ if (options->V3AuthInitialVotingInterval != 30*60 &&
+ !options->TestingTorNetwork) {
+ REJECT("V3AuthInitialVotingInterval may only be changed in testing "
+ "Tor networks!");
+ } else if (options->V3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
+ REJECT("V3AuthInitialVotingInterval is insanely low.");
+ } else if (((30*60) % options->V3AuthInitialVotingInterval) != 0) {
+ REJECT("V3AuthInitialVotingInterval does not divide evenly into "
+ "30 minutes.");
+ }
+
+ if (options->V3AuthInitialVoteDelay != 5*60 &&
+ !options->TestingTorNetwork) {
+ REJECT("V3AuthInitialVoteDelay may only be changed in testing "
+ "Tor networks!");
+ } else if (options->V3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
+ REJECT("V3AuthInitialVoteDelay is way too low.");
+ }
+
+ if (options->V3AuthInitialDistDelay != 5*60 &&
+ !options->TestingTorNetwork) {
+ REJECT("V3AuthInitialDistDelay may only be changed in testing "
+ "Tor networks!");
+ } else if (options->V3AuthInitialDistDelay < MIN_DIST_SECONDS) {
+ REJECT("V3AuthInitialDistDelay is way too low.");
+ }
+
+ if (options->V3AuthInitialVoteDelay + options->V3AuthInitialDistDelay >=
+ options->V3AuthInitialVotingInterval/2) {
+ REJECT("V3AuthInitialVoteDelay plus V3AuthInitialDistDelay must be "
+ "less than half V3AuthInitialVotingInterval");
+ }
+
+ if (options->DirTimeToLearnReachability != 30*60 &&
+ !options->TestingTorNetwork) {
+ REJECT("DirTimeToLearnReachability may only be changed in testing "
+ "Tor networks!");
+ } else if (options->DirTimeToLearnReachability < 0) {
+ REJECT("DirTimeToLearnReachability must be non-negative.");
+ } else if (options->DirTimeToLearnReachability > 2*60*60) {
+ COMPLAIN("DirTimeToLearnReachability is insanely high.");
+ }
+
+ if (options->EstimatedDescriptorPropagationTime != 10*60 &&
+ !options->TestingTorNetwork) {
+ REJECT("EstimatedDescriptorPropagationTime may only be changed in "
+ "testing Tor networks!");
+ } else if (options->EstimatedDescriptorPropagationTime < 0) {
+ REJECT("EstimatedDescriptorPropagationTime must be non-negative.");
+ } else if (options->EstimatedDescriptorPropagationTime > 60*60) {
+ COMPLAIN("EstimatedDescriptorPropagationTime is insanely high.");
+ }
+
+ if (options->TestingTorNetwork) {
+ log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node "
+ "almost unusable in the public Tor network, and is "
+ "therefore only advised if you are building a "
+ "testing Tor network!");
+ }
+
return 0;
#undef REJECT
#undef COMPLAIN
@@ -3413,6 +3507,12 @@ options_transition_allowed(or_options_t *old, or_options_t *new_val,
return -1;
}
+ if (old->TestingTorNetwork != new_val->TestingTorNetwork) {
+ *msg = tor_strdup("While Tor is running, changing TestingTorNetwork "
+ "is not allowed.");
+ return -1;
+ }
+
return 0;
}
@@ -3787,6 +3887,50 @@ options_init_from_string(const char *cf,
goto err;
}
+ /* If this is a testing network configuration, change defaults
+ * for a list of dependent config options, re-initialize newoptions
+ * with the new defaults, and assign all options to it second time. */
+ if (newoptions->TestingTorNetwork) {
+
+ /* Change defaults. */
+ int i;
+ for (i = 0; testing_tor_network_defaults[i].name; ++i) {
+ config_var_t *new_var = &testing_tor_network_defaults[i];
+ config_var_t *old_var =
+ config_find_option(&options_format, new_var->name);
+ tor_assert(new_var);
+ tor_assert(old_var);
+ old_var->initvalue = new_var->initvalue;
+ }
+
+ /* Clear newoptions and re-initialize them with new defaults. */
+ config_free(&options_format, newoptions);
+ newoptions = tor_malloc_zero(sizeof(or_options_t));
+ newoptions->_magic = OR_OPTIONS_MAGIC;
+ options_init(newoptions);
+ newoptions->command = command;
+ newoptions->command_arg = command_arg;
+
+ /* Assign all options a second time. */
+ retval = config_get_lines(cf, &cl);
+ if (retval < 0) {
+ err = SETOPT_ERR_PARSE;
+ goto err;
+ }
+ retval = config_assign(&options_format, newoptions, cl, 0, 0, msg);
+ config_free_lines(cl);
+ if (retval < 0) {
+ err = SETOPT_ERR_PARSE;
+ goto err;
+ }
+ retval = config_assign(&options_format, newoptions,
+ global_cmdline_options, 0, 0, msg);
+ if (retval < 0) {
+ err = SETOPT_ERR_PARSE;
+ goto err;
+ }
+ }
+
/* Validate newoptions */
if (options_validate(oldoptions, newoptions, 0, msg) < 0) {
err = SETOPT_ERR_PARSE; /*XXX021 make this separate.*/
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index dc7bc3f003..83126b95d6 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -2122,10 +2122,6 @@ router_clear_status_flags(routerinfo_t *router)
router->is_bad_exit = router->is_bad_directory = 0;
}
-/** If we've been around for less than this amount of time, our reachability
- * information is not accurate. */
-#define DIRSERV_TIME_TO_GET_REACHABILITY_INFO (30*60)
-
/** Return a new networkstatus_t* containing our current opinion. (For v3
* authorities) */
networkstatus_t *
@@ -2155,7 +2151,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
tor_assert(private_key);
tor_assert(cert);
- if (now - time_of_process_start < DIRSERV_TIME_TO_GET_REACHABILITY_INFO)
+ if (now - time_of_process_start < options->DirTimeToLearnReachability)
vote_on_reachability = 0;
if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) {
@@ -2241,7 +2237,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
last_consensus_interval = current_consensus->fresh_until -
current_consensus->valid_after;
else
- last_consensus_interval = DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS;
+ last_consensus_interval = options->V3AuthInitialVotingInterval;
v3_out->valid_after =
dirvote_get_start_of_next_interval(now, (int)last_consensus_interval);
format_iso_time(tbuf, v3_out->valid_after);
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 421f9c26c9..291d3dc4a6 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -1308,8 +1308,9 @@ dirvote_recalculate_timing(or_options_t *options, time_t now)
vote_delay = consensus->vote_seconds;
dist_delay = consensus->dist_seconds;
} else {
- interval = DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS;
- vote_delay = dist_delay = 300;
+ interval = options->V3AuthInitialVotingInterval;
+ vote_delay = options->V3AuthInitialVoteDelay;
+ dist_delay = options->V3AuthInitialDistDelay;
}
tor_assert(interval > 0);
diff --git a/src/or/or.h b/src/or/or.h
index 1851808397..456276c346 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2355,6 +2355,31 @@ typedef struct {
* migration purposes? */
int V3AuthUseLegacyKey;
+ /** The length of time that we think an initial consensus should be
+ * fresh. */
+ int V3AuthInitialVotingInterval;
+
+ /** The length of time we think it will take to distribute initial
+ * votes. */
+ int V3AuthInitialVoteDelay;
+
+ /** The length of time we think it will take to distribute initial
+ * signatures. */
+ int V3AuthInitialDistDelay;
+
+ /** If an authority has been around for less than this amount of time,
+ * its reachability information is not accurate. */
+ int DirTimeToLearnReachability;
+
+ /** Clients don't download any descriptor this recent, since it will
+ * probably not have propagated to enough caches. */
+ int EstimatedDescriptorPropagationTime;
+
+ /** If true, we take part in a testing network. Change the defaults of a
+ * couple of other configuration options and allow to change the values
+ * of certain configuration options. */
+ int TestingTorNetwork;
+
/** File to check for a consensus networkstatus, if we don't have one
* cached. */
char *FallbackNetworkstatusFile;
@@ -3223,9 +3248,6 @@ cached_dir_t *new_cached_dir(char *s, time_t published);
/** Smallest allowable voting interval. */
#define MIN_VOTE_INTERVAL 300
-/** If there is no consensus, what interval do we default to? */
-#define DEFAULT_VOTING_INTERVAL_WHEN_NO_CONSENSUS (30*60)
-
void dirvote_free_all(void);
/* vote manipulation */
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index f405069b53..58f950feb1 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -3718,10 +3718,6 @@ initiate_descriptor_downloads(routerstatus_t *source,
tor_free(resource);
}
-/** Clients don't download any descriptor this recent, since it will probably
- * not have propagated to enough caches. */
-#define ESTIMATED_PROPAGATION_TIME (10*60)
-
/** Return 0 if this routerstatus is obsolete, too new, isn't
* running, or otherwise not a descriptor that we would make any
* use of even if we had it. Else return 1. */
@@ -3733,7 +3729,7 @@ client_would_use_router(routerstatus_t *rs, time_t now, or_options_t *options)
* But, if we want to have a complete list, fetch it anyway. */
return 0;
}
- if (rs->published_on + ESTIMATED_PROPAGATION_TIME > now) {
+ if (rs->published_on + options->EstimatedDescriptorPropagationTime > now) {
/* Most caches probably don't have this descriptor yet. */
return 0;
}