|  | @@ -966,7 +966,7 @@ entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport,
 | 
	
		
			
				|  |  |   * violate it.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  STATIC int
 | 
	
		
			
				|  |  | -num_reachable_filtered_guards(guard_selection_t *gs,
 | 
	
		
			
				|  |  | +num_reachable_filtered_guards(const guard_selection_t *gs,
 | 
	
		
			
				|  |  |                                const entry_guard_restriction_t *rst)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    int n_reachable_filtered_guards = 0;
 | 
	
	
		
			
				|  | @@ -1472,30 +1472,28 @@ guard_create_exit_restriction(const uint8_t *exit_id)
 | 
	
		
			
				|  |  |    return rst;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/** If we have fewer than this many possible guards, don't set
 | 
	
		
			
				|  |  | - * MD-availability-based restrictions: we might blacklist all of
 | 
	
		
			
				|  |  | - * them. */
 | 
	
		
			
				|  |  | +/** If we have fewer than this many possible usable guards, don't set
 | 
	
		
			
				|  |  | + * MD-availability-based restrictions: we might blacklist all of them. */
 | 
	
		
			
				|  |  |  #define MIN_GUARDS_FOR_MD_RESTRICTION 10
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** Return true if we should set md dirserver restrictions. We might not want
 | 
	
		
			
				|  |  | - *  to set those if our network is too restricted, since we don't want to
 | 
	
		
			
				|  |  | - *  blacklist all our nodes. */
 | 
	
		
			
				|  |  | + *  to set those if our guard options are too restricted, since we don't want
 | 
	
		
			
				|  |  | + *  to blacklist all of them. */
 | 
	
		
			
				|  |  |  static int
 | 
	
		
			
				|  |  |  should_set_md_dirserver_restriction(void)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    const guard_selection_t *gs = get_guard_selection_info();
 | 
	
		
			
				|  |  | +  int num_usable_guards = num_reachable_filtered_guards(gs, NULL);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Compute the number of filtered guards */
 | 
	
		
			
				|  |  | -  int n_filtered_guards = 0;
 | 
	
		
			
				|  |  | -  SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
 | 
	
		
			
				|  |  | -    if (guard->is_filtered_guard) {
 | 
	
		
			
				|  |  | -      ++n_filtered_guards;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  } SMARTLIST_FOREACH_END(guard);
 | 
	
		
			
				|  |  | +  /* Don't set restriction if too few reachable filtered guards. */
 | 
	
		
			
				|  |  | +  if (num_usable_guards < MIN_GUARDS_FOR_MD_RESTRICTION) {
 | 
	
		
			
				|  |  | +    log_info(LD_GUARD, "Not setting md restriction: only %d"
 | 
	
		
			
				|  |  | +             " usable guards.", num_usable_guards);
 | 
	
		
			
				|  |  | +    return 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Do we have enough filtered guards that we feel okay about blacklisting
 | 
	
		
			
				|  |  | -   * some for MD restriction? */
 | 
	
		
			
				|  |  | -  return (n_filtered_guards >= MIN_GUARDS_FOR_MD_RESTRICTION);
 | 
	
		
			
				|  |  | +  /* We have enough usable guards: set MD restriction */
 | 
	
		
			
				|  |  | +  return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** Allocate and return an outdated md guard restriction. Return NULL if no
 |