mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Implement EVENT_NETWORK_LIVENESS
This commit is contained in:
parent
411049d0d4
commit
dce9e915c7
@ -1232,6 +1232,9 @@ circuit_build_times_network_is_live(circuit_build_times_t *cbt)
|
|||||||
}
|
}
|
||||||
cbt->liveness.network_last_live = now;
|
cbt->liveness.network_last_live = now;
|
||||||
cbt->liveness.nonlive_timeouts = 0;
|
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 "
|
"Tor has not observed any network activity for the past %d "
|
||||||
"seconds. Disabling circuit build timeout recording.",
|
"seconds. Disabling circuit build timeout recording.",
|
||||||
(int)(now - cbt->liveness.network_last_live));
|
(int)(now - cbt->liveness.network_last_live));
|
||||||
|
|
||||||
|
/* Tell control.c */
|
||||||
|
control_event_network_liveness_update(0);
|
||||||
} else {
|
} else {
|
||||||
log_info(LD_CIRC,
|
log_info(LD_CIRC,
|
||||||
"Got non-live timeout. Current count is: %d",
|
"Got non-live timeout. Current count is: %d",
|
||||||
|
@ -959,6 +959,7 @@ static const struct control_event_t control_event_table[] = {
|
|||||||
{ EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" },
|
{ EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" },
|
||||||
{ EVENT_HS_DESC, "HS_DESC" },
|
{ EVENT_HS_DESC, "HS_DESC" },
|
||||||
{ EVENT_HS_DESC_CONTENT, "HS_DESC_CONTENT" },
|
{ EVENT_HS_DESC_CONTENT, "HS_DESC_CONTENT" },
|
||||||
|
{ EVENT_NETWORK_LIVENESS, "NETWORK_LIVENESS" },
|
||||||
{ 0, NULL },
|
{ 0, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -4992,6 +4993,52 @@ control_event_or_authdir_new_descriptor(const char *action,
|
|||||||
return 0;
|
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
|
/** 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
|
* 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
|
* networkstatuses <b>statuses</b>. Currently it is used for NS events
|
||||||
|
@ -67,6 +67,7 @@ int control_event_or_authdir_new_descriptor(const char *action,
|
|||||||
size_t desclen,
|
size_t desclen,
|
||||||
const char *msg);
|
const char *msg);
|
||||||
int control_event_my_descriptor_changed(void);
|
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_networkstatus_changed(smartlist_t *statuses);
|
||||||
|
|
||||||
int control_event_newconsensus(const networkstatus_t *consensus);
|
int control_event_newconsensus(const networkstatus_t *consensus);
|
||||||
@ -166,7 +167,8 @@ void control_free_all(void);
|
|||||||
#define EVENT_TRANSPORT_LAUNCHED 0x0020
|
#define EVENT_TRANSPORT_LAUNCHED 0x0020
|
||||||
#define EVENT_HS_DESC 0x0021
|
#define EVENT_HS_DESC 0x0021
|
||||||
#define EVENT_HS_DESC_CONTENT 0x0022
|
#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 */
|
/* sizeof(control_connection_t.event_mask) in bits, currently a uint64_t */
|
||||||
#define EVENT_CAPACITY_ 0x0040
|
#define EVENT_CAPACITY_ 0x0040
|
||||||
|
Loading…
Reference in New Issue
Block a user