commit 19c34b46589492be3fe19bed7e5729c1c7d231f1 Author: Nick Mathewson nickm@torproject.org Date: Fri Jun 15 10:48:50 2018 -0400
Move or_connection_t to its own header. --- src/or/channelpadding.c | 2 + src/or/channeltls.c | 2 + src/or/connection.c | 1 + src/or/connection_or.c | 11 ++++++ src/or/connection_or.h | 2 + src/or/control.c | 1 + src/or/dos.c | 3 ++ src/or/ext_orport.c | 2 + src/or/hibernate.c | 2 + src/or/include.am | 1 + src/or/main.c | 1 + src/or/or.h | 88 +----------------------------------------- src/or/or_connection_st.h | 88 ++++++++++++++++++++++++++++++++++++++++++ src/or/scheduler.c | 2 + src/or/scheduler_kist.c | 2 + src/test/test_channelpadding.c | 2 + src/test/test_channeltls.c | 2 + src/test/test_connection.c | 1 + src/test/test_dos.c | 3 ++ src/test/test_extorport.c | 3 ++ src/test/test_link_handshake.c | 2 + src/test/test_oos.c | 1 + 22 files changed, 135 insertions(+), 87 deletions(-)
diff --git a/src/or/channelpadding.c b/src/or/channelpadding.c index a8b9a2b47..7eb0cc282 100644 --- a/src/or/channelpadding.c +++ b/src/or/channelpadding.c @@ -23,6 +23,8 @@ #include "compat_time.h" #include "rendservice.h"
+#include "or_connection_st.h" + STATIC int32_t channelpadding_get_netflow_inactive_timeout_ms( const channel_t *); STATIC int channelpadding_send_disable_command(channel_t *); diff --git a/src/or/channeltls.c b/src/or/channeltls.c index 54d94f610..20a4d37b4 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -60,6 +60,8 @@ #include "channelpadding_negotiation.h" #include "channelpadding.h"
+#include "or_connection_st.h" + /** How many CELL_PADDING cells have we received, ever? */ uint64_t stats_n_padding_cells_processed = 0; /** How many CELL_VERSIONS cells have we received, ever? */ diff --git a/src/or/connection.c b/src/or/connection.c index 11da4fc97..3c5330154 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -117,6 +117,7 @@ #include "control_connection_st.h" #include "entry_connection_st.h" #include "listener_connection_st.h" +#include "or_connection_st.h" #include "port_cfg_st.h"
static connection_t *connection_listener_new( diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 7898fbd42..c2dd36416 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -61,6 +61,8 @@ #include "torcert.h" #include "channelpadding.h"
+#include "or_connection_st.h" + static int connection_tls_finish_handshake(or_connection_t *conn); static int connection_or_launch_v3_or_handshake(or_connection_t *conn); static int connection_or_process_cells_from_inbuf(or_connection_t *conn); @@ -86,6 +88,15 @@ static void connection_or_check_canonicity(or_connection_t *conn,
/**************************************************************/
+/** Convert a connection_t* to an or_connection_t*; assert if the cast is + * invalid. */ +or_connection_t * +TO_OR_CONN(connection_t *c) +{ + tor_assert(c->magic == OR_CONNECTION_MAGIC); + return DOWNCAST(or_connection_t, c); +} + /** Global map between Extended ORPort identifiers and OR * connections. */ static digestmap_t *orconn_ext_or_id_map = NULL; diff --git a/src/or/connection_or.h b/src/or/connection_or.h index 158eb1fda..4251aacab 100644 --- a/src/or/connection_or.h +++ b/src/or/connection_or.h @@ -12,6 +12,8 @@ #ifndef TOR_CONNECTION_OR_H #define TOR_CONNECTION_OR_H
+or_connection_t *TO_OR_CONN(connection_t *); + void connection_or_clear_identity(or_connection_t *conn); void connection_or_clear_identity_map(void); void clear_broken_connection_map(int disable); diff --git a/src/or/control.c b/src/or/control.c index ba9f26c6b..45914f0c1 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -83,6 +83,7 @@
#include "control_connection_st.h" #include "entry_connection_st.h" +#include "or_connection_st.h"
#ifndef _WIN32 #include <pwd.h> diff --git a/src/or/dos.c b/src/or/dos.c index ee731acce..8367db4ef 100644 --- a/src/or/dos.c +++ b/src/or/dos.c @@ -11,6 +11,7 @@ #include "or.h" #include "channel.h" #include "config.h" +#include "connection_or.h" #include "crypto_rand.h" #include "geoip.h" #include "main.h" @@ -21,6 +22,8 @@
#include "dos.h"
+#include "or_connection_st.h" + /* * Circuit creation denial of service mitigation. * diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c index b842442ca..acbc900ad 100644 --- a/src/or/ext_orport.c +++ b/src/or/ext_orport.c @@ -29,6 +29,8 @@ #include "proto_ext_or.h" #include "util.h"
+#include "or_connection_st.h" + /** Allocate and return a structure capable of holding an Extended * ORPort message of body length <b>len</b>. */ ext_or_cmd_t * diff --git a/src/or/hibernate.c b/src/or/hibernate.c index d7d259470..e2e53b353 100644 --- a/src/or/hibernate.c +++ b/src/or/hibernate.c @@ -42,6 +42,8 @@ hibernating, phase 2: #include "router.h" #include "statefile.h"
+#include "or_connection_st.h" + /** Are we currently awake, asleep, running out of bandwidth, or shutting * down? */ static hibernate_state_t hibernate_state = HIBERNATE_STATE_INITIAL; diff --git a/src/or/include.am b/src/or/include.am index 1de42b7c7..673e43ece 100644 --- a/src/or/include.am +++ b/src/or/include.am @@ -249,6 +249,7 @@ ORHEADERS = \ src/or/onion_ntor.h \ src/or/onion_tap.h \ src/or/or.h \ + src/or/or_connection_st.h \ src/or/transports.h \ src/or/parsecommon.h \ src/or/periodic.h \ diff --git a/src/or/main.c b/src/or/main.c index 3bbd0a1d4..7b6010170 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -123,6 +123,7 @@ #include "dirauth/shared_random.h"
#include "entry_connection_st.h" +#include "or_connection_st.h" #include "port_cfg_st.h"
#ifdef HAVE_SYSTEMD diff --git a/src/or/or.h b/src/or/or.h index 443e76f35..2a69415e1 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1550,88 +1550,12 @@ typedef struct or_handshake_state_t { * drops below this size. */ #define OR_CONN_LOWWATER (16*1024)
-/** Subtype of connection_t for an "OR connection" -- that is, one that speaks - * cells over TLS. */ -typedef struct or_connection_t { - connection_t base_; - - /** Hash of the public RSA key for the other side's identity key, or zeroes - * if the other side hasn't shown us a valid identity key. */ - char identity_digest[DIGEST_LEN]; - - /** Extended ORPort connection identifier. */ - char *ext_or_conn_id; - /** This is the ClientHash value we expect to receive from the - * client during the Extended ORPort authentication protocol. We - * compute it upon receiving the ClientNoce from the client, and we - * compare it with the acual ClientHash value sent by the - * client. */ - char *ext_or_auth_correct_client_hash; - /** String carrying the name of the pluggable transport - * (e.g. "obfs2") that is obfuscating this connection. If no - * pluggable transports are used, it's NULL. */ - char *ext_or_transport; - - char *nickname; /**< Nickname of OR on other side (if any). */ - - tor_tls_t *tls; /**< TLS connection state. */ - int tls_error; /**< Last tor_tls error code. */ - /** When we last used this conn for any client traffic. If not - * recent, we can rate limit it further. */ - - /* Channel using this connection */ - channel_tls_t *chan; - - tor_addr_t real_addr; /**< The actual address that this connection came from - * or went to. The <b>addr</b> field is prone to - * getting overridden by the address from the router - * descriptor matching <b>identity_digest</b>. */ - - /** Should this connection be used for extending circuits to the server - * matching the <b>identity_digest</b> field? Set to true if we're pretty - * sure we aren't getting MITMed, either because we're connected to an - * address listed in a server descriptor, or because an authenticated - * NETINFO cell listed the address we're connected to as recognized. */ - unsigned int is_canonical:1; - - /** True iff this is an outgoing connection. */ - unsigned int is_outgoing:1; - unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ - unsigned int wide_circ_ids:1; - /** True iff this connection has had its bootstrap failure logged with - * control_event_bootstrap_problem. */ - unsigned int have_noted_bootstrap_problem:1; - /** True iff this is a client connection and its address has been put in the - * geoip cache and handled by the DoS mitigation subsystem. We use this to - * insure we have a coherent count of concurrent connection. */ - unsigned int tracked_for_dos_mitigation : 1; - - uint16_t link_proto; /**< What protocol version are we using? 0 for - * "none negotiated yet." */ - uint16_t idle_timeout; /**< How long can this connection sit with no - * circuits on it before we close it? Based on - * IDLE_CIRCUIT_TIMEOUT_{NON,}CANONICAL and - * on is_canonical, randomized. */ - or_handshake_state_t *handshake_state; /**< If we are setting this connection - * up, state information to do so. */ - - time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/ - - token_bucket_rw_t bucket; /**< Used for rate limiting when the connection is - * in state CONN_OPEN. */ - - /* - * Count the number of bytes flushed out on this orconn, and the number of - * bytes TLS actually sent - used for overhead estimation for scheduling. - */ - uint64_t bytes_xmitted, bytes_xmitted_by_tls; -} or_connection_t; - typedef struct control_connection_t control_connection_t; typedef struct dir_connection_t dir_connection_t; typedef struct edge_connection_t edge_connection_t; typedef struct entry_connection_t entry_connection_t; typedef struct listener_connection_t listener_connection_t; +typedef struct or_connection_t or_connection_t;
/** Cast a connection_t subtype pointer to a connection_t **/ #define TO_CONN(c) (&(((c)->base_))) @@ -1639,16 +1563,6 @@ typedef struct listener_connection_t listener_connection_t; /** Cast a entry_connection_t subtype pointer to a connection_t **/ #define ENTRY_TO_CONN(c) (TO_CONN(ENTRY_TO_EDGE_CONN(c)))
-/** Convert a connection_t* to an or_connection_t*; assert if the cast is - * invalid. */ -static or_connection_t *TO_OR_CONN(connection_t *); - -static inline or_connection_t *TO_OR_CONN(connection_t *c) -{ - tor_assert(c->magic == OR_CONNECTION_MAGIC); - return DOWNCAST(or_connection_t, c); -} - /** What action type does an address policy indicate: accept or reject? */ typedef enum { ADDR_POLICY_ACCEPT=1, diff --git a/src/or/or_connection_st.h b/src/or/or_connection_st.h new file mode 100644 index 000000000..bccfd18f6 --- /dev/null +++ b/src/or/or_connection_st.h @@ -0,0 +1,88 @@ +/* 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_CONNECTION_ST_H +#define OR_CONNECTION_ST_H + +/** Subtype of connection_t for an "OR connection" -- that is, one that speaks + * cells over TLS. */ +struct or_connection_t { + connection_t base_; + + /** Hash of the public RSA key for the other side's identity key, or zeroes + * if the other side hasn't shown us a valid identity key. */ + char identity_digest[DIGEST_LEN]; + + /** Extended ORPort connection identifier. */ + char *ext_or_conn_id; + /** This is the ClientHash value we expect to receive from the + * client during the Extended ORPort authentication protocol. We + * compute it upon receiving the ClientNoce from the client, and we + * compare it with the acual ClientHash value sent by the + * client. */ + char *ext_or_auth_correct_client_hash; + /** String carrying the name of the pluggable transport + * (e.g. "obfs2") that is obfuscating this connection. If no + * pluggable transports are used, it's NULL. */ + char *ext_or_transport; + + char *nickname; /**< Nickname of OR on other side (if any). */ + + tor_tls_t *tls; /**< TLS connection state. */ + int tls_error; /**< Last tor_tls error code. */ + /** When we last used this conn for any client traffic. If not + * recent, we can rate limit it further. */ + + /* Channel using this connection */ + channel_tls_t *chan; + + tor_addr_t real_addr; /**< The actual address that this connection came from + * or went to. The <b>addr</b> field is prone to + * getting overridden by the address from the router + * descriptor matching <b>identity_digest</b>. */ + + /** Should this connection be used for extending circuits to the server + * matching the <b>identity_digest</b> field? Set to true if we're pretty + * sure we aren't getting MITMed, either because we're connected to an + * address listed in a server descriptor, or because an authenticated + * NETINFO cell listed the address we're connected to as recognized. */ + unsigned int is_canonical:1; + + /** True iff this is an outgoing connection. */ + unsigned int is_outgoing:1; + unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ + unsigned int wide_circ_ids:1; + /** True iff this connection has had its bootstrap failure logged with + * control_event_bootstrap_problem. */ + unsigned int have_noted_bootstrap_problem:1; + /** True iff this is a client connection and its address has been put in the + * geoip cache and handled by the DoS mitigation subsystem. We use this to + * insure we have a coherent count of concurrent connection. */ + unsigned int tracked_for_dos_mitigation : 1; + + uint16_t link_proto; /**< What protocol version are we using? 0 for + * "none negotiated yet." */ + uint16_t idle_timeout; /**< How long can this connection sit with no + * circuits on it before we close it? Based on + * IDLE_CIRCUIT_TIMEOUT_{NON,}CANONICAL and + * on is_canonical, randomized. */ + or_handshake_state_t *handshake_state; /**< If we are setting this connection + * up, state information to do so. */ + + time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/ + + token_bucket_rw_t bucket; /**< Used for rate limiting when the connection is + * in state CONN_OPEN. */ + + /* + * Count the number of bytes flushed out on this orconn, and the number of + * bytes TLS actually sent - used for overhead estimation for scheduling. + */ + uint64_t bytes_xmitted, bytes_xmitted_by_tls; +}; + +#endif + diff --git a/src/or/scheduler.c b/src/or/scheduler.c index da894294b..d12b8555d 100644 --- a/src/or/scheduler.c +++ b/src/or/scheduler.c @@ -13,6 +13,8 @@ #define TOR_CHANNEL_INTERNAL_ #include "channeltls.h"
+#include "or_connection_st.h" + /** * \file scheduler.c * \brief Channel scheduling system: decides which channels should send and diff --git a/src/or/scheduler_kist.c b/src/or/scheduler_kist.c index c6e9b72c4..fc9130641 100644 --- a/src/or/scheduler_kist.c +++ b/src/or/scheduler_kist.c @@ -14,6 +14,8 @@ #define SCHEDULER_PRIVATE_ #include "scheduler.h"
+#include "or_connection_st.h" + #define TLS_PER_CELL_OVERHEAD 29
#ifdef HAVE_KIST_SUPPORT diff --git a/src/test/test_channelpadding.c b/src/test/test_channelpadding.c index 2c803c344..b8e3492ea 100644 --- a/src/test/test_channelpadding.c +++ b/src/test/test_channelpadding.c @@ -20,6 +20,8 @@ #include "networkstatus.h" #include "log_test_helpers.h"
+#include "or_connection_st.h" + int channelpadding_get_netflow_inactive_timeout_ms(channel_t *chan); int64_t channelpadding_compute_time_until_pad_for_netflow(channel_t *chan); int channelpadding_send_disable_command(channel_t*); diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c index 94f1893ca..0f134f1e7 100644 --- a/src/test/test_channeltls.c +++ b/src/test/test_channeltls.c @@ -17,6 +17,8 @@ #include "scheduler.h" #include "tortls.h"
+#include "or_connection_st.h" + /* Test suite stuff */ #include "test.h" #include "fakechans.h" diff --git a/src/test/test_connection.c b/src/test/test_connection.c index 79c5e2dd8..9f50d9f84 100644 --- a/src/test/test_connection.c +++ b/src/test/test_connection.c @@ -26,6 +26,7 @@
#include "dir_connection_st.h" #include "entry_connection_st.h" +#include "or_connection_st.h"
static void * test_conn_get_basic_setup(const struct testcase_t *tc); static int test_conn_get_basic_teardown(const struct testcase_t *tc, diff --git a/src/test/test_dos.c b/src/test/test_dos.c index 8ae967f3a..fcc537499 100644 --- a/src/test/test_dos.c +++ b/src/test/test_dos.c @@ -15,6 +15,9 @@ #include "networkstatus.h" #include "nodelist.h" #include "routerlist.h" + +#include "or_connection_st.h" + #include "test.h" #include "log_test_helpers.h"
diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index e05342cb8..77874a74e 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -13,6 +13,9 @@ #include "crypto_rand.h" #include "ext_orport.h" #include "main.h" + +#include "or_connection_st.h" + #include "test.h"
/* Test connection_or_remove_from_ext_or_id_map and diff --git a/src/test/test_link_handshake.c b/src/test/test_link_handshake.c index 6840072d7..94e784cdc 100644 --- a/src/test/test_link_handshake.c +++ b/src/test/test_link_handshake.c @@ -21,6 +21,8 @@ #include "scheduler.h" #include "torcert.h"
+#include "or_connection_st.h" + #include "test.h" #include "log_test_helpers.h"
diff --git a/src/test/test_oos.c b/src/test/test_oos.c index ddad5a08d..b34191803 100644 --- a/src/test/test_oos.c +++ b/src/test/test_oos.c @@ -13,6 +13,7 @@ #include "test.h"
#include "dir_connection_st.h" +#include "or_connection_st.h"
static or_options_t mock_options;