diff options
author | Nick Mathewson <nickm@torproject.org> | 2020-02-24 08:53:54 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2020-02-24 10:00:51 -0500 |
commit | e1cf10ceb7b742b5028ff4f5cfbf2b2e67572c06 (patch) | |
tree | 6c51e22a807c490fbdab04caf1703da6d2551001 /src/feature/dircommon | |
parent | c9bd3579f7e77076eb3543cc5875ed8f9a0d689a (diff) | |
download | tor-e1cf10ceb7b742b5028ff4f5cfbf2b2e67572c06.tar.gz tor-e1cf10ceb7b742b5028ff4f5cfbf2b2e67572c06.zip |
Move voting_schedule.[ch] to src/feature/dirauth/
Diffstat (limited to 'src/feature/dircommon')
-rw-r--r-- | src/feature/dircommon/include.am | 6 | ||||
-rw-r--r-- | src/feature/dircommon/voting_schedule.c | 193 | ||||
-rw-r--r-- | src/feature/dircommon/voting_schedule.h | 64 |
3 files changed, 2 insertions, 261 deletions
diff --git a/src/feature/dircommon/include.am b/src/feature/dircommon/include.am index f0f0323d12..87850ce183 100644 --- a/src/feature/dircommon/include.am +++ b/src/feature/dircommon/include.am @@ -3,8 +3,7 @@ LIBTOR_APP_A_SOURCES += \ src/feature/dircommon/consdiff.c \ src/feature/dircommon/directory.c \ - src/feature/dircommon/fp_pair.c \ - src/feature/dircommon/voting_schedule.c + src/feature/dircommon/fp_pair.c # ADD_C_FILE: INSERT HEADERS HERE. noinst_HEADERS += \ @@ -12,5 +11,4 @@ noinst_HEADERS += \ src/feature/dircommon/dir_connection_st.h \ src/feature/dircommon/directory.h \ src/feature/dircommon/fp_pair.h \ - src/feature/dircommon/vote_timing_st.h \ - src/feature/dircommon/voting_schedule.h + src/feature/dircommon/vote_timing_st.h diff --git a/src/feature/dircommon/voting_schedule.c b/src/feature/dircommon/voting_schedule.c deleted file mode 100644 index 389f7f6b5d..0000000000 --- a/src/feature/dircommon/voting_schedule.c +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (c) 2018-2020, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file voting_schedule.c - * \brief This file contains functions that are from the directory authority - * subsystem related to voting specifically but used by many part of - * tor. The full feature is built as part of the dirauth module. - **/ - -#include "feature/dircommon/voting_schedule.h" - -#include "core/or/or.h" -#include "app/config/config.h" -#include "feature/nodelist/networkstatus.h" - -#include "feature/nodelist/networkstatus_st.h" - -/* ===== - * Vote scheduling - * ===== */ - -/** Return the start of the next interval of size <b>interval</b> (in - * seconds) after <b>now</b>, plus <b>offset</b>. Midnight always - * starts a fresh interval, and if the last interval of a day would be - * truncated to less than half its size, it is rolled into the - * previous interval. */ -time_t -voting_schedule_get_start_of_next_interval(time_t now, int interval, - int offset) -{ - struct tm tm; - time_t midnight_today=0; - time_t midnight_tomorrow; - time_t next; - - tor_gmtime_r(&now, &tm); - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - - if (tor_timegm(&tm, &midnight_today) < 0) { - // LCOV_EXCL_START - log_warn(LD_BUG, "Ran into an invalid time when trying to find midnight."); - // LCOV_EXCL_STOP - } - midnight_tomorrow = midnight_today + (24*60*60); - - next = midnight_today + ((now-midnight_today)/interval + 1)*interval; - - /* Intervals never cross midnight. */ - if (next > midnight_tomorrow) - next = midnight_tomorrow; - - /* If the interval would only last half as long as it's supposed to, then - * skip over to the next day. */ - if (next + interval/2 > midnight_tomorrow) - next = midnight_tomorrow; - - next += offset; - if (next - interval > now) - next -= interval; - - return next; -} - -/* Populate and return a new voting_schedule_t that can be used to schedule - * voting. The object is allocated on the heap and it's the responsibility of - * the caller to free it. Can't fail. */ -static voting_schedule_t * -get_voting_schedule(const or_options_t *options, time_t now, int severity) -{ - int interval, vote_delay, dist_delay; - time_t start; - time_t end; - networkstatus_t *consensus; - voting_schedule_t *new_voting_schedule; - - new_voting_schedule = tor_malloc_zero(sizeof(voting_schedule_t)); - - consensus = networkstatus_get_live_consensus(now); - - if (consensus) { - interval = (int)( consensus->fresh_until - consensus->valid_after ); - vote_delay = consensus->vote_seconds; - dist_delay = consensus->dist_seconds; - - /* Note down the consensus valid after, so that we detect outdated voting - * schedules in case of skewed clocks etc. */ - new_voting_schedule->live_consensus_valid_after = consensus->valid_after; - } else { - interval = options->TestingV3AuthInitialVotingInterval; - vote_delay = options->TestingV3AuthInitialVoteDelay; - dist_delay = options->TestingV3AuthInitialDistDelay; - } - - tor_assert(interval > 0); - - if (vote_delay + dist_delay > interval/2) - vote_delay = dist_delay = interval / 4; - - start = new_voting_schedule->interval_starts = - voting_schedule_get_start_of_next_interval(now,interval, - options->TestingV3AuthVotingStartOffset); - end = voting_schedule_get_start_of_next_interval(start+1, interval, - options->TestingV3AuthVotingStartOffset); - - tor_assert(end > start); - - new_voting_schedule->fetch_missing_signatures = start - (dist_delay/2); - new_voting_schedule->voting_ends = start - dist_delay; - new_voting_schedule->fetch_missing_votes = - start - dist_delay - (vote_delay/2); - new_voting_schedule->voting_starts = start - dist_delay - vote_delay; - - { - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, new_voting_schedule->interval_starts); - tor_log(severity, LD_DIR,"Choosing expected valid-after time as %s: " - "consensus_set=%d, interval=%d", - tbuf, consensus?1:0, interval); - } - - return new_voting_schedule; -} - -#define voting_schedule_free(s) \ - FREE_AND_NULL(voting_schedule_t, voting_schedule_free_, (s)) - -/** Frees a voting_schedule_t. This should be used instead of the generic - * tor_free. */ -static void -voting_schedule_free_(voting_schedule_t *voting_schedule_to_free) -{ - if (!voting_schedule_to_free) - return; - tor_free(voting_schedule_to_free); -} - -voting_schedule_t voting_schedule; - -/* Using the time <b>now</b>, return the next voting valid-after time. */ -time_t -voting_schedule_get_next_valid_after_time(void) -{ - time_t now = approx_time(); - bool need_to_recalculate_voting_schedule = false; - - /* This is a safe guard in order to make sure that the voting schedule - * static object is at least initialized. Using this function with a zeroed - * voting schedule can lead to bugs. */ - if (fast_mem_is_zero((const char *) &voting_schedule, - sizeof(voting_schedule))) { - need_to_recalculate_voting_schedule = true; - goto done; /* no need for next check if we have to recalculate anyway */ - } - - /* Also make sure we are not using an outdated voting schedule. If we have a - * newer consensus, make sure we recalculate the voting schedule. */ - const networkstatus_t *ns = networkstatus_get_live_consensus(now); - if (ns && ns->valid_after != voting_schedule.live_consensus_valid_after) { - log_info(LD_DIR, "Voting schedule is outdated: recalculating (%d/%d)", - (int) ns->valid_after, - (int) voting_schedule.live_consensus_valid_after); - need_to_recalculate_voting_schedule = true; - } - - done: - if (need_to_recalculate_voting_schedule) { - voting_schedule_recalculate_timing(get_options(), approx_time()); - voting_schedule.created_on_demand = 1; - } - - return voting_schedule.interval_starts; -} - -/** Set voting_schedule to hold the timing for the next vote we should be - * doing. All type of tor do that because HS subsystem needs the timing as - * well to function properly. */ -void -voting_schedule_recalculate_timing(const or_options_t *options, time_t now) -{ - voting_schedule_t *new_voting_schedule; - - /* get the new voting schedule */ - new_voting_schedule = get_voting_schedule(options, now, LOG_INFO); - tor_assert(new_voting_schedule); - - /* Fill in the global static struct now */ - memcpy(&voting_schedule, new_voting_schedule, sizeof(voting_schedule)); - voting_schedule_free(new_voting_schedule); -} - diff --git a/src/feature/dircommon/voting_schedule.h b/src/feature/dircommon/voting_schedule.h deleted file mode 100644 index e4c6210087..0000000000 --- a/src/feature/dircommon/voting_schedule.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2018-2020, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file voting_schedule.h - * \brief Header file for voting_schedule.c. - **/ - -#ifndef TOR_VOTING_SCHEDULE_H -#define TOR_VOTING_SCHEDULE_H - -#include "core/or/or.h" - -/** Scheduling information for a voting interval. */ -typedef struct { - /** When do we generate and distribute our vote for this interval? */ - time_t voting_starts; - /** When do we send an HTTP request for any votes that we haven't - * been posted yet?*/ - time_t fetch_missing_votes; - /** When do we give up on getting more votes and generate a consensus? */ - time_t voting_ends; - /** When do we send an HTTP request for any signatures we're expecting to - * see on the consensus? */ - time_t fetch_missing_signatures; - /** When do we publish the consensus? */ - time_t interval_starts; - - /** True iff we have generated and distributed our vote. */ - int have_voted; - /** True iff we've requested missing votes. */ - int have_fetched_missing_votes; - /** True iff we have built a consensus and sent the signatures around. */ - int have_built_consensus; - /** True iff we've fetched missing signatures. */ - int have_fetched_missing_signatures; - /** True iff we have published our consensus. */ - int have_published_consensus; - - /* True iff this voting schedule was set on demand meaning not through the - * normal vote operation of a dirauth or when a consensus is set. This only - * applies to a directory authority that needs to recalculate the voting - * timings only for the first vote even though this object was initilized - * prior to voting. */ - int created_on_demand; - - /** The valid-after time of the last live consensus that filled this voting - * schedule. It's used to detect outdated voting schedules. */ - time_t live_consensus_valid_after; -} voting_schedule_t; - -/* Public API. */ - -extern voting_schedule_t voting_schedule; - -void voting_schedule_recalculate_timing(const or_options_t *options, - time_t now); - -time_t voting_schedule_get_start_of_next_interval(time_t now, - int interval, - int offset); -time_t voting_schedule_get_next_valid_after_time(void); - -#endif /* !defined(TOR_VOTING_SCHEDULE_H) */ |