diff --git a/src/or/dirvote.c b/src/or/dirvote.c index aadece9096..58b02da5cb 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -21,6 +21,10 @@ static int dirvote_perform_vote(void); static void dirvote_clear_votes(int all_votes); static int dirvote_compute_consensus(void); static int dirvote_publish_consensus(void); +static char *make_consensus_method_list(int low, int high); + +/** The highest consensus method that we currently support. */ +#define MAX_SUPPORTED_CONSENSUS_METHOD 6 /* ===== * Voting @@ -94,6 +98,8 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key, char vu[ISO_TIME_LEN+1]; char *flags = smartlist_join_strings(v3_ns->known_flags, " ", 0, NULL); authority_cert_t *cert = v3_ns->cert; + char *methods = + make_consensus_method_list(1, MAX_SUPPORTED_CONSENSUS_METHOD); format_iso_time(published, v3_ns->published); format_iso_time(va, v3_ns->valid_after); format_iso_time(fu, v3_ns->fresh_until); @@ -103,10 +109,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key, tor_snprintf(status, len, "network-status-version 3\n" "vote-status %s\n" - /* XXX: If you change this value, you also need to - * change consensus_method_is_supported(). - * Perhaps we should unify these somehow? */ - "consensus-methods 1 2 3 4 5 6\n" + "consensus-methods %s\n" "published %s\n" "valid-after %s\n" "fresh-until %s\n" @@ -117,6 +120,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key, "dir-source %s %s %s %s %d %d\n" "contact %s\n", v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", + methods, published, va, fu, vu, v3_ns->vote_seconds, v3_ns->dist_seconds, version_lines, @@ -125,6 +129,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key, ipaddr, voter->dir_port, voter->or_port, voter->contact); tor_free(flags); + tor_free(methods); outp = status + strlen(status); endp = status + len; @@ -458,10 +463,31 @@ compute_consensus_method(smartlist_t *votes) static int consensus_method_is_supported(int method) { - /* XXX: If you change this value, you also need to change - * format_networkstatus_vote(). Perhaps we should unify - * these somehow? */ - return (method >= 1) && (method <= 6); + return (method >= 1) && (method <= MAX_SUPPORTED_CONSENSUS_METHOD); +} + +/** Return a newly allocated string holding the numbers between low and high + * (inclusive) that are supported consensus methods. */ +static char * +make_consensus_method_list(int low, int high) +{ + char *list; + + char b[32]; + int i; + smartlist_t *lst; + lst = smartlist_create(); + for (i = low; i <= high; ++i) { + if (!consensus_method_is_supported(i)) + continue; + tor_snprintf(b, sizeof(b), "%d", i); + smartlist_add(lst, tor_strdup(b)); + } + list = smartlist_join_strings(lst, " ", 0, NULL); + tor_assert(list); + SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); + smartlist_free(lst); + return list; } /** Helper: given lst, a list of version strings such that every