]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Implement EVENT_NETWORK_LIVENESS
authorAndrea Shepard <andrea@torproject.org>
Wed, 6 May 2015 12:37:13 +0000 (12:37 +0000)
committerAndrea Shepard <andrea@torproject.org>
Sun, 17 May 2015 13:42:57 +0000 (13:42 +0000)
src/or/circuitstats.c
src/or/control.c
src/or/control.h

index 7b3ad56537f958033b5e366df43d72c9fdb896cd..3ced5afad518ebbc7217468b21c1a601cce323ad 100644 (file)
@@ -1232,6 +1232,9 @@ circuit_build_times_network_is_live(circuit_build_times_t *cbt)
   }
   cbt->liveness.network_last_live = now;
   cbt->liveness.nonlive_timeouts = 0;
+
+  /* Tell control.c */
+  control_event_network_liveness_update(1);
 }
 
 /**
@@ -1316,6 +1319,9 @@ circuit_build_times_network_close(circuit_build_times_t *cbt,
                  "Tor has not observed any network activity for the past %d "
                  "seconds. Disabling circuit build timeout recording.",
                  (int)(now - cbt->liveness.network_last_live));
+
+      /* Tell control.c */
+      control_event_network_liveness_update(0);
     } else {
       log_info(LD_CIRC,
              "Got non-live timeout. Current count is: %d",
index 950e9891e08acb37c76ab7dd5ef8d1b16e0d0761..a64822e5a2daadc0dc973a713d442758e5a1cdfb 100644 (file)
@@ -959,6 +959,7 @@ static const struct control_event_t control_event_table[] = {
   { EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" },
   { EVENT_HS_DESC, "HS_DESC" },
   { EVENT_HS_DESC_CONTENT, "HS_DESC_CONTENT" },
+  { EVENT_NETWORK_LIVENESS, "NETWORK_LIVENESS" },
   { 0, NULL },
 };
 
@@ -4992,6 +4993,52 @@ control_event_or_authdir_new_descriptor(const char *action,
   return 0;
 }
 
+/** Cached liveness for network liveness events and GETINFO
+ */
+
+static int network_is_live = 0;
+
+static int
+get_cached_network_liveness(void)
+{
+  return network_is_live;
+}
+
+static void
+set_cached_network_liveness(int liveness)
+{
+  network_is_live = liveness;
+}
+
+/** The network liveness has changed; this is called from circuitstats.c
+ * whenever we receive a cell, or when timeout expires and we assume the
+ * network is down. */
+int
+control_event_network_liveness_update(int liveness)
+{
+  if (liveness > 0) {
+    if (get_cached_network_liveness() <= 0) {
+      /* Update cached liveness */
+      set_cached_network_liveness(1);
+      log_debug(LD_CONTROL, "Sending NETWORK_LIVENESS UP");
+      send_control_event_string(EVENT_NETWORK_LIVENESS, ALL_FORMATS,
+                                "650 NETWORK_LIVENESS UP\r\n");
+    }
+    /* else was already live, no-op */
+  } else {
+    if (get_cached_network_liveness() > 0) {
+      /* Update cached liveness */
+      set_cached_network_liveness(0);
+      log_debug(LD_CONTROL, "Sending NETWORK_LIVENESS DOWN");
+      send_control_event_string(EVENT_NETWORK_LIVENESS, ALL_FORMATS,
+                                "650 NETWORK_LIVENESS DOWN\r\n");
+    }
+    /* else was already dead, no-op */
+  }
+
+  return 0;
+}
+
 /** Helper function for NS-style events. Constructs and sends an event
  * of type <b>event</b> with string <b>event_string</b> out of the set of
  * networkstatuses <b>statuses</b>. Currently it is used for NS events
index cb0468fa07c406d7379f182eb4e0b334ce719319..43a95b319f174242242f34016a28ca2dec4ce1cd 100644 (file)
@@ -67,6 +67,7 @@ int control_event_or_authdir_new_descriptor(const char *action,
                                             size_t desclen,
                                             const char *msg);
 int control_event_my_descriptor_changed(void);
+int control_event_network_liveness_update(int liveness);
 int control_event_networkstatus_changed(smartlist_t *statuses);
 
 int control_event_newconsensus(const networkstatus_t *consensus);
@@ -166,7 +167,8 @@ void control_free_all(void);
 #define EVENT_TRANSPORT_LAUNCHED      0x0020
 #define EVENT_HS_DESC                 0x0021
 #define EVENT_HS_DESC_CONTENT         0x0022
-#define EVENT_MAX_                    0x0022
+#define EVENT_NETWORK_LIVENESS        0x0023
+#define EVENT_MAX_                    0x0023
 
 /* sizeof(control_connection_t.event_mask) in bits, currently a uint64_t */
 #define EVENT_CAPACITY_               0x0040