]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
A Bridge Authority should compute flag thresholds
authorMatthew Finkel <Matthew.Finkel@gmail.com>
Wed, 2 Oct 2013 02:46:24 +0000 (02:46 +0000)
committerMatthew Finkel <Matthew.Finkel@gmail.com>
Mon, 21 Oct 2013 17:49:33 +0000 (17:49 +0000)
As a bridge authority, before we create our networkstatus document, we
should compute the thresholds needed for the various status flags
assigned to each bridge based on the status of all other bridges. We
then add these thresholds to the networkstatus document for easy access.
Fixes for #1117 and #9859.

changes/bug9859 [new file with mode: 0644]
src/or/dirserv.c
src/or/dirserv.h
src/or/networkstatus.c

diff --git a/changes/bug9859 b/changes/bug9859
new file mode 100644 (file)
index 0000000..54ca30e
--- /dev/null
@@ -0,0 +1,6 @@
+  o Minor Feature
+
+    - Assign status flags to bridges based on thresholds calculated
+      over all bridges. Fixes bug 9859.
+    - Add threshold cutoffs to the networkstatus document created by
+      the Bridge Authority. Fixes bug 1117.
index d30a474367a82ef72f193bfd5e42d1897dcfe217..8d2da5b50249c2e5857fffcb59dce7e83bb071a9 100644 (file)
@@ -1957,6 +1957,10 @@ dirserv_compute_performance_thresholds(routerlist_t *rl,
 
   /* Now, fill in the arrays. */
   SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) {
+    if (options->BridgeAuthoritativeDir &&
+        node->ri &&
+        node->ri->purpose != ROUTER_PURPOSE_BRIDGE)
+      continue;
     if (router_counts_toward_thresholds(node, now, omit_as_sybil,
                                         require_mbw)) {
       routerinfo_t *ri = node->ri;
@@ -2071,6 +2075,21 @@ dirserv_compute_performance_thresholds(routerlist_t *rl,
   tor_free(wfus);
 }
 
+/* Use dirserv_compute_performance_thresholds() to compute the thresholds
+ * for the status flags, specifically for bridges.
+ *
+ * This is only called by a Bridge Authority from
+ * networkstatus_getinfo_by_purpose().
+ */
+void
+dirserv_compute_bridge_flag_thresholds(routerlist_t *rl)
+{
+
+  digestmap_t *omit_as_sybil = digestmap_new();
+  dirserv_compute_performance_thresholds(rl, omit_as_sybil);
+  digestmap_free(omit_as_sybil, NULL);
+}
+
 /** Measured bandwidth cache entry */
 typedef struct mbw_cache_entry_s {
   long mbw_kb;
index 7221fc99578b32097468ddc54660ced9085660b1..c2d6131c7d0f407e2d32fe9089a7ee9c76462ce4 100644 (file)
@@ -51,6 +51,7 @@ int list_server_status_v1(smartlist_t *routers, char **router_status_out,
 int dirserv_dump_directory_to_string(char **dir_out,
                                      crypto_pk_t *private_key);
 char *dirserv_get_flag_thresholds_line(void);
+void dirserv_compute_bridge_flag_thresholds(routerlist_t *rl);
 
 int directory_fetches_from_authorities(const or_options_t *options);
 int directory_fetches_dir_info_early(const or_options_t *options);
index c950731bb2ba39a0f1e2b455c564dacbc11fe4d8..a935a4672c41b42949ecf6f649da4c0ed6e71904 100644 (file)
@@ -2171,9 +2171,17 @@ networkstatus_dump_bridge_status_to_file(time_t now)
   char *status = networkstatus_getinfo_by_purpose("bridge", now);
   const or_options_t *options = get_options();
   char *fname = NULL;
+  char *thresholds = NULL, *thresholds_and_status = NULL;
+  routerlist_t *rl = router_get_routerlist();
+  dirserv_compute_bridge_flag_thresholds(rl);
+  thresholds = dirserv_get_flag_thresholds_line();
+  tor_asprintf(&thresholds_and_status, "flag-thresholds %s\n%s",
+               thresholds, status);
   tor_asprintf(&fname, "%s"PATH_SEPARATOR"networkstatus-bridges",
                options->DataDirectory);
-  write_str_to_file(fname,status,0);
+  write_str_to_file(fname,thresholds_and_status,0);
+  tor_free(thresholds);
+  tor_free(thresholds_and_status);
   tor_free(fname);
   tor_free(status);
 }