From 08a1b4d6b160e0ebed379e66927114498e66122a Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 12 Mar 2021 08:40:26 -0500 Subject: Add a DormantTimeoutEnabled to disable dormant mode entirely (If you need to do this in an older version you can just set DormantClientTimeout to something huge.) Closes #40228. --- changes/ticket40228 | 4 ++++ doc/man/tor.1.txt | 6 ++++++ src/app/config/config.c | 5 +++-- src/app/config/or_options_st.h | 7 +++++++ src/core/mainloop/mainloop.c | 6 ++++++ src/core/mainloop/netstatus.c | 3 +++ src/test/test_mainloop.c | 2 ++ 7 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 changes/ticket40228 diff --git a/changes/ticket40228 b/changes/ticket40228 new file mode 100644 index 0000000000..297204decd --- /dev/null +++ b/changes/ticket40228 @@ -0,0 +1,4 @@ + o Minor features (dormant mode): + - Add a new 'DormantTimeoutEnabled' option to allow coarse-grained + control over whether the client ever becomes dormant from inactivity. + Most people won't need this. Closes ticket 40228. diff --git a/doc/man/tor.1.txt b/doc/man/tor.1.txt index b57c6ec70a..bec45dee6a 100644 --- a/doc/man/tor.1.txt +++ b/doc/man/tor.1.txt @@ -1888,6 +1888,12 @@ The following options control when Tor enters and leaves dormant mode: counts as client activity for the purpose of DormantClientTimeout. If false, then only network activity counts. (Default: 1) +[[DormantTimeoutEnabled]] **DormantTimeoutEnabled** **0**|**1**:: + If false, then no amount of time without activity is sufficient to + make Tor go dormant. Setting this option to zero is only recommended for + special-purpose applications that need to use the Tor binary for + something other than sending or receiving Tor traffic. (Default: 1) + == NODE SELECTION OPTIONS // These options are in alphabetical order, with exceptions as noted. diff --git a/src/app/config/config.c b/src/app/config/config.c index fa74907b3d..5b36554851 100644 --- a/src/app/config/config.c +++ b/src/app/config/config.c @@ -424,8 +424,9 @@ static const config_var_t option_vars_[] = { OBSOLETE("DynamicDHGroups"), VPORT(DNSPort), OBSOLETE("DNSListenAddress"), - V(DormantClientTimeout, INTERVAL, "24 hours"), - V(DormantTimeoutDisabledByIdleStreams, BOOL, "1"), + V(DormantClientTimeout, INTERVAL, "24 hours"), + V(DormantTimeoutEnabled, BOOL, "1"), + V(DormantTimeoutDisabledByIdleStreams, BOOL, "1"), V(DormantOnFirstStartup, BOOL, "0"), V(DormantCanceledByStartup, BOOL, "0"), /* DoS circuit creation options. */ diff --git a/src/app/config/or_options_st.h b/src/app/config/or_options_st.h index 4364f145ed..af38be585f 100644 --- a/src/app/config/or_options_st.h +++ b/src/app/config/or_options_st.h @@ -1065,6 +1065,13 @@ struct or_options_t { **/ int DormantClientTimeout; + /** + * Boolean: If enabled, then we consider the timeout when deciding whether + * to be dormant. If not enabled, then only the SIGNAL ACTIVE/DORMANT + * controls can change our status. + **/ + int DormantTimeoutEnabled; + /** Boolean: true if having an idle stream is sufficient to prevent a client * from becoming dormant. **/ diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c index 77ab6f26c8..dcd88b1a86 100644 --- a/src/core/mainloop/mainloop.c +++ b/src/core/mainloop/mainloop.c @@ -1823,6 +1823,12 @@ check_network_participation_callback(time_t now, const or_options_t *options) goto found_activity; } + /* If we aren't allowed to become dormant, then participation doesn't + matter */ + if (! options->DormantTimeoutEnabled) { + goto found_activity; + } + /* If we're running an onion service, we can't become dormant. */ /* XXXX this would be nice to change, so that we can be dormant with a * service. */ diff --git a/src/core/mainloop/netstatus.c b/src/core/mainloop/netstatus.c index 7367c68219..fc386c191e 100644 --- a/src/core/mainloop/netstatus.c +++ b/src/core/mainloop/netstatus.c @@ -154,6 +154,9 @@ netstatus_load_from_state(const mainloop_state_t *state, time_t now) last_activity = now; participating_on_network = true; } + if (! get_options()->DormantTimeoutEnabled) { + participating_on_network = true; + } reset_user_activity(last_activity); } diff --git a/src/test/test_mainloop.c b/src/test/test_mainloop.c index c4e60d9da5..a9bb714a0f 100644 --- a/src/test/test_mainloop.c +++ b/src/test/test_mainloop.c @@ -231,6 +231,8 @@ test_mainloop_check_participation(void *arg) const time_t start = 1542658829; const time_t ONE_DAY = 24*60*60; + options->DormantTimeoutEnabled = 1; + // Suppose we've been idle for a day or two reset_user_activity(start - 2*ONE_DAY); set_network_participation(true); -- cgit v1.2.3-54-g00ecf