LCOV - code coverage report
Current view: top level - feature/dirclient - dirclient_modes.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 23 23 100.0 %
Date: 2021-11-24 03:28:48 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* Copyright (c) 2001 Matej Pfajfar.
       2             :  * Copyright (c) 2001-2004, Roger Dingledine.
       3             :  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
       4             :  * Copyright (c) 2007-2021, The Tor Project, Inc. */
       5             : /* See LICENSE for licensing information */
       6             : 
       7             : /**
       8             :  * @file dirclient_modes.c
       9             :  * @brief Functions to answer questions about how we'd like to behave
      10             :  *     as a directory client
      11             :  **/
      12             : 
      13             : #include "orconfig.h"
      14             : 
      15             : #include "core/or/or.h"
      16             : 
      17             : #include "feature/dirclient/dirclient_modes.h"
      18             : #include "feature/dircache/dirserv.h"
      19             : #include "feature/relay/relay_find_addr.h"
      20             : #include "feature/relay/router.h"
      21             : #include "feature/relay/routermode.h"
      22             : #include "feature/stats/predict_ports.h"
      23             : 
      24             : #include "app/config/or_options_st.h"
      25             : #include "feature/nodelist/routerinfo_st.h"
      26             : 
      27             : /* Should this tor instance only use begindir for all its directory requests?
      28             :  */
      29             : int
      30          11 : dirclient_must_use_begindir(const or_options_t *options)
      31             : {
      32             :   /* Clients, onion services, and bridges must use begindir,
      33             :    * relays and authorities do not have to */
      34          11 :   return !public_server_mode(options);
      35             : }
      36             : 
      37             : /** Return 1 if we fetch our directory material directly from the
      38             :  * authorities, rather than from a mirror. */
      39             : int
      40          56 : dirclient_fetches_from_authorities(const or_options_t *options)
      41             : {
      42          56 :   const routerinfo_t *me;
      43          56 :   int refuseunknown;
      44          56 :   if (options->FetchDirInfoEarly)
      45             :     return 1;
      46          55 :   if (options->BridgeRelay == 1)
      47             :     return 0;
      48          56 :   refuseunknown = ! router_my_exit_policy_is_reject_star() &&
      49           2 :     should_refuse_unknown_exits(options);
      50          54 :   if (!dir_server_mode(options) && !refuseunknown)
      51             :     return 0;
      52           6 :   if (!server_mode(options) || !advertised_server_mode())
      53           1 :     return 0;
      54           5 :   me = router_get_my_routerinfo();
      55           5 :   if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
      56           2 :     return 0; /* if we don't service directory requests, return 0 too */
      57             :   return 1;
      58             : }
      59             : 
      60             : /** Return 1 if we should fetch new networkstatuses, descriptors, etc
      61             :  * on the "mirror" schedule rather than the "client" schedule.
      62             :  */
      63             : int
      64           5 : dirclient_fetches_dir_info_early(const or_options_t *options)
      65             : {
      66           5 :   return dirclient_fetches_from_authorities(options);
      67             : }
      68             : 
      69             : /** Return 1 if we should fetch new networkstatuses, descriptors, etc
      70             :  * on a very passive schedule -- waiting long enough for ordinary clients
      71             :  * to probably have the info we want. These would include bridge users,
      72             :  * and maybe others in the future e.g. if a Tor client uses another Tor
      73             :  * client as a directory guard.
      74             :  */
      75             : int
      76           3 : dirclient_fetches_dir_info_later(const or_options_t *options)
      77             : {
      78           3 :   return options->UseBridges != 0;
      79             : }
      80             : 
      81             : /** Return 1 if we have no need to fetch new descriptors. This generally
      82             :  * happens when we're not a dir cache and we haven't built any circuits
      83             :  * lately.
      84             :  */
      85             : int
      86          21 : dirclient_too_idle_to_fetch_descriptors(const or_options_t *options,
      87             :                                         time_t now)
      88             : {
      89          21 :   return !directory_caches_dir_info(options) &&
      90          42 :          !options->FetchUselessDescriptors &&
      91          21 :          rep_hist_circbuilding_dormant(now);
      92             : }

Generated by: LCOV version 1.14