[tor-commits] [tor/master] Hook up control_event_bootstrap() to btrack_orconn

nickm at torproject.org nickm at torproject.org
Fri Dec 21 19:28:10 UTC 2018


commit 936c93e562deaba62f0d32f7e7fda770c5604318
Author: Taylor Yu <catalyst at torproject.org>
Date:   Sat Dec 15 22:14:46 2018 -0600

    Hook up control_event_bootstrap() to btrack_orconn
    
    Replace a few invocations of control_event_bootstrap() with calls from
    the bootstrap tracker subsystem.  This mostly leaves behavior
    unchanged.  The actual behavior changes come in the next commit.
    
    Part of ticket 27167.
---
 src/core/include.am                        |   2 +
 src/core/or/circuitbuild.c                 |   2 -
 src/core/or/connection_or.c                |   2 -
 src/feature/control/btrack_orconn.c        |  13 +++-
 src/feature/control/btrack_orconn_cevent.c | 102 +++++++++++++++++++++++++++++
 src/feature/control/btrack_orconn_cevent.h |  17 +++++
 src/feature/control/control.h              |   1 -
 src/feature/control/control_bootstrap.c    |  11 ----
 src/feature/nodelist/nodelist.c            |   1 -
 src/test/test_controller_events.c          |   4 +-
 10 files changed, 133 insertions(+), 22 deletions(-)

diff --git a/src/core/include.am b/src/core/include.am
index 93a8bca5d..5e69cb9ad 100644
--- a/src/core/include.am
+++ b/src/core/include.am
@@ -66,6 +66,7 @@ LIBTOR_APP_A_SOURCES = 				\
 	src/feature/control/btrack.c		\
 	src/feature/control/btrack_circuit.c	\
 	src/feature/control/btrack_orconn.c	\
+	src/feature/control/btrack_orconn_cevent.c	\
 	src/feature/control/btrack_orconn_maps.c	\
 	src/feature/control/control.c		\
 	src/feature/control/control_bootstrap.c	\
@@ -280,6 +281,7 @@ noinst_HEADERS +=					\
 	src/feature/client/transports.h			\
 	src/feature/control/btrack_circuit.h		\
 	src/feature/control/btrack_orconn.h		\
+	src/feature/control/btrack_orconn_cevent.h	\
 	src/feature/control/btrack_orconn_maps.h	\
 	src/feature/control/btrack_sys.h		\
 	src/feature/control/control.h			\
