[tor-commits] [tor/master] Move dirclient-related functions out of dirserv, and reenable them

nickm at torproject.org nickm at torproject.org
Fri Jan 17 12:51:00 UTC 2020


commit 773bcf56290674cdc157f6e39894d31b366f8c50
Author: Nick Mathewson <nickm at torproject.org>
Date:   Wed Jan 15 11:43:14 2020 -0500

    Move dirclient-related functions out of dirserv, and reenable them
    
    I had incorrectly identified these functions as dircache-only, when
    in fact they apply to everyone who acts a directory client.
---
 src/app/config/config.c                 |  2 +-
 src/core/include.am                     |  2 +
 src/core/mainloop/mainloop.c            |  2 +-
 src/feature/dircache/dircache_stub.c    | 30 ------------
 src/feature/dircache/dirserv.c          | 63 +-----------------------
 src/feature/dircache/dirserv.h          |  5 --
 src/feature/dirclient/dirclient.c       |  1 +
 src/feature/dirclient/dirclient_modes.c | 85 +++++++++++++++++++++++++++++++++
 src/feature/dirclient/dirclient_modes.h | 23 +++++++++
 src/feature/nodelist/microdesc.c        |  1 +
 src/feature/nodelist/networkstatus.c    |  1 +
 src/feature/nodelist/nodelist.c         |  2 +-
 src/feature/nodelist/routerlist.c       |  1 +
 src/test/test_config.c                  |  1 +
 14 files changed, 119 insertions(+), 100 deletions(-)

diff --git a/src/app/config/config.c b/src/app/config/config.c
index d197e2b0c..f9bfb0512 100644
--- a/src/app/config/config.c
+++ b/src/app/config/config.c
@@ -88,7 +88,7 @@
 #include "feature/control/control.h"
 #include "feature/control/control_auth.h"
 #include "feature/control/control_events.h"
-#include "feature/dircache/dirserv.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/hibernate/hibernate.h"
 #include "feature/hs/hs_config.h"
 #include "feature/nodelist/dirlist.h"
diff --git a/src/core/include.am b/src/core/include.am
index 1861f6cd4..f332b3758 100644
--- a/src/core/include.am
+++ b/src/core/include.am
@@ -92,6 +92,7 @@ LIBTOR_APP_A_SOURCES = 				\
 	src/feature/control/fmt_serverstatus.c  \
 	src/feature/control/getinfo_geoip.c	\
 	src/feature/dirclient/dirclient.c	\
+	src/feature/dirclient/dirclient_modes.c	\
 	src/feature/dirclient/dlstatus.c	\
 	src/feature/dircommon/consdiff.c	\
 	src/feature/dircommon/directory.c	\
@@ -391,6 +392,7 @@ noinst_HEADERS +=					\
 	src/feature/dircache/dirserv.h			\
 	src/feature/dirclient/dir_server_st.h		\
 	src/feature/dirclient/dirclient.h		\
+	src/feature/dirclient/dirclient_modes.h		\
 	src/feature/dirclient/dlstatus.h		\
 	src/feature/dirclient/download_status_st.h	\
 	src/feature/dircommon/consdiff.h		\
diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c
index aac60dcd9..230bf4a25 100644
--- a/src/core/mainloop/mainloop.c
+++ b/src/core/mainloop/mainloop.c
@@ -77,7 +77,7 @@
 #include "feature/control/control_events.h"
 #include "feature/dirauth/authmode.h"
 #include "feature/dircache/consdiffmgr.h"
-#include "feature/dircache/dirserv.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dircommon/directory.h"
 #include "feature/hibernate/hibernate.h"
 #include "feature/hs/hs_cache.h"
diff --git a/src/feature/dircache/dircache_stub.c b/src/feature/dircache/dircache_stub.c
index dcab3bbbb..f6804dad7 100644
--- a/src/feature/dircache/dircache_stub.c
+++ b/src/feature/dircache/dircache_stub.c
@@ -31,27 +31,6 @@ connection_dirserv_flushed_some(dir_connection_t *conn)
 }
 
 int
