Tor 0.4.9.0-alpha-dev
connection_st.h
Go to the documentation of this file.
1/* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * @file connection_st.h
9 * @brief Base connection structure.
10 **/
11
12#ifndef CONNECTION_ST_H
13#define CONNECTION_ST_H
14
15struct buf_t;
16
17/* Values for connection_t.magic: used to make sure that downcasts (casts from
18* connection_t to foo_connection_t) are safe. */
19#define BASE_CONNECTION_MAGIC 0x7C3C304Eu
20#define OR_CONNECTION_MAGIC 0x7D31FF03u
21#define EDGE_CONNECTION_MAGIC 0xF0374013u
22#define ENTRY_CONNECTION_MAGIC 0xbb4a5703
23#define DIR_CONNECTION_MAGIC 0x9988ffeeu
24#define CONTROL_CONNECTION_MAGIC 0x8abc765du
25#define LISTENER_CONNECTION_MAGIC 0x1a1ac741u
26
27/** Description of a connection to another host or process, and associated
28 * data.
29 *
30 * A connection is named based on what it's connected to -- an "OR
31 * connection" has a Tor node on the other end, an "exit
32 * connection" has a website or other server on the other end, and an
33 * "AP connection" has an application proxy (and thus a user) on the
34 * other end.
35 *
36 * Every connection has a type and a state. Connections never change
37 * their type, but can go through many state changes in their lifetime.
38 *
39 * Every connection has two associated input and output buffers.
40 * Listeners don't use them. For non-listener connections, incoming
41 * data is appended to conn->inbuf, and outgoing data is taken from
42 * conn->outbuf. Connections differ primarily in the functions called
43 * to fill and drain these buffers.
44 */
46 uint32_t magic; /**< For memory debugging: must equal one of
47 * *_CONNECTION_MAGIC. */
48
49 uint8_t state; /**< Current state of this connection. */
50 unsigned int type:5; /**< What kind of connection is this? */
51 unsigned int purpose:5; /**< Only used for DIR and EXIT types currently. */
52
53 /* The next fields are all one-bit booleans. Some are only applicable to
54 * connection subtypes, but we hold them here anyway, to save space.
55 */
56 unsigned int read_blocked_on_bw:1; /**< Boolean: should we start reading
57 * again once the bandwidth throttler allows it? */
58 unsigned int write_blocked_on_bw:1; /**< Boolean: should we start writing
59 * again once the bandwidth throttler allows
60 * writes? */
61 unsigned int hold_open_until_flushed:1; /**< Despite this connection's being
62 * marked for close, do we flush it
63 * before closing it? */
64 unsigned int inbuf_reached_eof:1; /**< Boolean: did read() return 0 on this
65 * conn? */
66 /** Set to 1 when we're inside connection_flushed_some to keep us from
67 * calling connection_handle_write() recursively. */
68 unsigned int in_flushed_some:1;
69 /** True if connection_handle_write is currently running on this connection.
70 */
72 /** If true, then we treat this connection as remote for the purpose of
73 * rate-limiting, no matter what its address is. */
75
76 /* For linked connections:
77 */
78 unsigned int linked:1; /**< True if there is, or has been, a linked_conn. */
79 /** True iff we'd like to be notified about read events from the
80 * linked conn. */
82 /** True iff we're willing to write to the linked conn. */
83 unsigned int writing_to_linked_conn:1;
84 /** True iff we're currently able to read on the linked conn, and our
85 * read_event should be made active with libevent. */
86 unsigned int active_on_link:1;
87 /** True iff we've called connection_close_immediate() on this linked
88 * connection. */
89 unsigned int linked_conn_is_closed:1;
90 /** True iff this connection was opened from a listener and thus we've
91 * received this connection. Else, it means we've initiated an outbound
92 * connection. */
93 unsigned int from_listener:1;
94
95 /** CONNECT/SOCKS proxy client handshake state (for outgoing connections). */
96 unsigned int proxy_state:4;
97
98 /** Our socket; set to TOR_INVALID_SOCKET if this connection is closed,
99 * or has no socket. */
101 int conn_array_index; /**< Index into the global connection array. */
102
103 struct event *read_event; /**< Libevent event structure. */
104 struct event *write_event; /**< Libevent event structure. */
105 struct buf_t *inbuf; /**< Buffer holding data read over this connection. */
106 struct buf_t *outbuf; /**< Buffer holding data to write over this
107 * connection. */
108 time_t timestamp_last_read_allowed; /**< When was the last time libevent said
109 * we could read? */
110 time_t timestamp_last_write_allowed; /**< When was the last time libevent
111 * said we could write? */
112
113 time_t timestamp_created; /**< When was this connection_t created? */
114
115 int socket_family; /**< Address family of this connection's socket. Usually
116 * AF_INET, but it can also be AF_UNIX, or AF_INET6 */
117 /**
118 * IP address on the internet of this connection's peer, usually.
119 *
120 * This address may come from several sources. If this is an outbound
121 * connection, it is the address we are trying to connect to--either
122 * directly through `s`, or via a proxy. (If we used a proxy, then
123 * `getpeername(s)` will not give this address.)
124 *
125 * For incoming connections, this field is the address we got from
126 * getpeername() or accept(), as updated by any proxy that we
127 * are using (for example, an ExtORPort proxy).
128 *
129 * For listeners, this is the address we are trying to bind to.
130 *
131 * If this connection is using a unix socket, then this address is a null
132 * address, and the real address is in the `address` field.
133 *
134 * If this connection represents a request made somewhere other than via
135 * TCP (for example, a UDP dns request, or a controller resolve request),
136 * then this address is the address that originated the request.
137 *
138 * TECHNICAL DEBT:
139 *
140 * There are a few places in the code that modify this address,
141 * or use it in other ways that we don't currently like. Please don't add
142 * any more!
143 *
144 * The misuses of this field include:
145 * * Setting it on linked connections, possibly.
146 * * Updating it based on the Forwarded-For header-- Forwarded-For is
147 * set by a proxy, but not a local trusted proxy.
148 **/
150 uint16_t port; /**< If non-zero, port that socket "s" is directly connected
151 * to; may be the port for a proxy or pluggable transport,
152 * see "address" for the port at the final destination. */
153 uint16_t marked_for_close; /**< Should we close this conn on the next
154 * iteration of the main loop? (If true, holds
155 * the line number where this connection was
156 * marked.) */
157 const char *marked_for_close_file; /**< For debugging: in which file were
158 * we marked for close? */
159 /**
160 * String address of the peer of this connection.
161 *
162 * TECHNICAL DEBT:
163 *
164 * This field serves many purposes, and they're not all pretty. In addition
165 * to describing the peer we're connected to, it can also hold:
166 *
167 * * An address we're trying to resolve (as an exit).
168 * * A unix address we're trying to bind to (as a listener).
169 **/
170 char *address;
171 /** Another connection that's connected to this one in lieu of a socket. */
173
174 /** Unique identifier for this connection on this Tor instance. */
176
177 /** Bytes read since last call to control_event_conn_bandwidth_used().
178 * Only used if we're configured to emit CONN_BW events. */
180
181 /** Bytes written since last call to control_event_conn_bandwidth_used().
182 * Only used if we're configured to emit CONN_BW events. */
184};
185
186/** True iff <b>x</b> is an edge connection. */
187#define CONN_IS_EDGE(x) \
188 ((x)->type == CONN_TYPE_EXIT || (x)->type == CONN_TYPE_AP)
189
190/** True iff the purpose of <b>conn</b> means that it's a server-side
191 * directory connection. */
192#define DIR_CONN_IS_SERVER(conn) ((conn)->purpose == DIR_PURPOSE_SERVER)
193
194#endif /* !defined(CONNECTION_ST_H) */
#define tor_socket_t
Definition: nettypes.h:36
time_t timestamp_last_read_allowed
unsigned int proxy_state
Definition: connection_st.h:96
uint8_t state
Definition: connection_st.h:49
unsigned int writing_to_linked_conn
Definition: connection_st.h:83
struct buf_t * inbuf
unsigned int in_connection_handle_write
Definition: connection_st.h:71
struct event * write_event
uint32_t n_read_conn_bw
unsigned int inbuf_reached_eof
Definition: connection_st.h:64
struct connection_t * linked_conn
unsigned int hold_open_until_flushed
Definition: connection_st.h:61
unsigned int reading_from_linked_conn
Definition: connection_st.h:81
unsigned int type
Definition: connection_st.h:50
struct buf_t * outbuf
unsigned int from_listener
Definition: connection_st.h:93
uint32_t magic
Definition: connection_st.h:46
uint64_t global_identifier
unsigned int read_blocked_on_bw
Definition: connection_st.h:56
unsigned int linked
Definition: connection_st.h:78
uint16_t marked_for_close
uint16_t port
const char * marked_for_close_file
uint32_t n_written_conn_bw
unsigned int linked_conn_is_closed
Definition: connection_st.h:89
unsigned int in_flushed_some
Definition: connection_st.h:68
unsigned int purpose
Definition: connection_st.h:51
tor_socket_t s
unsigned int always_rate_limit_as_remote
Definition: connection_st.h:74
time_t timestamp_created
unsigned int active_on_link
Definition: connection_st.h:86
unsigned int write_blocked_on_bw
Definition: connection_st.h:58
struct event * read_event
time_t timestamp_last_write_allowed
tor_addr_t addr