2010-07-21 17:08:11 +02:00
|
|
|
/* Copyright (c) 2001-2004, Roger Dingledine.
|
|
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
2012-06-05 02:58:17 +02:00
|
|
|
* Copyright (c) 2007-2012, The Tor Project, Inc. */
|
2010-07-21 17:08:11 +02:00
|
|
|
/* See LICENSE for licensing information */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file routerlist.h
|
2010-07-28 17:42:33 +02:00
|
|
|
* \brief Header file for routerlist.c.
|
2010-07-21 17:08:11 +02:00
|
|
|
**/
|
|
|
|
|
|
|
|
#ifndef _TOR_ROUTERLIST_H
|
|
|
|
#define _TOR_ROUTERLIST_H
|
|
|
|
|
2010-11-08 20:27:36 +01:00
|
|
|
int get_n_authorities(dirinfo_type_t type);
|
2010-07-21 17:08:11 +02:00
|
|
|
int trusted_dirs_reload_certs(void);
|
|
|
|
int trusted_dirs_load_certs_from_string(const char *contents, int from_store,
|
|
|
|
int flush);
|
|
|
|
void trusted_dirs_flush_certs_to_disk(void);
|
|
|
|
authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest);
|
|
|
|
authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest);
|
|
|
|
authority_cert_t *authority_cert_get_by_digests(const char *id_digest,
|
|
|
|
const char *sk_digest);
|
|
|
|
void authority_cert_get_all(smartlist_t *certs_out);
|
|
|
|
void authority_cert_dl_failed(const char *id_digest, int status);
|
|
|
|
void authority_certs_fetch_missing(networkstatus_t *status, time_t now);
|
|
|
|
int router_reload_router_list(void);
|
2010-09-02 22:42:18 +02:00
|
|
|
int authority_cert_dl_looks_uncertain(const char *id_digest);
|
2010-07-21 17:08:11 +02:00
|
|
|
smartlist_t *router_get_trusted_dir_servers(void);
|
|
|
|
|
2010-11-08 20:27:36 +01:00
|
|
|
const routerstatus_t *router_pick_directory_server(dirinfo_type_t type,
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int flags);
|
2010-07-21 17:08:11 +02:00
|
|
|
trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d);
|
|
|
|
trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d);
|
2010-11-08 20:27:36 +01:00
|
|
|
const routerstatus_t *router_pick_trusteddirserver(dirinfo_type_t type,
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int flags);
|
2010-07-21 17:08:11 +02:00
|
|
|
int router_get_my_share_of_directory_requests(double *v2_share_out,
|
|
|
|
double *v3_share_out);
|
|
|
|
void router_reset_status_download_failures(void);
|
2010-09-15 04:19:00 +02:00
|
|
|
int routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2);
|
2010-09-29 06:38:32 +02:00
|
|
|
int router_nickname_is_in_list(const routerinfo_t *router, const char *list);
|
|
|
|
const routerinfo_t *routerlist_find_my_routerinfo(void);
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
const node_t *router_find_exact_exit_enclave(const char *address,
|
2010-07-21 17:08:11 +02:00
|
|
|
uint16_t port);
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int node_is_unreliable(const node_t *router, int need_uptime,
|
2010-07-21 17:08:11 +02:00
|
|
|
int need_capacity, int need_guard);
|
2010-09-29 06:38:32 +02:00
|
|
|
uint32_t router_get_advertised_bandwidth(const routerinfo_t *router);
|
|
|
|
uint32_t router_get_advertised_bandwidth_capped(const routerinfo_t *router);
|
2010-07-21 17:08:11 +02:00
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
const node_t *node_sl_choose_by_bandwidth(smartlist_t *sl,
|
|
|
|
bandwidth_weight_rule_t rule);
|
2010-07-21 17:08:11 +02:00
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
const node_t *router_choose_random_node(smartlist_t *excludedsmartlist,
|
2010-07-21 17:08:11 +02:00
|
|
|
struct routerset_t *excludedset,
|
|
|
|
router_crn_flags_t flags);
|
|
|
|
|
2010-09-29 06:38:32 +02:00
|
|
|
const routerinfo_t *router_get_by_nickname(const char *nickname,
|
2010-07-21 17:08:11 +02:00
|
|
|
int warn_if_unnamed);
|
2011-05-30 21:41:46 +02:00
|
|
|
int router_is_named(const routerinfo_t *router);
|
2010-07-21 17:08:11 +02:00
|
|
|
int router_digest_is_trusted_dir_type(const char *digest,
|
2010-11-08 20:27:36 +01:00
|
|
|
dirinfo_type_t type);
|
2010-07-21 17:08:11 +02:00
|
|
|
#define router_digest_is_trusted_dir(d) \
|
2010-11-08 20:35:02 +01:00
|
|
|
router_digest_is_trusted_dir_type((d), NO_DIRINFO)
|
2010-07-21 17:08:11 +02:00
|
|
|
|
|
|
|
int router_addr_is_trusted_dir(uint32_t addr);
|
|
|
|
int hexdigest_to_digest(const char *hexdigest, char *digest);
|
2010-09-29 06:38:32 +02:00
|
|
|
const routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
|
2010-10-14 17:49:51 +02:00
|
|
|
const routerinfo_t *router_get_by_id_digest(const char *digest);
|
2010-09-29 06:38:32 +02:00
|
|
|
routerinfo_t *router_get_mutable_by_digest(const char *digest);
|
2010-07-21 17:08:11 +02:00
|
|
|
signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
|
|
|
|
signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest);
|
|
|
|
signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
|
2010-09-29 06:38:32 +02:00
|
|
|
const char *signed_descriptor_get_body(const signed_descriptor_t *desc);
|
|
|
|
const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc);
|
2010-07-21 17:08:11 +02:00
|
|
|
routerlist_t *router_get_routerlist(void);
|
|
|
|
void routerinfo_free(routerinfo_t *router);
|
|
|
|
void extrainfo_free(extrainfo_t *extrainfo);
|
|
|
|
void routerlist_free(routerlist_t *rl);
|
|
|
|
void dump_routerlist_mem_usage(int severity);
|
|
|
|
void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old,
|
|
|
|
time_t now);
|
|
|
|
void routerlist_free_all(void);
|
|
|
|
void routerlist_reset_warnings(void);
|
|
|
|
void router_set_status(const char *digest, int up);
|
|
|
|
|
|
|
|
static int WRA_WAS_ADDED(was_router_added_t s);
|
|
|
|
static int WRA_WAS_OUTDATED(was_router_added_t s);
|
|
|
|
static int WRA_WAS_REJECTED(was_router_added_t s);
|
2012-06-05 06:17:54 +02:00
|
|
|
/** Return true iff the outcome code in <b>s</b> indicates that the descriptor
|
|
|
|
* was added. It might still be necessary to check whether the descriptor
|
|
|
|
* generator should be notified.
|
2010-07-21 17:08:11 +02:00
|
|
|
*/
|
|
|
|
static INLINE int
|
|
|
|
WRA_WAS_ADDED(was_router_added_t s) {
|
|
|
|
return s == ROUTER_ADDED_SUCCESSFULLY || s == ROUTER_ADDED_NOTIFY_GENERATOR;
|
|
|
|
}
|
2012-06-05 06:17:54 +02:00
|
|
|
/** Return true iff the outcome code in <b>s</b> indicates that the descriptor
|
|
|
|
* was not added because it was either:
|
2010-07-21 17:08:11 +02:00
|
|
|
* - not in the consensus
|
|
|
|
* - neither in the consensus nor in any networkstatus document
|
|
|
|
* - it was outdated.
|
|
|
|
*/
|
|
|
|
static INLINE int WRA_WAS_OUTDATED(was_router_added_t s)
|
|
|
|
{
|
|
|
|
return (s == ROUTER_WAS_NOT_NEW ||
|
|
|
|
s == ROUTER_NOT_IN_CONSENSUS ||
|
|
|
|
s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS);
|
|
|
|
}
|
2012-06-05 06:17:54 +02:00
|
|
|
/** Return true iff the outcome code in <b>s</b> indicates that the descriptor
|
|
|
|
* was flat-out rejected. */
|
2010-07-21 17:08:11 +02:00
|
|
|
static INLINE int WRA_WAS_REJECTED(was_router_added_t s)
|
|
|
|
{
|
|
|
|
return (s == ROUTER_AUTHDIR_REJECTS);
|
|
|
|
}
|
|
|
|
was_router_added_t router_add_to_routerlist(routerinfo_t *router,
|
|
|
|
const char **msg,
|
|
|
|
int from_cache,
|
|
|
|
int from_fetch);
|
|
|
|
was_router_added_t router_add_extrainfo_to_routerlist(
|
|
|
|
extrainfo_t *ei, const char **msg,
|
|
|
|
int from_cache, int from_fetch);
|
2010-08-18 19:36:09 +02:00
|
|
|
void routerlist_descriptors_added(smartlist_t *sl, int from_cache);
|
2010-07-21 17:08:11 +02:00
|
|
|
void routerlist_remove_old_routers(void);
|
|
|
|
int router_load_single_router(const char *s, uint8_t purpose, int cache,
|
|
|
|
const char **msg);
|
|
|
|
int router_load_routers_from_string(const char *s, const char *eos,
|
|
|
|
saved_location_t saved_location,
|
|
|
|
smartlist_t *requested_fingerprints,
|
|
|
|
int descriptor_digests,
|
|
|
|
const char *prepend_annotations);
|
|
|
|
void router_load_extrainfo_from_string(const char *s, const char *eos,
|
|
|
|
saved_location_t saved_location,
|
|
|
|
smartlist_t *requested_fingerprints,
|
|
|
|
int descriptor_digests);
|
|
|
|
|
|
|
|
void routerlist_retry_directory_downloads(time_t now);
|
2011-07-15 18:58:13 +02:00
|
|
|
int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port,
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int need_uptime);
|
|
|
|
|
2010-09-29 06:38:32 +02:00
|
|
|
int router_exit_policy_rejects_all(const routerinfo_t *router);
|
2010-07-21 17:08:11 +02:00
|
|
|
trusted_dir_server_t *add_trusted_dir_server(const char *nickname,
|
|
|
|
const char *address,
|
|
|
|
uint16_t dir_port, uint16_t or_port,
|
|
|
|
const char *digest, const char *v3_auth_digest,
|
2010-11-08 20:27:36 +01:00
|
|
|
dirinfo_type_t type);
|
2010-07-21 17:08:11 +02:00
|
|
|
void authority_cert_free(authority_cert_t *cert);
|
|
|
|
void clear_trusted_dir_servers(void);
|
|
|
|
int any_trusted_dir_is_v1_authority(void);
|
|
|
|
void update_consensus_router_descriptor_downloads(time_t now, int is_vote,
|
|
|
|
networkstatus_t *consensus);
|
|
|
|
void update_router_descriptor_downloads(time_t now);
|
2010-11-12 18:05:27 +01:00
|
|
|
void update_all_descriptor_downloads(time_t now);
|
2010-07-21 17:08:11 +02:00
|
|
|
void update_extrainfo_downloads(time_t now);
|
|
|
|
int router_have_minimum_dir_info(void);
|
|
|
|
void router_dir_info_changed(void);
|
|
|
|
const char *get_dir_info_status_string(void);
|
|
|
|
int count_loading_descriptors_progress(void);
|
|
|
|
void router_reset_descriptor_download_failures(void);
|
2010-09-29 06:38:32 +02:00
|
|
|
int router_differences_are_cosmetic(const routerinfo_t *r1,
|
|
|
|
const routerinfo_t *r2);
|
|
|
|
int routerinfo_incompatible_with_extrainfo(const routerinfo_t *ri,
|
|
|
|
extrainfo_t *ei,
|
2010-07-21 17:08:11 +02:00
|
|
|
signed_descriptor_t *sd,
|
|
|
|
const char **msg);
|
|
|
|
|
2010-09-29 06:38:32 +02:00
|
|
|
void routerlist_assert_ok(const routerlist_t *rl);
|
|
|
|
const char *esc_router_info(const routerinfo_t *router);
|
2010-07-21 17:08:11 +02:00
|
|
|
void routers_sort_by_identity(smartlist_t *routers);
|
|
|
|
|
|
|
|
routerset_t *routerset_new(void);
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
void routerset_refresh_countries(routerset_t *rs);
|
2010-07-21 17:08:11 +02:00
|
|
|
int routerset_parse(routerset_t *target, const char *s,
|
|
|
|
const char *description);
|
|
|
|
void routerset_union(routerset_t *target, const routerset_t *source);
|
|
|
|
int routerset_is_list(const routerset_t *set);
|
|
|
|
int routerset_needs_geoip(const routerset_t *set);
|
2011-04-04 01:43:47 +02:00
|
|
|
int routerset_is_empty(const routerset_t *set);
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int routerset_contains_router(const routerset_t *set, const routerinfo_t *ri,
|
|
|
|
country_t country);
|
2010-07-21 17:08:11 +02:00
|
|
|
int routerset_contains_routerstatus(const routerset_t *set,
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
const routerstatus_t *rs,
|
|
|
|
country_t country);
|
2010-07-21 17:08:11 +02:00
|
|
|
int routerset_contains_extendinfo(const routerset_t *set,
|
|
|
|
const extend_info_t *ei);
|
2011-04-27 20:36:30 +02:00
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int routerset_contains_node(const routerset_t *set, const node_t *node);
|
|
|
|
void routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset,
|
2011-04-27 20:36:30 +02:00
|
|
|
const routerset_t *excludeset,
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int running_only);
|
2011-03-11 10:35:08 +01:00
|
|
|
#if 0
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
void routersets_get_node_disjunction(smartlist_t *target,
|
|
|
|
const smartlist_t *source,
|
2010-07-21 17:08:11 +02:00
|
|
|
const routerset_t *include,
|
|
|
|
const routerset_t *exclude, int running_only);
|
2011-03-11 10:35:08 +01:00
|
|
|
#endif
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
void routerset_subtract_nodes(smartlist_t *out,
|
2010-07-21 17:08:11 +02:00
|
|
|
const routerset_t *routerset);
|
2011-04-27 20:36:30 +02:00
|
|
|
|
2010-07-21 17:08:11 +02:00
|
|
|
char *routerset_to_string(const routerset_t *routerset);
|
|
|
|
int routerset_equal(const routerset_t *old, const routerset_t *new);
|
|
|
|
void routerset_free(routerset_t *routerset);
|
|
|
|
void refresh_all_country_info(void);
|
|
|
|
|
|
|
|
int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs,
|
|
|
|
const char *id);
|
|
|
|
int hid_serv_acting_as_directory(void);
|
|
|
|
int hid_serv_responsible_for_desc_id(const char *id);
|
|
|
|
|
2010-05-11 23:20:33 +02:00
|
|
|
void list_pending_microdesc_downloads(digestmap_t *result);
|
|
|
|
void launch_descriptor_downloads(int purpose,
|
|
|
|
smartlist_t *downloadable,
|
2010-09-29 07:35:08 +02:00
|
|
|
const routerstatus_t *source,
|
2010-05-11 23:20:33 +02:00
|
|
|
time_t now);
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
int hex_digest_nickname_decode(const char *hexdigest,
|
|
|
|
char *digest_out,
|
|
|
|
char *nickname_qualifier_out,
|
|
|
|
char *nickname_out);
|
|
|
|
|
2012-08-09 19:47:42 +02:00
|
|
|
#ifdef ROUTERLIST_PRIVATE
|
|
|
|
int choose_array_element_by_weight(const uint64_t *entries, int n_entries,
|
|
|
|
uint64_t *total_out);
|
|
|
|
#endif
|
|
|
|
|
2010-07-21 17:08:11 +02:00
|
|
|
#endif
|
|
|
|
|