-directory_fetches_from_authorities(const or_options_t *options)
-{
-  (void) options;
-  return 0;
-}
-
-int
-directory_fetches_dir_info_early(const or_options_t *options)
-{
-  (void) options;
-  return 0;
-}
-
-int
-directory_fetches_dir_info_later(const or_options_t *options)
-{
-  (void) options;
-  return 0;
-}
-
-int
 directory_caches_unknown_auth_certs(const or_options_t *options)
 {
   (void) options;
@@ -72,15 +51,6 @@ directory_permits_begindir_requests(const or_options_t *options)
   return 0;
 }
 
-int
-directory_too_idle_to_fetch_descriptors(const or_options_t *options,
-                                        time_t now)
-{
-  (void)options;
-  (void)now;
-  return 0;
-}
-
 cached_dir_t *
 dirserv_get_consensus(const char *flavor_name)
 {
diff --git a/src/feature/dircache/dirserv.c b/src/feature/dircache/dirserv.c
index 721261479..fb8db879a 100644
--- a/src/feature/dircache/dirserv.c
+++ b/src/feature/dircache/dirserv.c
@@ -68,55 +68,7 @@ static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp);
 /********************************************************************/
 
 /* A set of functions to answer questions about how we'd like to behave
- * as a directory mirror/client. */
-
-/** Return 1 if we fetch our directory material directly from the
- * authorities, rather than from a mirror. */
-int
-directory_fetches_from_authorities(const or_options_t *options)
-{
-  const routerinfo_t *me;
-  uint32_t addr;
-  int refuseunknown;
-  if (options->FetchDirInfoEarly)
-    return 1;
-  if (options->BridgeRelay == 1)
-    return 0;
-  if (server_mode(options) &&
-      router_pick_published_address(options, &addr, 1) < 0)
-    return 1; /* we don't know our IP address; ask an authority. */
-  refuseunknown = ! router_my_exit_policy_is_reject_star() &&
-    should_refuse_unknown_exits(options);
-  if (!dir_server_mode(options) && !refuseunknown)
-    return 0;
-  if (!server_mode(options) || !advertised_server_mode())
-    return 0;
-  me = router_get_my_routerinfo();
-  if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
-    return 0; /* if we don't service directory requests, return 0 too */
-  return 1;
-}
-
-/** Return 1 if we should fetch new networkstatuses, descriptors, etc
- * on the "mirror" schedule rather than the "client" schedule.
- */
-int
-directory_fetches_dir_info_early(const or_options_t *options)
-{
-  return directory_fetches_from_authorities(options);
-}
-
-/** Return 1 if we should fetch new networkstatuses, descriptors, etc
- * on a very passive schedule -- waiting long enough for ordinary clients
- * to probably have the info we want. These would include bridge users,
- * and maybe others in the future e.g. if a Tor client uses another Tor
- * client as a directory guard.
- */
-int
-directory_fetches_dir_info_later(const or_options_t *options)
-{
-  return options->UseBridges != 0;
-}
+ * as a directory mirror */
 
 /** Return true iff we want to serve certificates for authorities
  * that we don't acknowledge as authorities ourself.
@@ -160,19 +112,6 @@ directory_permits_begindir_requests(const or_options_t *options)
   return options->BridgeRelay != 0 || dir_server_mode(options);
 }
 
-/** Return 1 if we have no need to fetch new descriptors. This generally
- * happens when we're not a dir cache and we haven't built any circuits
- * lately.
- */
-int
-directory_too_idle_to_fetch_descriptors(const or_options_t *options,
-                                        time_t now)
-{
-  return !directory_caches_dir_info(options) &&
-         !options->FetchUselessDescriptors &&
-         rep_hist_circbuilding_dormant(now);
-}
-
 /********************************************************************/
 
 /** Map from flavor name to the cached_dir_t for the v3 consensuses that we're
diff --git a/src/feature/dircache/dirserv.h b/src/feature/dircache/dirserv.h
index 895cef948..29c5b9ad2 100644
--- a/src/feature/dircache/dirserv.h
+++ b/src/feature/dircache/dirserv.h
@@ -80,14 +80,9 @@ int dir_split_resource_into_spoolable(const char *resource,
                                       int *compressed_out,
                                       int flags);
 
-int directory_fetches_from_authorities(const or_options_t *options);
-int directory_fetches_dir_info_early(const or_options_t *options);
-int directory_fetches_dir_info_later(const or_options_t *options);
 int directory_caches_unknown_auth_certs(const or_options_t *options);
 int directory_caches_dir_info(const or_options_t *options);
 int directory_permits_begindir_requests(const or_options_t *options);
-int directory_too_idle_to_fetch_descriptors(const or_options_t *options,
-                                            time_t now);
 
 MOCK_DECL(cached_dir_t *, dirserv_get_consensus, (const char *flavor_name));
 void dirserv_set_cached_consensus_networkstatus(const char *consensus,
diff --git a/src/feature/dirclient/dirclient.c b/src/feature/dirclient/dirclient.c
index 721b0f8d1..200e4e6a1 100644
--- a/src/feature/dirclient/dirclient.c
+++ b/src/feature/dirclient/dirclient.c
@@ -25,6 +25,7 @@
 #include "feature/dirauth/shared_random.h"
 #include "feature/dircache/dirserv.h"
 #include "feature/dirclient/dirclient.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dirclient/dlstatus.h"
 #include "feature/dircommon/consdiff.h"
 #include "feature/dircommon/directory.h"
diff --git a/src/feature/dirclient/dirclient_modes.c b/src/feature/dirclient/dirclient_modes.c
new file mode 100644
index 000000000..37d2d7e04
--- /dev/null
+++ b/src/feature/dirclient/dirclient_modes.c
@@ -0,0 +1,85 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file dirclient_modes.c
+ * @brief Functions to answer questions about how we'd like to behave
+ *     as a directory client
+ **/
+
+#include "orconfig.h"
+
+#include "core/or/or.h"
+
+#include "feature/dirclient/dirclient_modes.h"
+#include "feature/dircache/dirserv.h"
+#include "feature/relay/router.h"
+#include "feature/relay/routermode.h"
+#include "feature/stats/predict_ports.h"
+
+#include "app/config/or_options_st.h"
+#include "feature/nodelist/routerinfo_st.h"
+
+/** Return 1 if we fetch our directory material directly from the
+ * authorities, rather than from a mirror. */
+int
+directory_fetches_from_authorities(const or_options_t *options)
+{
+  const routerinfo_t *me;
+  uint32_t addr;
+  int refuseunknown;
+  if (options->FetchDirInfoEarly)
+    return 1;
+  if (options->BridgeRelay == 1)
+    return 0;
+  if (server_mode(options) &&
+      router_pick_published_address(options, &addr, 1) < 0)
+    return 1; /* we don't know our IP address; ask an authority. */
+  refuseunknown = ! router_my_exit_policy_is_reject_star() &&
+    should_refuse_unknown_exits(options);
+  if (!dir_server_mode(options) && !refuseunknown)
+    return 0;
+  if (!server_mode(options) || !advertised_server_mode())
+    return 0;
+  me = router_get_my_routerinfo();
+  if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
+    return 0; /* if we don't service directory requests, return 0 too */
+  return 1;
+}
+
+/** Return 1 if we should fetch new networkstatuses, descriptors, etc
+ * on the "mirror" schedule rather than the "client" schedule.
+ */
+int
+directory_fetches_dir_info_early(const or_options_t *options)
+{
+  return directory_fetches_from_authorities(options);
+}
+
+/** Return 1 if we should fetch new networkstatuses, descriptors, etc
+ * on a very passive schedule -- waiting long enough for ordinary clients
+ * to probably have the info we want. These would include bridge users,
+ * and maybe others in the future e.g. if a Tor client uses another Tor
+ * client as a directory guard.
+ */
+int
+directory_fetches_dir_info_later(const or_options_t *options)
+{
+  return options->UseBridges != 0;
+}
+
+/** Return 1 if we have no need to fetch new descriptors. This generally
+ * happens when we're not a dir cache and we haven't built any circuits
+ * lately.
+ */
+int
+directory_too_idle_to_fetch_descriptors(const or_options_t *options,
+                                        time_t now)
+{
+  return !directory_caches_dir_info(options) &&
+         !options->FetchUselessDescriptors &&
+         rep_hist_circbuilding_dormant(now);
+}
diff --git a/src/feature/dirclient/dirclient_modes.h b/src/feature/dirclient/dirclient_modes.h
new file mode 100644
index 000000000..ceb883038
--- /dev/null
+++ b/src/feature/dirclient/dirclient_modes.h
@@ -0,0 +1,23 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file dirclient_modes.h
+ * @brief Header for feature/dirclient/dirclient_modes.c
+ **/
+
+#ifndef TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H
+#define TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H
+
+struct or_options_t;
+
+int directory_fetches_from_authorities(const struct or_options_t *options);
+int directory_fetches_dir_info_early(const struct or_options_t *options);
+int directory_fetches_dir_info_later(const struct or_options_t *options);
+int directory_too_idle_to_fetch_descriptors(const struct or_options_t *options,
+                                            time_t now);
+
+#endif /* !defined(TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H) */
diff --git a/src/feature/nodelist/microdesc.c b/src/feature/nodelist/microdesc.c
index 39cffcf3a..a2b95dd1f 100644
--- a/src/feature/nodelist/microdesc.c
+++ b/src/feature/nodelist/microdesc.c
@@ -18,6 +18,7 @@
 #include "feature/client/entrynodes.h"
 #include "feature/dircache/dirserv.h"
 #include "feature/dirclient/dlstatus.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dircommon/directory.h"
 #include "feature/dirparse/microdesc_parse.h"
 #include "feature/nodelist/dirlist.h"
