/**
* Check if we are missing any crucial dirinfo for the guard subsystem to
* work. Return NULL if everything went well, otherwise return a newly
- * allocated string with an informative error message. */
+ * allocated string with an informative error message. In the latter case, use
+ * the genreal descriptor information <b>using_mds</b>, <b>num_present</b> and
+ * <b>num_usable</b> to improve the error message. */
char *
-guard_selection_get_dir_info_status_str(guard_selection_t *gs)
+guard_selection_get_dir_info_status_str(guard_selection_t *gs,
+ int using_mds,
+ int num_present, int num_usable)
{
if (!gs->primary_guards_up_to_date)
entry_guards_update_primary(gs);
/* otherwise return a helpful error string */
tor_asprintf(&ret_str, "We're missing descriptors for %d/%d of our "
- "primary entry guards",
- n_missing_descriptors, num_primary_to_check);
+ "primary entry guards (total %sdescriptors: %d/%d).",
+ n_missing_descriptors, num_primary_to_check,
+ using_mds?"micro":"", num_present, num_usable);
return ret_str;
}
/** As guard_selection_have_enough_dir_info_to_build_circuits, but uses
* the default guard selection. */
char *
-entry_guards_get_dir_info_status_str(void)
+entry_guards_get_dir_info_status_str(int using_mds,
+ int num_present, int num_usable)
{
- return guard_selection_get_dir_info_status_str(
- get_guard_selection_info());
+ return guard_selection_get_dir_info_status_str(get_guard_selection_info(),
+ using_mds,
+ num_present, num_usable);
}
/** Free one guard selection context */
int entries_known_but_down(const or_options_t *options);
void entries_retry_all(const or_options_t *options);
-char *entry_guards_get_dir_info_status_str(void);
-char *guard_selection_get_dir_info_status_str(guard_selection_t *gs);
+char *entry_guards_get_dir_info_status_str(int using_mds,
+ int num_present, int num_usable);
+char *guard_selection_get_dir_info_status_str(guard_selection_t *gs,
+ int using_mds,
+ int num_present, int num_usable);
void entry_guards_free_all(void);
{
time_t now = time(NULL);
int res;
+ int num_present=0, num_usable=0;
const or_options_t *options = get_options();
const networkstatus_t *consensus =
networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor());
/* Check fraction of available paths */
{
char *status = NULL;
- int num_present=0, num_usable=0;
double paths = compute_frac_paths_available(consensus, options, now,
&num_present, &num_usable,
&status);
}
{ /* Check entry guard dirinfo status */
- char *guard_error = entry_guards_get_dir_info_status_str();
+ char *guard_error = entry_guards_get_dir_info_status_str(using_md,
+ num_present,
+ num_usable);
if (guard_error) {
strlcpy(dir_info_status, guard_error, sizeof(dir_info_status));
tor_free(guard_error);
}
}
-
done:
/* If paths have just become available in this update. */
/* Do some dirinfo checks */
{
- /* Check that we have all required dirinfo for the primaries (that's done in
- * big_fake_network_setup()) */
- char *dir_info_str = guard_selection_get_dir_info_status_str(gs);
+ /* Check that we have all required dirinfo for the primaries (that's done
+ * in big_fake_network_setup()) */
+ char *dir_info_str = guard_selection_get_dir_info_status_str(gs, 0, 0, 0);
tt_assert(!dir_info_str);
/* Now artificially remove the first primary's descriptor and re-check */
/* Change the first primary's identity digest so that the mocked functions
* can't find its descriptor */
memset(first_primary->identity, 9, sizeof(first_primary->identity));
- dir_info_str = guard_selection_get_dir_info_status_str(gs);
+ dir_info_str = guard_selection_get_dir_info_status_str(gs, 1, 2, 3);
tt_str_op(dir_info_str, OP_EQ,
- "We're missing descriptors for 1/2 of our primary entry guards");
+ "We're missing descriptors for 1/2 of our primary entry guards "
+ "(total microdescriptors: 2/3).");
tor_free(dir_info_str);
}