Refactor duplicated extrainfo checks into a common macro.

This patch refactors duplicated code, to check if a given router
supports fetching the extra-info document, into a common macro called
SKIP_MISSING_TRUSTED_EXTRAINFO.
This commit is contained in:
Alexander Færøy 2017-01-12 01:12:29 +01:00 committed by Nick Mathewson
parent 0ff9ea2afd
commit 46ef32ba22

View File

@ -1935,6 +1935,21 @@ router_picked_poor_directory_log(const routerstatus_t *rs)
} \ } \
STMT_END STMT_END
/* Common code used in the loop within router_pick_directory_server_impl and
* router_pick_trusteddirserver_impl.
*
* Check if the given <b>identity</b> supports extrainfo. If not, skip further
* checks.
*/
#define SKIP_MISSING_TRUSTED_EXTRAINFO(type, identity) \
STMT_BEGIN \
int is_trusted_extrainfo = router_digest_is_trusted_dir_type( \
(identity), EXTRAINFO_DIRINFO); \
if (((type) & EXTRAINFO_DIRINFO) && \
!router_supports_extrainfo((identity), is_trusted_extrainfo)) \
continue; \
STMT_END
/* When iterating through the routerlist, can OR address/port preference /* When iterating through the routerlist, can OR address/port preference
* and reachability checks be skipped? * and reachability checks be skipped?
*/ */
@ -2007,7 +2022,7 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags,
/* Find all the running dirservers we know about. */ /* Find all the running dirservers we know about. */
SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) {
int is_trusted, is_trusted_extrainfo; int is_trusted;
int is_overloaded; int is_overloaded;
const routerstatus_t *status = node->rs; const routerstatus_t *status = node->rs;
const country_t country = node->country; const country_t country = node->country;
@ -2018,12 +2033,9 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags,
continue; continue;
if (requireother && router_digest_is_me(node->identity)) if (requireother && router_digest_is_me(node->identity))
continue; continue;
is_trusted = router_digest_is_trusted_dir(node->identity);
is_trusted_extrainfo = router_digest_is_trusted_dir_type( SKIP_MISSING_TRUSTED_EXTRAINFO(type, node->identity);
node->identity, EXTRAINFO_DIRINFO);
if ((type & EXTRAINFO_DIRINFO) &&
!router_supports_extrainfo(node->identity, is_trusted_extrainfo))
continue;
#ifdef ENABLE_LEGACY_GUARD_ALGORITHM #ifdef ENABLE_LEGACY_GUARD_ALGORITHM
/* Don't make the same node a guard twice */ /* Don't make the same node a guard twice */
if (for_guard && is_node_used_as_guard(node)) { if (for_guard && is_node_used_as_guard(node)) {
@ -2051,6 +2063,7 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags,
} }
is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now;
is_trusted = router_digest_is_trusted_dir(node->identity);
/* Clients use IPv6 addresses if the server has one and the client /* Clients use IPv6 addresses if the server has one and the client
* prefers IPv6. * prefers IPv6.
@ -2182,11 +2195,9 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist,
if (!d->is_running) continue; if (!d->is_running) continue;
if ((type & d->type) == 0) if ((type & d->type) == 0)
continue; continue;
int is_trusted_extrainfo = router_digest_is_trusted_dir_type(
d->digest, EXTRAINFO_DIRINFO); SKIP_MISSING_TRUSTED_EXTRAINFO(type, d->digest);
if ((type & EXTRAINFO_DIRINFO) &&
!router_supports_extrainfo(d->digest, is_trusted_extrainfo))
continue;
if (requireother && me && router_digest_is_me(d->digest)) if (requireother && me && router_digest_is_me(d->digest))
continue; continue;
if (try_excluding && if (try_excluding &&