diff --git a/src/feature/nodelist/networkstatus.c b/src/feature/nodelist/networkstatus.c
index 786802047..2758dbc27 100644
--- a/src/feature/nodelist/networkstatus.c
+++ b/src/feature/nodelist/networkstatus.c
@@ -63,6 +63,7 @@
 #include "feature/dircache/consdiffmgr.h"
 #include "feature/dircache/dirserv.h"
 #include "feature/dirclient/dirclient.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dirclient/dlstatus.h"
 #include "feature/dircommon/directory.h"
 #include "feature/dircommon/voting_schedule.h"
diff --git a/src/feature/nodelist/nodelist.c b/src/feature/nodelist/nodelist.c
index 04c290613..49b8c8732 100644
--- a/src/feature/nodelist/nodelist.c
+++ b/src/feature/nodelist/nodelist.c
@@ -51,7 +51,7 @@
 #include "feature/client/entrynodes.h"
 #include "feature/control/control_events.h"
 #include "feature/dirauth/process_descs.h"
-#include "feature/dircache/dirserv.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/hs/hs_client.h"
 #include "feature/hs/hs_common.h"
 #include "feature/nodelist/describe.h"
diff --git a/src/feature/nodelist/routerlist.c b/src/feature/nodelist/routerlist.c
index e6457191b..8caa0df11 100644
--- a/src/feature/nodelist/routerlist.c
+++ b/src/feature/nodelist/routerlist.c
@@ -73,6 +73,7 @@
 #include "feature/dirauth/reachability.h"
 #include "feature/dircache/dirserv.h"
 #include "feature/dirclient/dirclient.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dirclient/dlstatus.h"
 #include "feature/dircommon/directory.h"
 #include "feature/nodelist/authcert.h"
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 39af34b1e..771c00841 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -28,6 +28,7 @@
 #include "feature/control/control.h"
 #include "core/mainloop/cpuworker.h"
 #include "feature/dircache/dirserv.h"
+#include "feature/dirclient/dirclient_modes.h"
 #include "feature/dirauth/dirvote.h"
 #include "feature/relay/dns.h"
 #include "feature/client/entrynodes.h"





More information about the tor-commits mailing list