or.h
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:207k
- int AutomapHostsOnResolve; /**< If true, when we get a resolve request for a
- * hostname ending with one of the suffixes in
- * <b>AutomapHostsSuffixes</b>, map it to a
- * virtual address. */
- smartlist_t *AutomapHostsSuffixes; /**< List of suffixes for
- * <b>AutomapHostsOnResolve</b>. */
- int RendPostPeriod; /**< How often do we post each rendezvous service
- * descriptor? Remember to publish them independently. */
- int KeepalivePeriod; /**< How often do we send padding cells to keep
- * connections alive? */
- int SocksTimeout; /**< How long do we let a socks connection wait
- * unattached before we fail it? */
- int CircuitBuildTimeout; /**< Cull non-open circuits that were born
- * at least this many seconds ago. */
- int CircuitIdleTimeout; /**< Cull open clean circuits that were born
- * at least this many seconds ago. */
- int MaxOnionsPending; /**< How many circuit CREATE requests do we allow
- * to wait simultaneously before we start dropping
- * them? */
- int NewCircuitPeriod; /**< How long do we use a circuit before building
- * a new one? */
- int MaxCircuitDirtiness; /**< Never use circs that were first used more than
- this interval ago. */
- uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing
- * to use in a second? */
- uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing
- * to use in a second? */
- uint64_t MaxAdvertisedBandwidth; /**< How much bandwidth are we willing to
- * tell people we have? */
- uint64_t RelayBandwidthRate; /**< How much bandwidth, on average, are we
- * willing to use for all relayed conns? */
- uint64_t RelayBandwidthBurst; /**< How much bandwidth, at maximum, will we
- * use in a second for all relayed conns? */
- int NumCpus; /**< How many CPUs should we try to use? */
- int RunTesting; /**< If true, create testing circuits to measure how well the
- * other ORs are running. */
- config_line_t *RendConfigLines; /**< List of configuration lines
- * for rendezvous services. */
- config_line_t *HidServAuth; /**< List of configuration lines for client-side
- * authorizations for hidden services */
- char *ContactInfo; /**< Contact info to be published in the directory. */
- char *HttpProxy; /**< hostname[:port] to use as http proxy, if any. */
- uint32_t HttpProxyAddr; /**< Parsed IPv4 addr for http proxy, if any. */
- uint16_t HttpProxyPort; /**< Parsed port for http proxy, if any. */
- char *HttpProxyAuthenticator; /**< username:password string, if any. */
- char *HttpsProxy; /**< hostname[:port] to use as https proxy, if any. */
- uint32_t HttpsProxyAddr; /**< Parsed IPv4 addr for https proxy, if any. */
- uint16_t HttpsProxyPort; /**< Parsed port for https proxy, if any. */
- char *HttpsProxyAuthenticator; /**< username:password string, if any. */
- /** List of configuration lines for replacement directory authorities.
- * If you just want to replace one class of authority at a time,
- * use the "Alternate*Authority" options below instead. */
- config_line_t *DirServers;
- /** If set, use these main (currently v3) directory authorities and
- * not the default ones. */
- config_line_t *AlternateDirAuthority;
- /** If set, use these bridge authorities and not the default one. */
- config_line_t *AlternateBridgeAuthority;
- /** If set, use these HS authorities and not the default ones. */
- config_line_t *AlternateHSAuthority;
- char *MyFamily; /**< Declared family for this OR. */
- config_line_t *NodeFamilies; /**< List of config lines for
- * node families */
- config_line_t *AuthDirBadDir; /**< Address policy for descriptors to
- * mark as bad dir mirrors. */
- config_line_t *AuthDirBadExit; /**< Address policy for descriptors to
- * mark as bad exits. */
- config_line_t *AuthDirReject; /**< Address policy for descriptors to
- * reject. */
- config_line_t *AuthDirInvalid; /**< Address policy for descriptors to
- * never mark as valid. */
- int AuthDirListBadDirs; /**< True iff we should list bad dirs,
- * and vote for all other dir mirrors as good. */
- int AuthDirListBadExits; /**< True iff we should list bad exits,
- * and vote for all other exits as good. */
- int AuthDirRejectUnlisted; /**< Boolean: do we reject all routers that
- * aren't named in our fingerprint file? */
- int AuthDirMaxServersPerAddr; /**< Do not permit more than this
- * number of servers per IP address. */
- int AuthDirMaxServersPerAuthAddr; /**< Do not permit more than this
- * number of servers per IP address shared
- * with an authority. */
- char *AccountingStart; /**< How long is the accounting interval, and when
- * does it start? */
- uint64_t AccountingMax; /**< How many bytes do we allow per accounting
- * interval before hibernation? 0 for "never
- * hibernate." */
- /** Base64-encoded hash of accepted passwords for the control system. */
- config_line_t *HashedControlPassword;
- /** As HashedControlPassword, but not saved. */
- config_line_t *HashedControlSessionPassword;
- int CookieAuthentication; /**< Boolean: do we enable cookie-based auth for
- * the control system? */
- char *CookieAuthFile; /**< Location of a cookie authentication file. */
- int CookieAuthFileGroupReadable; /**< Boolean: Is the CookieAuthFile g+r? */
- int LeaveStreamsUnattached; /**< Boolean: Does Tor attach new streams to
- * circuits itself (0), or does it expect a controller
- * to cope? (1) */
- int DisablePredictedCircuits; /**< Boolean: does Tor preemptively
- * make circuits in the background (0),
- * or not (1)? */
- int ShutdownWaitLength; /**< When we get a SIGINT and we're a server, how
- * long do we wait before exiting? */
- int SafeLogging; /**< Boolean: are we allowed to log sensitive strings
- * such as addresses (0), or do we scrub them first (1)? */
- int SafeSocks; /**< Boolean: should we outright refuse application
- * connections that use socks4 or socks5-with-local-dns? */
- #define LOG_PROTOCOL_WARN (get_options()->ProtocolWarnings ?
- LOG_WARN : LOG_INFO)
- int ProtocolWarnings; /**< Boolean: when other parties screw up the Tor
- * protocol, is it a warn or an info in our logs? */
- int TestSocks; /**< Boolean: when we get a socks connection, do we loudly
- * log whether it was DNS-leaking or not? */
- int HardwareAccel; /**< Boolean: Should we enable OpenSSL hardware
- * acceleration where available? */
- int UseEntryGuards; /**< Boolean: Do we try to enter from a smallish number
- * of fixed nodes? */
- int NumEntryGuards; /**< How many entry guards do we try to establish? */
- int RephistTrackTime; /**< How many seconds do we keep rephist info? */
- int FastFirstHopPK; /**< If Tor believes it is safe, should we save a third
- * of our PK time by sending CREATE_FAST cells? */
- /** Should we always fetch our dir info on the mirror schedule (which
- * means directly from the authorities) no matter our other config? */
- int FetchDirInfoEarly;
- char *VirtualAddrNetwork; /**< Address and mask to hand out for virtual
- * MAPADDRESS requests. */
- int ServerDNSSearchDomains; /**< Boolean: If set, we don't force exit
- * addresses to be FQDNs, but rather search for them in
- * the local domains. */
- int ServerDNSDetectHijacking; /**< Boolean: If true, check for DNS failure
- * hijacking. */
- int ServerDNSRandomizeCase; /**< Boolean: Use the 0x20-hack to prevent
- * DNS poisoning attacks. */
- char *ServerDNSResolvConfFile; /**< If provided, we configure our internal
- * resolver from the file here rather than from
- * /etc/resolv.conf (Unix) or the registry (Windows). */
- char *DirPortFrontPage; /**< This is a full path to a file with an html
- disclaimer. This allows a server administrator to show
- that they're running Tor and anyone visiting their server
- will know this without any specialized knowledge. */
- /** Boolean: if set, we start even if our resolv.conf file is missing
- * or broken. */
- int ServerDNSAllowBrokenConfig;
- smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely
- * should be resolvable. Used for
- * testing our DNS server. */
- int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the
- * same network zone in the same circuit. */
- int TunnelDirConns; /**< If true, use BEGIN_DIR rather than BEGIN when
- * possible. */
- int PreferTunneledDirConns; /**< If true, avoid dirservers that don't
- * support BEGIN_DIR, when possible. */
- int AllowNonRFC953Hostnames; /**< If true, we allow connections to hostnames
- * with weird characters. */
- /** If true, we try resolving hostnames with weird characters. */
- int ServerDNSAllowNonRFC953Hostnames;
- /** If true, we try to download extra-info documents (and we serve them,
- * if we are a cache). For authorities, this is always true. */
- int DownloadExtraInfo;
- /** If true, and we are acting as a relay, allow exit circuits even when
- * we are the first hop of a circuit. */
- int AllowSingleHopExits;
- /** If true, don't allow relays with AllowSingleHopExits=1 to be used in
- * circuits that we build. */
- int ExcludeSingleHopRelays;
- /** If true, and the controller tells us to use a one-hop circuit, and the
- * exit allows it, we use it. */
- int AllowSingleHopCircuits;
- /** If true, do not believe anybody who tells us that a domain resolves
- * to an internal address, or that an internal address has a PTR mapping.
- * Helps avoid some cross-site attacks. */
- int ClientDNSRejectInternalAddresses;
- /** The length of time that we think a consensus should be fresh. */
- int V3AuthVotingInterval;
- /** The length of time we think it will take to distribute votes. */
- int V3AuthVoteDelay;
- /** The length of time we think it will take to distribute signatures. */
- int V3AuthDistDelay;
- /** The number of intervals we think a consensus should be valid. */
- int V3AuthNIntervalsValid;
- /** Should advertise and sign consensuses with a legacy key, for key
- * migration purposes? */
- int V3AuthUseLegacyKey;
- /** The length of time that we think an initial consensus should be fresh.
- * Only altered on testing networks. */
- int TestingV3AuthInitialVotingInterval;
- /** The length of time we think it will take to distribute initial votes.
- * Only altered on testing networks. */
- int TestingV3AuthInitialVoteDelay;
- /** The length of time we think it will take to distribute initial
- * signatures. Only altered on testing networks.*/
- int TestingV3AuthInitialDistDelay;
- /** If an authority has been around for less than this amount of time, it
- * does not believe its reachability information is accurate. Only
- * altered on testing networks. */
- int TestingAuthDirTimeToLearnReachability;
- /** Clients don't download any descriptor this recent, since it will
- * probably not have propagated to enough caches. Only altered on testing
- * networks. */
- int TestingEstimatedDescriptorPropagationTime;
- /** If true, we take part in a testing network. Change the defaults of a
- * couple of other configuration options and allow to change the values
- * of certain configuration options. */
- int TestingTorNetwork;
- /** File to check for a consensus networkstatus, if we don't have one
- * cached. */
- char *FallbackNetworkstatusFile;
- /** If true, and we have GeoIP data, and we're a bridge, keep a per-country
- * count of how many client addresses have contacted us so that we can help
- * the bridge authority guess which countries have blocked access to us. */
- int BridgeRecordUsageByCountry;
- #ifdef ENABLE_GEOIP_STATS
- /** If true, and Tor is built with GEOIP_STATS support, and we're a
- * directory, record how many directory requests we get from each country. */
- int DirRecordUsageByCountry;
- /** Round all GeoIP results to the next multiple of this value, to avoid
- * leaking information. */
- int DirRecordUsageGranularity;
- /** Time interval: purge geoip stats after this long. */
- int DirRecordUsageRetainIPs;
- /** Time interval: Flush geoip data to disk this often. */
- int DirRecordUsageSaveInterval;
- #endif
- /** Optionally, a file with GeoIP data. */
- char *GeoIPFile;
- /** If true, SIGHUP should reload the torrc. Sometimes controllers want
- * to make this false. */
- int ReloadTorrcOnSIGHUP;
- } or_options_t;
- /** Persistent state for an onion router, as saved to disk. */
- typedef struct {
- uint32_t _magic;
- /** The time at which we next plan to write the state to the disk. Equal to
- * TIME_MAX if there are no savable changes, 0 if there are changes that
- * should be saved right away. */
- time_t next_write;
- /** When was the state last written to disk? */
- time_t LastWritten;
- /** Fields for accounting bandwidth use. */
- time_t AccountingIntervalStart;
- uint64_t AccountingBytesReadInInterval;
- uint64_t AccountingBytesWrittenInInterval;
- int AccountingSecondsActive;
- uint64_t AccountingExpectedUsage;
- /** A list of Entry Guard-related configuration lines. */
- config_line_t *EntryGuards;
- /** These fields hold information on the history of bandwidth usage for
- * servers. The "Ends" fields hold the time when we last updated the
- * bandwidth usage. The "Interval" fields hold the granularity, in seconds,
- * of the entries of Values. The "Values" lists hold decimal string
- * representations of the number of bytes read or written in each
- * interval. */
- time_t BWHistoryReadEnds;
- int BWHistoryReadInterval;
- smartlist_t *BWHistoryReadValues;
- time_t BWHistoryWriteEnds;
- int BWHistoryWriteInterval;
- smartlist_t *BWHistoryWriteValues;
- /** What version of Tor wrote this state file? */
- char *TorVersion;
- /** Holds any unrecognized values we found in the state file, in the order
- * in which we found them. */
- config_line_t *ExtraLines;
- /** When did we last rotate our onion key? "0" for 'no idea'. */
- time_t LastRotatedOnionKey;
- } or_state_t;
- /** Change the next_write time of <b>state</b> to <b>when</b>, unless the
- * state is already scheduled to be written to disk earlier than <b>when</b>.
- */
- static INLINE void or_state_mark_dirty(or_state_t *state, time_t when)
- {
- if (state->next_write > when)
- state->next_write = when;
- }
- #define MAX_SOCKS_REPLY_LEN 1024
- #define MAX_SOCKS_ADDR_LEN 256
- /** Please open a TCP connection to this addr:port. */
- #define SOCKS_COMMAND_CONNECT 0x01
- /** Please turn this FQDN into an IP address, privately. */
- #define SOCKS_COMMAND_RESOLVE 0xF0
- /** Please turn this IP address into an FQDN, privately. */
- #define SOCKS_COMMAND_RESOLVE_PTR 0xF1
- #define SOCKS_COMMAND_IS_CONNECT(c) ((c)==SOCKS_COMMAND_CONNECT)
- #define SOCKS_COMMAND_IS_RESOLVE(c) ((c)==SOCKS_COMMAND_RESOLVE ||
- (c)==SOCKS_COMMAND_RESOLVE_PTR)
- /** State of a SOCKS request from a user to an OP. Also used to encode other
- * information for non-socks user request (such as those on TransPort and
- * DNSPort) */
- struct socks_request_t {
- /** Which version of SOCKS did the client use? One of "0, 4, 5" -- where
- * 0 means that no socks handshake ever took place, and this is just a
- * stub connection (e.g. see connection_ap_make_link()). */
- char socks_version;
- int command; /**< What is this stream's goal? One from the above list. */
- size_t replylen; /**< Length of <b>reply</b>. */
- char reply[MAX_SOCKS_REPLY_LEN]; /**< Write an entry into this string if
- * we want to specify our own socks reply,
- * rather than using the default socks4 or
- * socks5 socks reply. We use this for the
- * two-stage socks5 handshake.
- */
- char address[MAX_SOCKS_ADDR_LEN]; /**< What address did the client ask to
- connect to/resolve? */
- uint16_t port; /**< What port did the client ask to connect to? */
- unsigned int has_finished : 1; /**< Has the SOCKS handshake finished? Used to
- * make sure we send back a socks reply for
- * every connection. */
- };
- /* all the function prototypes go here */
- /********************************* buffers.c ***************************/
- buf_t *buf_new(void);
- buf_t *buf_new_with_capacity(size_t size);
- void buf_free(buf_t *buf);
- void buf_clear(buf_t *buf);
- void buf_shrink(buf_t *buf);
- void buf_shrink_freelists(int free_all);
- void buf_dump_freelist_sizes(int severity);
- size_t buf_datalen(const buf_t *buf);
- size_t buf_allocation(const buf_t *buf);
- size_t buf_slack(const buf_t *buf);
- const char *_buf_peek_raw_buffer(const buf_t *buf);
- int read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof,
- int *socket_error);
- int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf);
- int flush_buf(int s, buf_t *buf, size_t sz, size_t *buf_flushlen);
- int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen);
- int write_to_buf(const char *string, size_t string_len, buf_t *buf);
- int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
- const char *data, size_t data_len, int done);
- int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen);
- int fetch_from_buf(char *string, size_t string_len, buf_t *buf);
- int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto);
- int fetch_from_buf_http(buf_t *buf,
- char **headers_out, size_t max_headerlen,
- char **body_out, size_t *body_used, size_t max_bodylen,
- int force_complete);
- int fetch_from_buf_socks(buf_t *buf, socks_request_t *req,
- int log_sockstype, int safe_socks);
- int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len);
- int peek_buf_has_control0_command(buf_t *buf);
- void assert_buf_ok(buf_t *buf);
- #ifdef BUFFERS_PRIVATE
- int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
- #endif
- /********************************* circuitbuild.c **********************/
- char *circuit_list_path(origin_circuit_t *circ, int verbose);
- char *circuit_list_path_for_controller(origin_circuit_t *circ);
- void circuit_log_path(int severity, unsigned int domain,
- origin_circuit_t *circ);
- void circuit_rep_hist_note_result(origin_circuit_t *circ);
- origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags);
- origin_circuit_t *circuit_establish_circuit(uint8_t purpose,
- extend_info_t *exit,
- int flags);
- int circuit_handle_first_hop(origin_circuit_t *circ);
- void circuit_n_conn_done(or_connection_t *or_conn, int status);
- int inform_testing_reachability(void);
- int circuit_send_next_onion_skin(origin_circuit_t *circ);
- void circuit_note_clock_jumped(int seconds_elapsed);
- int circuit_extend(cell_t *cell, circuit_t *circ);
- int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
- int reverse);
- int circuit_finish_handshake(origin_circuit_t *circ, uint8_t cell_type,
- const char *reply);
- int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer);
- int onionskin_answer(or_circuit_t *circ, uint8_t cell_type,
- const char *payload, const char *keys);
- int circuit_all_predicted_ports_handled(time_t now, int *need_uptime,
- int *need_capacity);
- int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info);
- int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info);
- void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop);
- extend_info_t *extend_info_alloc(const char *nickname, const char *digest,
- crypto_pk_env_t *onion_key,
- const tor_addr_t *addr, uint16_t port);
- extend_info_t *extend_info_from_router(routerinfo_t *r);
- extend_info_t *extend_info_dup(extend_info_t *info);
- void extend_info_free(extend_info_t *info);
- routerinfo_t *build_state_get_exit_router(cpath_build_state_t *state);
- const char *build_state_get_exit_nickname(cpath_build_state_t *state);
- void entry_guards_compute_status(void);
- int entry_guard_register_connect_status(const char *digest, int succeeded,
- int mark_relay_status, time_t now);
- void entry_nodes_should_be_added(void);
- int entry_list_can_grow(or_options_t *options);
- routerinfo_t *choose_random_entry(cpath_build_state_t *state);
- int entry_guards_parse_state(or_state_t *state, int set, char **msg);
- void entry_guards_update_state(or_state_t *state);
- int getinfo_helper_entry_guards(control_connection_t *conn,
- const char *question, char **answer);
- void clear_bridge_list(void);
- int routerinfo_is_a_configured_bridge(routerinfo_t *ri);
- void bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
- char *digest);
- void retry_bridge_descriptor_fetch_directly(const char *digest);
- void fetch_bridge_descriptors(time_t now);
- void learned_bridge_descriptor(routerinfo_t *ri, int from_cache);
- int any_bridge_descriptors_known(void);
- int any_pending_bridge_descriptor_fetches(void);
- int bridges_known_but_down(void);
- void bridges_retry_all(void);
- void entry_guards_free_all(void);
- /********************************* circuitlist.c ***********************/
- circuit_t * _circuit_get_global_list(void);
- const char *circuit_state_to_string(int state);
- const char *circuit_purpose_to_controller_string(uint8_t purpose);
- void circuit_dump_by_conn(connection_t *conn, int severity);
- void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id,
- or_connection_t *conn);
- void circuit_set_n_circid_orconn(circuit_t *circ, circid_t id,
- or_connection_t *conn);
- void circuit_set_state(circuit_t *circ, uint8_t state);
- void circuit_close_all_marked(void);
- int32_t circuit_initial_package_window(void);
- origin_circuit_t *origin_circuit_new(void);
- or_circuit_t *or_circuit_new(circid_t p_circ_id, or_connection_t *p_conn);
- circuit_t *circuit_get_by_circid_orconn(circid_t circ_id,
- or_connection_t *conn);
- int circuit_id_in_use_on_orconn(circid_t circ_id, or_connection_t *conn);
- circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn);
- void circuit_unlink_all_from_or_conn(or_connection_t *conn, int reason);
- origin_circuit_t *circuit_get_by_global_id(uint32_t id);
- origin_circuit_t *circuit_get_by_rend_query_and_purpose(const char *rend_query,
- uint8_t purpose);
- origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
- const char *digest, uint8_t purpose);
- or_circuit_t *circuit_get_rendezvous(const char *cookie);
- or_circuit_t *circuit_get_intro_point(const char *digest);
- origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
- extend_info_t *info, int flags);
- void circuit_mark_all_unused_circs(void);
- void circuit_expire_all_dirty_circs(void);
- void _circuit_mark_for_close(circuit_t *circ, int reason,
- int line, const char *file);
- int circuit_get_cpath_len(origin_circuit_t *circ);
- crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum);
- void circuit_get_all_pending_on_or_conn(smartlist_t *out,
- or_connection_t *or_conn);
- int circuit_count_pending_on_or_conn(or_connection_t *or_conn);
- #define circuit_mark_for_close(c, reason)
- _circuit_mark_for_close((c), (reason), __LINE__, _SHORT_FILE_)
- void assert_cpath_layer_ok(const crypt_path_t *cp);
- void assert_circuit_ok(const circuit_t *c);
- void circuit_free_all(void);
- /********************************* circuituse.c ************************/
- void circuit_expire_building(time_t now);
- void circuit_remove_handled_ports(smartlist_t *needed_ports);
- int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port,
- int min);
- int circuit_conforms_to_options(const origin_circuit_t *circ,
- const or_options_t *options);
- void circuit_build_needed_circs(time_t now);
- void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn);
- void reset_bandwidth_test(void);
- int circuit_enough_testing_circs(void);
- void circuit_has_opened(origin_circuit_t *circ);
- void circuit_build_failed(origin_circuit_t *circ);
- /** Flag to set when a circuit should have only a single hop. */
- #define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0)
- /** Flag to set when a circuit needs to be built of high-uptime nodes */
- #define CIRCLAUNCH_NEED_UPTIME (1<<1)
- /** Flag to set when a circuit needs to be built of high-capacity nodes */
- #define CIRCLAUNCH_NEED_CAPACITY (1<<2)
- /** Flag to set when the last hop of a circuit doesn't need to be an
- * exit node. */
- #define CIRCLAUNCH_IS_INTERNAL (1<<3)
- origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose,
- extend_info_t *info,
- int flags);
- origin_circuit_t *circuit_launch_by_router(uint8_t purpose,
- routerinfo_t *exit, int flags);
- void circuit_reset_failure_count(int timeout);
- int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn,
- origin_circuit_t *circ,
- crypt_path_t *cpath);
- int connection_ap_handshake_attach_circuit(edge_connection_t *conn);
- /********************************* command.c ***************************/
- void command_process_cell(cell_t *cell, or_connection_t *conn);
- void command_process_var_cell(var_cell_t *cell, or_connection_t *conn);
- extern uint64_t stats_n_padding_cells_processed;
- extern uint64_t stats_n_create_cells_processed;
- extern uint64_t stats_n_created_cells_processed;
- extern uint64_t stats_n_relay_cells_processed;
- extern uint64_t stats_n_destroy_cells_processed;
- /********************************* config.c ***************************/
- /** An error from options_trial_assign() or options_init_from_string(). */
- typedef enum setopt_err_t {
- SETOPT_OK = 0,
- SETOPT_ERR_MISC = -1,
- SETOPT_ERR_PARSE = -2,
- SETOPT_ERR_TRANSITION = -3,
- SETOPT_ERR_SETTING = -4,
- } setopt_err_t;
- const char *get_dirportfrontpage(void);
- or_options_t *get_options(void);
- int set_options(or_options_t *new_val, char **msg);
- void config_free_all(void);
- const char *safe_str(const char *address);
- const char *escaped_safe_str(const char *address);
- const char *get_version(void);
- int config_get_lines(const char *string, config_line_t **result);
- void config_free_lines(config_line_t *front);
- setopt_err_t options_trial_assign(config_line_t *list, int use_defaults,
- int clear_first, char **msg);
- int resolve_my_address(int warn_severity, or_options_t *options,
- uint32_t *addr, char **hostname_out);
- int is_local_addr(const tor_addr_t *addr) ATTR_PURE;
- void options_init(or_options_t *options);
- int options_init_from_torrc(int argc, char **argv);
- setopt_err_t options_init_from_string(const char *cf,
- int command, const char *command_arg, char **msg);
- int option_is_recognized(const char *key);
- const char *option_get_canonical_name(const char *key);
- config_line_t *option_get_assignment(or_options_t *options,
- const char *key);
- int options_save_current(void);
- const char *get_torrc_fname(void);
- char *options_get_datadir_fname2_suffix(or_options_t *options,
- const char *sub1, const char *sub2,
- const char *suffix);
- #define get_datadir_fname2_suffix(sub1, sub2, suffix)
- options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix))
- /** Return a newly allocated string containing datadir/sub1. See
- * get_datadir_fname2_suffix. */
- #define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL)
- /** Return a newly allocated string containing datadir/sub1/sub2. See
- * get_datadir_fname2_suffix. */
- #define get_datadir_fname2(sub1,sub2)
- get_datadir_fname2_suffix((sub1), (sub2), NULL)
- /** Return a newly allocated string containing datadir/sub1suffix. See
- * get_datadir_fname2_suffix. */
- #define get_datadir_fname_suffix(sub1, suffix)
- get_datadir_fname2_suffix((sub1), NULL, (suffix))
- or_state_t *get_or_state(void);
- int or_state_save(time_t now);
- int options_need_geoip_info(or_options_t *options, const char **reason_out);
- int getinfo_helper_config(control_connection_t *conn,
- const char *question, char **answer);
- uint32_t get_effective_bwrate(or_options_t *options);
- uint32_t get_effective_bwburst(or_options_t *options);
- #ifdef CONFIG_PRIVATE
- /* Used only by config.c and test.c */
- or_options_t *options_new(void);
- #endif
- /********************************* connection.c ***************************/
- const char *conn_type_to_string(int type);
- const char *conn_state_to_string(int type, int state);
- dir_connection_t *dir_connection_new(int socket_family);
- or_connection_t *or_connection_new(int socket_family);
- edge_connection_t *edge_connection_new(int type, int socket_family);
- control_connection_t *control_connection_new(int socket_family);
- connection_t *connection_new(int type, int socket_family);
- void connection_link_connections(connection_t *conn_a, connection_t *conn_b);
- void connection_unregister_events(connection_t *conn);
- void connection_free(connection_t *conn);
- void connection_free_all(void);
- void connection_about_to_close_connection(connection_t *conn);
- void connection_close_immediate(connection_t *conn);
- void _connection_mark_for_close(connection_t *conn,int line, const char *file);
- #define connection_mark_for_close(c)
- _connection_mark_for_close((c), __LINE__, _SHORT_FILE_)
- void connection_expire_held_open(void);
- int connection_connect(connection_t *conn, const char *address,
- const tor_addr_t *addr,
- uint16_t port, int *socket_error);
- int retry_all_listeners(smartlist_t *replaced_conns,
- smartlist_t *new_conns);
- ssize_t connection_bucket_write_limit(connection_t *conn, time_t now);
- int global_write_bucket_low(connection_t *conn, size_t attempt, int priority);
- void connection_bucket_init(void);
- void connection_bucket_refill(int seconds_elapsed, time_t now);
- int connection_handle_read(connection_t *conn);
- int connection_fetch_from_buf(char *string, size_t len, connection_t *conn);
- int connection_wants_to_flush(connection_t *conn);
- int connection_outbuf_too_full(connection_t *conn);
- int connection_handle_write(connection_t *conn, int force);
- void _connection_write_to_buf_impl(const char *string, size_t len,
- connection_t *conn, int zlib);
- static void connection_write_to_buf(const char *string, size_t len,
- connection_t *conn);
- static void connection_write_to_buf_zlib(const char *string, size_t len,
- dir_connection_t *conn, int done);
- static INLINE void
- connection_write_to_buf(const char *string, size_t len, connection_t *conn)
- {
- _connection_write_to_buf_impl(string, len, conn, 0);
- }
- static INLINE void
- connection_write_to_buf_zlib(const char *string, size_t len,
- dir_connection_t *conn, int done)
- {
- _connection_write_to_buf_impl(string, len, TO_CONN(conn), done ? -1 : 1);
- }
- connection_t *connection_get_by_global_id(uint64_t id);
- connection_t *connection_get_by_type(int type);
- connection_t *connection_get_by_type_purpose(int type, int purpose);
- connection_t *connection_get_by_type_addr_port_purpose(int type,
- const tor_addr_t *addr,
- uint16_t port, int purpose);
- connection_t *connection_get_by_type_state(int type, int state);
- connection_t *connection_get_by_type_state_rendquery(int type, int state,
- const char *rendquery,
- int rendversion);
- #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
- int connection_is_listener(connection_t *conn);
- int connection_state_is_open(connection_t *conn);
- int connection_state_is_connecting(connection_t *conn);
- char *alloc_http_authenticator(const char *authenticator);
- void assert_connection_ok(connection_t *conn, time_t now);
- int connection_or_nonopen_was_started_here(or_connection_t *conn);
- void connection_dump_buffer_mem_stats(int severity);
- void remove_file_if_very_old(const char *fname, time_t now);
- /********************************* connection_edge.c *************************/
- #define connection_mark_unattached_ap(conn, endreason)
- _connection_mark_unattached_ap((conn), (endreason), __LINE__, _SHORT_FILE_)
- void _connection_mark_unattached_ap(edge_connection_t *conn, int endreason,
- int line, const char *file);
- int connection_edge_reached_eof(edge_connection_t *conn);
- int connection_edge_process_inbuf(edge_connection_t *conn,
- int package_partial);
- int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn);
- int connection_edge_end(edge_connection_t *conn, uint8_t reason);
- int connection_edge_end_errno(edge_connection_t *conn);
- int connection_edge_finished_flushing(edge_connection_t *conn);
- int connection_edge_finished_connecting(edge_connection_t *conn);
- int connection_ap_handshake_send_begin(edge_connection_t *ap_conn);
- int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn);
- edge_connection_t *connection_ap_make_link(char *address, uint16_t port,
- const char *digest,
- int use_begindir, int want_onehop);
- void connection_ap_handshake_socks_reply(edge_connection_t *conn, char *reply,
- size_t replylen,
- int endreason);
- void connection_ap_handshake_socks_resolved(edge_connection_t *conn,
- int answer_type,
- size_t answer_len,
- const char *answer,
- int ttl,
- time_t expires);
- int connection_exit_begin_conn(cell_t *cell, circuit_t *circ);
- int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ);
- void connection_exit_connect(edge_connection_t *conn);
- int connection_edge_is_rendezvous_stream(edge_connection_t *conn);
- int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit);
- void connection_ap_expire_beginning(void);
- void connection_ap_attach_pending(void);
- void connection_ap_fail_onehop(const char *failed_digest,
- cpath_build_state_t *build_state);
- void circuit_discard_optional_exit_enclaves(extend_info_t *info);
- int connection_ap_detach_retriable(edge_connection_t *conn,
- origin_circuit_t *circ,
- int reason);
- int connection_ap_process_transparent(edge_connection_t *conn);
- int address_is_invalid_destination(const char *address, int client);
- void addressmap_init(void);
- void addressmap_clean(time_t now);
- void addressmap_clear_configured(void);
- void addressmap_clear_transient(void);
- void addressmap_free_all(void);
- int addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out);
- int addressmap_have_mapping(const char *address, int update_timeout);
- /** Enumerates possible origins of a client-side address mapping. */
- typedef enum {
- /** We're remapping this address because the controller told us to. */
- ADDRMAPSRC_CONTROLLER,
- /** We're remapping this address because our configuration (via torrc, the
- * command line, or a SETCONF command) told us to. */
- ADDRMAPSRC_TORRC,
- /** We're remapping this address because we have TrackHostExit configured,
- * and we want to remember to use the same exit next time. */
- ADDRMAPSRC_TRACKEXIT,
- /** We're remapping this address because we got a DNS resolution from a
- * Tor server that told us what its value was. */
- ADDRMAPSRC_DNS,
- } addressmap_entry_source_t;
- void addressmap_register(const char *address, char *new_address,
- time_t expires, addressmap_entry_source_t source);
- int parse_virtual_addr_network(const char *val, int validate_only,
- char **msg);
- int client_dns_incr_failures(const char *address);
- void client_dns_clear_failures(const char *address);
- void client_dns_set_addressmap(const char *address, uint32_t val,
- const char *exitname, int ttl);
- const char *addressmap_register_virtual_address(int type, char *new_address);
- void addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
- time_t max_expires, int want_expiry);
- int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn,
- origin_circuit_t *circ,
- crypt_path_t *cpath);
- int hostname_is_noconnect_address(const char *address);
- /** Possible return values for parse_extended_hostname. */
- typedef enum hostname_type_t {
- NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME
- } hostname_type_t;
- hostname_type_t parse_extended_hostname(char *address);
- #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H)
- int get_pf_socket(void);
- #endif
- /********************************* connection_or.c ***************************/
- void connection_or_remove_from_identity_map(or_connection_t *conn);
- void connection_or_clear_identity_map(void);
- or_connection_t *connection_or_get_for_extend(const char *digest,
- const tor_addr_t *target_addr,
- const char **msg_out,
- int *launch_out);
- void connection_or_set_bad_connections(void);
- int connection_or_reached_eof(or_connection_t *conn);
- int connection_or_process_inbuf(or_connection_t *conn);
- int connection_or_flushed_some(or_connection_t *conn);
- int connection_or_finished_flushing(or_connection_t *conn);
- int connection_or_finished_connecting(or_connection_t *conn);
- void connection_or_connect_failed(or_connection_t *conn,
- int reason, const char *msg);
- or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port,
- const char *id_digest);
- int connection_tls_start_handshake(or_connection_t *conn, int receiving);
- int connection_tls_continue_handshake(or_connection_t *conn);
- void or_handshake_state_free(or_handshake_state_t *state);
- int connection_or_set_state_open(or_connection_t *conn);
- void connection_or_write_cell_to_buf(const cell_t *cell,
- or_connection_t *conn);
- void connection_or_write_var_cell_to_buf(const var_cell_t *cell,
- or_connection_t *conn);
- int connection_or_send_destroy(circid_t circ_id, or_connection_t *conn,
- int reason);
- int connection_or_send_netinfo(or_connection_t *conn);
- int connection_or_send_cert(or_connection_t *conn);
- int connection_or_send_link_auth(or_connection_t *conn);
- int connection_or_compute_link_auth_hmac(or_connection_t *conn,
- char *hmac_out);
- int is_or_protocol_version_known(uint16_t version);
- void cell_pack(packed_cell_t *dest, const cell_t *src);
- void var_cell_pack_header(const var_cell_t *cell, char *hdr_out);
- var_cell_t *var_cell_new(uint16_t payload_len);
- void var_cell_free(var_cell_t *cell);
- /********************************* control.c ***************************/
- /** Used to indicate the type of a circuit event passed to the controller.
- * The various types are defined in control-spec.txt */
- typedef enum circuit_status_event_t {
- CIRC_EVENT_LAUNCHED = 0,
- CIRC_EVENT_BUILT = 1,
- CIRC_EVENT_EXTENDED = 2,
- CIRC_EVENT_FAILED = 3,
- CIRC_EVENT_CLOSED = 4,
- } circuit_status_event_t;
- /** Used to indicate the type of a stream event passed to the controller.
- * The various types are defined in control-spec.txt */
- typedef enum stream_status_event_t {
- STREAM_EVENT_SENT_CONNECT = 0,
- STREAM_EVENT_SENT_RESOLVE = 1,
- STREAM_EVENT_SUCCEEDED = 2,
- STREAM_EVENT_FAILED = 3,
- STREAM_EVENT_CLOSED = 4,
- STREAM_EVENT_NEW = 5,
- STREAM_EVENT_NEW_RESOLVE = 6,
- STREAM_EVENT_FAILED_RETRIABLE = 7,
- STREAM_EVENT_REMAP = 8
- } stream_status_event_t;
- /** Used to indicate the type of an OR connection event passed to the
- * controller. The various types are defined in control-spec.txt */
- typedef enum or_conn_status_event_t {
- OR_CONN_EVENT_LAUNCHED = 0,
- OR_CONN_EVENT_CONNECTED = 1,
- OR_CONN_EVENT_FAILED = 2,
- OR_CONN_EVENT_CLOSED = 3,
- OR_CONN_EVENT_NEW = 4,
- } or_conn_status_event_t;
- void control_update_global_event_mask(void);
- void control_adjust_event_log_severity(void);
- /** Execute the statement <b>stmt</b>, which may log events concerning the
- * connection <b>conn</b>. To prevent infinite loops, disable log messages
- * being sent to controllers if <b>conn</b> is a control connection.
- *
- * Stmt must not contain any return or goto statements.
- */
- #define CONN_LOG_PROTECT(conn, stmt)
- STMT_BEGIN
- int _log_conn_is_control = (conn && conn->type == CONN_TYPE_CONTROL);
- if (_log_conn_is_control)
- disable_control_logging();
- STMT_BEGIN stmt; STMT_END;
- if (_log_conn_is_control)
- enable_control_logging();
- STMT_END
- /** Log information about the connection <b>conn</b>, protecting it as with
- * CONN_LOG_PROTECT. Example:
- *
- * LOG_FN_CONN(conn, (LOG_DEBUG, "Socket %d wants to write", conn->s));
- **/
- #define LOG_FN_CONN(conn, args)
- CONN_LOG_PROTECT(conn, log_fn args)
- int connection_control_finished_flushing(control_connection_t *conn);
- int connection_control_reached_eof(control_connection_t *conn);
- int connection_control_process_inbuf(control_connection_t *conn);
- #define EVENT_AUTHDIR_NEWDESCS 0x000D
- #define EVENT_NS 0x000F
- int control_event_is_interesting(int event);
- int control_event_circuit_status(origin_circuit_t *circ,
- circuit_status_event_t e, int reason);
- int control_event_stream_status(edge_connection_t *conn,
- stream_status_event_t e,
- int reason);
- int control_event_or_conn_status(or_connection_t *conn,
- or_conn_status_event_t e, int reason);
- int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
- int control_event_stream_bandwidth(edge_connection_t *edge_conn);
- int control_event_stream_bandwidth_used(void);
- void control_event_logmsg(int severity, unsigned int domain, const char *msg);
- int control_event_descriptors_changed(smartlist_t *routers);
- int control_event_address_mapped(const char *from, const char *to,
- time_t expires, const char *error);
- int control_event_or_authdir_new_descriptor(const char *action,
- const char *desc,
- size_t desclen,
- const char *msg);
- int control_event_my_descriptor_changed(void);
- int control_event_networkstatus_changed(smartlist_t *statuses);
- int control_event_newconsensus(const networkstatus_t *consensus);
- int control_event_networkstatus_changed_single(routerstatus_t *rs);
- int control_event_general_status(int severity, const char *format, ...)
- CHECK_PRINTF(2,3);
- int control_event_client_status(int severity, const char *format, ...)
- CHECK_PRINTF(2,3);
- int control_event_server_status(int severity, const char *format, ...)
- CHECK_PRINTF(2,3);
- int control_event_guard(const char *nickname, const char *digest,
- const char *status);
- int init_cookie_authentication(int enabled);
- smartlist_t *decode_hashed_passwords(config_line_t *passwords);
- void disable_control_logging(void);
- void enable_control_logging(void);
- /** Enum describing various stages of bootstrapping, for use with controller
- * bootstrap status events. The values range from 0 to 100. */
- typedef enum {
- BOOTSTRAP_STATUS_UNDEF=-1,
- BOOTSTRAP_STATUS_STARTING=0,
- BOOTSTRAP_STATUS_CONN_DIR=5,
- BOOTSTRAP_STATUS_HANDSHAKE=-2,
- BOOTSTRAP_STATUS_HANDSHAKE_DIR=10,
- BOOTSTRAP_STATUS_ONEHOP_CREATE=15,
- BOOTSTRAP_STATUS_REQUESTING_STATUS=20,
- BOOTSTRAP_STATUS_LOADING_STATUS=25,
- BOOTSTRAP_STATUS_LOADING_KEYS=40,
- BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS=45,
- BOOTSTRAP_STATUS_LOADING_DESCRIPTORS=50,
- BOOTSTRAP_STATUS_CONN_OR=80,
- BOOTSTRAP_STATUS_HANDSHAKE_OR=85,
- BOOTSTRAP_STATUS_CIRCUIT_CREATE=90,
- BOOTSTRAP_STATUS_DONE=100
- } bootstrap_status_t;
- void control_event_bootstrap(bootstrap_status_t status, int progress);
- void control_event_bootstrap_problem(const char *warn, int reason);
- void control_event_clients_seen(const char *timestarted,
- const char *countries);
- #ifdef CONTROL_PRIVATE
- /* Used only by control.c and test.c */
- size_t write_escaped_data(const char *data, size_t len, char **out);
- size_t read_escaped_data(const char *data, size_t len, char **out);
- #endif
- /********************************* cpuworker.c *****************************/
- void cpu_init(void);
- void cpuworkers_rotate(void);
- int connection_cpu_finished_flushing(connection_t *conn);
- int connection_cpu_reached_eof(connection_t *conn);
- int connection_cpu_process_inbuf(connection_t *conn);
- int assign_onionskin_to_cpuworker(connection_t *cpuworker,
- or_circuit_t *circ,
- char *onionskin);
- /********************************* directory.c ***************************/
- int directories_have_accepted_server_descriptor(void);
- char *authority_type_to_string(authority_type_t auth);
- void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
- authority_type_t type, const char *payload,
- size_t payload_len, size_t extrainfo_len);
- void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
- const char *resource,
- int pds_flags);
- void directory_get_from_all_authorities(uint8_t dir_purpose,
- uint8_t router_purpose,
- const char *resource);
- void directory_initiate_command_routerstatus(routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- int anonymized_connection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since);
- void directory_initiate_command_routerstatus_rend(routerstatus_t *status,
- uint8_t dir_purpose,
- uint8_t router_purpose,
- int anonymized_connection,
- const char *resource,
- const char *payload,
- size_t payload_len,
- time_t if_modified_since,
- const rend_data_t *rend_query);
- int parse_http_response(const char *headers, int *code, time_t *date,
- compress_method_t *compression, char **response);
- int connection_dir_is_encrypted(dir_connection_t *conn);
- int connection_dir_reached_eof(dir_connection_t *conn);
- int connection_dir_process_inbuf(dir_connection_t *conn);
- int connection_dir_finished_flushing(dir_connection_t *conn);
- int connection_dir_finished_connecting(dir_connection_t *conn);
- void connection_dir_request_failed(dir_connection_t *conn);
- void directory_initiate_command(const char *address, const tor_addr_t *addr,
- uint16_t or_port, uint16_t dir_port,
- int supports_conditional_consensus,
- int supports_begindir, const char *digest,
- uint8_t dir_purpose, uint8_t router_purpose,
- int anonymized_connection,
- const char *resource,
- const char *payload, size_t payload_len,
- time_t if_modified_since);
- int dir_split_resource_into_fingerprints(const char *resource,
- smartlist_t *fp_out, int *compresseed_out,
- int decode_hex, int sort_uniq);
- /** A pair of digests created by dir_split_resource_info_fingerprint_pairs() */
- typedef struct {
- char first[DIGEST_LEN];
- char second[DIGEST_LEN];
- } fp_pair_t;
- int dir_split_resource_into_fingerprint_pairs(const char *res,
- smartlist_t *pairs_out);
- char *directory_dump_request_log(void);
- void note_request(const char *key, size_t bytes);
- int router_supports_extrainfo(const char *identity_digest, int is_authority);
- time_t download_status_increment_failure(download_status_t *dls,
- int status_code, const char *item,
- int server, time_t now);
- /** Increment the failure count of the download_status_t <b>dls</b>, with
- * the optional status code <b>sc</b>. */
- #define download_status_failed(dls, sc)
- download_status_increment_failure((dls), (sc), NULL,
- get_options()->DirPort, time(NULL))
- void download_status_reset(download_status_t *dls);
- static int download_status_is_ready(download_status_t *dls, time_t now,
- int max_failures);
- /** Return true iff, as of <b>now</b>, the resource tracked by <b>dls</b> is
- * ready to get its download reattempted. */
- static INLINE int
- download_status_is_ready(download_status_t *dls, time_t now,
- int max_failures)
- {
- return (dls->n_download_failures <= max_failures
- && dls->next_attempt_at <= now);
- }
- static void download_status_mark_impossible(download_status_t *dl);
- /** Mark <b>dl</b> as never downloadable. */
- static INLINE void
- download_status_mark_impossible(download_status_t *dl)
- {
- dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD;
- }
- /********************************* dirserv.c ***************************/
- /** Maximum length of an exit policy summary. */
- #define MAX_EXITPOLICY_SUMMARY_LEN (1000)
- /** Maximum allowable length of a version line in a networkstatus. */
- #define MAX_V_LINE_LEN 128
- /** Length of "r Authority BadDirectory BadExit Exit Fast Guard HSDir Named
- * Running Stable Unnamed V2Dir Validn". */
- #define MAX_FLAG_LINE_LEN 96
- /** Length of "w" line for weighting. Currently at most
- * "w Bandwidth=<uint32t>n" */
- #define MAX_WEIGHT_LINE_LEN (13+10)
- /** Maximum length of an exit policy summary line. */
- #define MAX_POLICY_LINE_LEN (3+MAX_EXITPOLICY_SUMMARY_LEN)
- /** Amount of space to allocate for each entry: r, s, and v lines. */
- #define RS_ENTRY_LEN
- ( /* first line */
- MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+
- 5*2 /* ports */ + 10 /* punctuation */ +
- /* second line */
- MAX_FLAG_LINE_LEN +
- /* weight line */
- MAX_WEIGHT_LINE_LEN +
- /* p line. */
- MAX_POLICY_LINE_LEN +
- /* v line. */
- MAX_V_LINE_LEN
- )
- #define UNNAMED_ROUTER_NICKNAME "Unnamed"
- int connection_dirserv_flushed_some(dir_connection_t *conn);
- int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk);
- int dirserv_load_fingerprint_file(void);
- void dirserv_free_fingerprint_list(void);
- const char *dirserv_get_nickname_by_digest(const char *digest);
- enum was_router_added_t dirserv_add_multiple_descriptors(
- const char *desc, uint8_t purpose,
- const char *source,
- const char **msg);
- enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri,
- const char **msg,
- const char *source);
- int getinfo_helper_dirserv_unregistered(control_connection_t *conn,
- const char *question, char **answer);
- void dirserv_free_descriptors(void);
- void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
- int list_server_status_v1(smartlist_t *routers, char **router_status_out,
- int for_controller);
- int dirserv_dump_directory_to_string(char **dir_out,
- crypto_pk_env_t *private_key);
- int directory_fetches_from_authorities(or_options_t *options);
- int directory_fetches_dir_info_early(or_options_t *options);
- int directory_fetches_dir_info_later(or_options_t *options);
- int directory_caches_v2_dir_info(or_options_t *options);
- #define directory_caches_v1_dir_info(o) directory_caches_v2_dir_info(o)
- int directory_caches_dir_info(or_options_t *options);
- int directory_permits_begindir_requests(or_options_t *options);
- int directory_permits_controller_requests(or_options_t *options);
- int directory_too_idle_to_fetch_descriptors(or_options_t *options, time_t now);
- void directory_set_dirty(void);
- cached_dir_t *dirserv_get_directory(void);
- cached_dir_t *dirserv_get_runningrouters(void);
- cached_dir_t *dirserv_get_consensus(void);
- void dirserv_set_cached_directory(const char *directory, time_t when,
- int is_running_routers);
- void dirserv_set_cached_networkstatus_v2(const char *directory,
- const char *identity,
- time_t published);
- void dirserv_set_cached_networkstatus_v3(const char *consensus,
- time_t published);
- void dirserv_clear_old_networkstatuses(time_t cutoff);
- void dirserv_clear_old_v1_info(time_t now);
- void dirserv_get_networkstatus_v2(smartlist_t *result, const char *key);
- void dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result,
- const char *key);
- int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
- const char **msg,
- int for_unencrypted_conn,
- int is_extrainfo);
- int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
- const char **msg);
- void dirserv_orconn_tls_done(const char *address,
- uint16_t or_port,
- const char *digest_rcvd,
- int as_advertised);
- void dirserv_test_reachability(time_t now, int try_all);
- int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg,
- int complain);
- int dirserv_would_reject_router(routerstatus_t *rs);
- int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff);
- int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src);
- size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs,
- int compressed);
- int routerstatus_format_entry(char *buf, size_t buf_len,
- routerstatus_t *rs, const char *platform,
- int first_line_only, int v2_format);
- void dirserv_free_all(void);
- void cached_dir_decref(cached_dir_t *d);
- cached_dir_t *new_cached_dir(char *s, time_t published);
- /********************************* dirvote.c ************************/
- /** Lowest allowable value for VoteSeconds. */
- #define MIN_VOTE_SECONDS 20
- /** Lowest allowable value for DistSeconds. */
- #define MIN_DIST_SECONDS 20
- /** Smallest allowable voting interval. */
- #define MIN_VOTE_INTERVAL 300
- void dirvote_free_all(void);
- /* vote manipulation */
- char *networkstatus_compute_consensus(smartlist_t *votes,
- int total_authorities,
- crypto_pk_env_t *identity_key,
- crypto_pk_env_t *signing_key,
- const char *legacy_identity_key_digest,
- crypto_pk_env_t *legacy_signing_key);
- int networkstatus_add_detached_signatures(networkstatus_t *target,
- ns_detached_signatures_t *sigs,
- const char **msg_out);
- char *networkstatus_get_detached_signatures(networkstatus_t *consensus);
- void ns_detached_signatures_free(ns_detached_signatures_t *s);
- /* cert manipulation */
- authority_cert_t *authority_cert_dup(authority_cert_t *cert);
- /** Describes the schedule by which votes should be generated. */
- typedef struct vote_timing_t {
- int vote_interval;
- int n_intervals_valid;
- int vote_delay;
- int dist_delay;
- } vote_timing_t;
- /* vote scheduling */
- void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out);
- time_t dirvote_get_start_of_next_interval(time_t now, int interval);
- void dirvote_recalculate_timing(or_options_t *options, time_t now);
- void dirvote_act(or_options_t *options, time_t now);
- /* invoked on timers and by outside triggers. */
- struct pending_vote_t * dirvote_add_vote(const char *vote_body,
- const char **msg_out,
- int *status_out);
- int dirvote_add_signatures(const char *detached_signatures_body,
- const char *source,
- const char **msg_out);
- /* Item access */
- const char *dirvote_get_pending_consensus(void);
- const char *dirvote_get_pending_detached_signatures(void);
- #define DGV_BY_ID 1
- #define DGV_INCLUDE_PENDING 2
- #define DGV_INCLUDE_PREVIOUS 4
- const cached_dir_t *dirvote_get_vote(const char *fp, int flags);
- void set_routerstatus_from_routerinfo(routerstatus_t *rs,
- routerinfo_t *ri, time_t now,
- int naming, int exits_can_be_guards,
- int listbadexits, int listbaddirs);
- void router_clear_status_flags(routerinfo_t *ri);
- networkstatus_t *
- dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
- authority_cert_t *cert);
- #ifdef DIRVOTE_PRIVATE
- char *format_networkstatus_vote(crypto_pk_env_t *private_key,
- networkstatus_t *v3_ns);
- char *dirvote_compute_params(smartlist_t *votes);
- #endif
- /********************************* dns.c ***************************/
- int dns_init(void);
- int has_dns_init_failed(void);
- void dns_free_all(void);
- uint32_t dns_clip_ttl(uint32_t ttl);
- int dns_reset(void);
- void connection_dns_remove(edge_connection_t *conn);
- void assert_connection_edge_not_dns_pending(edge_connection_t *conn);
- void assert_all_pending_dns_resolves_ok(void);
- void dns_cancel_pending_resolve(const char *question);
- int dns_resolve(edge_connection_t *exitconn);
- void dns_launch_correctness_checks(void);
- int dns_seems_to_be_broken(void);
- void dns_reset_correctness_checks(void);
- /********************************* dnsserv.c ************************/
- void dnsserv_configure_listener(connection_t *conn);
- void dnsserv_close_listener(connection_t *conn);
- void dnsserv_resolved(edge_connection_t *conn,
- int answer_type,
- size_t answer_len,
- const char *answer,
- int ttl);
- void dnsserv_reject_request(edge_connection_t *conn);
- int dnsserv_launch_request(const char *name, int is_reverse);
- /********************************* geoip.c **************************/
- #ifdef GEOIP_PRIVATE
- int geoip_parse_entry(const char *line);
- #endif
- int should_record_bridge_info(or_options_t *options);
- int geoip_load_file(const char *filename, or_options_t *options);
- int geoip_get_country_by_ip(uint32_t ipaddr);
- int geoip_get_n_countries(void);
- const char *geoip_get_country_name(country_t num);
- int geoip_is_loaded(void);
- country_t geoip_get_country(const char *countrycode);
- /** Indicates an action that we might be noting geoip statistics on.
- * Note that if we're noticing CONNECT, we're a bridge, and if we're noticing
- * the others, we're not.
- */
- typedef enum {
- /** We've noticed a connection as a bridge relay. */
- GEOIP_CLIENT_CONNECT = 0,
- /** We've served a networkstatus consensus as a directory server. */
- GEOIP_CLIENT_NETWORKSTATUS = 1,
- /** We've served a v2 networkstatus consensus as a directory server. */
- GEOIP_CLIENT_NETWORKSTATUS_V2 = 2,
- } geoip_client_action_t;
- void geoip_note_client_seen(geoip_client_action_t action,
- uint32_t addr, time_t now);
- void geoip_remove_old_clients(time_t cutoff);
- time_t geoip_get_history_start(void);
- char *geoip_get_client_history(time_t now, geoip_client_action_t action);
- char *geoip_get_request_history(time_t now, geoip_client_action_t action);
- int getinfo_helper_geoip(control_connection_t *control_conn,
- const char *question, char **answer);
- void geoip_free_all(void);
- void dump_geoip_stats(void);
- /********************************* hibernate.c **********************/
- int accounting_parse_options(or_options_t *options, int validate_only);
- int accounting_is_enabled(or_options_t *options);
- void configure_accounting(time_t now);
- void accounting_run_housekeeping(time_t now);
- void accounting_add_bytes(size_t n_read, size_t n_written, int seconds);
- int accounting_record_bandwidth_usage(time_t now, or_state_t *state);
- void hibernate_begin_shutdown(void);
- int we_are_hibernating(void);
- void consider_hibernation(time_t now);
- int getinfo_helper_accounting(control_connection_t *conn,
- const char *question, char **answer);
- void accounting_set_bandwidth_usage_from_state(or_state_t *state);
- /********************************* main.c ***************************/
- extern int has_completed_circuit;
- int connection_add(connection_t *conn);
- int connection_remove(connection_t *conn);
- int connection_in_array(connection_t *conn);
- void add_connection_to_closeable_list(connection_t *conn);
- int connection_is_on_closeable_list(connection_t *conn);
- smartlist_t *get_connection_array(void);
- void connection_watch_events(connection_t *conn, short events);
- int connection_is_reading(connection_t *conn);
- void connection_stop_reading(connection_t *conn);
- void connection_start_reading(connection_t *conn);
- int connection_is_writing(connection_t *conn);
- void connection_stop_writing(connection_t *conn);
- void connection_start_writing(connection_t *conn);
- void connection_stop_reading_from_linked_conn(connection_t *conn);
- void directory_all_unreachable(time_t now);
- void directory_info_has_arrived(time_t now, int from_cache);
- void ip_address_changed(int at_interface);
- void dns_servers_relaunch_checks(void);
- void control_signal_act(int the_signal);
- void handle_signals(int is_parent);
- int try_locking(or_options_t *options, int err_if_locked);
- int have_lockfile(void);
- void release_lockfile(void);
- void tor_cleanup(void);
- void tor_free_all(int postfork);
- int tor_main(int argc, char *argv[]);
- #ifdef MAIN_PRIVATE
- int do_main_loop(void);
- int do_list_fingerprint(void);
- void do_hash_password(void);
- int tor_init(int argc, char **argv);
- #endif
- /********************************* networkstatus.c *********************/
- /** How old do we allow a v2 network-status to get before removing it
- * completely? */
- #define MAX_NETWORKSTATUS_AGE (10*24*60*60)
- /** Location where we found a v2 networkstatus. */
- typedef enum {
- NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
- } v2_networkstatus_source_t;
- /** Possible statuses of a version of Tor, given opinions from the directory
- * servers. */
- typedef enum version_status_t {
- VS_RECOMMENDED=0, /**< This version is listed as recommended. */
- VS_OLD=1, /**< This version is older than any recommended version. */
- VS_NEW=2, /**< This version is newer than any recommended version. */
- VS_NEW_IN_SERIES=3, /**< This version is newer than any recommended version
- * in its series, but later recommended versions exist.
- */
- VS_UNRECOMMENDED=4, /**< This version is not recommended (general case). */
- VS_EMPTY=5, /**< The version list was empty; no agreed-on versions. */
- VS_UNKNOWN, /**< We have no idea. */
- } version_status_t;
- void networkstatus_reset_warnings(void);
- void networkstatus_reset_download_failures(void);
- int router_reload_v2_networkstatus(void);
- int router_reload_consensus_networkstatus(void);
- void routerstatus_free(routerstatus_t *rs);
- void networkstatus_v2_free(networkstatus_v2_t *ns);
- void networkstatus_vote_free(networkstatus_t *ns);
- networkstatus_voter_info_t *networkstatus_get_voter_by_id(
- networkstatus_t *vote,
- const char *identity);
- int networkstatus_check_consensus_signature(networkstatus_t *consensus,
- int warn);
- int networkstatus_check_voter_signature(networkstatus_t *consensus,
- networkstatus_voter_info_t *voter,
- authority_cert_t *cert);
- char *networkstatus_get_cache_filename(const char *identity_digest);
- int router_set_networkstatus_v2(const char *s, time_t arrived_at,
- v2_networkstatus_source_t source,
- smartlist_t *requested_fingerprints);
- void networkstatus_v2_list_clean(time_t now);
- routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns,
- const char *digest);
- routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns,
- const char *digest);
- int networkstatus_vote_find_entry_idx(networkstatus_t *ns,
- const char *digest, int *found_out);
- const smartlist_t *networkstatus_get_v2_list(void);
- download_status_t *router_get_dl_status_by_descriptor_digest(const char *d);
- routerstatus_t *router_get_consensus_status_by_id(const char *digest);
- routerstatus_t *router_get_consensus_status_by_descriptor_digest(
- const char *digest);
- routerstatus_t *router_get_consensus_status_by_nickname(const char *nickname,
- int warn_if_unnamed);
- const char *networkstatus_get_router_digest_by_nickname(const char *nickname);
- int networkstatus_nickname_is_unnamed(const char *nickname);
- void networkstatus_consensus_download_failed(int status_code);
- void update_consensus_networkstatus_fetch_time(time_t now);
- int should_delay_dir_fetches(or_options_t *options);
- void update_networkstatus_downloads(time_t now);
- void update_certificate_downloads(time_t now);
- int consensus_is_waiting_for_certs(void);
- networkstatus_v2_t *networkstatus_v2_get_by_digest(const char *digest);
- networkstatus_t *networkstatus_get_latest_consensus(void);
- networkstatus_t *networkstatus_get_live_consensus(time_t now);
- networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now);
- #define NSSET_FROM_CACHE 1
- #define NSSET_WAS_WAITING_FOR_CERTS 2
- #define NSSET_DONT_DOWNLOAD_CERTS 4
- #define NSSET_ACCEPT_OBSOLETE 8
- int networkstatus_set_current_consensus(const char *consensus, unsigned flags);
- void networkstatus_note_certs_arrived(void);
- void routers_update_all_from_networkstatus(time_t now, int dir_version);
- void routerstatus_list_update_from_consensus_networkstatus(time_t now);
- void routers_update_status_from_consensus_networkstatus(smartlist_t *routers,
- int reset_failures);
- void signed_descs_update_status_from_consensus_networkstatus(
- smartlist_t *descs);
- char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
- char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
- void networkstatus_dump_bridge_status_to_file(time_t now);
- int32_t networkstatus_get_param(networkstatus_t *ns, const char *param_name,
- int32_t default_val);
- int getinfo_helper_networkstatus(control_connection_t *conn,
- const char *question, char **answer);
- void networkstatus_free_all(void);
- /********************************* ntmain.c ***************************/
- #ifdef MS_WINDOWS
- #define NT_SERVICE
- #endif
- #ifdef NT_SERVICE
- int nt_service_parse_options(int argc, char **argv, int *should_exit);
- int nt_service_is_stopping(void);
- void nt_service_set_state(DWORD state);
- #else
- #define nt_service_is_stopping() (0)
- #endif
- /********************************* onion.c ***************************/
- int onion_pending_add(or_circuit_t *circ, char *onionskin);
- or_circuit_t *onion_next_task(char **onionskin_out);
- void onion_pending_remove(or_circuit_t *circ);
- int onion_skin_create(crypto_pk_env_t *router_key,
- crypto_dh_env_t **handshake_state_out,
- char *onion_skin_out);
- int onion_skin_server_handshake(const char *onion_skin,
- crypto_pk_env_t *private_key,
- crypto_pk_env_t *prev_private_key,
- char *handshake_reply_out,
- char *key_out,
- size_t key_out_len);
- int onion_skin_client_handshake(crypto_dh_env_t *handshake_state,
- const char *handshake_reply,
- char *key_out,
- size_t key_out_len);
- int fast_server_handshake(const char *key_in,
- char *handshake_reply_out,
- char *key_out,
- size_t key_out_len);
- int fast_client_handshake(const char *handshake_state,
- const char *handshake_reply_out,
- char *key_out,
- size_t key_out_len);
- void clear_pending_onions(void);
- /********************************* policies.c ************************/
- /* (length of "accept 255.255.255.255/255.255.255.255:65535-65535n" plus a
- * NUL.)
- */
- #define POLICY_BUF_LEN 52
- /** Outcome of applying an address policy to an address. */
- typedef enum {
- /** The address was accepted */
- ADDR_POLICY_ACCEPTED=0,
- /** The address was rejected */
- ADDR_POLICY_REJECTED=-1,
- /** Part of the address was unknown, but as far as we can tell, it was
- * accepted. */
- ADDR_POLICY_PROBABLY_ACCEPTED=1,
- /** Part of the address was unknown, but as far as we can tell, it was
- * rejected. */
- ADDR_POLICY_PROBABLY_REJECTED=2
- } addr_policy_result_t;
- int firewall_is_fascist_or(void);
- int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port);
- int fascist_firewall_allows_or(routerinfo_t *ri);
- int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port);
- int dir_policy_permits_address(const tor_addr_t *addr);
- int socks_policy_permits_address(const tor_addr_t *addr);
- int authdir_policy_permits_address(uint32_t addr, uint16_t port);
- int authdir_policy_valid_address(uint32_t addr, uint16_t port);
- int authdir_policy_baddir_address(uint32_t addr, uint16_t port);
- int authdir_policy_badexit_address(uint32_t addr, uint16_t port);
- int validate_addr_policies(or_options_t *options, char **msg);
- void policy_expand_private(smartlist_t **policy);
- int policies_parse_from_options(or_options_t *options);
- addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent);
- int cmp_addr_policies(smartlist_t *a, smartlist_t *b);
- addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr,
- uint16_t port, const smartlist_t *policy);
- addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr,
- uint16_t port, const smartlist_t *policy);
- int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
- int rejectprivate, const char *local_address);
- void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter);
- int exit_policy_is_general_exit(smartlist_t *policy);
- int policy_is_reject_star(const smartlist_t *policy);
- int getinfo_helper_policies(control_connection_t *conn,
- const char *question, char **answer);
- int policy_write_item(char *buf, size_t buflen, addr_policy_t *item,
- int format_for_desc);
- void addr_policy_list_free(smartlist_t *p);
- void addr_policy_free(addr_policy_t *p);
- void policies_free_all(void);
- char *policy_summarize(smartlist_t *policy);
- /********************************* reasons.c ***************************/
- const char *stream_end_reason_to_control_string(int reason);
- const char *stream_end_reason_to_string(int reason);
- socks5_reply_status_t stream_end_reason_to_socks5_response(int reason);
- uint8_t errno_to_stream_end_reason(int e);
- const char *orconn_end_reason_to_control_string(int r);
- int tls_error_to_orconn_end_reason(int e);
- int errno_to_orconn_end_reason(int e);
- const char *circuit_end_reason_to_control_string(int reason);
- /********************************* relay.c ***************************/
- extern uint64_t stats_n_relay_cells_relayed;
- extern uint64_t stats_n_relay_cells_delivered;
- int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
- cell_direction_t cell_direction);
- void relay_header_pack(char *dest, const relay_header_t *src);
- void relay_header_unpack(relay_header_t *dest, const char *src);
- int relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ,
- uint8_t relay_command, const char *payload,
- size_t payload_len, crypt_path_t *cpath_layer);
- int connection_edge_send_command(edge_connection_t *fromconn,
- uint8_t relay_command, const char *payload,
- size_t payload_len);
- int connection_edge_package_raw_inbuf(edge_connection_t *conn,
- int package_partial);
- void connection_edge_consider_sending_sendme(edge_connection_t *conn);
- extern uint64_t stats_n_data_cells_packaged;
- extern uint64_t stats_n_data_bytes_packaged;
- extern uint64_t stats_n_data_cells_received;
- extern uint64_t stats_n_data_bytes_received;
- void init_cell_pool(void);
- void free_cell_pool(void);
- void clean_cell_pool(void);
- void dump_cell_pool_usage(int severity);
- void cell_queue_clear(cell_queue_t *queue);
- void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell);
- void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell);
- void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn,
- cell_t *cell, cell_direction_t direction);
- void connection_or_unlink_all_active_circs(or_connection_t *conn);
- int connection_or_flush_from_first_active_circuit(or_connection_t *conn,
- int max, time_t now);
- void assert_active_circuits_ok(or_connection_t *orconn);
- void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn);
- void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn);
- int append_address_to_payload(char *payload_out, const tor_addr_t *addr);
- const char *decode_address_from_payload(tor_addr_t *addr_out,
- const char *payload,
- int payload_len);
- /********************************* rephist.c ***************************/
- void rep_hist_init(void);
- void rep_hist_note_connect_failed(const char* nickname, time_t when);
- void rep_hist_note_connect_succeeded(const char* nickname, time_t when);
- void rep_hist_note_disconnect(const char* nickname, time_t when);
- void rep_hist_note_connection_died(const char* nickname, time_t when);
- void rep_hist_note_extend_succeeded(const char *from_name,
- const char *to_name);
- void rep_hist_note_extend_failed(const char *from_name, const char *to_name);
- void rep_hist_dump_stats(time_t now, int severity);
- void rep_hist_note_bytes_read(size_t num_bytes, time_t when);
- void rep_hist_note_bytes_written(size_t num_bytes, time_t when);
- int rep_hist_bandwidth_assess(void);
- char *rep_hist_get_bandwidth_lines(int for_extrainfo);
- void rep_hist_update_state(or_state_t *state);
- int rep_hist_load_state(or_state_t *state, char **err);
- void rep_history_clean(time_t before);
- void rep_hist_note_router_reachable(const char *id, time_t when);
- void rep_hist_note_router_unreachable(const char *id, time_t when);
- int rep_hist_record_mtbf_data(time_t now, int missing_means_down);
- int rep_hist_load_mtbf_data(time_t now);
- time_t rep_hist_downrate_old_runs(time_t now);
- double rep_hist_get_stability(const char *id, time_t when);
- double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when);
- long rep_hist_get_weighted_time_known(const char *id, time_t when);
- int rep_hist_have_measured_enough_stability(void);
- const char *rep_hist_get_router_stability_doc(time_t now);
- void rep_hist_note_used_port(time_t now, uint16_t port);
- smartlist_t *rep_hist_get_predicted_ports(time_t now);
- void rep_hist_note_used_resolve(time_t now);
- void rep_hist_note_used_internal(time_t now, int need_uptime,
- int need_capacity);
- int rep_hist_get_predicted_internal(time_t now, int *need_uptime,
- int *need_capacity);
- int any_predicted_circuits(time_t now);
- int rep_hist_circbuilding_dormant(time_t now);
- /** Possible public/private key operations in Tor: used to keep track of where
- * we're spending our time. */
- typedef enum {
- SIGN_DIR, SIGN_RTR,
- VERIFY_DIR, VERIFY_RTR,
- ENC_ONIONSKIN, DEC_ONIONSKIN,
- TLS_HANDSHAKE_C, TLS_HANDSHAKE_S,
- REND_CLIENT, REND_MID, REND_SERVER,
- } pk_op_t;
- void note_crypto_pk_op(pk_op_t operation);
- void dump_pk_ops(int severity);
- void rep_hist_free_all(void);
- /* for hidden service usage statistics */
- void hs_usage_note_publish_total(const char *service_id, time_t now);
- void hs_usage_note_publish_novel(const char *service_id, time_t now);
- void hs_usage_note_fetch_total(const char *service_id, time_t now);
- void hs_usage_note_fetch_successful(const char *service_id, time_t now);
- void hs_usage_write_statistics_to_file(time_t now);
- void hs_usage_free_all(void);
- /********************************* rendclient.c ***************************/
- void rend_client_introcirc_has_opened(origin_circuit_t *circ);
- void rend_client_rendcirc_has_opened(origin_circuit_t *circ);
- int rend_client_introduction_acked(origin_circuit_t *circ, const char *request,
- size_t request_len);
- void rend_client_refetch_renddesc(const char *query);
- void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query);
- int rend_client_remove_intro_point(extend_info_t *failed_intro,
- const rend_data_t *rend_query);
- int rend_client_rendezvous_acked(origin_circuit_t *circ, const char *request,
- size_t request_len);
- int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request,
- size_t request_len);
- void rend_client_desc_trynow(const char *query, int rend_version);
- extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query);
- int rend_client_send_introduction(origin_circuit_t *introcirc,
- origin_circuit_t *rendcirc);
- int rend_parse_service_authorization(or_options_t *options,
- int validate_only);
- rend_service_authorization_t *rend_client_lookup_service_authorization(
- const char *onion_address);
- void rend_service_authorization_free_all(void);
- rend_data_t *rend_data_dup(const rend_data_t *request);
- /********************************* rendcommon.c ***************************/
- /** Hidden-service side configuration of client authorization. */
- typedef struct rend_authorized_client_t {
- char *client_name;
- char descriptor_cookie[REND_DESC_COOKIE_LEN];
- crypto_pk_env_t *client_key;
- } rend_authorized_client_t;
- /** ASCII-encoded v2 hidden service descriptor. */
- typedef struct rend_encoded_v2_service_descriptor_t {
- char desc_id[DIGEST_LEN]; /**< Descriptor ID. */
- char *desc_str; /**< Descriptor string. */
- } rend_encoded_v2_service_descriptor_t;
- /** Introduction point information. */
- typedef struct rend_intro_point_t {
- extend_info_t *extend_info; /**< Extend info of this introduction point. */
- crypto_pk_env_t *intro_key; /**< Introduction key that replaces the service
- * key, if this descriptor is V2. */
- } rend_intro_point_t;
- /** Information used to connect to a hidden service. */
- typedef struct rend_service_descriptor_t {
- crypto_pk_env_t *pk; /**< This service's public key. */
- int version; /**< Version of the descriptor format: 0 or 2. */
- time_t timestamp; /**< Time when the descriptor was generated. */
- uint16_t protocols; /**< Bitmask: which rendezvous protocols are supported?
- * (We allow bits '0', '1', and '2' to be set.) */
- /** List of the service's introduction points. Elements are removed if
- * introduction attempts fail. */
- smartlist_t *intro_nodes;
- /** Has descriptor been uploaded to all hidden service directories? */
- int all_uploads_performed;
- /** List of hidden service directories to which an upload request for
- * this descriptor could be sent. Smartlist exists only when at least one
- * of the previous upload requests failed (otherwise it's not important
- * to know which uploads succeeded and which not). */
- smartlist_t *successful_uploads;
- } rend_service_descriptor_t;
- /** Free all storage associated with <b>data</b> */
- static INLINE void
- rend_data_free(rend_data_t *data)
- {
- tor_free(data);
- }
- int rend_cmp_service_ids(const char *one, const char *two);
- void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint,
- int command, size_t length, const char *payload);
- void rend_service_descriptor_free(rend_service_descriptor_t *desc);
- int rend_encode_service_descriptor(rend_service_descriptor_t *desc,
- crypto_pk_env_t *key,
- char **str_out,
- size_t *len_out);
- rend_service_descriptor_t *rend_parse_service_descriptor(const char *str,
- size_t len);
- int rend_get_service_id(crypto_pk_env_t *pk, char *out);
- void rend_encoded_v2_service_descriptor_free(
- rend_encoded_v2_service_descriptor_t *desc);
- void rend_intro_point_free(rend_intro_point_t *intro);
- /** A cached rendezvous descriptor. */
- typedef struct rend_cache_entry_t {
- size_t len; /**< Length of <b>desc</b> */
- time_t received; /**< When was the descriptor received? */
- char *desc; /**< Service descriptor */
- rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */
- } rend_cache_entry_t;
- void rend_cache_init(void);
- void rend_cache_clean(void);
- void rend_cache_clean_v2_descs_as_dir(void);
- void rend_cache_free_all(void);
- int rend_valid_service_id(const char *query);
- int rend_cache_lookup_desc(const char *query, int version, const char **desc,
- size_t *desc_len);
- int rend_cache_lookup_entry(const char *query, int version,
- rend_cache_entry_t **entry_out);
- int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc);
- int rend_cache_store(const char *desc, size_t desc_len, int published);
- int rend_cache_store_v2_desc_as_client(const char *desc,
- const rend_data_t *rend_query);
- int rend_cache_store_v2_desc_as_dir(const char *desc);
- int rend_cache_size(void);
- int rend_encode_v2_descriptors(smartlist_t *descs_out,
- rend_service_descriptor_t *desc, time_t now,
- uint8_t period, rend_auth_type_t auth_type,
- crypto_pk_env_t *client_key,
- smartlist_t *client_cookies);
- int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id,
- const char *descriptor_cookie,
- time_t now, uint8_t replica);
- int rend_id_is_in_interval(const char *a, const char *b, const char *c);
- void rend_get_descriptor_id_bytes(char *descriptor_id_out,
- const char *service_id,
- const char *secret_id_part);
- /********************************* rendservice.c ***************************/
- int num_rend_services(void);
- int rend_config_services(or_options_t *options, int validate_only);
- int rend_service_load_keys(void);
- void rend_services_init(void);
- void rend_services_introduce(void);
- void rend_consider_services_upload(time_t now);
- void rend_hsdir_routers_changed(void);
- void rend_consider_descriptor_republication(void);
- void rend_service_intro_has_opened(origin_circuit_t *circuit);
- int rend_service_intro_established(origin_circuit_t *circuit,
- const char *request,
- size_t request_len);
- void rend_service_rendezvous_has_opened(origin_circuit_t *circuit);
- int rend_service_introduce(origin_circuit_t *circuit, const char *request,
- size_t request_len);
- void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc);
- int rend_service_set_connection_addr_port(edge_connection_t *conn,
- origin_circuit_t *circ);
- void rend_service_dump_stats(int severity);
- void rend_service_free_all(void);
- /********************************* rendmid.c *******************************/
- int rend_mid_establish_intro(or_circuit_t *circ, const char *request,
- size_t request_len);
- int rend_mid_introduce(or_circuit_t *circ, const char *request,
- size_t request_len);
- int rend_mid_establish_rendezvous(or_circuit_t *circ, const char *request,
- size_t request_len);
- int rend_mid_rendezvous(or_circuit_t *circ, const char *request,
- size_t request_len);
- /********************************* router.c ***************************/
- crypto_pk_env_t *get_onion_key(void);
- time_t get_onion_key_set_at(void);
- void set_identity_key(crypto_pk_env_t *k);
- crypto_pk_env_t *get_identity_key(void);
- int identity_key_is_set(void);
- authority_cert_t *get_my_v3_authority_cert(void);
- crypto_pk_env_t *get_my_v3_authority_signing_key(void);
- authority_cert_t *get_my_v3_legacy_cert(void);
- crypto_pk_env_t *get_my_v3_legacy_signing_key(void);
- void dup_onion_keys(crypto_pk_env_t **key, crypto_pk_env_t **last);
- void rotate_onion_key(void);
- crypto_pk_env_t *init_key_from_file(const char *fname, int generate,
- int severity);
- void v3_authority_check_key_expiry(void);
- int init_keys(void);
- int check_whether_orport_reachable(void);
- int check_whether_dirport_reachable(void);
- void consider_testing_reachability(int test_or, int test_dir);
- void router_orport_found_reachable(void);
- void router_dirport_found_reachable(void);
- void router_perform_bandwidth_test(int num_circs, time_t now);
- int authdir_mode(or_options_t *options);
- int authdir_mode_v1(or_options_t *options);
- int authdir_mode_v2(or_options_t *options);
- int authdir_mode_v3(or_options_t *options);
- int authdir_mode_any_main(or_options_t *options);
- int authdir_mode_any_nonhidserv(or_options_t *options);
- int authdir_mode_handles_descs(or_options_t *options, int purpose);
- int authdir_mode_publishes_statuses(or_options_t *options);
- int authdir_mode_tests_reachability(or_options_t *options);
- int authdir_mode_bridge(or_options_t *options);
- int clique_mode(or_options_t *options);
- int server_mode(or_options_t *options);
- int advertised_server_mode(void);
- int proxy_mode(or_options_t *options);
- void consider_publishable_server(int force);
- int router_is_clique_mode(routerinfo_t *router);
- void router_upload_dir_desc_to_dirservers(int force);
- void mark_my_descriptor_dirty_if_older_than(time_t when);
- void mark_my_descriptor_dirty(void);
- void check_descriptor_bandwidth_changed(time_t now);
- void check_descriptor_ipaddress_changed(time_t now);
- void router_new_address_suggestion(const char *suggestion,
- const dir_connection_t *d_conn);
- int router_compare_to_my_exit_policy(edge_connection_t *conn);
- routerinfo_t *router_get_my_routerinfo(void);
- extrainfo_t *router_get_my_extrainfo(void);
- const char *router_get_my_descriptor(void);
- int router_digest_is_me(const char *digest);
- int router_extrainfo_digest_is_me(const char *digest);
- int router_is_me(routerinfo_t *router);
- int router_fingerprint_is_me(const char *fp);
- int router_pick_published_address(or_options_t *options, uint32_t *addr);
- int router_rebuild_descriptor(int force);
- int router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router,
- crypto_pk_env_t *ident_key);
- int extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo,
- crypto_pk_env_t *ident_key);
- char *extrainfo_get_client_geoip_summary(time_t);
- int is_legal_nickname(const char *s);
- int is_legal_nickname_or_hexdigest(const char *s);
- int is_legal_hexdigest(const char *s);
- void router_get_verbose_nickname(char *buf, const routerinfo_t *router);
- void routerstatus_get_verbose_nickname(char *buf,
- const routerstatus_t *router);
- void router_reset_warnings(void);
- void router_reset_reachability(void);
- void router_free_all(void);
- const char *router_purpose_to_string(uint8_t p);
- uint8_t router_purpose_from_string(const char *s);
- #ifdef ROUTER_PRIVATE
- /* Used only by router.c and test.c */
- void get_platform_str(char *platform, size_t len);
- #endif
- /********************************* routerlist.c ***************************/
- /** Represents information about a single trusted directory server. */
- typedef struct trusted_dir_server_t {
- char *description;
- char *nickname;
- char *address; /**< Hostname. */
- uint32_t addr; /**< IPv4 address. */
- uint16_t dir_port; /**< Directory port. */
- uint16_t or_port; /**< OR port: Used for tunneling connections. */
- char digest[DIGEST_LEN]; /**< Digest of identity key. */
- char v3_identity_digest[DIGEST_LEN]; /**< Digest of v3 (authority only,
- * high-security) identity key. */
- unsigned int is_running:1; /**< True iff we think this server is running. */
- /** True iff this server has accepted the most recent server descriptor
- * we tried to upload to it. */
- unsigned int has_accepted_serverdesc:1;
- /** What kind of authority is this? (Bitfield.) */
- authority_type_t type;
- download_status_t v2_ns_dl_status; /**< Status of downloading this server's
- * v2 network status. */
- time_t addr_current_at; /**< When was the document that we derived the
- * address information from published? */
- routerstatus_t fake_status; /**< Used when we need to pass this trusted
- * dir_server_t to directory_initiate_command_*
- * as a routerstatus_t. Not updated by the
- * router-status management code!
- **/
- } trusted_dir_server_t;
- #define ROUTER_REQUIRED_MIN_BANDWIDTH (20*1024)
- #define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX
- int get_n_authorities(authority_type_t type);
- 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);
- smartlist_t *router_get_trusted_dir_servers(void);
- /* Flags for pick_directory_server and pick_trusteddirserver. */
- /** Flag to indicate that we should not automatically be willing to use
- * ourself to answer a directory request.
- * Passed to router_pick_directory_server (et al).*/
- #define PDS_ALLOW_SELF (1<<0)
- /** Flag to indicate that if no servers seem to be up, we should mark all
- * directory servers as up and try again.
- * Passed to router_pick_directory_server (et al).*/
- #define PDS_RETRY_IF_NO_SERVERS (1<<1)
- /** Flag to indicate that we should not exclude directory servers that
- * our ReachableAddress settings would exclude. This usually means that
- * we're going to connect to the server over Tor, and so we don't need to
- * worry about our firewall telling us we can't.
- * Passed to router_pick_directory_server (et al).*/
- #define PDS_IGNORE_FASCISTFIREWALL (1<<2)
- /** Flag to indicate that we should not use any directory authority to which
- * we have an existing directory connection for downloading server descriptors
- * or extrainfo documents.
- *
- * Passed to router_pick_directory_server (et al)
- *
- * [XXXX NOTE: This option is only implemented for pick_trusteddirserver,
- * not pick_directory_server. If we make it work on pick_directory_server
- * too, we could conservatively make it only prevent multiple fetches to
- * the same authority, or we could aggressively make it prevent multiple
- * fetches to _any_ single directory server.]
- */
- #define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3)
- #define _PDS_PREFER_TUNNELED_DIR_CONNS (1<<16)
- routerstatus_t *router_pick_directory_server(authority_type_t type, int flags);
- 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);
- routerstatus_t *router_pick_trusteddirserver(authority_type_t type, int flags);
- int router_get_my_share_of_directory_requests(double *v2_share_out,
- double *v3_share_out);
- void router_reset_status_download_failures(void);
- void routerlist_add_family(smartlist_t *sl, routerinfo_t *router);
- int routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2);
- void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list,
- int must_be_running);
- int router_nickname_is_in_list(routerinfo_t *router, const char *list);
- routerinfo_t *routerlist_find_my_routerinfo(void);
- routerinfo_t *router_find_exact_exit_enclave(const char *address,
- uint16_t port);
- int router_is_unreliable(routerinfo_t *router, int need_uptime,
- int need_capacity, int need_guard);
- uint32_t router_get_advertised_bandwidth(routerinfo_t *router);
- uint32_t router_get_advertised_bandwidth_capped(routerinfo_t *router);
- /** Possible ways to weight routers when choosing one randomly. See
- * routerlist_sl_choose_by_bandwidth() for more information.*/
- typedef enum {
- NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_GUARD
- } bandwidth_weight_rule_t;
- routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl,
- bandwidth_weight_rule_t rule);
- routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl);
- /** Flags to be passed to control router_choose_random_node() to indicate what
- * kind of nodes to pick according to what algorithm. */
- typedef enum {
- CRN_NEED_UPTIME = 1<<0,
- CRN_NEED_CAPACITY = 1<<1,
- CRN_NEED_GUARD = 1<<2,
- CRN_ALLOW_INVALID = 1<<3,
- /* XXXX not used, apparently. */
- CRN_STRICT_PREFERRED = 1<<4,
- /* XXXX not used, apparently. */
- CRN_WEIGHT_AS_EXIT = 1<<5
- } router_crn_flags_t;
- routerinfo_t *router_choose_random_node(const char *preferred,
- smartlist_t *excludedsmartlist,
- struct routerset_t *excludedset,
- router_crn_flags_t flags);
- routerinfo_t *router_get_by_nickname(const char *nickname,
- int warn_if_unnamed);
- int router_digest_version_as_new_as(const char *digest, const char *cutoff);
- int router_digest_is_trusted_dir_type(const char *digest,
- authority_type_t type);
- #define router_digest_is_trusted_dir(d)
- router_digest_is_trusted_dir_type((d), NO_AUTHORITY)
- int router_addr_is_trusted_dir(uint32_t addr);
- int hexdigest_to_digest(const char *hexdigest, char *digest);
- routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
- routerinfo_t *router_get_by_digest(const char *digest);
- 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);
- const char *signed_descriptor_get_body(signed_descriptor_t *desc);
- const char *signed_descriptor_get_annotations(signed_descriptor_t *desc);
- 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);
- /** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */
- typedef enum was_router_added_t {
- ROUTER_ADDED_SUCCESSFULLY = 1,
- ROUTER_ADDED_NOTIFY_GENERATOR = 0,
- ROUTER_BAD_EI = -1,
- ROUTER_WAS_NOT_NEW = -2,
- ROUTER_NOT_IN_CONSENSUS = -3,
- ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4,
- ROUTER_AUTHDIR_REJECTS = -5,
- } was_router_added_t;
- 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);
- /** Return true iff the descriptor was added. It might still be necessary to
- * check whether the descriptor generator should be notified.
- */
- static INLINE int
- WRA_WAS_ADDED(was_router_added_t s) {
- return s == ROUTER_ADDED_SUCCESSFULLY || s == ROUTER_ADDED_NOTIFY_GENERATOR;
- }
- /** Return true iff the descriptor was not added because it was either:
- * - 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);
- }
- /** Return true iff the descriptor rejected because it was malformed. */
- 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);
- 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);
- int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port,
- int need_uptime);
- int router_exit_policy_rejects_all(routerinfo_t *router);
- 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,
- authority_type_t type);
- void authority_cert_free(authority_cert_t *cert);
- void clear_trusted_dir_servers(void);
- int any_trusted_dir_is_v1_authority(void);
- void update_router_descriptor_downloads(time_t now);
- 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);
- int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2);
- int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei,
- signed_descriptor_t *sd,
- const char **msg);
- void routerlist_assert_ok(routerlist_t *rl);
- const char *esc_router_info(routerinfo_t *router);
- void routers_sort_by_identity(smartlist_t *routers);
- routerset_t *routerset_new(void);
- 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);
- int routerset_contains_router(const routerset_t *set, routerinfo_t *ri);
- int routerset_contains_routerstatus(const routerset_t *set,
- routerstatus_t *rs);
- int routerset_contains_extendinfo(const routerset_t *set,
- const extend_info_t *ei);
- void routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset,
- int running_only);
- void routersets_get_disjunction(smartlist_t *target, const smartlist_t *source,
- const routerset_t *include,
- const routerset_t *exclude, int running_only);
- void routerset_subtract_routers(smartlist_t *out,
- const routerset_t *routerset);
- char *routerset_to_string(const routerset_t *routerset);
- void routerset_refresh_countries(routerset_t *target);
- int routerset_equal(const routerset_t *old, const routerset_t *new);
- void routerset_free(routerset_t *routerset);
- void routerinfo_set_country(routerinfo_t *ri);
- void routerlist_refresh_countries(void);
- 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);
- /********************************* routerparse.c ************************/
- #define MAX_STATUS_TAG_LEN 32
- /** Structure to hold parsed Tor versions. This is a little messier
- * than we would like it to be, because we changed version schemes with 0.1.0.
- *
- * See version-spec.txt for the whole business.
- */
- typedef struct tor_version_t {
- int major;
- int minor;
- int micro;
- /** Release status. For version in the post-0.1 format, this is always
- * VER_RELEASE. */
- enum { VER_PRE=0, VER_RC=1, VER_RELEASE=2, } status;
- int patchlevel;
- char status_tag[MAX_STATUS_TAG_LEN];
- int svn_revision;
- } tor_version_t;
- int router_get_router_hash(const char *s, char *digest);
- int router_get_dir_hash(const char *s, char *digest);
- int router_get_runningrouters_hash(const char *s, char *digest);
- int router_get_networkstatus_v2_hash(const char *s, char *digest);
- int router_get_networkstatus_v3_hash(const char *s, char *digest);
- int router_get_extrainfo_hash(const char *s, char *digest);
- int router_append_dirobj_signature(char *buf, size_t buf_len,
- const char *digest,
- crypto_pk_env_t *private_key);
- int router_parse_list_from_string(const char **s, const char *eos,
- smartlist_t *dest,
- saved_location_t saved_location,
- int is_extrainfo,
- int allow_annotations,
- const char *prepend_annotations);
- int router_parse_routerlist_from_directory(const char *s,
- routerlist_t **dest,
- crypto_pk_env_t *pkey,
- int check_version,
- int write_to_cache);
- int router_parse_runningrouters(const char *str);
- int router_parse_directory(const char *str);
- routerinfo_t *router_parse_entry_from_string(const char *s, const char *end,
- int cache_copy,
- int allow_annotations,
- const char *prepend_annotations);
- extrainfo_t *extrainfo_parse_entry_from_string(const char *s, const char *end,
- int cache_copy, struct digest_ri_map_t *routermap);
- addr_policy_t *router_parse_addr_policy_item_from_string(const char *s,
- int assume_action);
- version_status_t tor_version_is_obsolete(const char *myversion,
- const char *versionlist);
- int tor_version_parse(const char *s, tor_version_t *out);
- int tor_version_as_new_as(const char *platform, const char *cutoff);
- int tor_version_compare(tor_version_t *a, tor_version_t *b);
- void sort_version_list(smartlist_t *lst, int remove_duplicates);
- void assert_addr_policy_ok(smartlist_t *t);
- void dump_distinct_digest_count(int severity);
- networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s);
- networkstatus_t *networkstatus_parse_vote_from_string(const char *s,
- const char **eos_out,
- networkstatus_type_t ns_type);
- ns_detached_signatures_t *networkstatus_parse_detached_signatures(
- const char *s, const char *eos);
- authority_cert_t *authority_cert_parse_from_string(const char *s,
- const char **end_of_string);
- int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
- char *desc_id_out,
- char **intro_points_encrypted_out,
- size_t *intro_points_encrypted_size_out,
- size_t *encoded_size_out,
- const char **next_out, const char *desc);
- int rend_decrypt_introduction_points(char **ipos_decrypted,
- size_t *ipos_decrypted_size,
- const char *descriptor_cookie,
- const char *ipos_encrypted,
- size_t ipos_encrypted_size);
- int rend_parse_introduction_points(rend_service_descriptor_t *parsed,
- const char *intro_points_encoded,
- size_t intro_points_encoded_size);
- int rend_parse_client_keys(strmap_t *parsed_clients, const char *str);
- #endif