diff options
author | Peter Palfrader <peter@palfrader.org> | 2008-08-14 23:00:57 +0000 |
---|---|---|
committer | Peter Palfrader <peter@palfrader.org> | 2008-08-14 23:00:57 +0000 |
commit | ceae7ed96020cf4e4936d57367ca004ba1166147 (patch) | |
tree | 10a04c2b140c1ac28db857e78a88fd8eb9ffd308 /src/or/dirvote.c | |
parent | 82f8050ac428416a91997003b205ac90019768dd (diff) | |
download | tor-ceae7ed96020cf4e4936d57367ca004ba1166147.tar.gz tor-ceae7ed96020cf4e4936d57367ca004ba1166147.zip |
Add bw to consensus
svn:r16551
Diffstat (limited to 'src/or/dirvote.c')
-rw-r--r-- | src/or/dirvote.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/or/dirvote.c b/src/or/dirvote.c index b704a94f08..626854fa69 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -106,7 +106,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key, tor_snprintf(status, len, "network-status-version 3\n" "vote-status %s\n" - "consensus-methods 1 2 3 4\n" + "consensus-methods 1 2 3 4 5\n" "published %s\n" "valid-after %s\n" "fresh-until %s\n" @@ -452,7 +452,7 @@ compute_consensus_method(smartlist_t *votes) static int consensus_method_is_supported(int method) { - return (method >= 1) && (method <= 4); + return (method >= 1) && (method <= 5); } /** Given a list of vote networkstatus_t in <b>votes</b>, our public @@ -688,6 +688,8 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_t *matching_descs = smartlist_create(); smartlist_t *chosen_flags = smartlist_create(); smartlist_t *versions = smartlist_create(); + uint32_t *bandwidths = tor_malloc(sizeof(uint32_t) * smartlist_len(votes)); + int num_bandwidths; int *n_voter_flags; /* n_voter_flags[j] is the number of flags that * votes[j] knows about. */ @@ -819,6 +821,7 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_clear(matching_descs); smartlist_clear(chosen_flags); smartlist_clear(versions); + num_bandwidths = 0; /* Okay, go through all the entries for this digest. */ SMARTLIST_FOREACH(votes, networkstatus_t *, v, { @@ -850,6 +853,10 @@ networkstatus_compute_consensus(smartlist_t *votes, } chosen_name = rs->status.nickname; } + + /* count bandwidths */ + if (rs->status.has_bandwidth) + bandwidths[num_bandwidths++] = rs->status.bandwidth; }); /* We don't include this router at all unless more than half of @@ -922,6 +929,12 @@ networkstatus_compute_consensus(smartlist_t *votes, chosen_version = NULL; } + /* Pick a bandwidth */ + if (consensus_method >= 5 && num_bandwidths > 0) { + rs_out.has_bandwidth = 1; + rs_out.bandwidth = median_uint32(bandwidths, num_bandwidths); + } + /* Okay!! Now we can write the descriptor... */ /* First line goes into "buf". */ routerstatus_format_entry(buf, sizeof(buf), &rs_out, NULL, 1, 0); @@ -935,6 +948,15 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_add(chunks, tor_strdup(chosen_version)); } smartlist_add(chunks, tor_strdup("\n")); + /* Now the weight line. */ + if (rs_out.has_bandwidth) { + int r = tor_snprintf(buf, sizeof(buf), "w Bandwidth=%d\n", rs_out.bandwidth); + if (r<0) { + log_warn(LD_BUG, "Not enough space in buffer for weight line."); + *buf = '\0'; + } + smartlist_add(chunks, tor_strdup(buf)); + }; /* And the loop is over and we move on to the next router */ } |