|
@@ -98,6 +98,7 @@ static smartlist_t *outgoing_addrs = NULL;
|
|
|
|
|
|
#define CASE_ANY_LISTENER_TYPE \
|
|
#define CASE_ANY_LISTENER_TYPE \
|
|
case CONN_TYPE_OR_LISTENER: \
|
|
case CONN_TYPE_OR_LISTENER: \
|
|
|
|
+ case CONN_TYPE_EXT_OR_LISTENER: \
|
|
case CONN_TYPE_AP_LISTENER: \
|
|
case CONN_TYPE_AP_LISTENER: \
|
|
case CONN_TYPE_DIR_LISTENER: \
|
|
case CONN_TYPE_DIR_LISTENER: \
|
|
case CONN_TYPE_CONTROL_LISTENER: \
|
|
case CONN_TYPE_CONTROL_LISTENER: \
|
|
@@ -129,6 +130,8 @@ conn_type_to_string(int type)
|
|
case CONN_TYPE_CPUWORKER: return "CPU worker";
|
|
case CONN_TYPE_CPUWORKER: return "CPU worker";
|
|
case CONN_TYPE_CONTROL_LISTENER: return "Control listener";
|
|
case CONN_TYPE_CONTROL_LISTENER: return "Control listener";
|
|
case CONN_TYPE_CONTROL: return "Control";
|
|
case CONN_TYPE_CONTROL: return "Control";
|
|
|
|
+ case CONN_TYPE_EXT_OR: return "Extended OR";
|
|
|
|
+ case CONN_TYPE_EXT_OR_LISTENER: return "Extended OR listener";
|
|
default:
|
|
default:
|
|
log_warn(LD_BUG, "unknown connection type %d", type);
|
|
log_warn(LD_BUG, "unknown connection type %d", type);
|
|
tor_snprintf(buf, sizeof(buf), "unknown [%d]", type);
|
|
tor_snprintf(buf, sizeof(buf), "unknown [%d]", type);
|
|
@@ -165,6 +168,12 @@ conn_state_to_string(int type, int state)
|
|
case OR_CONN_STATE_OPEN: return "open";
|
|
case OR_CONN_STATE_OPEN: return "open";
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
|
|
+ switch (state) {
|
|
|
|
+ case EXT_OR_CONN_STATE_OPEN: return "open";
|
|
|
|
+ case EXT_OR_CONN_STATE_FLUSHING: return "flushing final OKAY";
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|
|
switch (state) {
|
|
switch (state) {
|
|
case EXIT_CONN_STATE_RESOLVING: return "waiting for dest info";
|
|
case EXIT_CONN_STATE_RESOLVING: return "waiting for dest info";
|
|
@@ -229,6 +238,7 @@ connection_type_uses_bufferevent(connection_t *conn)
|
|
case CONN_TYPE_DIR:
|
|
case CONN_TYPE_DIR:
|
|
case CONN_TYPE_CONTROL:
|
|
case CONN_TYPE_CONTROL:
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
case CONN_TYPE_CPUWORKER:
|
|
case CONN_TYPE_CPUWORKER:
|
|
return 1;
|
|
return 1;
|
|
default:
|
|
default:
|
|
@@ -259,14 +269,18 @@ dir_connection_new(int socket_family)
|
|
* Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick.
|
|
* Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick.
|
|
*/
|
|
*/
|
|
or_connection_t *
|
|
or_connection_t *
|
|
-or_connection_new(int socket_family)
|
|
|
|
|
|
+or_connection_new(int type, int socket_family)
|
|
{
|
|
{
|
|
or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t));
|
|
or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t));
|
|
time_t now = time(NULL);
|
|
time_t now = time(NULL);
|
|
- connection_init(now, TO_CONN(or_conn), CONN_TYPE_OR, socket_family);
|
|
|
|
|
|
+ tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR);
|
|
|
|
+ connection_init(now, TO_CONN(or_conn), type, socket_family);
|
|
|
|
|
|
or_conn->timestamp_last_added_nonpadding = time(NULL);
|
|
or_conn->timestamp_last_added_nonpadding = time(NULL);
|
|
|
|
|
|
|
|
+ if (type == CONN_TYPE_EXT_OR)
|
|
|
|
+ connection_or_set_ext_or_identifier(or_conn);
|
|
|
|
+
|
|
return or_conn;
|
|
return or_conn;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -335,7 +349,8 @@ connection_new(int type, int socket_family)
|
|
{
|
|
{
|
|
switch (type) {
|
|
switch (type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
- return TO_CONN(or_connection_new(socket_family));
|
|
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
|
|
+ return TO_CONN(or_connection_new(type, socket_family));
|
|
|
|
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|
|
return TO_CONN(edge_connection_new(type, socket_family));
|
|
return TO_CONN(edge_connection_new(type, socket_family));
|
|
@@ -377,6 +392,7 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family)
|
|
|
|
|
|
switch (type) {
|
|
switch (type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
conn->magic = OR_CONNECTION_MAGIC;
|
|
conn->magic = OR_CONNECTION_MAGIC;
|
|
break;
|
|
break;
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|
|
@@ -445,6 +461,7 @@ connection_free_(connection_t *conn)
|
|
|
|
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
|
|
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
|
|
mem = TO_OR_CONN(conn);
|
|
mem = TO_OR_CONN(conn);
|
|
memlen = sizeof(or_connection_t);
|
|
memlen = sizeof(or_connection_t);
|
|
@@ -575,6 +592,9 @@ connection_free_(connection_t *conn)
|
|
log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest");
|
|
log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest");
|
|
connection_or_remove_from_identity_map(TO_OR_CONN(conn));
|
|
connection_or_remove_from_identity_map(TO_OR_CONN(conn));
|
|
}
|
|
}
|
|
|
|
+ if (conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR)
|
|
|
|
+ connection_or_remove_from_ext_or_id_map(TO_OR_CONN(conn));
|
|
|
|
+
|
|
#ifdef USE_BUFFEREVENTS
|
|
#ifdef USE_BUFFEREVENTS
|
|
if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) {
|
|
if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) {
|
|
ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg);
|
|
ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg);
|
|
@@ -638,6 +658,7 @@ connection_about_to_close_connection(connection_t *conn)
|
|
connection_dir_about_to_close(TO_DIR_CONN(conn));
|
|
connection_dir_about_to_close(TO_DIR_CONN(conn));
|
|
break;
|
|
break;
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
connection_or_about_to_close(TO_OR_CONN(conn));
|
|
connection_or_about_to_close(TO_OR_CONN(conn));
|
|
break;
|
|
break;
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_AP:
|
|
@@ -1374,6 +1395,9 @@ connection_init_accepted_conn(connection_t *conn,
|
|
connection_start_reading(conn);
|
|
connection_start_reading(conn);
|
|
|
|
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
|
|
+ conn->state = EXT_OR_CONN_STATE_OPEN;
|
|
|
|
+ break;
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
control_event_or_conn_status(TO_OR_CONN(conn), OR_CONN_EVENT_NEW, 0);
|
|
control_event_or_conn_status(TO_OR_CONN(conn), OR_CONN_EVENT_NEW, 0);
|
|
rv = connection_tls_start_handshake(TO_OR_CONN(conn), 1);
|
|
rv = connection_tls_start_handshake(TO_OR_CONN(conn), 1);
|
|
@@ -2886,6 +2910,8 @@ connection_handle_read_impl(connection_t *conn)
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
case CONN_TYPE_OR_LISTENER:
|
|
case CONN_TYPE_OR_LISTENER:
|
|
return connection_handle_listener_read(conn, CONN_TYPE_OR);
|
|
return connection_handle_listener_read(conn, CONN_TYPE_OR);
|
|
|
|
+ case CONN_TYPE_EXT_OR_LISTENER:
|
|
|
|
+ return connection_handle_listener_read(conn, CONN_TYPE_EXT_OR);
|
|
case CONN_TYPE_AP_LISTENER:
|
|
case CONN_TYPE_AP_LISTENER:
|
|
case CONN_TYPE_AP_TRANS_LISTENER:
|
|
case CONN_TYPE_AP_TRANS_LISTENER:
|
|
case CONN_TYPE_AP_NATD_LISTENER:
|
|
case CONN_TYPE_AP_NATD_LISTENER:
|
|
@@ -3918,6 +3944,7 @@ int
|
|
connection_is_listener(connection_t *conn)
|
|
connection_is_listener(connection_t *conn)
|
|
{
|
|
{
|
|
if (conn->type == CONN_TYPE_OR_LISTENER ||
|
|
if (conn->type == CONN_TYPE_OR_LISTENER ||
|
|
|
|
+ conn->type == CONN_TYPE_EXT_OR_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_TRANS_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_TRANS_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_DNS_LISTENER ||
|
|
conn->type == CONN_TYPE_AP_DNS_LISTENER ||
|
|
@@ -3940,6 +3967,7 @@ connection_state_is_open(connection_t *conn)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
if ((conn->type == CONN_TYPE_OR && conn->state == OR_CONN_STATE_OPEN) ||
|
|
if ((conn->type == CONN_TYPE_OR && conn->state == OR_CONN_STATE_OPEN) ||
|
|
|
|
+ (conn->type == CONN_TYPE_EXT_OR) ||
|
|
(conn->type == CONN_TYPE_AP && conn->state == AP_CONN_STATE_OPEN) ||
|
|
(conn->type == CONN_TYPE_AP && conn->state == AP_CONN_STATE_OPEN) ||
|
|
(conn->type == CONN_TYPE_EXIT && conn->state == EXIT_CONN_STATE_OPEN) ||
|
|
(conn->type == CONN_TYPE_EXIT && conn->state == EXIT_CONN_STATE_OPEN) ||
|
|
(conn->type == CONN_TYPE_CONTROL &&
|
|
(conn->type == CONN_TYPE_CONTROL &&
|
|
@@ -4109,6 +4137,8 @@ connection_process_inbuf(connection_t *conn, int package_partial)
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
return connection_or_process_inbuf(TO_OR_CONN(conn));
|
|
return connection_or_process_inbuf(TO_OR_CONN(conn));
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
|
|
+ return connection_ext_or_process_inbuf(TO_OR_CONN(conn));
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_AP:
|
|
return connection_edge_process_inbuf(TO_EDGE_CONN(conn),
|
|
return connection_edge_process_inbuf(TO_EDGE_CONN(conn),
|
|
@@ -4169,6 +4199,8 @@ connection_finished_flushing(connection_t *conn)
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
return connection_or_finished_flushing(TO_OR_CONN(conn));
|
|
return connection_or_finished_flushing(TO_OR_CONN(conn));
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
|
|
+ return connection_ext_or_finished_flushing(TO_OR_CONN(conn));
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|
|
return connection_edge_finished_flushing(TO_EDGE_CONN(conn));
|
|
return connection_edge_finished_flushing(TO_EDGE_CONN(conn));
|
|
@@ -4224,6 +4256,7 @@ connection_reached_eof(connection_t *conn)
|
|
{
|
|
{
|
|
switch (conn->type) {
|
|
switch (conn->type) {
|
|
case CONN_TYPE_OR:
|
|
case CONN_TYPE_OR:
|
|
|
|
+ case CONN_TYPE_EXT_OR:
|
|
return connection_or_reached_eof(TO_OR_CONN(conn));
|
|
return connection_or_reached_eof(TO_OR_CONN(conn));
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_AP:
|
|
case CONN_TYPE_EXIT:
|
|
case CONN_TYPE_EXIT:
|