mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-24 06:48:05 +01:00
Refactor listener_connection_t into its own type.
This will allow us to add more fields to listener_connection_t without bloating the other connection types.
This commit is contained in:
parent
ddc65e2b33
commit
d2205ca458
5 changed files with 60 additions and 24 deletions
|
@ -76,6 +76,15 @@ static uint32_t last_interface_ip = 0;
|
|||
* Used to detect IP address changes. */
|
||||
static smartlist_t *outgoing_addrs = NULL;
|
||||
|
||||
#define CASE_ANY_LISTENER_TYPE \
|
||||
case CONN_TYPE_OR_LISTENER: \
|
||||
case CONN_TYPE_AP_LISTENER: \
|
||||
case CONN_TYPE_DIR_LISTENER: \
|
||||
case CONN_TYPE_CONTROL_LISTENER: \
|
||||
case CONN_TYPE_AP_TRANS_LISTENER: \
|
||||
case CONN_TYPE_AP_NATD_LISTENER: \
|
||||
case CONN_TYPE_AP_DNS_LISTENER
|
||||
|
||||
/**************************************************************/
|
||||
|
||||
/**
|
||||
|
@ -116,13 +125,7 @@ conn_state_to_string(int type, int state)
|
|||
{
|
||||
static char buf[96];
|
||||
switch (type) {
|
||||
case CONN_TYPE_OR_LISTENER:
|
||||
case CONN_TYPE_AP_LISTENER:
|
||||
case CONN_TYPE_AP_TRANS_LISTENER:
|
||||
case CONN_TYPE_AP_NATD_LISTENER:
|
||||
case CONN_TYPE_AP_DNS_LISTENER:
|
||||
case CONN_TYPE_DIR_LISTENER:
|
||||
case CONN_TYPE_CONTROL_LISTENER:
|
||||
CASE_ANY_LISTENER_TYPE:
|
||||
if (state == LISTENER_STATE_READY)
|
||||
return "ready";
|
||||
break;
|
||||
|
@ -265,6 +268,17 @@ control_connection_new(int socket_family)
|
|||
return control_conn;
|
||||
}
|
||||
|
||||
/** Allocate and return a new listener_connection_t, initialized as by
|
||||
* connection_init(). */
|
||||
listener_connection_t *
|
||||
listener_connection_new(int type, int socket_family)
|
||||
{
|
||||
listener_connection_t *listener_conn =
|
||||
tor_malloc_zero(sizeof(listener_connection_t));
|
||||
connection_init(time(NULL), TO_CONN(listener_conn), type, socket_family);
|
||||
return listener_conn;
|
||||
}
|
||||
|
||||
/** Allocate, initialize, and return a new connection_t subtype of <b>type</b>
|
||||
* to make or receive connections of address family <b>socket_family</b>. The
|
||||
* type should be one of the CONN_TYPE_* constants. */
|
||||
|
@ -285,6 +299,9 @@ connection_new(int type, int socket_family)
|
|||
case CONN_TYPE_CONTROL:
|
||||
return TO_CONN(control_connection_new(socket_family));
|
||||
|
||||
CASE_ANY_LISTENER_TYPE:
|
||||
return TO_CONN(listener_connection_new(type, socket_family));
|
||||
|
||||
default: {
|
||||
connection_t *conn = tor_malloc_zero(sizeof(connection_t));
|
||||
connection_init(time(NULL), conn, type, socket_family);
|
||||
|
@ -325,6 +342,8 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family)
|
|||
case CONN_TYPE_CONTROL:
|
||||
conn->magic = CONTROL_CONNECTION_MAGIC;
|
||||
break;
|
||||
CASE_ANY_LISTENER_TYPE:
|
||||
conn->magic = LISTENER_CONNECTION_MAGIC;
|
||||
default:
|
||||
conn->magic = BASE_CONNECTION_MAGIC;
|
||||
break;
|
||||
|
@ -396,6 +415,11 @@ _connection_free(connection_t *conn)
|
|||
mem = TO_CONTROL_CONN(conn);
|
||||
memlen = sizeof(control_connection_t);
|
||||
break;
|
||||
CASE_ANY_LISTENER_TYPE:
|
||||
tor_assert(conn->magic == LISTENER_CONNECTION_MAGIC);
|
||||
mem = TO_LISTENER_CONN(conn);
|
||||
memlen = sizeof(listener_connection_t);
|
||||
break;
|
||||
default:
|
||||
tor_assert(conn->magic == BASE_CONNECTION_MAGIC);
|
||||
mem = conn;
|
||||
|
@ -3970,13 +3994,7 @@ assert_connection_ok(connection_t *conn, time_t now)
|
|||
|
||||
switch (conn->type)
|
||||
{
|
||||
case CONN_TYPE_OR_LISTENER:
|
||||
case CONN_TYPE_AP_LISTENER:
|
||||
case CONN_TYPE_AP_TRANS_LISTENER:
|
||||
case CONN_TYPE_AP_NATD_LISTENER:
|
||||
case CONN_TYPE_DIR_LISTENER:
|
||||
case CONN_TYPE_CONTROL_LISTENER:
|
||||
case CONN_TYPE_AP_DNS_LISTENER:
|
||||
CASE_ANY_LISTENER_TYPE:
|
||||
tor_assert(conn->state == LISTENER_STATE_READY);
|
||||
break;
|
||||
case CONN_TYPE_OR:
|
||||
|
|
|
@ -22,6 +22,7 @@ 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);
|
||||
listener_connection_t *listener_connection_new(int type, int socket_family);
|
||||
connection_t *connection_new(int type, int socket_family);
|
||||
|
||||
void connection_link_connections(connection_t *conn_a, connection_t *conn_b);
|
||||
|
|
|
@ -305,11 +305,13 @@ dnsserv_resolved(edge_connection_t *conn,
|
|||
void
|
||||
dnsserv_configure_listener(connection_t *conn)
|
||||
{
|
||||
listener_connection_t *listener_conn;
|
||||
tor_assert(conn);
|
||||
tor_assert(SOCKET_OK(conn->s));
|
||||
tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER);
|
||||
|
||||
conn->dns_server_port =
|
||||
listener_conn = TO_LISTENER_CONN(conn);
|
||||
listener_conn->dns_server_port =
|
||||
tor_evdns_add_server_port(conn->s, 0, evdns_server_callback, NULL);
|
||||
}
|
||||
|
||||
|
@ -318,12 +320,15 @@ dnsserv_configure_listener(connection_t *conn)
|
|||
void
|
||||
dnsserv_close_listener(connection_t *conn)
|
||||
{
|
||||
listener_connection_t *listener_conn;
|
||||
tor_assert(conn);
|
||||
tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER);
|
||||
|
||||
if (conn->dns_server_port) {
|
||||
evdns_close_server_port(conn->dns_server_port);
|
||||
conn->dns_server_port = NULL;
|
||||
listener_conn = TO_LISTENER_CONN(conn);
|
||||
|
||||
if (listener_conn->dns_server_port) {
|
||||
evdns_close_server_port(listener_conn->dns_server_port);
|
||||
listener_conn->dns_server_port = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -290,7 +290,7 @@ connection_unregister_events(connection_t *conn)
|
|||
conn->bufev = NULL;
|
||||
}
|
||||
#endif
|
||||
if (conn->dns_server_port) {
|
||||
if (conn->type == CONN_TYPE_AP_DNS_LISTENER) {
|
||||
dnsserv_close_listener(conn);
|
||||
}
|
||||
}
|
||||
|
|
22
src/or/or.h
22
src/or/or.h
|
@ -938,6 +938,7 @@ typedef struct socks_request_t socks_request_t;
|
|||
#define EDGE_CONNECTION_MAGIC 0xF0374013u
|
||||
#define DIR_CONNECTION_MAGIC 0x9988ffeeu
|
||||
#define CONTROL_CONNECTION_MAGIC 0x8abc765du
|
||||
#define LISTENER_CONNECTION_MAGIC 0x1a1ac741u
|
||||
|
||||
/** Description of a connection to another host or process, and associated
|
||||
* data.
|
||||
|
@ -1043,15 +1044,18 @@ typedef struct connection_t {
|
|||
/** Unique identifier for this connection on this Tor instance. */
|
||||
uint64_t global_identifier;
|
||||
|
||||
/* XXXX023 move this field, and all the listener-only fields (just
|
||||
socket_family, I think), into a new listener_connection_t subtype. */
|
||||
/** Unique ID for measuring tunneled network status requests. */
|
||||
uint64_t dirreq_id;
|
||||
} connection_t;
|
||||
|
||||
typedef struct listener_connection_t {
|
||||
connection_t _base;
|
||||
|
||||
/** If the connection is a CONN_TYPE_AP_DNS_LISTENER, this field points
|
||||
* to the evdns_server_port it uses to listen to and answer connections. */
|
||||
struct evdns_server_port *dns_server_port;
|
||||
|
||||
/** Unique ID for measuring tunneled network status requests. */
|
||||
uint64_t dirreq_id;
|
||||
} connection_t;
|
||||
} listener_connection_t;
|
||||
|
||||
/** Stores flags and information related to the portion of a v2 Tor OR
|
||||
* connection handshake that happens after the TLS handshake is finished.
|
||||
|
@ -1321,6 +1325,9 @@ static edge_connection_t *TO_EDGE_CONN(connection_t *);
|
|||
/** Convert a connection_t* to an control_connection_t*; assert if the cast is
|
||||
* invalid. */
|
||||
static control_connection_t *TO_CONTROL_CONN(connection_t *);
|
||||
/** Convert a connection_t* to an listener_connection_t*; assert if the cast is
|
||||
* invalid. */
|
||||
static listener_connection_t *TO_LISTENER_CONN(connection_t *);
|
||||
|
||||
static INLINE or_connection_t *TO_OR_CONN(connection_t *c)
|
||||
{
|
||||
|
@ -1342,6 +1349,11 @@ static INLINE control_connection_t *TO_CONTROL_CONN(connection_t *c)
|
|||
tor_assert(c->magic == CONTROL_CONNECTION_MAGIC);
|
||||
return DOWNCAST(control_connection_t, c);
|
||||
}
|
||||
static INLINE listener_connection_t *TO_LISTENER_CONN(connection_t *c)
|
||||
{
|
||||
tor_assert(c->magic == LISTENER_CONNECTION_MAGIC);
|
||||
return DOWNCAST(listener_connection_t, c);
|
||||
}
|
||||
|
||||
/* Conditional macros to help write code that works whether bufferevents are
|
||||
disabled or not.
|
||||
|
|
Loading…
Add table
Reference in a new issue