Explorar o código

Report HS circ states stored in circ purpose field in CIRC events

Robert Ransom %!s(int64=13) %!d(string=hai) anos
pai
achega
c7d01b0541
Modificáronse 4 ficheiros con 75 adicións e 0 borrados
  1. 4 0
      changes/feature2411
  2. 57 0
      src/or/circuitlist.c
  3. 1 0
      src/or/circuitlist.h
  4. 13 0
      src/or/control.c

+ 4 - 0
changes/feature2411

@@ -4,4 +4,8 @@
       controllers in CIRC events and in replies to 'GETINFO
       circuit-status'.  Implements part of ticket 2411.
 
+    - Report the current state of a hidden-service-related circuit to
+      controllers in CIRC events and in replies to 'GETINFO
+      circuit-status'.  Implements part of ticket 2411.
+
 

+ 57 - 0
src/or/circuitlist.c

@@ -378,6 +378,63 @@ circuit_purpose_to_controller_string(uint8_t purpose)
   }
 }
 
+/** Return a string specifying the state of the hidden-service circuit
+ * purpose <b>purpose</b>, or NULL if <b>purpose</b> is not a
+ * hidden-service-related circuit purpose. */
+const char *
+circuit_purpose_to_controller_hs_state_string(uint8_t purpose)
+{
+  switch (purpose)
+    {
+    default:
+      log_fn(LOG_WARN, LD_BUG,
+             "Unrecognized circuit purpose: %d",
+             (int)purpose);
+      tor_fragile_assert();
+      /* fall through */
+
+    case CIRCUIT_PURPOSE_OR:
+    case CIRCUIT_PURPOSE_C_GENERAL:
+    case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
+    case CIRCUIT_PURPOSE_TESTING:
+    case CIRCUIT_PURPOSE_CONTROLLER:
+      return NULL;
+
+    case CIRCUIT_PURPOSE_INTRO_POINT:
+      return "OR_HSSI_ESTABLISHED";
+    case CIRCUIT_PURPOSE_REND_POINT_WAITING:
+      return "OR_HSCR_ESTABLISHED";
+    case CIRCUIT_PURPOSE_REND_ESTABLISHED:
+      return "OR_HS_R_JOINED";
+
+    case CIRCUIT_PURPOSE_C_INTRODUCING:
+      return "HSCI_CONNECTING";
+    case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT:
+      return "HSCI_INTRO_SENT";
+    case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED:
+      return "HSCI_DONE";
+
+    case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
+      return "HSCR_CONNECTING";
+    case CIRCUIT_PURPOSE_C_REND_READY:
+      return "HSCR_ESTABLISHED_IDLE";
+    case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED:
+      return "HSCR_ESTABLISHED_WAITING";
+    case CIRCUIT_PURPOSE_C_REND_JOINED:
+      return "HSCR_JOINED";
+
+    case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
+      return "HSSI_CONNECTING";
+    case CIRCUIT_PURPOSE_S_INTRO:
+      return "HSSI_ESTABLISHED";
+
+    case CIRCUIT_PURPOSE_S_CONNECT_REND:
+      return "HSSR_CONNECTING";
+    case CIRCUIT_PURPOSE_S_REND_JOINED:
+      return "HSSR_JOINED";
+    }
+}
+
 /** Return a human-readable string for the circuit purpose <b>purpose</b>. */
 const char *
 circuit_purpose_to_string(uint8_t purpose)

+ 1 - 0
src/or/circuitlist.h

@@ -15,6 +15,7 @@
 circuit_t * _circuit_get_global_list(void);
 const char *circuit_state_to_string(int state);
 const char *circuit_purpose_to_controller_string(uint8_t purpose);
+const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose);
 const char *circuit_purpose_to_string(uint8_t purpose);
 void circuit_dump_by_conn(connection_t *conn, int severity);
 void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id,

+ 13 - 0
src/or/control.c

@@ -1829,6 +1829,19 @@ circuit_describe_status_for_controller(origin_circuit_t *circ)
     smartlist_add(descparts, purpose);
   }
 
+  {
+    char *hs_state_arg = NULL;
+    const char *hs_state =
+      circuit_purpose_to_controller_hs_state_string(circ->_base.purpose);
+
+    if (hs_state != NULL) {
+      tor_asprintf(&hs_state_arg, "HS_STATE=%s",
+                   hs_state);
+
+      smartlist_add(descparts, hs_state_arg);
+    }
+  }
+
   rv = smartlist_join_strings(descparts, " ", 0, NULL);
 
   SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp));