From dce9e915c77ccf42e74a5cccca309e8085738d75 Mon Sep 17 00:00:00 2001 From: Andrea Shepard Date: Wed, 6 May 2015 12:37:13 +0000 Subject: [PATCH 1/3] Implement EVENT_NETWORK_LIVENESS --- src/or/circuitstats.c | 6 ++++++ src/or/control.c | 47 +++++++++++++++++++++++++++++++++++++++++++ src/or/control.h | 4 +++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index 7b3ad56537..3ced5afad5 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -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", diff --git a/src/or/control.c b/src/or/control.c index 950e9891e0..a64822e5a2 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -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 event with string event_string out of the set of * networkstatuses statuses. Currently it is used for NS events diff --git a/src/or/control.h b/src/or/control.h index cb0468fa07..43a95b319f 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -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 From 4cbc9c53131573a8edcbe1748b5ed220959db0b6 Mon Sep 17 00:00:00 2001 From: Andrea Shepard Date: Fri, 15 May 2015 19:44:13 +0000 Subject: [PATCH 2/3] Add GETINFO network-liveness to control protocol --- src/or/control.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/or/control.c b/src/or/control.c index a64822e5a2..c76ade06d5 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -179,6 +179,9 @@ static int write_stream_target_to_buf(entry_connection_t *conn, char *buf, static void orconn_target_get_name(char *buf, size_t len, or_connection_t *conn); +static int get_cached_network_liveness(void); +static void set_cached_network_liveness(int liveness); + /** Given a control event code for a message event, return the corresponding * log severity. */ static INLINE int @@ -2207,6 +2210,24 @@ getinfo_helper_onions(control_connection_t *control_conn, return 0; } +/** Implementation helper for GETINFO: answers queries about network + * liveness. */ +static int +getinfo_helper_liveness(control_connection_t *control_conn, + const char *question, char **answer, + const char **errmsg) +{ + if (strcmp(question, "network-liveness") == 0) { + if (get_cached_network_liveness()) { + *answer = tor_strdup("up"); + } else { + *answer = tor_strdup("down"); + } + } + + return 0; +} + /** Callback function for GETINFO: on a given control connection, try to * answer the question q and store the newly-allocated answer in * *a. If an internal error occurs, return -1 and optionally set @@ -2291,6 +2312,8 @@ static const getinfo_item_t getinfo_items[] = { "Information about and from the ns consensus."), ITEM("network-status", dir, "Brief summary of router status (v1 directory format)"), + ITEM("network-liveness", liveness, + "Current opinion on whether the network is live"), ITEM("circuit-status", events, "List of current circuits originating here."), ITEM("stream-status", events,"List of current streams."), ITEM("orconn-status", events, "A list of current OR connections."), From 79f7721a7e339783d6d0005def77abe3d7e23e95 Mon Sep 17 00:00:00 2001 From: Andrea Shepard Date: Sun, 17 May 2015 13:58:05 +0000 Subject: [PATCH 3/3] Changes file for ticket 15358 --- changes/ticket15358 | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changes/ticket15358 diff --git a/changes/ticket15358 b/changes/ticket15358 new file mode 100644 index 0000000000..8c85d51007 --- /dev/null +++ b/changes/ticket15358 @@ -0,0 +1,3 @@ + o Features (control protocl): + - Support network-liveness GETINFO key and NETWORK_LIVENESS events in the + control protocol. Resolves ticket #15358.