commit a0bc164af57a3e5828cfc4fdefb9b2191af79ce9 Author: Nick Mathewson nickm@torproject.org Date: Fri Jun 15 11:34:33 2018 -0400
Extract {or,origin}_circuit_t into their own headers --- src/or/circpathbias.c | 2 + src/or/circuitbuild.c | 2 + src/or/circuitlist.c | 27 ++++ src/or/circuitlist.h | 9 ++ src/or/circuitmux.c | 2 + src/or/circuitstats.c | 2 + src/or/circuituse.c | 2 + src/or/command.c | 3 + src/or/connection_edge.c | 2 + src/or/control.c | 2 + src/or/cpuworker.c | 2 + src/or/directory.h | 1 + src/or/dns.c | 1 + src/or/entrynodes.c | 2 + src/or/hs_cell.c | 2 + src/or/hs_circuit.c | 2 + src/or/hs_circuitmap.c | 3 + src/or/hs_client.c | 1 + src/or/hs_common.c | 1 + src/or/hs_intropoint.c | 2 + src/or/hs_service.c | 1 + src/or/include.am | 2 + src/or/onion.c | 2 + src/or/or.h | 316 +------------------------------------- src/or/or_circuit_st.h | 77 ++++++++++ src/or/origin_circuit_st.h | 233 ++++++++++++++++++++++++++++ src/or/relay.c | 2 + src/or/relay_crypto.c | 4 + src/or/rendclient.c | 1 + src/or/rendcommon.c | 3 + src/or/rendmid.c | 2 + src/or/rendservice.c | 1 + src/or/rephist.c | 2 + src/or/router.c | 1 + src/test/bench.c | 2 + src/test/test.c | 2 + src/test/test_cell_queue.c | 3 + src/test/test_channel.c | 2 + src/test/test_circuitlist.c | 3 + src/test/test_circuitstats.c | 2 + src/test/test_circuituse.c | 2 + src/test/test_controller_events.c | 3 + src/test/test_dns.c | 1 + src/test/test_entrynodes.c | 1 + src/test/test_helpers.c | 1 + src/test/test_hs_client.c | 1 + src/test/test_hs_intropoint.c | 2 + src/test/test_hs_service.c | 2 + src/test/test_oom.c | 2 + src/test/test_relay.c | 2 + src/test/test_relaycell.c | 1 + src/test/test_relaycrypt.c | 4 + src/test/test_status.c | 3 + 53 files changed, 443 insertions(+), 313 deletions(-)
diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c index ff42bf91e..f139c6d7e 100644 --- a/src/or/circpathbias.c +++ b/src/or/circpathbias.c @@ -35,6 +35,8 @@ #include "networkstatus.h" #include "relay.h"
+#include "origin_circuit_st.h" + static void pathbias_count_successful_close(origin_circuit_t *circ); static void pathbias_count_collapse(origin_circuit_t *circ); static void pathbias_count_use_failed(origin_circuit_t *circ); diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 883f93074..c5d1c65f5 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -66,6 +66,8 @@ #include "transports.h"
#include "entry_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
static channel_t * channel_connect_for_circuit(const tor_addr_t *addr, uint16_t port, diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 1a3f3a229..7601bc613 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -94,6 +94,8 @@
#include "dir_connection_st.h" #include "edge_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
/********* START VARIABLES **********/
@@ -130,6 +132,31 @@ static int any_opened_circs_cached_val = 0;
/********* END VARIABLES ************/
+or_circuit_t * +TO_OR_CIRCUIT(circuit_t *x) +{ + tor_assert(x->magic == OR_CIRCUIT_MAGIC); + return DOWNCAST(or_circuit_t, x); +} +const or_circuit_t * +CONST_TO_OR_CIRCUIT(const circuit_t *x) +{ + tor_assert(x->magic == OR_CIRCUIT_MAGIC); + return DOWNCAST(or_circuit_t, x); +} +origin_circuit_t * +TO_ORIGIN_CIRCUIT(circuit_t *x) +{ + tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); + return DOWNCAST(origin_circuit_t, x); +} +const origin_circuit_t * +CONST_TO_ORIGIN_CIRCUIT(const circuit_t *x) +{ + tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); + return DOWNCAST(origin_circuit_t, x); +} + /** A map from channel and circuit ID to circuit. (Lookup performance is * very important here, since we need to do it every time a cell arrives.) */ typedef struct chan_circid_circuit_map_t { diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index 246f0c881..8eb6fefbf 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -15,6 +15,15 @@ #include "testsupport.h" #include "hs_ident.h"
+/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert + * if the cast is impossible. */ +or_circuit_t *TO_OR_CIRCUIT(circuit_t *); +const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *); +/** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t. + * Assert if the cast is impossible. */ +origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *); +const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *); + MOCK_DECL(smartlist_t *, circuit_get_global_list, (void)); smartlist_t *circuit_get_global_origin_circuit_list(void); int circuit_any_opened_circuits(void); diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c index f9f5faa05..5f7f002f4 100644 --- a/src/or/circuitmux.c +++ b/src/or/circuitmux.c @@ -75,6 +75,8 @@ #include "circuitmux.h" #include "relay.h"
+#include "or_circuit_st.h" + /* * Private typedefs for circuitmux.c */ diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index 94f75c590..bff553a02 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -41,6 +41,8 @@ #include "circuitlist.h" #include "circuituse.h"
+#include "origin_circuit_st.h" + #undef log #include <math.h>
diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 45eeff433..3a18c3403 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -59,6 +59,8 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
static void circuit_expire_old_circuits_clientside(void); static void circuit_increment_failure_count(void); diff --git a/src/or/command.c b/src/or/command.c index 39950f41b..148578a26 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -56,6 +56,9 @@ #include "router.h" #include "routerlist.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + /** How many CELL_CREATE cells have we received, ever? */ uint64_t stats_n_create_cells_processed = 0; /** How many CELL_CREATED cells have we received, ever? */ diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 1ba61609b..b972724a8 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -99,6 +99,8 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
#ifdef HAVE_LINUX_TYPES_H #include <linux/types.h> diff --git a/src/or/control.c b/src/or/control.c index 45914f0c1..183778801 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -84,6 +84,8 @@ #include "control_connection_st.h" #include "entry_connection_st.h" #include "or_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
#ifndef _WIN32 #include <pwd.h> diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index 15ef6869c..ad66268c3 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -32,6 +32,8 @@ #include "router.h" #include "workqueue.h"
+#include "or_circuit_st.h" + static void queue_pending_tasks(void);
typedef struct worker_state_s { diff --git a/src/or/directory.h b/src/or/directory.h index e94c02b6c..8823de4d9 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -61,6 +61,7 @@ void directory_request_set_dir_addr_port(directory_request_t *req, const tor_addr_port_t *p); void directory_request_set_directory_id_digest(directory_request_t *req, const char *digest); +struct circuit_guard_state_t; void directory_request_set_guard_state(directory_request_t *req, struct circuit_guard_state_t *state); void directory_request_set_router_purpose(directory_request_t *req, diff --git a/src/or/dns.c b/src/or/dns.c index 422751553..defc86bc9 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -66,6 +66,7 @@ #include "sandbox.h"
#include "edge_connection_st.h" +#include "or_circuit_st.h"
#include <event2/event.h> #include <event2/dns.h> diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 27d760f1a..8aac07451 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -139,6 +139,8 @@ #include "transports.h" #include "statefile.h"
+#include "origin_circuit_st.h" + /** A list of existing guard selection contexts. */ static smartlist_t *guard_contexts = NULL; /** The currently enabled guard selection context. */ diff --git a/src/or/hs_cell.c b/src/or/hs_cell.c index 03273a44f..f5ed3df57 100644 --- a/src/or/hs_cell.c +++ b/src/or/hs_cell.c @@ -16,6 +16,8 @@ #include "hs_cell.h" #include "hs_ntor.h"
+#include "origin_circuit_st.h" + /* Trunnel. */ #include "ed25519_cert.h" #include "hs/cell_common.h" diff --git a/src/or/hs_circuit.c b/src/or/hs_circuit.c index a35d2af8b..189ebdc1b 100644 --- a/src/or/hs_circuit.c +++ b/src/or/hs_circuit.c @@ -33,6 +33,8 @@ #include "hs/cell_common.h" #include "hs/cell_establish_intro.h"
+#include "origin_circuit_st.h" + /* A circuit is about to become an e2e rendezvous circuit. Check * <b>circ_purpose</b> and ensure that it's properly set. Return true iff * circuit purpose is properly set, otherwise return false. */ diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c index 112c8bdce..fd0a01f8b 100644 --- a/src/or/hs_circuitmap.c +++ b/src/or/hs_circuitmap.c @@ -18,6 +18,9 @@ #include "circuitlist.h" #include "hs_circuitmap.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + /************************** HS circuitmap code *******************************/
/* This is the hidden service circuitmap. It's a hash table that maps diff --git a/src/or/hs_client.c b/src/or/hs_client.c index ff84296d0..c4db60e52 100644 --- a/src/or/hs_client.c +++ b/src/or/hs_client.c @@ -37,6 +37,7 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "origin_circuit_st.h"
/* Return a human-readable string for the client fetch status code. */ static const char * diff --git a/src/or/hs_common.c b/src/or/hs_common.c index 33c09b53f..afe80467a 100644 --- a/src/or/hs_common.c +++ b/src/or/hs_common.c @@ -34,6 +34,7 @@ #include "dirauth/shared_random_state.h"
#include "edge_connection_st.h" +#include "origin_circuit_st.h"
/* Trunnel */ #include "ed25519_cert.h" diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c index 3274e8e9c..58416fbe9 100644 --- a/src/or/hs_intropoint.c +++ b/src/or/hs_intropoint.c @@ -27,6 +27,8 @@ #include "hs_intropoint.h" #include "hs_common.h"
+#include "or_circuit_st.h" + /** Extract the authentication key from an ESTABLISH_INTRO or INTRODUCE1 using * the given <b>cell_type</b> from <b>cell</b> and place it in * <b>auth_key_out</b>. */ diff --git a/src/or/hs_service.c b/src/or/hs_service.c index 9f12484eb..6c2c16734 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -41,6 +41,7 @@
#include "dir_connection_st.h" #include "edge_connection_st.h" +#include "origin_circuit_st.h"
/* Trunnel */ #include "ed25519_cert.h" diff --git a/src/or/include.am b/src/or/include.am index de263e9b8..eb8b52e93 100644 --- a/src/or/include.am +++ b/src/or/include.am @@ -250,9 +250,11 @@ ORHEADERS = \ src/or/onion_ntor.h \ src/or/onion_tap.h \ src/or/or.h \ + src/or/or_circuit_st.h \ src/or/or_connection_st.h \ src/or/or_handshake_certs_st.h \ src/or/or_handshake_state_st.h \ + src/or/origin_circuit_st.h \ src/or/transports.h \ src/or/parsecommon.h \ src/or/periodic.h \ diff --git a/src/or/onion.c b/src/or/onion.c index 829be12ba..813ad265e 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -77,6 +77,8 @@ #include "rephist.h" #include "router.h"
+#include "or_circuit_st.h" + // trunnel #include "ed25519_cert.h"
diff --git a/src/or/or.h b/src/or/or.h index c3506d3ff..61987d825 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2561,6 +2561,9 @@ typedef struct circuit_t { HT_ENTRY(circuit_t) hs_circuitmap_node; } circuit_t;
+typedef struct origin_circuit_t origin_circuit_t; +typedef struct or_circuit_t or_circuit_t; + /** Largest number of relay_early cells that we can send on a given * circuit. */ #define MAX_RELAY_EARLY_CELLS_PER_CIRCUIT 8 @@ -2622,288 +2625,6 @@ typedef enum { } path_state_t; #define path_state_bitfield_t ENUM_BF(path_state_t)
-/** An origin_circuit_t holds data necessary to build and use a circuit. - */ -typedef struct origin_circuit_t { - circuit_t base_; - - /** Linked list of AP streams (or EXIT streams if hidden service) - * associated with this circuit. */ - edge_connection_t *p_streams; - - /** Bytes read on this circuit since last call to - * control_event_circ_bandwidth_used(). Only used if we're configured - * to emit CIRC_BW events. */ - uint32_t n_read_circ_bw; - - /** Bytes written to on this circuit since last call to - * control_event_circ_bandwidth_used(). Only used if we're configured - * to emit CIRC_BW events. */ - uint32_t n_written_circ_bw; - - /** Total known-valid relay cell bytes since last call to - * control_event_circ_bandwidth_used(). Only used if we're configured - * to emit CIRC_BW events. */ - uint32_t n_delivered_read_circ_bw; - - /** Total written relay cell bytes since last call to - * control_event_circ_bandwidth_used(). Only used if we're configured - * to emit CIRC_BW events. */ - uint32_t n_delivered_written_circ_bw; - - /** Total overhead data in all known-valid relay data cells since last - * call to control_event_circ_bandwidth_used(). Only used if we're - * configured to emit CIRC_BW events. */ - uint32_t n_overhead_read_circ_bw; - - /** Total written overhead data in all relay data cells since last call to - * control_event_circ_bandwidth_used(). Only used if we're configured - * to emit CIRC_BW events. */ - uint32_t n_overhead_written_circ_bw; - - /** Build state for this circuit. It includes the intended path - * length, the chosen exit router, rendezvous information, etc. - */ - cpath_build_state_t *build_state; - /** The doubly-linked list of crypt_path_t entries, one per hop, - * for this circuit. This includes ciphers for each hop, - * integrity-checking digests for each hop, and package/delivery - * windows for each hop. - */ - crypt_path_t *cpath; - - /** Holds all rendezvous data on either client or service side. */ - rend_data_t *rend_data; - - /** Holds hidden service identifier on either client or service side. This - * is for both introduction and rendezvous circuit. */ - struct hs_ident_circuit_t *hs_ident; - - /** Holds the data that the entry guard system uses to track the - * status of the guard this circuit is using, and thereby to determine - * whether this circuit can be used. */ - struct circuit_guard_state_t *guard_state; - - /** Index into global_origin_circuit_list for this circuit. -1 if not - * present. */ - int global_origin_circuit_list_idx; - - /** How many more relay_early cells can we send on this circuit, according - * to the specification? */ - unsigned int remaining_relay_early_cells : 4; - - /** Set if this circuit is insanely old and we already informed the user */ - unsigned int is_ancient : 1; - - /** Set if this circuit has already been opened. Used to detect - * cannibalized circuits. */ - unsigned int has_opened : 1; - - /** - * Path bias state machine. Used to ensure integrity of our - * circuit building and usage accounting. See path_state_t - * for more details. - */ - path_state_bitfield_t path_state : 3; - - /* If this flag is set, we should not consider attaching any more - * connections to this circuit. */ - unsigned int unusable_for_new_conns : 1; - - /** - * Tristate variable to guard against pathbias miscounting - * due to circuit purpose transitions changing the decision - * of pathbias_should_count(). This variable is informational - * only. The current results of pathbias_should_count() are - * the official decision for pathbias accounting. - */ - uint8_t pathbias_shouldcount; -#define PATHBIAS_SHOULDCOUNT_UNDECIDED 0 -#define PATHBIAS_SHOULDCOUNT_IGNORED 1 -#define PATHBIAS_SHOULDCOUNT_COUNTED 2 - - /** For path probing. Store the temporary probe stream ID - * for response comparison */ - streamid_t pathbias_probe_id; - - /** For path probing. Store the temporary probe address nonce - * (in host byte order) for response comparison. */ - uint32_t pathbias_probe_nonce; - - /** Set iff this is a hidden-service circuit which has timed out - * according to our current circuit-build timeout, but which has - * been kept around because it might still succeed in connecting to - * its destination, and which is not a fully-connected rendezvous - * circuit. - * - * (We clear this flag for client-side rendezvous circuits when they - * are 'joined' to the other side's rendezvous circuit, so that - * connection_ap_handshake_attach_circuit can put client streams on - * the circuit. We also clear this flag for service-side rendezvous - * circuits when they are 'joined' to a client's rend circ, but only - * for symmetry with the client case. Client-side introduction - * circuits are closed when we get a joined rend circ, and - * service-side introduction circuits never have this flag set.) */ - unsigned int hs_circ_has_timed_out : 1; - - /** Set iff this circuit has been given a relaxed timeout because - * no circuits have opened. Used to prevent spamming logs. */ - unsigned int relaxed_timeout : 1; - - /** Set iff this is a service-side rendezvous circuit for which a - * new connection attempt has been launched. We consider launching - * a new service-side rend circ to a client when the previous one - * fails; now that we don't necessarily close a service-side rend - * circ when we launch a new one to the same client, this flag keeps - * us from launching two retries for the same failed rend circ. */ - unsigned int hs_service_side_rend_circ_has_been_relaunched : 1; - - /** What commands were sent over this circuit that decremented the - * RELAY_EARLY counter? This is for debugging task 878. */ - uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT]; - - /** How many RELAY_EARLY cells have been sent over this circuit? This is - * for debugging task 878, too. */ - int relay_early_cells_sent; - - /** The next stream_id that will be tried when we're attempting to - * construct a new AP stream originating at this circuit. */ - streamid_t next_stream_id; - - /* The intro key replaces the hidden service's public key if purpose is - * S_ESTABLISH_INTRO or S_INTRO, provided that no unversioned rendezvous - * descriptor is used. */ - crypto_pk_t *intro_key; - - /** Quasi-global identifier for this circuit; used for control.c */ - /* XXXX NM This can get re-used after 2**32 circuits. */ - uint32_t global_identifier; - - /** True if we have associated one stream to this circuit, thereby setting - * the isolation parameters for this circuit. Note that this doesn't - * necessarily mean that we've <em>attached</em> any streams to the circuit: - * we may only have marked up this circuit during the launch process. - */ - unsigned int isolation_values_set : 1; - /** True iff any stream has <em>ever</em> been attached to this circuit. - * - * In a better world we could use timestamp_dirty for this, but - * timestamp_dirty is far too overloaded at the moment. - */ - unsigned int isolation_any_streams_attached : 1; - - /** A bitfield of ISO_* flags for every isolation field such that this - * circuit has had streams with more than one value for that field - * attached to it. */ - uint8_t isolation_flags_mixed; - - /** @name Isolation parameters - * - * If any streams have been associated with this circ (isolation_values_set - * == 1), and all streams associated with the circuit have had the same - * value for some field ((isolation_flags_mixed & ISO_FOO) == 0), then these - * elements hold the value for that field. - * - * Note again that "associated" is not the same as "attached": we - * preliminarily associate streams with a circuit while the circuit is being - * launched, so that we can tell whether we need to launch more circuits. - * - * @{ - */ - uint8_t client_proto_type; - uint8_t client_proto_socksver; - uint16_t dest_port; - tor_addr_t client_addr; - char *dest_address; - int session_group; - unsigned nym_epoch; - size_t socks_username_len; - uint8_t socks_password_len; - /* Note that the next two values are NOT NUL-terminated; see - socks_username_len and socks_password_len for their lengths. */ - char *socks_username; - char *socks_password; - /** Global identifier for the first stream attached here; used by - * ISO_STREAM. */ - uint64_t associated_isolated_stream_global_id; - /**@}*/ - /** A list of addr_policy_t for this circuit in particular. Used by - * adjust_exit_policy_from_exitpolicy_failure. - */ - smartlist_t *prepend_policy; - - /** How long do we wait before closing this circuit if it remains - * completely idle after it was built, in seconds? This value - * is randomized on a per-circuit basis from CircuitsAvailableTimoeut - * to 2*CircuitsAvailableTimoeut. */ - int circuit_idle_timeout; - -} origin_circuit_t; - -struct onion_queue_t; - -/** An or_circuit_t holds information needed to implement a circuit at an - * OR. */ -typedef struct or_circuit_t { - circuit_t base_; - - /** Pointer to an entry on the onion queue, if this circuit is waiting for a - * chance to give an onionskin to a cpuworker. Used only in onion.c */ - struct onion_queue_t *onionqueue_entry; - /** Pointer to a workqueue entry, if this circuit has given an onionskin to - * a cpuworker and is waiting for a response. Used to decide whether it is - * safe to free a circuit or if it is still in use by a cpuworker. */ - struct workqueue_entry_s *workqueue_entry; - - /** The circuit_id used in the previous (backward) hop of this circuit. */ - circid_t p_circ_id; - /** Queue of cells waiting to be transmitted on p_conn. */ - cell_queue_t p_chan_cells; - /** The channel that is previous in this circuit. */ - channel_t *p_chan; - /** - * Circuit mux associated with p_chan to which this circuit is attached; - * NULL if we have no p_chan. - */ - circuitmux_t *p_mux; - /** Linked list of Exit streams associated with this circuit. */ - edge_connection_t *n_streams; - /** Linked list of Exit streams associated with this circuit that are - * still being resolved. */ - edge_connection_t *resolving_streams; - - /** Cryptographic state used for encrypting and authenticating relay - * cells to and from this hop. */ - relay_crypto_t crypto; - - /** Points to spliced circuit if purpose is REND_ESTABLISHED, and circuit - * is not marked for close. */ - struct or_circuit_t *rend_splice; - - /** Stores KH for the handshake. */ - char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */ - - /** How many more relay_early cells can we send on this circuit, according - * to the specification? */ - unsigned int remaining_relay_early_cells : 4; - - /* We have already received an INTRODUCE1 cell on this circuit. */ - unsigned int already_received_introduce1 : 1; - - /** If set, this circuit carries HS traffic. Consider it in any HS - * statistics. */ - unsigned int circuit_carries_hs_traffic_stats : 1; - - /** Number of cells that were removed from circuit queue; reset every - * time when writing buffer stats to disk. */ - uint32_t processed_cells; - - /** Total time in milliseconds that cells spent in both app-ward and - * exit-ward queues of this circuit; reset every time when writing - * buffer stats to disk. */ - uint64_t total_cell_waiting_time; -} or_circuit_t; - #if REND_COOKIE_LEN != DIGEST_LEN #error "The REND_TOKEN_LEN macro assumes REND_COOKIE_LEN == DIGEST_LEN" #endif @@ -2912,15 +2633,6 @@ typedef struct or_circuit_t { /** Convert a circuit subtype to a circuit_t. */ #define TO_CIRCUIT(x) (&((x)->base_))
-/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert - * if the cast is impossible. */ -static or_circuit_t *TO_OR_CIRCUIT(circuit_t *); -static const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *); -/** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t. - * Assert if the cast is impossible. */ -static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *); -static const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *); - /** Return 1 iff <b>node</b> has Exit flag and no BadExit flag. * Otherwise, return 0. */ @@ -2929,28 +2641,6 @@ static inline int node_is_good_exit(const node_t *node) return node->is_exit && ! node->is_bad_exit; }
-static inline or_circuit_t *TO_OR_CIRCUIT(circuit_t *x) -{ - tor_assert(x->magic == OR_CIRCUIT_MAGIC); - return DOWNCAST(or_circuit_t, x); -} -static inline const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *x) -{ - tor_assert(x->magic == OR_CIRCUIT_MAGIC); - return DOWNCAST(or_circuit_t, x); -} -static inline origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x) -{ - tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); - return DOWNCAST(origin_circuit_t, x); -} -static inline const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT( - const circuit_t *x) -{ - tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); - return DOWNCAST(origin_circuit_t, x); -} - /* limits for TCP send and recv buffer size used for constrained sockets */ #define MIN_CONSTRAINED_TCP_BUFFER 2048 #define MAX_CONSTRAINED_TCP_BUFFER 262144 /* 256k */ diff --git a/src/or/or_circuit_st.h b/src/or/or_circuit_st.h new file mode 100644 index 000000000..19c39f8e6 --- /dev/null +++ b/src/or/or_circuit_st.h @@ -0,0 +1,77 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef OR_CIRCUIT_ST_H +#define OR_CIRCUIT_ST_H + +#include "or.h" + +struct onion_queue_t; + +/** An or_circuit_t holds information needed to implement a circuit at an + * OR. */ +struct or_circuit_t { + circuit_t base_; + + /** Pointer to an entry on the onion queue, if this circuit is waiting for a + * chance to give an onionskin to a cpuworker. Used only in onion.c */ + struct onion_queue_t *onionqueue_entry; + /** Pointer to a workqueue entry, if this circuit has given an onionskin to + * a cpuworker and is waiting for a response. Used to decide whether it is + * safe to free a circuit or if it is still in use by a cpuworker. */ + struct workqueue_entry_s *workqueue_entry; + + /** The circuit_id used in the previous (backward) hop of this circuit. */ + circid_t p_circ_id; + /** Queue of cells waiting to be transmitted on p_conn. */ + cell_queue_t p_chan_cells; + /** The channel that is previous in this circuit. */ + channel_t *p_chan; + /** + * Circuit mux associated with p_chan to which this circuit is attached; + * NULL if we have no p_chan. + */ + circuitmux_t *p_mux; + /** Linked list of Exit streams associated with this circuit. */ + edge_connection_t *n_streams; + /** Linked list of Exit streams associated with this circuit that are + * still being resolved. */ + edge_connection_t *resolving_streams; + + /** Cryptographic state used for encrypting and authenticating relay + * cells to and from this hop. */ + relay_crypto_t crypto; + + /** Points to spliced circuit if purpose is REND_ESTABLISHED, and circuit + * is not marked for close. */ + struct or_circuit_t *rend_splice; + + /** Stores KH for the handshake. */ + char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */ + + /** How many more relay_early cells can we send on this circuit, according + * to the specification? */ + unsigned int remaining_relay_early_cells : 4; + + /* We have already received an INTRODUCE1 cell on this circuit. */ + unsigned int already_received_introduce1 : 1; + + /** If set, this circuit carries HS traffic. Consider it in any HS + * statistics. */ + unsigned int circuit_carries_hs_traffic_stats : 1; + + /** Number of cells that were removed from circuit queue; reset every + * time when writing buffer stats to disk. */ + uint32_t processed_cells; + + /** Total time in milliseconds that cells spent in both app-ward and + * exit-ward queues of this circuit; reset every time when writing + * buffer stats to disk. */ + uint64_t total_cell_waiting_time; +}; + +#endif + diff --git a/src/or/origin_circuit_st.h b/src/or/origin_circuit_st.h new file mode 100644 index 000000000..e995776c2 --- /dev/null +++ b/src/or/origin_circuit_st.h @@ -0,0 +1,233 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef ORIGIN_CIRCUIT_ST_H +#define ORIGIN_CIRCUIT_ST_H + +#include "or.h" + +struct onion_queue_t; + +/** An origin_circuit_t holds data necessary to build and use a circuit. + */ +struct origin_circuit_t { + circuit_t base_; + + /** Linked list of AP streams (or EXIT streams if hidden service) + * associated with this circuit. */ + edge_connection_t *p_streams; + + /** Bytes read on this circuit since last call to + * control_event_circ_bandwidth_used(). Only used if we're configured + * to emit CIRC_BW events. */ + uint32_t n_read_circ_bw; + + /** Bytes written to on this circuit since last call to + * control_event_circ_bandwidth_used(). Only used if we're configured + * to emit CIRC_BW events. */ + uint32_t n_written_circ_bw; + + /** Total known-valid relay cell bytes since last call to + * control_event_circ_bandwidth_used(). Only used if we're configured + * to emit CIRC_BW events. */ + uint32_t n_delivered_read_circ_bw; + + /** Total written relay cell bytes since last call to + * control_event_circ_bandwidth_used(). Only used if we're configured + * to emit CIRC_BW events. */ + uint32_t n_delivered_written_circ_bw; + + /** Total overhead data in all known-valid relay data cells since last + * call to control_event_circ_bandwidth_used(). Only used if we're + * configured to emit CIRC_BW events. */ + uint32_t n_overhead_read_circ_bw; + + /** Total written overhead data in all relay data cells since last call to + * control_event_circ_bandwidth_used(). Only used if we're configured + * to emit CIRC_BW events. */ + uint32_t n_overhead_written_circ_bw; + + /** Build state for this circuit. It includes the intended path + * length, the chosen exit router, rendezvous information, etc. + */ + cpath_build_state_t *build_state; + /** The doubly-linked list of crypt_path_t entries, one per hop, + * for this circuit. This includes ciphers for each hop, + * integrity-checking digests for each hop, and package/delivery + * windows for each hop. + */ + crypt_path_t *cpath; + + /** Holds all rendezvous data on either client or service side. */ + rend_data_t *rend_data; + + /** Holds hidden service identifier on either client or service side. This + * is for both introduction and rendezvous circuit. */ + struct hs_ident_circuit_t *hs_ident; + + /** Holds the data that the entry guard system uses to track the + * status of the guard this circuit is using, and thereby to determine + * whether this circuit can be used. */ + struct circuit_guard_state_t *guard_state; + + /** Index into global_origin_circuit_list for this circuit. -1 if not + * present. */ + int global_origin_circuit_list_idx; + + /** How many more relay_early cells can we send on this circuit, according + * to the specification? */ + unsigned int remaining_relay_early_cells : 4; + + /** Set if this circuit is insanely old and we already informed the user */ + unsigned int is_ancient : 1; + + /** Set if this circuit has already been opened. Used to detect + * cannibalized circuits. */ + unsigned int has_opened : 1; + + /** + * Path bias state machine. Used to ensure integrity of our + * circuit building and usage accounting. See path_state_t + * for more details. + */ + path_state_bitfield_t path_state : 3; + + /* If this flag is set, we should not consider attaching any more + * connections to this circuit. */ + unsigned int unusable_for_new_conns : 1; + + /** + * Tristate variable to guard against pathbias miscounting + * due to circuit purpose transitions changing the decision + * of pathbias_should_count(). This variable is informational + * only. The current results of pathbias_should_count() are + * the official decision for pathbias accounting. + */ + uint8_t pathbias_shouldcount; +#define PATHBIAS_SHOULDCOUNT_UNDECIDED 0 +#define PATHBIAS_SHOULDCOUNT_IGNORED 1 +#define PATHBIAS_SHOULDCOUNT_COUNTED 2 + + /** For path probing. Store the temporary probe stream ID + * for response comparison */ + streamid_t pathbias_probe_id; + + /** For path probing. Store the temporary probe address nonce + * (in host byte order) for response comparison. */ + uint32_t pathbias_probe_nonce; + + /** Set iff this is a hidden-service circuit which has timed out + * according to our current circuit-build timeout, but which has + * been kept around because it might still succeed in connecting to + * its destination, and which is not a fully-connected rendezvous + * circuit. + * + * (We clear this flag for client-side rendezvous circuits when they + * are 'joined' to the other side's rendezvous circuit, so that + * connection_ap_handshake_attach_circuit can put client streams on + * the circuit. We also clear this flag for service-side rendezvous + * circuits when they are 'joined' to a client's rend circ, but only + * for symmetry with the client case. Client-side introduction + * circuits are closed when we get a joined rend circ, and + * service-side introduction circuits never have this flag set.) */ + unsigned int hs_circ_has_timed_out : 1; + + /** Set iff this circuit has been given a relaxed timeout because + * no circuits have opened. Used to prevent spamming logs. */ + unsigned int relaxed_timeout : 1; + + /** Set iff this is a service-side rendezvous circuit for which a + * new connection attempt has been launched. We consider launching + * a new service-side rend circ to a client when the previous one + * fails; now that we don't necessarily close a service-side rend + * circ when we launch a new one to the same client, this flag keeps + * us from launching two retries for the same failed rend circ. */ + unsigned int hs_service_side_rend_circ_has_been_relaunched : 1; + + /** What commands were sent over this circuit that decremented the + * RELAY_EARLY counter? This is for debugging task 878. */ + uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT]; + + /** How many RELAY_EARLY cells have been sent over this circuit? This is + * for debugging task 878, too. */ + int relay_early_cells_sent; + + /** The next stream_id that will be tried when we're attempting to + * construct a new AP stream originating at this circuit. */ + streamid_t next_stream_id; + + /* The intro key replaces the hidden service's public key if purpose is + * S_ESTABLISH_INTRO or S_INTRO, provided that no unversioned rendezvous + * descriptor is used. */ + crypto_pk_t *intro_key; + + /** Quasi-global identifier for this circuit; used for control.c */ + /* XXXX NM This can get re-used after 2**32 circuits. */ + uint32_t global_identifier; + + /** True if we have associated one stream to this circuit, thereby setting + * the isolation parameters for this circuit. Note that this doesn't + * necessarily mean that we've <em>attached</em> any streams to the circuit: + * we may only have marked up this circuit during the launch process. + */ + unsigned int isolation_values_set : 1; + /** True iff any stream has <em>ever</em> been attached to this circuit. + * + * In a better world we could use timestamp_dirty for this, but + * timestamp_dirty is far too overloaded at the moment. + */ + unsigned int isolation_any_streams_attached : 1; + + /** A bitfield of ISO_* flags for every isolation field such that this + * circuit has had streams with more than one value for that field + * attached to it. */ + uint8_t isolation_flags_mixed; + + /** @name Isolation parameters + * + * If any streams have been associated with this circ (isolation_values_set + * == 1), and all streams associated with the circuit have had the same + * value for some field ((isolation_flags_mixed & ISO_FOO) == 0), then these + * elements hold the value for that field. + * + * Note again that "associated" is not the same as "attached": we + * preliminarily associate streams with a circuit while the circuit is being + * launched, so that we can tell whether we need to launch more circuits. + * + * @{ + */ + uint8_t client_proto_type; + uint8_t client_proto_socksver; + uint16_t dest_port; + tor_addr_t client_addr; + char *dest_address; + int session_group; + unsigned nym_epoch; + size_t socks_username_len; + uint8_t socks_password_len; + /* Note that the next two values are NOT NUL-terminated; see + socks_username_len and socks_password_len for their lengths. */ + char *socks_username; + char *socks_password; + /** Global identifier for the first stream attached here; used by + * ISO_STREAM. */ + uint64_t associated_isolated_stream_global_id; + /**@}*/ + /** A list of addr_policy_t for this circuit in particular. Used by + * adjust_exit_policy_from_exitpolicy_failure. + */ + smartlist_t *prepend_policy; + + /** How long do we wait before closing this circuit if it remains + * completely idle after it was built, in seconds? This value + * is randomized on a per-circuit basis from CircuitsAvailableTimoeut + * to 2*CircuitsAvailableTimoeut. */ + int circuit_idle_timeout; + +}; + +#endif + diff --git a/src/or/relay.c b/src/or/relay.c index dca31498f..55c2abd12 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -84,6 +84,8 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, diff --git a/src/or/relay_crypto.c b/src/or/relay_crypto.c index 530c8e582..7603d3b4e 100644 --- a/src/or/relay_crypto.c +++ b/src/or/relay_crypto.c @@ -5,12 +5,16 @@ /* See LICENSE for licensing information */
#include "or.h" +#include "circuitlist.h" #include "config.h" #include "crypto_util.h" #include "hs_ntor.h" // for HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN #include "relay.h" #include "relay_crypto.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + /** Update digest from the payload of cell. Assign integrity part to * cell. */ diff --git a/src/or/rendclient.c b/src/or/rendclient.c index c46b8c565..6762bbfb0 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -35,6 +35,7 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "origin_circuit_st.h"
static extend_info_t *rend_client_get_random_intro_impl( const rend_cache_entry_t *rend_query, diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index f3fa2f64d..308b91878 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -12,6 +12,7 @@
#include "or.h" #include "circuitbuild.h" +#include "circuitlist.h" #include "circuituse.h" #include "config.h" #include "control.h" @@ -30,6 +31,8 @@ #include "routerlist.h" #include "routerparse.h"
+#include "origin_circuit_st.h" + /** Return 0 if one and two are the same service ids, else -1 or 1 */ int rend_cmp_service_ids(const char *one, const char *two) diff --git a/src/or/rendmid.c b/src/or/rendmid.c index c4a34ca62..8afc73067 100644 --- a/src/or/rendmid.c +++ b/src/or/rendmid.c @@ -20,6 +20,8 @@ #include "hs_circuitmap.h" #include "hs_intropoint.h"
+#include "or_circuit_st.h" + /** Respond to an ESTABLISH_INTRO cell by checking the signed data and * setting the circuit's purpose and service pk digest. */ diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 4d9309e49..d1e6f8a8e 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -37,6 +37,7 @@ #include "routerset.h"
#include "edge_connection_st.h" +#include "origin_circuit_st.h"
struct rend_service_t; static origin_circuit_t *find_intro_circuit(rend_intro_point_t *intro, diff --git a/src/or/rephist.c b/src/or/rephist.c index c7117bad6..909cd043b 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -89,6 +89,8 @@ #include "connection_or.h" #include "statefile.h"
+#include "or_circuit_st.h" + static void bw_arrays_init(void); static void predicted_ports_alloc(void);
diff --git a/src/or/router.c b/src/or/router.c index f1fff6be2..11ee2e6ab 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -41,6 +41,7 @@
#include "dir_connection_st.h" #include "dir_server_st.h" +#include "origin_circuit_st.h" #include "port_cfg_st.h"
/** diff --git a/src/test/bench.c b/src/test/bench.c index 9ab23c992..784bcf326 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -26,6 +26,8 @@ #include "crypto_rand.h" #include "consdiff.h"
+#include "or_circuit_st.h" + #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) static uint64_t nanostart; static inline uint64_t diff --git a/src/test/test.c b/src/test/test.c index f0e8b9b72..b92dd3c8a 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -62,6 +62,8 @@ double fabs(double x); #include "statefile.h" #include "crypto_curve25519.h"
+#include "or_circuit_st.h" + /** Run unit tests for the onion handshake code. */ static void test_onion_handshake(void *arg) diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c index df987f82c..b41f7ac38 100644 --- a/src/test/test_cell_queue.c +++ b/src/test/test_cell_queue.c @@ -8,6 +8,9 @@ #include "relay.h" #include "test.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + static void test_cq_manip(void *arg) { diff --git a/src/test/test_channel.c b/src/test/test_channel.c index 76124a6e7..c41afff5d 100644 --- a/src/test/test_channel.c +++ b/src/test/test_channel.c @@ -20,6 +20,8 @@ #include "scheduler.h" #include "networkstatus.h"
+#include "origin_circuit_st.h" + /* Test suite stuff */ #include "log_test_helpers.h" #include "test.h" diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c index 3794ffc2c..86e78c331 100644 --- a/src/test/test_circuitlist.c +++ b/src/test/test_circuitlist.c @@ -14,6 +14,9 @@ #include "test.h" #include "log_test_helpers.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + static channel_t * new_fake_channel(void) { diff --git a/src/test/test_circuitstats.c b/src/test/test_circuitstats.c index 8ebef659c..c03164954 100644 --- a/src/test/test_circuitstats.c +++ b/src/test/test_circuitstats.c @@ -17,6 +17,8 @@ #include "circuituse.h" #include "channel.h"
+#include "origin_circuit_st.h" + void test_circuitstats_timeout(void *arg); void test_circuitstats_hoplen(void *arg); origin_circuit_t *subtest_fourhop_circuit(struct timeval, int); diff --git a/src/test/test_circuituse.c b/src/test/test_circuituse.c index df1b43807..7d1b1d9b0 100644 --- a/src/test/test_circuituse.c +++ b/src/test/test_circuituse.c @@ -14,6 +14,8 @@ #include "circuitbuild.h" #include "nodelist.h"
+#include "origin_circuit_st.h" + static void test_circuit_is_available_for_use_ret_false_when_marked_for_close(void *arg) { diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c index e81aea8d6..70ce1a696 100644 --- a/src/test/test_controller_events.c +++ b/src/test/test_controller_events.c @@ -11,6 +11,9 @@ #include "control.h" #include "test.h"
+#include "or_circuit_st.h" +#include "origin_circuit_st.h" + static void add_testing_cell_stats_entry(circuit_t *circ, uint8_t command, unsigned int waiting_time, diff --git a/src/test/test_dns.c b/src/test/test_dns.c index c472b9790..ffc6fb451 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -11,6 +11,7 @@ #include "router.h"
#include "edge_connection_st.h" +#include "or_circuit_st.h"
#define NS_MODULE dns
diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index d4939355d..19a32aa8a 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -34,6 +34,7 @@
#include "test_helpers.h" #include "log_test_helpers.h" +#include "origin_circuit_st.h"
/* TODO: * choose_random_entry() test with state set. diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c index 86aeabb7c..91cc7d4d2 100644 --- a/src/test/test_helpers.c +++ b/src/test/test_helpers.c @@ -25,6 +25,7 @@ #include "routerlist.h"
#include "connection_st.h" +#include "origin_circuit_st.h"
#include "test.h" #include "test_helpers.h" diff --git a/src/test/test_hs_client.c b/src/test/test_hs_client.c index 0420f70f8..bf0d56f8a 100644 --- a/src/test/test_hs_client.c +++ b/src/test/test_hs_client.c @@ -39,6 +39,7 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "origin_circuit_st.h"
static int mock_connection_ap_handshake_send_begin(entry_connection_t *ap_conn) diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c index 4253c9a38..b8462d294 100644 --- a/src/test/test_hs_intropoint.c +++ b/src/test/test_hs_intropoint.c @@ -28,6 +28,8 @@ #include "hs_intropoint.h" #include "hs_service.h"
+#include "or_circuit_st.h" + /* Trunnel. */ #include "hs/cell_establish_intro.h" #include "hs/cell_introduce1.h" diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 33b5e9607..06df50740 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -53,6 +53,8 @@ #include "dirauth/shared_random_state.h" #include "voting_schedule.h"
+#include "origin_circuit_st.h" + /* Trunnel */ #include "hs/cell_establish_intro.h"
diff --git a/src/test/test_oom.c b/src/test/test_oom.c index 98935fe45..fcee7cc73 100644 --- a/src/test/test_oom.c +++ b/src/test/test_oom.c @@ -19,6 +19,8 @@ #include "test_helpers.h"
#include "entry_connection_st.h" +#include "or_circuit_st.h" +#include "origin_circuit_st.h"
/* small replacement mock for circuit_mark_for_close_ to avoid doing all * the other bookkeeping that comes with marking circuits. */ diff --git a/src/test/test_relay.c b/src/test/test_relay.c index 73c0ed558..4a526671b 100644 --- a/src/test/test_relay.c +++ b/src/test/test_relay.c @@ -9,6 +9,8 @@ /* For init/free stuff */ #include "scheduler.h"
+#include "or_circuit_st.h" + /* Test suite stuff */ #include "test.h" #include "fakechans.h" diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c index b4cb9d4bb..e6a673403 100644 --- a/src/test/test_relaycell.c +++ b/src/test/test_relaycell.c @@ -17,6 +17,7 @@ #include "test.h"
#include "entry_connection_st.h" +#include "origin_circuit_st.h"
static int srm_ncalls; static entry_connection_t *srm_conn; diff --git a/src/test/test_relaycrypt.c b/src/test/test_relaycrypt.c index 60bd47971..62bcedabc 100644 --- a/src/test/test_relaycrypt.c +++ b/src/test/test_relaycrypt.c @@ -10,6 +10,10 @@ #include "crypto_rand.h" #include "relay.h" #include "relay_crypto.h" + +#include "or_circuit_st.h" +#include "origin_circuit_st.h" + #include "test.h"
static const char KEY_MATERIAL[3][CPATH_KEY_MATERIAL_LEN] = { diff --git a/src/test/test_status.c b/src/test/test_status.c index b4ca17891..062a28f73 100644 --- a/src/test/test_status.c +++ b/src/test/test_status.c @@ -24,6 +24,9 @@ #include "main.h" #include "nodelist.h" #include "statefile.h" + +#include "origin_circuit_st.h" + #include "test.h"
#define NS_MODULE status
tor-commits@lists.torproject.org