[tor-commits] [tor/master] Vote on 'proto' lines and include them after 'v' lines.

nickm at torproject.org nickm at torproject.org
Mon Sep 26 18:03:40 UTC 2016


commit 90a6fe318cfae4d64fff034574153b8c96895a6c
Author: Nick Mathewson <nickm at torproject.org>
Date:   Fri Aug 26 12:33:23 2016 -0400

    Vote on 'proto' lines and include them after 'v' lines.
    
    (Despite the increased size of the consensus, this should have
    approximately zero effect on the compressed consensus size, since
    the "proto" line should be completely implied by the "v" line.)
---
 src/or/dirvote.c     | 22 ++++++++++++++++++++++
 src/or/dirvote.h     |  2 --
 src/or/routerparse.c |  5 +++++
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 67f0ba8..f606b07 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -1563,6 +1563,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
     smartlist_t *matching_descs = smartlist_new();
     smartlist_t *chosen_flags = smartlist_new();
     smartlist_t *versions = smartlist_new();
+    smartlist_t *protocols = smartlist_new();
     smartlist_t *exitsummaries = smartlist_new();
     uint32_t *bandwidths_kb = tor_calloc(smartlist_len(votes),
                                          sizeof(uint32_t));
@@ -1705,6 +1706,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
       routerstatus_t rs_out;
       const char *current_rsa_id = NULL;
       const char *chosen_version;
+      const char *chosen_protocol_list;
       const char *chosen_name = NULL;
       int exitsummary_disagreement = 0;
       int is_named = 0, is_unnamed = 0, is_running = 0;
@@ -1718,6 +1720,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
       smartlist_clear(matching_descs);
       smartlist_clear(chosen_flags);
       smartlist_clear(versions);
+      smartlist_clear(protocols);
       num_bandwidths = 0;
       num_mbws = 0;
       num_guardfraction_inputs = 0;
@@ -1737,6 +1740,12 @@ networkstatus_compute_consensus(smartlist_t *votes,
         if (rs->version && rs->version[0])
           smartlist_add(versions, rs->version);
 
+        if (rs->protocols) {
+          /* We include this one even if it's empty: voting for an
+           * empty protocol list actually is meaningful. */
+          smartlist_add(protocols, rs->protocols);
+        }
+
         /* Tally up all the flags. */
         for (int flag = 0; flag < n_voter_flags[voter_idx]; ++flag) {
           if (rs->flags & (U64_LITERAL(1) << flag))
@@ -1875,6 +1884,14 @@ networkstatus_compute_consensus(smartlist_t *votes,
         chosen_version = NULL;
       }
 
+      /* Pick the protocol list */
+      if (smartlist_len(protocols)) {
+        smartlist_sort_strings(protocols);
+        chosen_protocol_list = get_most_frequent_member(protocols);
+      } else {
+        chosen_protocol_list = NULL;
+      }
+
       /* If it's a guard and we have enough guardfraction votes,
          calculate its consensus guardfraction value. */
       if (is_guard && num_guardfraction_inputs > 2 &&
@@ -2028,6 +2045,10 @@ networkstatus_compute_consensus(smartlist_t *votes,
         smartlist_add(chunks, tor_strdup(chosen_version));
       }
       smartlist_add(chunks, tor_strdup("\n"));
+      if (chosen_protocol_list &&
+          consensus_method >= MIN_METHOD_FOR_RS_PROTOCOLS) {
+        smartlist_add_asprintf(chunks, "proto %s\n", chosen_protocol_list);
+      }
       /*     Now the weight line. */
       if (rs_out.has_bandwidth) {
         char *guardfraction_str = NULL;
@@ -2068,6 +2089,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
     smartlist_free(matching_descs);
     smartlist_free(chosen_flags);
     smartlist_free(versions);
+    smartlist_free(protocols);
     smartlist_free(exitsummaries);
     tor_free(bandwidths_kb);
     tor_free(measured_bws_kb);
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index f29fe97..a6c847e 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -103,11 +103,9 @@
  * protocols. */
 #define MIN_METHOD_FOR_RECOMMENDED_PROTOCOLS 24
 
-#if 0
 /** Lowest consensus method where authorities add protocols to routerstatus
  * entries. */
 #define MIN_METHOD_FOR_RS_PROTOCOLS 24
-#endif
 
 /** Default bandwidth to clip unmeasured bandwidths to using method >=
  * MIN_METHOD_TO_CLIP_UNMEASURED_BW.  (This is not a consensus method; do not
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 46209ab..9428e45 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -388,6 +388,7 @@ static token_rule_t rtrstatus_token_table[] = {
   T01("w",                   K_W,                   ARGS,    NO_OBJ ),
   T0N("m",                   K_M,               CONCAT_ARGS, NO_OBJ ),
   T0N("id",                  K_ID,                  GE(2),   NO_OBJ ),
+  T01("proto",               K_PROTO,           CONCAT_ARGS, NO_OBJ ),
   T0N("opt",                 K_OPT,             CONCAT_ARGS, OBJ_OK ),
   END_OF_TABLE
 };
@@ -2992,6 +2993,10 @@ routerstatus_parse_entry_from_string(memarea_t *area,
           }
         }
       }
+      if (t->tp == K_PROTO) {
+        tor_assert(t->n_args == 1);
+        vote_rs->protocols = tor_strdup(t->args[0]);
+      }
     } SMARTLIST_FOREACH_END(t);
   } else if (flav == FLAV_MICRODESC) {
     tok = find_opt_by_keyword(tokens, K_M);





More information about the tor-commits mailing list