diff --git a/src/core/or/circuitbuild.c b/src/core/or/circuitbuild.c
index 3de8da9cd..b89ec09a9 100644
--- a/src/core/or/circuitbuild.c
+++ b/src/core/or/circuitbuild.c
@@ -583,8 +583,6 @@ circuit_handle_first_hop(origin_circuit_t *circ)
     circ->base_.n_hop = extend_info_dup(firsthop->extend_info);
 
     if (should_launch) {
-      if (circ->build_state->onehop_tunnel)
-        control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0);
       n_chan = channel_connect_for_circuit(
           &firsthop->extend_info->addr,
           firsthop->extend_info->port,
diff --git a/src/core/or/connection_or.c b/src/core/or/connection_or.c
index a12ea55c4..5d0874869 100644
--- a/src/core/or/connection_or.c
+++ b/src/core/or/connection_or.c
@@ -751,8 +751,6 @@ connection_or_finished_connecting(or_connection_t *or_conn)
 
   log_debug(LD_HANDSHAKE,"OR connect() to router at %s:%u finished.",
             conn->address,conn->port);
-  control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0);
-  control_event_boot_first_orconn();
 
   if (proxy_type != PROXY_NONE) {
     /* start proxy handshake */
diff --git a/src/feature/control/btrack_orconn.c b/src/feature/control/btrack_orconn.c
index 28f8509fe..0fbf52100 100644
--- a/src/feature/control/btrack_orconn.c
+++ b/src/feature/control/btrack_orconn.c
@@ -27,6 +27,10 @@
  * might be a one-hop circuit for directory lookups, or it might be a
  * connection for an application circuit because we already have
  * enough directory info to build an application circuit.
+ *
+ * We call functions in btrack_orconn_cevent.c to generate the actual
+ * controller events, because some of the state decoding we need to do
+ * is complicated.
  **/
 
 #include <stdbool.h>
@@ -38,6 +42,7 @@
 #include "core/or/ocirc_event.h"
 #include "core/or/orconn_event.h"
 #include "feature/control/btrack_orconn.h"
+#include "feature/control/btrack_orconn_cevent.h"
 #include "feature/control/btrack_orconn_maps.h"
 #include "lib/log/log.h"
 
@@ -86,9 +91,10 @@ bto_update_bests(const bt_orconn_t *bto)
 {
   tor_assert(bto->is_orig);
 
-  bto_update_best(bto, &best_any, "ANY");
-  if (!bto->is_onehop)
-    bto_update_best(bto, &best_ap, "AP");
+  if (bto_update_best(bto, &best_any, "ANY"))
+    bto_cevent_anyconn(bto);
+  if (!bto->is_onehop && bto_update_best(bto, &best_ap, "AP"))
+    bto_cevent_apconn(bto);
 }
 
 /** Reset cached "best" values */
@@ -196,4 +202,5 @@ btrack_orconn_fini(void)
 {
   bto_clear_maps();
   bto_reset_bests();
+  bto_cevent_reset();
 }
diff --git a/src/feature/control/btrack_orconn_cevent.c b/src/feature/control/btrack_orconn_cevent.c
new file mode 100644
index 000000000..fbbd34aca
--- /dev/null
+++ b/src/feature/control/btrack_orconn_cevent.c
@@ -0,0 +1,102 @@
+/* Copyright (c) 2007-2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file btrack_orconn_cevent.c
+ * \brief Emit bootstrap status events for OR connections
+ **/
+
+#include <stdbool.h>
+
+#include "core/or/or.h"
+
+#define BTRACK_ORCONN_PRIVATE
+
+#include "core/or/orconn_event.h"
+#include "feature/control/btrack_orconn.h"
+#include "feature/control/btrack_orconn_cevent.h"
+#include "feature/control/control.h"
+
+/**
+ * Have we completed our first OR connection?
+ *
+ * Block display of application circuit progress until we do, to avoid
+ * some misleading behavior of jumping to high progress.
+ **/
+static bool bto_first_orconn = false;
+
+/**
+ * Emit control events when we have updated our idea of the best state
+ * that any OR connection has reached.
+ **/
+void
+bto_cevent_anyconn(const bt_orconn_t *bto)
+{
+  switch (bto->state) {
+  case OR_CONN_STATE_CONNECTING:
+  case OR_CONN_STATE_PROXY_HANDSHAKING:
+    /* XXX This isn't quite right, because this isn't necessarily a
+       directory server we're talking to, but we'll improve the
+       bootstrap tags and messages later */
+    control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0);
+    break;
+  case OR_CONN_STATE_TLS_HANDSHAKING:
+    /* Here we should report a connection completed (TCP or proxied),
+       if we had the states */
+    break;
+  case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING:
+  case OR_CONN_STATE_OR_HANDSHAKING_V2:
+  case OR_CONN_STATE_OR_HANDSHAKING_V3:
+    /* XXX Again, this isn't quite right, because it's not necessarily
+       a directory server we're talking to. */
+    control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE_DIR, 0);
+    break;
+  case OR_CONN_STATE_OPEN:
+    /* Unblock directory progress display */
+    control_event_boot_first_orconn();
+    /* Unblock apconn progress display */
+    bto_first_orconn = true;
+    break;
+  default:
+    break;
+  }
+}
+
+/**
+ * Emit control events when we have updated our idea of the best state
+ * that any application circuit OR connection has reached.
+ **/
+void
+bto_cevent_apconn(const bt_orconn_t *bto)
+{
+  if (!bto_first_orconn)
+    return;
+
+  switch (bto->state) {
+  case OR_CONN_STATE_CONNECTING:
+  case OR_CONN_STATE_PROXY_HANDSHAKING:
+    control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0);
+    break;
+  case OR_CONN_STATE_TLS_HANDSHAKING:
+    /* Here we should report a connection completed (TCP or proxied) */
+    break;
+  case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING:
+  case OR_CONN_STATE_OR_HANDSHAKING_V2:
+  case OR_CONN_STATE_OR_HANDSHAKING_V3:
+    control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE_OR, 0);
+    break;
+  case OR_CONN_STATE_OPEN:
+    /* XXX Not quite right, because it implictly reports the next
+       state, but we'll improve it later. */
+    control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0);
+  default:
+    break;
+  }
+}
+
+/** Forget that we completed our first OR connection */
+void
+bto_cevent_reset(void)
+{
+  bto_first_orconn = false;
+}
diff --git a/src/feature/control/btrack_orconn_cevent.h b/src/feature/control/btrack_orconn_cevent.h
new file mode 100644
index 000000000..165ff69cd
--- /dev/null
+++ b/src/feature/control/btrack_orconn_cevent.h
@@ -0,0 +1,17 @@
+/* Copyright (c) 2007-2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file btrack_orconn_cevent.h
+ * \brief Header file for btrack_orconn_cevent.c
+ **/
+
+#ifndef TOR_BTRACK_ORCONN_CEVENT_H
+
+#include "feature/control/btrack_orconn.h"
+
+void bto_cevent_anyconn(const bt_orconn_t *);
+void bto_cevent_apconn(const bt_orconn_t *);
+void bto_cevent_reset(void);
+
+#endif  /* defined(TOR_BTRACK_ORCONN_CEVENT_H) */
diff --git a/src/feature/control/control.h b/src/feature/control/control.h
index 68c9a6bed..8180c4b60 100644
--- a/src/feature/control/control.h
+++ b/src/feature/control/control.h
@@ -52,7 +52,6 @@ typedef enum {
   BOOTSTRAP_STATUS_UNDEF=-1,
   BOOTSTRAP_STATUS_STARTING=0,
   BOOTSTRAP_STATUS_CONN_DIR=5,
-  BOOTSTRAP_STATUS_HANDSHAKE=-2,
   BOOTSTRAP_STATUS_HANDSHAKE_DIR=10,
   BOOTSTRAP_STATUS_ONEHOP_CREATE=15,
   BOOTSTRAP_STATUS_REQUESTING_STATUS=20,
diff --git a/src/feature/control/control_bootstrap.c b/src/feature/control/control_bootstrap.c
index 0756e208e..0478f0783 100644
--- a/src/feature/control/control_bootstrap.c
+++ b/src/feature/control/control_bootstrap.c
@@ -34,7 +34,6 @@ static const struct {
   { BOOTSTRAP_STATUS_UNDEF, "undef", "Undefined" },
   { BOOTSTRAP_STATUS_STARTING, "starting", "Starting" },
   { BOOTSTRAP_STATUS_CONN_DIR, "conn_dir", "Connecting to directory server" },
-  { BOOTSTRAP_STATUS_HANDSHAKE, "status_handshake", "Finishing handshake" },
   { BOOTSTRAP_STATUS_HANDSHAKE_DIR, "handshake_dir",
     "Finishing handshake with directory server" },
   { BOOTSTRAP_STATUS_ONEHOP_CREATE, "onehop_create",
@@ -151,16 +150,6 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
   if (bootstrap_percent == BOOTSTRAP_STATUS_DONE)
     return; /* already bootstrapped; nothing to be done here. */
 
-  /* special case for handshaking status, since our TLS handshaking code
-   * can't distinguish what the connection is going to be for. */
-  if (status == BOOTSTRAP_STATUS_HANDSHAKE) {
-    if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) {
-      status = BOOTSTRAP_STATUS_HANDSHAKE_DIR;
-    } else {
-      status = BOOTSTRAP_STATUS_HANDSHAKE_OR;
-    }
-  }
-
   if (status <= bootstrap_percent) {
     /* If there's no new progress, return early. */
     if (!progress || progress <= bootstrap_percent)
diff --git a/src/feature/nodelist/nodelist.c b/src/feature/nodelist/nodelist.c
index f93ecd5bf..e1d5e4d3f 100644
--- a/src/feature/nodelist/nodelist.c
+++ b/src/feature/nodelist/nodelist.c
@@ -2633,7 +2633,6 @@ update_router_have_minimum_dir_info(void)
   /* If paths have just become available in this update. */
   if (res && !have_min_dir_info) {
     control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO");
-    control_event_boot_dir(BOOTSTRAP_STATUS_CONN_OR, 0);
     log_info(LD_DIR,
              "We now have enough directory information to build circuits.");
   }
diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c
index 4c404876b..63013390e 100644
--- a/src/test/test_controller_events.c
+++ b/src/test/test_controller_events.c
@@ -353,7 +353,7 @@ test_cntev_dirboot_defer_desc(void *arg)
   assert_bootmsg("0 TAG=starting");
   control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0);
   assert_bootmsg("5 TAG=conn_dir");
-  control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0);
+  control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE_DIR, 0);
   assert_bootmsg("10 TAG=handshake_dir");
   /* The deferred event should appear */
   control_event_boot_first_orconn();
@@ -378,7 +378,7 @@ test_cntev_dirboot_defer_orconn(void *arg)
   assert_bootmsg("0 TAG=starting");
   control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0);
   assert_bootmsg("5 TAG=conn_dir");
-  control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0);
+  control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE_DIR, 0);
   assert_bootmsg("10 TAG=handshake_dir");
   /* The deferred event should appear */
   control_event_boot_first_orconn();





More information about the tor-commits mailing list