From 60f699c859875b92602819c47c4a673343bee5fb Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Wed, 8 Jul 2020 20:12:56 -0700 Subject: [PATCH 1/2] Send a control port event when a stream enters the AP_CONN_STATE_CONTROLLER_WAIT state --- changes/ticket32190 | 4 ++++ src/core/or/connection_edge.c | 16 ++++++++++++---- src/core/or/connection_edge.h | 2 ++ src/feature/control/control_cmd.c | 3 +-- src/feature/control/control_events.c | 10 ++++++++++ src/feature/control/control_events.h | 5 ++++- 6 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 changes/ticket32190 diff --git a/changes/ticket32190 b/changes/ticket32190 new file mode 100644 index 0000000000..a34fd51c60 --- /dev/null +++ b/changes/ticket32190 @@ -0,0 +1,4 @@ + o Minor features (control port): + - When a stream enters the AP_CONN_STATE_CONTROLLER_WAIT status, + send a control port event CONTROLLER_WAIT. Closes ticket 32190. + Patch by Neel Chauhan. diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c index 2826a99249..5fc5f1176a 100644 --- a/src/core/or/connection_edge.c +++ b/src/core/or/connection_edge.c @@ -1504,6 +1504,16 @@ circuit_discard_optional_exit_enclaves(extend_info_t *info) } SMARTLIST_FOREACH_END(conn); } +/** Set the connection state to CONTROLLER_WAIT and send an control port event. + */ +void +connection_entry_set_controller_wait(entry_connection_t *conn) +{ + CONNECTION_AP_EXPECT_NONPENDING(conn); + ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; + control_event_enter_controller_wait(); +} + /** The AP connection conn has just failed while attaching or * sending a BEGIN or resolving on circ, but another circuit * might work. Detach the circuit, and either reattach it, launch a @@ -1535,8 +1545,7 @@ connection_ap_detach_retriable(entry_connection_t *conn, circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); connection_ap_mark_as_pending_circuit(conn); } else { - CONNECTION_AP_EXPECT_NONPENDING(conn); - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; + connection_entry_set_controller_wait(conn); circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); } return 0; @@ -1686,8 +1695,7 @@ connection_ap_rewrite_and_attach_if_allowed,(entry_connection_t *conn, const or_options_t *options = get_options(); if (options->LeaveStreamsUnattached) { - CONNECTION_AP_EXPECT_NONPENDING(conn); - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; + connection_entry_set_controller_wait(conn); return 0; } return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath); diff --git a/src/core/or/connection_edge.h b/src/core/or/connection_edge.h index 8c06af5664..12bc314b70 100644 --- a/src/core/or/connection_edge.h +++ b/src/core/or/connection_edge.h @@ -94,6 +94,8 @@ int connection_edge_flushed_some(edge_connection_t *conn); int connection_edge_finished_flushing(edge_connection_t *conn); int connection_edge_finished_connecting(edge_connection_t *conn); +void connection_entry_set_controller_wait(entry_connection_t *conn); + void connection_ap_about_to_close(entry_connection_t *edge_conn); void connection_exit_about_to_close(edge_connection_t *edge_conn); diff --git a/src/feature/control/control_cmd.c b/src/feature/control/control_cmd.c index a8926c0b79..6dc556a579 100644 --- a/src/feature/control/control_cmd.c +++ b/src/feature/control/control_cmd.c @@ -982,8 +982,7 @@ handle_control_attachstream(control_connection_t *conn, edge_conn->end_reason = 0; if (tmpcirc) circuit_detach_stream(tmpcirc, edge_conn); - CONNECTION_AP_EXPECT_NONPENDING(ap_conn); - TO_CONN(edge_conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; + connection_entry_set_controller_wait(ap_conn); } if (circ && (circ->base_.state != CIRCUIT_STATE_OPEN)) { diff --git a/src/feature/control/control_events.c b/src/feature/control/control_events.c index 8e69c772f6..85936aa722 100644 --- a/src/feature/control/control_events.c +++ b/src/feature/control/control_events.c @@ -109,6 +109,7 @@ const struct control_event_t control_event_table[] = { { EVENT_HS_DESC, "HS_DESC" }, { EVENT_HS_DESC_CONTENT, "HS_DESC_CONTENT" }, { EVENT_NETWORK_LIVENESS, "NETWORK_LIVENESS" }, + { EVENT_CONTROLLER_WAIT, "CONTROLLER_WAIT" }, { 0, NULL }, }; @@ -2363,6 +2364,15 @@ control_events_free_all(void) disable_log_messages = 0; } +/** Our own router descriptor has changed; tell any controllers that care. + */ +int +control_event_enter_controller_wait(void) +{ + send_control_event(EVENT_CONTROLLER_WAIT, "650 CONTROLLER_WAIT\r\n"); + return 0; +} + #ifdef TOR_UNIT_TESTS /* For testing: change the value of global_event_mask */ void diff --git a/src/feature/control/control_events.h b/src/feature/control/control_events.h index 0c8448e0f8..cd84fb0850 100644 --- a/src/feature/control/control_events.h +++ b/src/feature/control/control_events.h @@ -226,6 +226,8 @@ void control_event_hs_descriptor_content(const char *onion_address, void cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt, buildtimeout_set_event_t type); +int control_event_enter_controller_wait(void); + void control_events_free_all(void); #ifdef CONTROL_MODULE_PRIVATE @@ -284,7 +286,8 @@ typedef uint64_t event_mask_t; #define EVENT_NETWORK_LIVENESS 0x0023 #define EVENT_PT_LOG 0x0024 #define EVENT_PT_STATUS 0x0025 -#define EVENT_MAX_ 0x0025 +#define EVENT_CONTROLLER_WAIT 0x0026 +#define EVENT_MAX_ 0x0026 /* sizeof(control_connection_t.event_mask) in bits, currently a uint64_t */ #define EVENT_CAPACITY_ 0x0040 From 837e0c4dc93bd035298551c35db5be2ed18ee5dc Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Fri, 31 Jul 2020 09:21:43 -0700 Subject: [PATCH 2/2] Code simplifications for AP_CONN_STATE_CONTROLLER_WAIT --- src/core/or/connection_edge.c | 2 +- src/feature/control/control_events.c | 10 +--------- src/feature/control/control_events.h | 3 ++- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c index 5fc5f1176a..6c02d6b122 100644 --- a/src/core/or/connection_edge.c +++ b/src/core/or/connection_edge.c @@ -1511,7 +1511,7 @@ connection_entry_set_controller_wait(entry_connection_t *conn) { CONNECTION_AP_EXPECT_NONPENDING(conn); ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; - control_event_enter_controller_wait(); + control_event_stream_status(conn, STREAM_EVENT_CONTROLLER_WAIT, 0); } /** The AP connection conn has just failed while attaching or diff --git a/src/feature/control/control_events.c b/src/feature/control/control_events.c index 85936aa722..f97130d020 100644 --- a/src/feature/control/control_events.c +++ b/src/feature/control/control_events.c @@ -819,6 +819,7 @@ control_event_stream_status(entry_connection_t *conn, stream_status_event_t tp, case STREAM_EVENT_NEW_RESOLVE: status = "NEWRESOLVE"; break; case STREAM_EVENT_FAILED_RETRIABLE: status = "DETACHED"; break; case STREAM_EVENT_REMAP: status = "REMAP"; break; + case STREAM_EVENT_CONTROLLER_WAIT: status = "CONTROLLER_WAIT"; break; default: log_warn(LD_BUG, "Unrecognized status code %d", (int)tp); return 0; @@ -2364,15 +2365,6 @@ control_events_free_all(void) disable_log_messages = 0; } -/** Our own router descriptor has changed; tell any controllers that care. - */ -int -control_event_enter_controller_wait(void) -{ - send_control_event(EVENT_CONTROLLER_WAIT, "650 CONTROLLER_WAIT\r\n"); - return 0; -} - #ifdef TOR_UNIT_TESTS /* For testing: change the value of global_event_mask */ void diff --git a/src/feature/control/control_events.h b/src/feature/control/control_events.h index cd84fb0850..82c665ac71 100644 --- a/src/feature/control/control_events.h +++ b/src/feature/control/control_events.h @@ -36,7 +36,8 @@ typedef enum stream_status_event_t { STREAM_EVENT_NEW = 5, STREAM_EVENT_NEW_RESOLVE = 6, STREAM_EVENT_FAILED_RETRIABLE = 7, - STREAM_EVENT_REMAP = 8 + STREAM_EVENT_REMAP = 8, + STREAM_EVENT_CONTROLLER_WAIT = 9 } stream_status_event_t; /** Used to indicate the type of a buildtime event */