]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Vote on 'proto' lines and include them after 'v' lines.
authorNick Mathewson <nickm@torproject.org>
Fri, 26 Aug 2016 16:33:23 +0000 (12:33 -0400)
committerNick Mathewson <nickm@torproject.org>
Mon, 26 Sep 2016 17:56:51 +0000 (10:56 -0700)
(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
src/or/dirvote.h
src/or/routerparse.c

index 67f0ba8cc7cf4dfaf566135eccc36cdff7ea2d7d..f606b07f7a097440cc1d21b56ee31f246c796af3 100644 (file)
@@ -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);
index f29fe97f26e4ea28a5d6f95bf3a4eea5c4358ce2..a6c847ec25ec7af7dc215154ffce95a94c351747 100644 (file)
  * 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
index 46209abcd51ca9c17578308f122b63608e488747..9428e4560af1b288e3f487958a8f7c46c16c6671 100644 (file)
@@ -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);