12 #ifndef TOR_ENTRYNODES_H
13 #define TOR_ENTRYNODES_H
18 typedef struct guard_selection_t guard_selection_t;
21 typedef struct entry_guard_t entry_guard_t;
25 typedef struct circuit_guard_state_t circuit_guard_state_t;
29 typedef struct entry_guard_restriction_t entry_guard_restriction_t;
66 #if defined(ENTRYNODES_PRIVATE)
75 #define GUARD_REACHABLE_NO 0
76 #define GUARD_REACHABLE_YES 1
77 #define GUARD_REACHABLE_MAYBE 2
84 struct entry_guard_t {
85 HANDLE_ENTRY(entry_guard, entry_guard_t);
102 time_t sampled_on_date;
107 time_t unlisted_since_date;
109 char *sampled_by_version;
112 unsigned currently_listed : 1;
118 time_t confirmed_on_date;
140 char *selection_name;
149 time_t last_tried_to_connect;
152 unsigned is_reachable : 2;
157 unsigned is_pending : 1;
160 unsigned is_persistent : 1;
165 time_t failing_since;
170 unsigned is_filtered_guard : 1;
175 unsigned is_usable_filtered_guard : 1;
176 unsigned is_primary:1;
180 char *extra_state_fields;
184 guard_selection_t *in_selection;
194 typedef enum guard_selection_type_t {
207 } guard_selection_type_t;
220 struct guard_selection_t {
229 guard_selection_type_t type;
237 int primary_guards_up_to_date;
276 time_t last_time_on_internet;
280 int next_confirmed_idx;
286 int next_sampled_idx;
290 struct entry_guard_handle_t;
293 typedef enum guard_restriction_type_t {
297 RST_OUTDATED_MD_DIRSERVER = 1
298 } guard_restriction_type_t;
307 struct entry_guard_restriction_t {
309 guard_restriction_type_t type;
320 struct circuit_guard_state_t {
322 struct entry_guard_handle_t *guard;
334 entry_guard_restriction_t *restrictions;
342 circuit_guard_state_t **guard_state_out);
344 circuit_guard_state_t **guard_state_out);
350 guard_selection_t *gs,
const char *digest);
353 circuit_guard_state_t *
359 int num_live_entry_guards_for_guard_selection(
360 guard_selection_t *gs,
362 int num_live_entry_guards(
int for_directory);
373 GUARD_USAGE_TRAFFIC = 0,
374 GUARD_USAGE_DIRGUARD = 1
377 #define circuit_guard_state_free(val) \
378 FREE_AND_NULL(circuit_guard_state_t, circuit_guard_state_free_, (val))
383 entry_guard_restriction_t *rst,
384 const node_t **chosen_node_out,
385 circuit_guard_state_t **guard_state_out);
389 GUARD_USABLE_NEVER = -1,
390 GUARD_MAYBE_USABLE_LATER = 0,
391 GUARD_USABLE_NOW = 1,
411 #ifdef ENTRYNODES_PRIVATE
421 #define DFLT_MAX_SAMPLE_THRESHOLD_PERCENT 20
426 #define DFLT_MAX_SAMPLE_SIZE 60
430 #define DFLT_MIN_FILTERED_SAMPLE_SIZE 20
434 #define DFLT_REMOVE_UNLISTED_GUARDS_AFTER_DAYS 20
439 #define DFLT_GUARD_LIFETIME_DAYS 120
444 #define DFLT_GUARD_CONFIRMED_MIN_LIFETIME_DAYS 60
448 #define DFLT_N_PRIMARY_GUARDS 3
453 #define DFLT_N_PRIMARY_GUARDS_TO_USE 1
457 #define DFLT_N_PRIMARY_DIR_GUARDS_TO_USE 3
462 #define DFLT_INTERNET_LIKELY_DOWN_INTERVAL (10*60)
468 #define DFLT_NONPRIMARY_GUARD_CONNECT_TIMEOUT 15
473 #define DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT (10*60)
478 #define DFLT_MEANINGFUL_RESTRICTION_PERCENT 20
483 #define DFLT_EXTREME_RESTRICTION_PERCENT 1
500 HANDLE_DECL(entry_guard, entry_guard_t,
STATIC)
501 #define entry_guard_handle_free(h) \
502 FREE_AND_NULL(entry_guard_handle_t, entry_guard_handle_free_, (h))
505 guard_selection_type_t type_in,
508 guard_selection_type_t type);
510 const char *
name, guard_selection_type_t type,
int create_if_absent);
512 #define guard_selection_free(gs) \
513 FREE_AND_NULL(guard_selection_t, guard_selection_free_, (gs))
515 (guard_selection_t *gs,
const entry_guard_t *guard));
518 const guard_selection_t *old_selection,
519 guard_selection_type_t *type_out);
521 const uint8_t *rsa_id);
527 entry_guard_restriction_t *rst));
533 dense_sampled_index);
535 #define entry_guard_free(e) \
536 FREE_AND_NULL(entry_guard_t, entry_guard_free_, (e))
544 #define SAMPLE_EXCLUDE_CONFIRMED (1u<<0)
545 #define SAMPLE_EXCLUDE_PRIMARY (1u<<1)
546 #define SAMPLE_EXCLUDE_PENDING (1u<<2)
547 #define SAMPLE_NO_UPDATE_PRIMARY (1u<<3)
548 #define SAMPLE_EXCLUDE_NO_DESCRIPTOR (1u<<4)
551 guard_selection_t *gs,
552 const entry_guard_restriction_t *rst,
559 const entry_guard_restriction_t *rst);
568 #define GUARD_CIRC_STATE_USABLE_ON_COMPLETION 1
572 #define GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD 2
575 #define GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD 3
578 #define GUARD_CIRC_STATE_COMPLETE 4
580 #define GUARD_CIRC_STATE_DEAD 5
583 entry_guard_t *guard);
586 const entry_guard_restriction_t *rst,
587 unsigned *state_out);
590 entry_guard_t *guard,
595 STATIC entry_guard_restriction_t *guard_create_exit_restriction(
596 const uint8_t *exit_id);
601 #define entry_guard_restriction_free(rst) \
602 FREE_AND_NULL(entry_guard_restriction_t, \
603 entry_guard_restriction_free_, (rst))
612 const uint8_t *rsa_id_digest);
616 int entry_guards_parse_state_for_guard_selection(
617 guard_selection_t *gs,
or_state_t *state,
int set,
char **msg);
621 const char *question,
char **answer,
622 const char **errmsg);
624 int entries_known_but_down(
const or_options_t *options);
628 int num_present,
int num_usable);
631 int num_present,
int num_usable);
652 uint32_t guardfraction_percentage);
Header for crypto_ed25519.c.
STATIC int get_n_primary_guards(void)
STATIC void entry_guards_update_primary(guard_selection_t *gs)
STATIC void entry_guards_note_guard_failure(guard_selection_t *gs, entry_guard_t *guard)
STATIC void guard_selection_free_(guard_selection_t *gs)
STATIC double get_meaningful_restriction_threshold(void)
STATIC entry_guard_t * entry_guards_expand_sample(guard_selection_t *gs)
STATIC guard_selection_type_t guard_selection_infer_type(guard_selection_type_t type, const char *name)
STATIC int get_nonprimary_guard_idle_timeout(void)
STATIC void mark_primary_guards_maybe_reachable(guard_selection_t *gs)
STATIC double get_extreme_restriction_threshold(void)
STATIC int get_min_filtered_sample_size(void)
STATIC guard_selection_t * get_guard_selection_by_name(const char *name, guard_selection_type_t type, int create_if_absent)
STATIC void entry_guard_free_(entry_guard_t *e)
STATIC void entry_guard_restriction_free_(entry_guard_restriction_t *rst)
STATIC entry_guard_t * entry_guard_add_to_sample(guard_selection_t *gs, const node_t *node)
STATIC int get_guard_confirmed_min_lifetime(void)
STATIC entry_guard_restriction_t * guard_create_dirserver_md_restriction(void)
STATIC int entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b)
STATIC entry_guard_t * first_reachable_filtered_entry_guard(guard_selection_t *gs, const entry_guard_restriction_t *rst, unsigned flags)
STATIC void entry_guards_update_confirmed(guard_selection_t *gs)
STATIC void entry_guards_update_filtered_sets(guard_selection_t *gs)
STATIC const char * choose_guard_selection(const or_options_t *options, const networkstatus_t *live_ns, const guard_selection_t *old_selection, guard_selection_type_t *type_out)
STATIC entry_guard_t * get_sampled_guard_with_id(guard_selection_t *gs, const uint8_t *rsa_id)
STATIC char * getinfo_helper_format_single_entry_guard(const entry_guard_t *e)
STATIC int get_remove_unlisted_guards_after_days(void)
STATIC int get_max_sample_size_absolute(void)
STATIC entry_guard_t * select_entry_guard_for_circuit(guard_selection_t *gs, guard_usage_t usage, const entry_guard_restriction_t *rst, unsigned *state_out)
STATIC int get_nonprimary_guard_connect_timeout(void)
STATIC unsigned entry_guards_note_guard_success(guard_selection_t *gs, entry_guard_t *guard, unsigned old_state)
STATIC int entry_guard_is_listed(guard_selection_t *gs, const entry_guard_t *guard)
STATIC char * entry_guard_encode_for_state(entry_guard_t *guard, int dense_sampled_idx)
STATIC void entry_guard_consider_retry(entry_guard_t *guard)
STATIC double get_max_sample_threshold(void)
STATIC int num_reachable_filtered_guards(const guard_selection_t *gs, const entry_guard_restriction_t *rst)
STATIC circuit_guard_state_t * circuit_guard_state_new(entry_guard_t *guard, unsigned state, entry_guard_restriction_t *rst)
STATIC int entry_guards_all_primary_guards_are_down(guard_selection_t *gs)
STATIC time_t randomize_time(time_t now, time_t max_backdate)
STATIC int get_n_primary_guards_to_use(guard_usage_t usage)
STATIC void make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard)
STATIC int get_guard_lifetime(void)
STATIC void sampled_guards_update_from_consensus(guard_selection_t *gs)
STATIC guard_selection_t * guard_selection_new(const char *name, guard_selection_type_t type)
STATIC entry_guard_t * entry_guard_parse_from_state(const char *s)
STATIC int get_internet_likely_down_interval(void)
void entry_guard_failed(circuit_guard_state_t **guard_state_p)
entry_guard_t * entry_guard_get_by_id_digest(const char *digest)
void entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, const uint8_t *rsa_id_digest)
void entry_guard_chan_failed(channel_t *chan)
char * guard_selection_get_err_str_if_dir_info_missing(guard_selection_t *gs, int using_mds, int num_present, int num_usable)
void entry_guards_changed(void)
const node_t * entry_guard_find_node(const entry_guard_t *guard)
char * entry_guards_get_err_str_if_dir_info_missing(int using_mds, int num_present, int num_usable)
void remove_all_entry_guards(void)
void entry_guard_cancel(circuit_guard_state_t **guard_state_p)
void remove_all_entry_guards_for_guard_selection(guard_selection_t *gs)
int num_bridges_usable(int use_maybe_reachable)
int entry_guards_update_all(guard_selection_t *gs)
guard_pathbias_t * entry_guard_get_pathbias_state(entry_guard_t *guard)
const char * entry_guard_describe(const entry_guard_t *guard)
int entry_list_is_constrained(const or_options_t *options)
guard_usable_t entry_guard_succeeded(circuit_guard_state_t **guard_state_p)
void entry_guards_note_internet_connectivity(guard_selection_t *gs)
double pathbias_get_use_success_count(entry_guard_t *guard)
void entry_guards_update_state(or_state_t *state)
const char * entry_guard_get_rsa_id_digest(const entry_guard_t *guard)
int update_guard_selection_choice(const or_options_t *options)
void circuit_guard_state_free_(circuit_guard_state_t *state)
int entry_guard_pick_for_circuit(guard_selection_t *gs, guard_usage_t usage, entry_guard_restriction_t *rst, const node_t **chosen_node_out, circuit_guard_state_t **guard_state_out)
const node_t * guards_choose_dirguard(uint8_t dir_purpose, circuit_guard_state_t **guard_state_out)
entry_guard_t * entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, const char *digest)
int entry_guards_parse_state(or_state_t *state, int set, char **msg)
int entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
int entry_guard_could_succeed(const circuit_guard_state_t *guard_state)
int guards_retry_optimistic(const or_options_t *options)
circuit_guard_state_t * get_guard_state_for_bridge_desc_fetch(const char *digest)
const node_t * guards_choose_guard(cpath_build_state_t *state, uint8_t purpose, circuit_guard_state_t **guard_state_out)
int should_apply_guardfraction(const networkstatus_t *ns)
void entry_guards_changed_for_guard_selection(guard_selection_t *gs)
int getinfo_helper_entry_guards(control_connection_t *conn, const char *question, char **answer, const char **errmsg)
guard_selection_t * get_guard_selection_info(void)
int guards_update_all(void)
int entry_guards_upgrade_waiting_circuits(guard_selection_t *gs, const smartlist_t *all_circuits, smartlist_t *newly_complete_out)
void entry_guards_free_all(void)
double pathbias_get_close_success_count(entry_guard_t *guard)
Macros for C weak-handle implementation.
#define MAX_HEX_NICKNAME_LEN
unsigned int path_bias_use_noticed
unsigned int path_bias_use_extreme
unsigned int path_bias_warned
unsigned int path_bias_extreme
double collapsed_circuits
unsigned int path_bias_disabled
double successful_circuits_closed
unsigned int path_bias_noticed
#define MOCK_DECL(rv, funcname, arglist)