routerlist.c
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:184k
源码类别:

网络

开发平台:

Unix_Linux

  1.                         sd->extra_info_digest);
  2.   if (ei_tmp) {
  3.     rl->extrainfo_store.bytes_dropped +=
  4.       ei_tmp->cache_info.signed_descriptor_len;
  5.     extrainfo_free(ei_tmp);
  6.   }
  7.   if (!tor_digest_is_zero(sd->extra_info_digest))
  8.     sdmap_remove(rl->desc_by_eid_map, sd->extra_info_digest);
  9.   signed_descriptor_free(sd);
  10. #ifdef DEBUG_ROUTERLIST
  11.   routerlist_assert_ok(rl);
  12. #endif
  13. }
  14. /** Remove <b>ri_old</b> from the routerlist <b>rl</b>, and replace it with
  15.  * <b>ri_new</b>, updating all index info.  If <b>idx</b> is nonnegative and
  16.  * smartlist_get(rl-&gt;routers, idx) == ri, we don't need to do a linear
  17.  * search over the list to decide which to remove.  We put ri_new in the same
  18.  * index as ri_old, if possible.  ri is freed as appropriate.
  19.  *
  20.  * If should_cache_descriptors() is true, instead of deleting the router,
  21.  * we add it to rl-&gt;old_routers. */
  22. static void
  23. routerlist_replace(routerlist_t *rl, routerinfo_t *ri_old,
  24.                    routerinfo_t *ri_new)
  25. {
  26.   int idx;
  27.   routerinfo_t *ri_tmp;
  28.   extrainfo_t *ei_tmp;
  29.   {
  30.     /* XXXX Remove this if it turns out to slow us down. */
  31.     routerinfo_t *ri_generated = router_get_my_routerinfo();
  32.     tor_assert(ri_generated != ri_new);
  33.   }
  34.   tor_assert(ri_old != ri_new);
  35.   tor_assert(ri_new->cache_info.routerlist_index == -1);
  36.   idx = ri_old->cache_info.routerlist_index;
  37.   tor_assert(0 <= idx && idx < smartlist_len(rl->routers));
  38.   tor_assert(smartlist_get(rl->routers, idx) == ri_old);
  39.   router_dir_info_changed();
  40.   if (idx >= 0) {
  41.     smartlist_set(rl->routers, idx, ri_new);
  42.     ri_old->cache_info.routerlist_index = -1;
  43.     ri_new->cache_info.routerlist_index = idx;
  44.     /* Check that ri_old is not in rl->routers anymore: */
  45.     tor_assert( _routerlist_find_elt(rl->routers, ri_old, -1) == -1 );
  46.   } else {
  47.     log_warn(LD_BUG, "Appending entry from routerlist_replace.");
  48.     routerlist_insert(rl, ri_new);
  49.     return;
  50.   }
  51.   if (memcmp(ri_old->cache_info.identity_digest,
  52.              ri_new->cache_info.identity_digest, DIGEST_LEN)) {
  53.     /* digests don't match; digestmap_set won't replace */
  54.     rimap_remove(rl->identity_map, ri_old->cache_info.identity_digest);
  55.   }
  56.   ri_tmp = rimap_set(rl->identity_map,
  57.                      ri_new->cache_info.identity_digest, ri_new);
  58.   tor_assert(!ri_tmp || ri_tmp == ri_old);
  59.   sdmap_set(rl->desc_digest_map,
  60.             ri_new->cache_info.signed_descriptor_digest,
  61.             &(ri_new->cache_info));
  62.   if (!tor_digest_is_zero(ri_new->cache_info.extra_info_digest)) {
  63.     sdmap_set(rl->desc_by_eid_map, ri_new->cache_info.extra_info_digest,
  64.               &ri_new->cache_info);
  65.   }
  66.   if (should_cache_old_descriptors() &&
  67.       ri_old->purpose == ROUTER_PURPOSE_GENERAL) {
  68.     signed_descriptor_t *sd = signed_descriptor_from_routerinfo(ri_old);
  69.     smartlist_add(rl->old_routers, sd);
  70.     sd->routerlist_index = smartlist_len(rl->old_routers)-1;
  71.     sdmap_set(rl->desc_digest_map, sd->signed_descriptor_digest, sd);
  72.     if (!tor_digest_is_zero(sd->extra_info_digest))
  73.       sdmap_set(rl->desc_by_eid_map, sd->extra_info_digest, sd);
  74.   } else {
  75.     if (memcmp(ri_old->cache_info.signed_descriptor_digest,
  76.                ri_new->cache_info.signed_descriptor_digest,
  77.                DIGEST_LEN)) {
  78.       /* digests don't match; digestmap_set didn't replace */
  79.       sdmap_remove(rl->desc_digest_map,
  80.                    ri_old->cache_info.signed_descriptor_digest);
  81.     }
  82.     ei_tmp = eimap_remove(rl->extra_info_map,
  83.                           ri_old->cache_info.extra_info_digest);
  84.     if (ei_tmp) {
  85.       rl->extrainfo_store.bytes_dropped +=
  86.         ei_tmp->cache_info.signed_descriptor_len;
  87.       extrainfo_free(ei_tmp);
  88.     }
  89.     if (!tor_digest_is_zero(ri_old->cache_info.extra_info_digest)) {
  90.       sdmap_remove(rl->desc_by_eid_map,
  91.                    ri_old->cache_info.extra_info_digest);
  92.     }
  93.     rl->desc_store.bytes_dropped += ri_old->cache_info.signed_descriptor_len;
  94.     routerinfo_free(ri_old);
  95.   }
  96. #ifdef DEBUG_ROUTERLIST
  97.   routerlist_assert_ok(rl);
  98. #endif
  99. }
  100. /** Extract the descriptor <b>sd</b> from old_routerlist, and re-parse
  101.  * it as a fresh routerinfo_t. */
  102. static routerinfo_t *
  103. routerlist_reparse_old(routerlist_t *rl, signed_descriptor_t *sd)
  104. {
  105.   routerinfo_t *ri;
  106.   const char *body;
  107.   body = signed_descriptor_get_annotations(sd);
  108.   ri = router_parse_entry_from_string(body,
  109.                          body+sd->signed_descriptor_len+sd->annotations_len,
  110.                          0, 1, NULL);
  111.   if (!ri)
  112.     return NULL;
  113.   memcpy(&ri->cache_info, sd, sizeof(signed_descriptor_t));
  114.   sd->signed_descriptor_body = NULL; /* Steal reference. */
  115.   ri->cache_info.routerlist_index = -1;
  116.   routerlist_remove_old(rl, sd, -1);
  117.   return ri;
  118. }
  119. /** Free all memory held by the routerlist module. */
  120. void
  121. routerlist_free_all(void)
  122. {
  123.   if (routerlist)
  124.     routerlist_free(routerlist);
  125.   routerlist = NULL;
  126.   if (warned_nicknames) {
  127.     SMARTLIST_FOREACH(warned_nicknames, char *, cp, tor_free(cp));
  128.     smartlist_free(warned_nicknames);
  129.     warned_nicknames = NULL;
  130.   }
  131.   if (trusted_dir_servers) {
  132.     SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, ds,
  133.                       trusted_dir_server_free(ds));
  134.     smartlist_free(trusted_dir_servers);
  135.     trusted_dir_servers = NULL;
  136.   }
  137.   if (trusted_dir_certs) {
  138.     DIGESTMAP_FOREACH(trusted_dir_certs, key, cert_list_t *, cl) {
  139.       SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert,
  140.                         authority_cert_free(cert));
  141.       smartlist_free(cl->certs);
  142.       tor_free(cl);
  143.     } DIGESTMAP_FOREACH_END;
  144.     digestmap_free(trusted_dir_certs, NULL);
  145.     trusted_dir_certs = NULL;
  146.   }
  147. }
  148. /** Forget that we have issued any router-related warnings, so that we'll
  149.  * warn again if we see the same errors. */
  150. void
  151. routerlist_reset_warnings(void)
  152. {
  153.   if (!warned_nicknames)
  154.     warned_nicknames = smartlist_create();
  155.   SMARTLIST_FOREACH(warned_nicknames, char *, cp, tor_free(cp));
  156.   smartlist_clear(warned_nicknames); /* now the list is empty. */
  157.   networkstatus_reset_warnings();
  158. }
  159. /** Mark the router with ID <b>digest</b> as running or non-running
  160.  * in our routerlist. */
  161. void
  162. router_set_status(const char *digest, int up)
  163. {
  164.   routerinfo_t *router;
  165.   routerstatus_t *status;
  166.   tor_assert(digest);
  167.   SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, d,
  168.                     if (!memcmp(d->digest, digest, DIGEST_LEN))
  169.                       d->is_running = up);
  170.   router = router_get_by_digest(digest);
  171.   if (router) {
  172.     log_debug(LD_DIR,"Marking router '%s/%s' as %s.",
  173.               router->nickname, router->address, up ? "up" : "down");
  174.     if (!up && router_is_me(router) && !we_are_hibernating())
  175.       log_warn(LD_NET, "We just marked ourself as down. Are your external "
  176.                "addresses reachable?");
  177.     router->is_running = up;
  178.   }
  179.   status = router_get_consensus_status_by_id(digest);
  180.   if (status && status->is_running != up) {
  181.     status->is_running = up;
  182.     control_event_networkstatus_changed_single(status);
  183.   }
  184.   router_dir_info_changed();
  185. }
  186. /** Add <b>router</b> to the routerlist, if we don't already have it.  Replace
  187.  * older entries (if any) with the same key.  Note: Callers should not hold
  188.  * their pointers to <b>router</b> if this function fails; <b>router</b>
  189.  * will either be inserted into the routerlist or freed. Similarly, even
  190.  * if this call succeeds, they should not hold their pointers to
  191.  * <b>router</b> after subsequent calls with other routerinfo's -- they
  192.  * might cause the original routerinfo to get freed.
  193.  *
  194.  * Returns the status for the operation. Might set *<b>msg</b> if it wants
  195.  * the poster of the router to know something.
  196.  *
  197.  * If <b>from_cache</b>, this descriptor came from our disk cache. If
  198.  * <b>from_fetch</b>, we received it in response to a request we made.
  199.  * (If both are false, that means it was uploaded to us as an auth dir
  200.  * server or via the controller.)
  201.  *
  202.  * This function should be called *after*
  203.  * routers_update_status_from_consensus_networkstatus; subsequently, you
  204.  * should call router_rebuild_store and routerlist_descriptors_added.
  205.  */
  206. was_router_added_t
  207. router_add_to_routerlist(routerinfo_t *router, const char **msg,
  208.                          int from_cache, int from_fetch)
  209. {
  210.   const char *id_digest;
  211.   int authdir = authdir_mode_handles_descs(get_options(), router->purpose);
  212.   int authdir_believes_valid = 0;
  213.   routerinfo_t *old_router;
  214.   networkstatus_t *consensus = networkstatus_get_latest_consensus();
  215.   const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
  216.   int in_consensus = 0;
  217.   tor_assert(msg);
  218.   if (!routerlist)
  219.     router_get_routerlist();
  220.   id_digest = router->cache_info.identity_digest;
  221.   /* Make sure that we haven't already got this exact descriptor. */
  222.   if (sdmap_get(routerlist->desc_digest_map,
  223.                 router->cache_info.signed_descriptor_digest)) {
  224.     log_info(LD_DIR,
  225.              "Dropping descriptor that we already have for router '%s'",
  226.              router->nickname);
  227.     *msg = "Router descriptor was not new.";
  228.     routerinfo_free(router);
  229.     return ROUTER_WAS_NOT_NEW;
  230.   }
  231.   if (authdir) {
  232.     if (authdir_wants_to_reject_router(router, msg,
  233.                                        !from_cache && !from_fetch)) {
  234.       tor_assert(*msg);
  235.       routerinfo_free(router);
  236.       return ROUTER_AUTHDIR_REJECTS;
  237.     }
  238.     authdir_believes_valid = router->is_valid;
  239.   } else if (from_fetch) {
  240.     /* Only check the descriptor digest against the network statuses when
  241.      * we are receiving in response to a fetch. */
  242.     if (!signed_desc_digest_is_recognized(&router->cache_info) &&
  243.         !routerinfo_is_a_configured_bridge(router)) {
  244.       /* We asked for it, so some networkstatus must have listed it when we
  245.        * did.  Save it if we're a cache in case somebody else asks for it. */
  246.       log_info(LD_DIR,
  247.                "Received a no-longer-recognized descriptor for router '%s'",
  248.                router->nickname);
  249.       *msg = "Router descriptor is not referenced by any network-status.";
  250.       /* Only journal this desc if we'll be serving it. */
  251.       if (!from_cache && should_cache_old_descriptors())
  252.         signed_desc_append_to_journal(&router->cache_info,
  253.                                       &routerlist->desc_store);
  254.       routerlist_insert_old(routerlist, router);
  255.       return ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS;
  256.     }
  257.   }
  258.   /* We no longer need a router with this descriptor digest. */
  259.   SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
  260.   {
  261.     routerstatus_t *rs =
  262.       networkstatus_v2_find_entry(ns, router->cache_info.identity_digest);
  263.     if (rs && !memcmp(rs->descriptor_digest,
  264.                       router->cache_info.signed_descriptor_digest,
  265.                       DIGEST_LEN))
  266.       rs->need_to_mirror = 0;
  267.   });
  268.   if (consensus) {
  269.     routerstatus_t *rs = networkstatus_vote_find_entry(consensus,
  270.                                         router->cache_info.identity_digest);
  271.     if (rs && !memcmp(rs->descriptor_digest,
  272.                       router->cache_info.signed_descriptor_digest,
  273.                       DIGEST_LEN)) {
  274.       in_consensus = 1;
  275.       rs->need_to_mirror = 0;
  276.     }
  277.   }
  278.   if (router->purpose == ROUTER_PURPOSE_GENERAL &&
  279.       consensus && !in_consensus && !authdir) {
  280.     /* If it's a general router not listed in the consensus, then don't
  281.      * consider replacing the latest router with it. */
  282.     if (!from_cache && should_cache_old_descriptors())
  283.       signed_desc_append_to_journal(&router->cache_info,
  284.                                     &routerlist->desc_store);
  285.     routerlist_insert_old(routerlist, router);
  286.     *msg = "Skipping router descriptor: not in consensus.";
  287.     return ROUTER_NOT_IN_CONSENSUS;
  288.   }
  289.   /* If we have a router with the same identity key, choose the newer one. */
  290.   old_router = rimap_get(routerlist->identity_map,
  291.                          router->cache_info.identity_digest);
  292.   if (old_router) {
  293.     if (!in_consensus && (router->cache_info.published_on <=
  294.                           old_router->cache_info.published_on)) {
  295.       /* Same key, but old.  This one is not listed in the consensus. */
  296.       log_debug(LD_DIR, "Skipping not-new descriptor for router '%s'",
  297.                 router->nickname);
  298.       /* Only journal this desc if we'll be serving it. */
  299.       if (!from_cache && should_cache_old_descriptors())
  300.         signed_desc_append_to_journal(&router->cache_info,
  301.                                       &routerlist->desc_store);
  302.       routerlist_insert_old(routerlist, router);
  303.       *msg = "Router descriptor was not new.";
  304.       return ROUTER_WAS_NOT_NEW;
  305.     } else {
  306.       /* Same key, and either new, or listed in the consensus. */
  307.       log_debug(LD_DIR, "Replacing entry for router '%s/%s' [%s]",
  308.                 router->nickname, old_router->nickname,
  309.                 hex_str(id_digest,DIGEST_LEN));
  310.       if (router->addr == old_router->addr &&
  311.           router->or_port == old_router->or_port) {
  312.         /* these carry over when the address and orport are unchanged. */
  313.         router->last_reachable = old_router->last_reachable;
  314.         router->testing_since = old_router->testing_since;
  315.       }
  316.       routerlist_replace(routerlist, old_router, router);
  317.       if (!from_cache) {
  318.         signed_desc_append_to_journal(&router->cache_info,
  319.                                       &routerlist->desc_store);
  320.       }
  321.       directory_set_dirty();
  322.       *msg = authdir_believes_valid ? "Valid server updated" :
  323.         ("Invalid server updated. (This dirserver is marking your "
  324.          "server as unapproved.)");
  325.       return ROUTER_ADDED_SUCCESSFULLY;
  326.     }
  327.   }
  328.   if (!in_consensus && from_cache &&
  329.       router->cache_info.published_on < time(NULL) - OLD_ROUTER_DESC_MAX_AGE) {
  330.     *msg = "Router descriptor was really old.";
  331.     routerinfo_free(router);
  332.     return ROUTER_WAS_NOT_NEW;
  333.   }
  334.   /* We haven't seen a router with this identity before. Add it to the end of
  335.    * the list. */
  336.   routerlist_insert(routerlist, router);
  337.   if (!from_cache)
  338.     signed_desc_append_to_journal(&router->cache_info,
  339.                                   &routerlist->desc_store);
  340.   directory_set_dirty();
  341.   return ROUTER_ADDED_SUCCESSFULLY;
  342. }
  343. /** Insert <b>ei</b> into the routerlist, or free it. Other arguments are
  344.  * as for router_add_to_routerlist().  Return ROUTER_ADDED_SUCCESSFULLY iff
  345.  * we actually inserted it, ROUTER_BAD_EI otherwise.
  346.  */
  347. was_router_added_t
  348. router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg,
  349.                                    int from_cache, int from_fetch)
  350. {
  351.   int inserted;
  352.   (void)from_fetch;
  353.   if (msg) *msg = NULL;
  354.   /*XXXX022 Do something with msg */
  355.   inserted = extrainfo_insert(router_get_routerlist(), ei);
  356.   if (inserted && !from_cache)
  357.     signed_desc_append_to_journal(&ei->cache_info,
  358.                                   &routerlist->extrainfo_store);
  359.   if (inserted)
  360.     return ROUTER_ADDED_SUCCESSFULLY;
  361.   else
  362.     return ROUTER_BAD_EI;
  363. }
  364. /** Sorting helper: return &lt;0, 0, or &gt;0 depending on whether the
  365.  * signed_descriptor_t* in *<b>a</b> has an identity digest preceding, equal
  366.  * to, or later than that of *<b>b</b>. */
  367. static int
  368. _compare_old_routers_by_identity(const void **_a, const void **_b)
  369. {
  370.   int i;
  371.   const signed_descriptor_t *r1 = *_a, *r2 = *_b;
  372.   if ((i = memcmp(r1->identity_digest, r2->identity_digest, DIGEST_LEN)))
  373.     return i;
  374.   return (int)(r1->published_on - r2->published_on);
  375. }
  376. /** Internal type used to represent how long an old descriptor was valid,
  377.  * where it appeared in the list of old descriptors, and whether it's extra
  378.  * old. Used only by routerlist_remove_old_cached_routers_with_id(). */
  379. struct duration_idx_t {
  380.   int duration;
  381.   int idx;
  382.   int old;
  383. };
  384. /** Sorting helper: compare two duration_idx_t by their duration. */
  385. static int
  386. _compare_duration_idx(const void *_d1, const void *_d2)
  387. {
  388.   const struct duration_idx_t *d1 = _d1;
  389.   const struct duration_idx_t *d2 = _d2;
  390.   return d1->duration - d2->duration;
  391. }
  392. /** The range <b>lo</b> through <b>hi</b> inclusive of routerlist->old_routers
  393.  * must contain routerinfo_t with the same identity and with publication time
  394.  * in ascending order.  Remove members from this range until there are no more
  395.  * than max_descriptors_per_router() remaining.  Start by removing the oldest
  396.  * members from before <b>cutoff</b>, then remove members which were current
  397.  * for the lowest amount of time.  The order of members of old_routers at
  398.  * indices <b>lo</b> or higher may be changed.
  399.  */
  400. static void
  401. routerlist_remove_old_cached_routers_with_id(time_t now,
  402.                                              time_t cutoff, int lo, int hi,
  403.                                              digestset_t *retain)
  404. {
  405.   int i, n = hi-lo+1;
  406.   unsigned n_extra, n_rmv = 0;
  407.   struct duration_idx_t *lifespans;
  408.   uint8_t *rmv, *must_keep;
  409.   smartlist_t *lst = routerlist->old_routers;
  410. #if 1
  411.   const char *ident;
  412.   tor_assert(hi < smartlist_len(lst));
  413.   tor_assert(lo <= hi);
  414.   ident = ((signed_descriptor_t*)smartlist_get(lst, lo))->identity_digest;
  415.   for (i = lo+1; i <= hi; ++i) {
  416.     signed_descriptor_t *r = smartlist_get(lst, i);
  417.     tor_assert(!memcmp(ident, r->identity_digest, DIGEST_LEN));
  418.   }
  419. #endif
  420.   /* Check whether we need to do anything at all. */
  421.   {
  422.     int mdpr = directory_caches_dir_info(get_options()) ? 2 : 1;
  423.     if (n <= mdpr)
  424.       return;
  425.     n_extra = n - mdpr;
  426.   }
  427.   lifespans = tor_malloc_zero(sizeof(struct duration_idx_t)*n);
  428.   rmv = tor_malloc_zero(sizeof(uint8_t)*n);
  429.   must_keep = tor_malloc_zero(sizeof(uint8_t)*n);
  430.   /* Set lifespans to contain the lifespan and index of each server. */
  431.   /* Set rmv[i-lo]=1 if we're going to remove a server for being too old. */
  432.   for (i = lo; i <= hi; ++i) {
  433.     signed_descriptor_t *r = smartlist_get(lst, i);
  434.     signed_descriptor_t *r_next;
  435.     lifespans[i-lo].idx = i;
  436.     if (r->last_listed_as_valid_until >= now ||
  437.         (retain && digestset_isin(retain, r->signed_descriptor_digest))) {
  438.       must_keep[i-lo] = 1;
  439.     }
  440.     if (i < hi) {
  441.       r_next = smartlist_get(lst, i+1);
  442.       tor_assert(r->published_on <= r_next->published_on);
  443.       lifespans[i-lo].duration = (int)(r_next->published_on - r->published_on);
  444.     } else {
  445.       r_next = NULL;
  446.       lifespans[i-lo].duration = INT_MAX;
  447.     }
  448.     if (!must_keep[i-lo] && r->published_on < cutoff && n_rmv < n_extra) {
  449.       ++n_rmv;
  450.       lifespans[i-lo].old = 1;
  451.       rmv[i-lo] = 1;
  452.     }
  453.   }
  454.   if (n_rmv < n_extra) {
  455.     /**
  456.      * We aren't removing enough servers for being old.  Sort lifespans by
  457.      * the duration of liveness, and remove the ones we're not already going to
  458.      * remove based on how long they were alive.
  459.      **/
  460.     qsort(lifespans, n, sizeof(struct duration_idx_t), _compare_duration_idx);
  461.     for (i = 0; i < n && n_rmv < n_extra; ++i) {
  462.       if (!must_keep[lifespans[i].idx-lo] && !lifespans[i].old) {
  463.         rmv[lifespans[i].idx-lo] = 1;
  464.         ++n_rmv;
  465.       }
  466.     }
  467.   }
  468.   i = hi;
  469.   do {
  470.     if (rmv[i-lo])
  471.       routerlist_remove_old(routerlist, smartlist_get(lst, i), i);
  472.   } while (--i >= lo);
  473.   tor_free(must_keep);
  474.   tor_free(rmv);
  475.   tor_free(lifespans);
  476. }
  477. /** Deactivate any routers from the routerlist that are more than
  478.  * ROUTER_MAX_AGE seconds old and not recommended by any networkstatuses;
  479.  * remove old routers from the list of cached routers if we have too many.
  480.  */
  481. void
  482. routerlist_remove_old_routers(void)
  483. {
  484.   int i, hi=-1;
  485.   const char *cur_id = NULL;
  486.   time_t now = time(NULL);
  487.   time_t cutoff;
  488.   routerinfo_t *router;
  489.   signed_descriptor_t *sd;
  490.   digestset_t *retain;
  491.   int caches = directory_caches_dir_info(get_options());
  492.   const networkstatus_t *consensus = networkstatus_get_latest_consensus();
  493.   const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
  494.   int have_enough_v2;
  495.   trusted_dirs_remove_old_certs();
  496.   if (!routerlist || !consensus)
  497.     return;
  498.   // routerlist_assert_ok(routerlist);
  499.   /* We need to guess how many router descriptors we will wind up wanting to
  500.      retain, so that we can be sure to allocate a large enough Bloom filter
  501.      to hold the digest set.  Overestimating is fine; underestimating is bad.
  502.   */
  503.   {
  504.     /* We'll probably retain everything in the consensus. */
  505.     int n_max_retain = smartlist_len(consensus->routerstatus_list);
  506.     if (caches && networkstatus_v2_list) {
  507.       /* If we care about v2 statuses, we'll retain at most as many as are
  508.          listed any of the v2 statues.  This will be at least the length of
  509.          the largest v2 networkstatus, and in the worst case, this set will be
  510.          equal to the sum of the lengths of all v2 consensuses.  Take the
  511.          worst case.
  512.       */
  513.       SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
  514.                         n_max_retain += smartlist_len(ns->entries));
  515.     }
  516.     retain = digestset_new(n_max_retain);
  517.   }
  518.   cutoff = now - OLD_ROUTER_DESC_MAX_AGE;
  519.   /* Build a list of all the descriptors that _anybody_ lists. */
  520.   if (caches && networkstatus_v2_list) {
  521.     SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
  522.     {
  523.       /* XXXX The inner loop here gets pretty expensive, and actually shows up
  524.        * on some profiles.  It may be the reason digestmap_set shows up in
  525.        * profiles too.  If instead we kept a per-descriptor digest count of
  526.        * how many networkstatuses recommended each descriptor, and changed
  527.        * that only when the networkstatuses changed, that would be a speed
  528.        * improvement, possibly 1-4% if it also removes digestmap_set from the
  529.        * profile.  Not worth it for 0.1.2.x, though.  The new directory
  530.        * system will obsolete this whole thing in 0.2.0.x. */
  531.       SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs,
  532.         if (rs->published_on >= cutoff)
  533.           digestset_add(retain, rs->descriptor_digest));
  534.     });
  535.   }
  536.   /* Retain anything listed in the consensus. */
  537.   if (consensus) {
  538.     SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs,
  539.         if (rs->published_on >= cutoff)
  540.           digestset_add(retain, rs->descriptor_digest));
  541.   }
  542.   /* If we have a consensus, and nearly as many v2 networkstatuses as we want,
  543.    * we should consider pruning current routers that are too old and that
  544.    * nobody recommends.  (If we don't have a consensus or enough v2
  545.    * networkstatuses, then we should get more before we decide to kill
  546.    * routers.) */
  547.   /* we set this to true iff we don't care about v2 info, or we have enough. */
  548.   have_enough_v2 = !caches ||
  549.     (networkstatus_v2_list &&
  550.      smartlist_len(networkstatus_v2_list) > get_n_v2_authorities() / 2);
  551.   if (have_enough_v2 && consensus) {
  552.     cutoff = now - ROUTER_MAX_AGE;
  553.     /* Remove too-old unrecommended members of routerlist->routers. */
  554.     for (i = 0; i < smartlist_len(routerlist->routers); ++i) {
  555.       router = smartlist_get(routerlist->routers, i);
  556.       if (router->cache_info.published_on <= cutoff &&
  557.           router->cache_info.last_listed_as_valid_until < now &&
  558.           !digestset_isin(retain,
  559.                           router->cache_info.signed_descriptor_digest)) {
  560.         /* Too old: remove it.  (If we're a cache, just move it into
  561.          * old_routers.) */
  562.         log_info(LD_DIR,
  563.                  "Forgetting obsolete (too old) routerinfo for router '%s'",
  564.                  router->nickname);
  565.         routerlist_remove(routerlist, router, 1, now);
  566.         i--;
  567.       }
  568.     }
  569.   }
  570.   //routerlist_assert_ok(routerlist);
  571.   /* Remove far-too-old members of routerlist->old_routers. */
  572.   cutoff = now - OLD_ROUTER_DESC_MAX_AGE;
  573.   for (i = 0; i < smartlist_len(routerlist->old_routers); ++i) {
  574.     sd = smartlist_get(routerlist->old_routers, i);
  575.     if (sd->published_on <= cutoff &&
  576.         sd->last_listed_as_valid_until < now &&
  577.         !digestset_isin(retain, sd->signed_descriptor_digest)) {
  578.       /* Too old.  Remove it. */
  579.       routerlist_remove_old(routerlist, sd, i--);
  580.     }
  581.   }
  582.   //routerlist_assert_ok(routerlist);
  583.   log_info(LD_DIR, "We have %d live routers and %d old router descriptors.",
  584.            smartlist_len(routerlist->routers),
  585.            smartlist_len(routerlist->old_routers));
  586.   /* Now we might have to look at routerlist->old_routers for extraneous
  587.    * members. (We'd keep all the members if we could, but we need to save
  588.    * space.) First, check whether we have too many router descriptors, total.
  589.    * We're okay with having too many for some given router, so long as the
  590.    * total number doesn't approach max_descriptors_per_router()*len(router).
  591.    */
  592.   if (smartlist_len(routerlist->old_routers) <
  593.       smartlist_len(routerlist->routers))
  594.     goto done;
  595.   /* Sort by identity, then fix indices. */
  596.   smartlist_sort(routerlist->old_routers, _compare_old_routers_by_identity);
  597.   /* Fix indices. */
  598.   for (i = 0; i < smartlist_len(routerlist->old_routers); ++i) {
  599.     signed_descriptor_t *r = smartlist_get(routerlist->old_routers, i);
  600.     r->routerlist_index = i;
  601.   }
  602.   /* Iterate through the list from back to front, so when we remove descriptors
  603.    * we don't mess up groups we haven't gotten to. */
  604.   for (i = smartlist_len(routerlist->old_routers)-1; i >= 0; --i) {
  605.     signed_descriptor_t *r = smartlist_get(routerlist->old_routers, i);
  606.     if (!cur_id) {
  607.       cur_id = r->identity_digest;
  608.       hi = i;
  609.     }
  610.     if (memcmp(cur_id, r->identity_digest, DIGEST_LEN)) {
  611.       routerlist_remove_old_cached_routers_with_id(now,
  612.                                                    cutoff, i+1, hi, retain);
  613.       cur_id = r->identity_digest;
  614.       hi = i;
  615.     }
  616.   }
  617.   if (hi>=0)
  618.     routerlist_remove_old_cached_routers_with_id(now, cutoff, 0, hi, retain);
  619.   //routerlist_assert_ok(routerlist);
  620.  done:
  621.   digestset_free(retain);
  622.   router_rebuild_store(RRS_DONT_REMOVE_OLD, &routerlist->desc_store);
  623.   router_rebuild_store(RRS_DONT_REMOVE_OLD,&routerlist->extrainfo_store);
  624. }
  625. /** We just added a new set of descriptors. Take whatever extra steps
  626.  * we need. */
  627. static void
  628. routerlist_descriptors_added(smartlist_t *sl, int from_cache)
  629. {
  630.   tor_assert(sl);
  631.   control_event_descriptors_changed(sl);
  632.   SMARTLIST_FOREACH(sl, routerinfo_t *, ri,
  633.     if (ri->purpose == ROUTER_PURPOSE_BRIDGE)
  634.       learned_bridge_descriptor(ri, from_cache);
  635.   );
  636. }
  637. /**
  638.  * Code to parse a single router descriptor and insert it into the
  639.  * routerlist.  Return -1 if the descriptor was ill-formed; 0 if the
  640.  * descriptor was well-formed but could not be added; and 1 if the
  641.  * descriptor was added.
  642.  *
  643.  * If we don't add it and <b>msg</b> is not NULL, then assign to
  644.  * *<b>msg</b> a static string describing the reason for refusing the
  645.  * descriptor.
  646.  *
  647.  * This is used only by the controller.
  648.  */
  649. int
  650. router_load_single_router(const char *s, uint8_t purpose, int cache,
  651.                           const char **msg)
  652. {
  653.   routerinfo_t *ri;
  654.   was_router_added_t r;
  655.   smartlist_t *lst;
  656.   char annotation_buf[ROUTER_ANNOTATION_BUF_LEN];
  657.   tor_assert(msg);
  658.   *msg = NULL;
  659.   tor_snprintf(annotation_buf, sizeof(annotation_buf),
  660.                "@source controllern"
  661.                "@purpose %sn", router_purpose_to_string(purpose));
  662.   if (!(ri = router_parse_entry_from_string(s, NULL, 1, 0, annotation_buf))) {
  663.     log_warn(LD_DIR, "Error parsing router descriptor; dropping.");
  664.     *msg = "Couldn't parse router descriptor.";
  665.     return -1;
  666.   }
  667.   tor_assert(ri->purpose == purpose);
  668.   if (router_is_me(ri)) {
  669.     log_warn(LD_DIR, "Router's identity key matches mine; dropping.");
  670.     *msg = "Router's identity key matches mine.";
  671.     routerinfo_free(ri);
  672.     return 0;
  673.   }
  674.   if (!cache) /* obey the preference of the controller */
  675.     ri->cache_info.do_not_cache = 1;
  676.   lst = smartlist_create();
  677.   smartlist_add(lst, ri);
  678.   routers_update_status_from_consensus_networkstatus(lst, 0);
  679.   r = router_add_to_routerlist(ri, msg, 0, 0);
  680.   if (!WRA_WAS_ADDED(r)) {
  681.     /* we've already assigned to *msg now, and ri is already freed */
  682.     tor_assert(*msg);
  683.     if (r == ROUTER_AUTHDIR_REJECTS)
  684.       log_warn(LD_DIR, "Couldn't add router to list: %s Dropping.", *msg);
  685.     smartlist_free(lst);
  686.     return 0;
  687.   } else {
  688.     routerlist_descriptors_added(lst, 0);
  689.     smartlist_free(lst);
  690.     log_debug(LD_DIR, "Added router to list");
  691.     return 1;
  692.   }
  693. }
  694. /** Given a string <b>s</b> containing some routerdescs, parse it and put the
  695.  * routers into our directory.  If saved_location is SAVED_NOWHERE, the routers
  696.  * are in response to a query to the network: cache them by adding them to
  697.  * the journal.
  698.  *
  699.  * Return the number of routers actually added.
  700.  *
  701.  * If <b>requested_fingerprints</b> is provided, it must contain a list of
  702.  * uppercased fingerprints.  Do not update any router whose
  703.  * fingerprint is not on the list; after updating a router, remove its
  704.  * fingerprint from the list.
  705.  *
  706.  * If <b>descriptor_digests</b> is non-zero, then the requested_fingerprints
  707.  * are descriptor digests. Otherwise they are identity digests.
  708.  */
  709. int
  710. router_load_routers_from_string(const char *s, const char *eos,
  711.                                 saved_location_t saved_location,
  712.                                 smartlist_t *requested_fingerprints,
  713.                                 int descriptor_digests,
  714.                                 const char *prepend_annotations)
  715. {
  716.   smartlist_t *routers = smartlist_create(), *changed = smartlist_create();
  717.   char fp[HEX_DIGEST_LEN+1];
  718.   const char *msg;
  719.   int from_cache = (saved_location != SAVED_NOWHERE);
  720.   int allow_annotations = (saved_location != SAVED_NOWHERE);
  721.   int any_changed = 0;
  722.   router_parse_list_from_string(&s, eos, routers, saved_location, 0,
  723.                                 allow_annotations, prepend_annotations);
  724.   routers_update_status_from_consensus_networkstatus(routers, !from_cache);
  725.   log_info(LD_DIR, "%d elements to add", smartlist_len(routers));
  726.   SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
  727.     was_router_added_t r;
  728.     char d[DIGEST_LEN];
  729.     if (requested_fingerprints) {
  730.       base16_encode(fp, sizeof(fp), descriptor_digests ?
  731.                       ri->cache_info.signed_descriptor_digest :
  732.                       ri->cache_info.identity_digest,
  733.                     DIGEST_LEN);
  734.       if (smartlist_string_isin(requested_fingerprints, fp)) {
  735.         smartlist_string_remove(requested_fingerprints, fp);
  736.       } else {
  737.         char *requested =
  738.           smartlist_join_strings(requested_fingerprints," ",0,NULL);
  739.         log_warn(LD_DIR,
  740.                  "We received a router descriptor with a fingerprint (%s) "
  741.                  "that we never requested. (We asked for: %s.) Dropping.",
  742.                  fp, requested);
  743.         tor_free(requested);
  744.         routerinfo_free(ri);
  745.         continue;
  746.       }
  747.     }
  748.     memcpy(d, ri->cache_info.signed_descriptor_digest, DIGEST_LEN);
  749.     r = router_add_to_routerlist(ri, &msg, from_cache, !from_cache);
  750.     if (WRA_WAS_ADDED(r)) {
  751.       any_changed++;
  752.       smartlist_add(changed, ri);
  753.       routerlist_descriptors_added(changed, from_cache);
  754.       smartlist_clear(changed);
  755.     } else if (WRA_WAS_REJECTED(r)) {
  756.       download_status_t *dl_status;
  757.       dl_status = router_get_dl_status_by_descriptor_digest(d);
  758.       if (dl_status) {
  759.         log_info(LD_GENERAL, "Marking router %s as never downloadable",
  760.                  hex_str(d, DIGEST_LEN));
  761.         download_status_mark_impossible(dl_status);
  762.       }
  763.     }
  764.   } SMARTLIST_FOREACH_END(ri);
  765.   routerlist_assert_ok(routerlist);
  766.   if (any_changed)
  767.     router_rebuild_store(0, &routerlist->desc_store);
  768.   smartlist_free(routers);
  769.   smartlist_free(changed);
  770.   return any_changed;
  771. }
  772. /** Parse one or more extrainfos from <b>s</b> (ending immediately before
  773.  * <b>eos</b> if <b>eos</b> is present).  Other arguments are as for
  774.  * router_load_routers_from_string(). */
  775. void
  776. router_load_extrainfo_from_string(const char *s, const char *eos,
  777.                                   saved_location_t saved_location,
  778.                                   smartlist_t *requested_fingerprints,
  779.                                   int descriptor_digests)
  780. {
  781.   smartlist_t *extrainfo_list = smartlist_create();
  782.   const char *msg;
  783.   int from_cache = (saved_location != SAVED_NOWHERE);
  784.   router_parse_list_from_string(&s, eos, extrainfo_list, saved_location, 1, 0,
  785.                                 NULL);
  786.   log_info(LD_DIR, "%d elements to add", smartlist_len(extrainfo_list));
  787.   SMARTLIST_FOREACH(extrainfo_list, extrainfo_t *, ei, {
  788.       was_router_added_t added =
  789.         router_add_extrainfo_to_routerlist(ei, &msg, from_cache, !from_cache);
  790.       if (WRA_WAS_ADDED(added) && requested_fingerprints) {
  791.         char fp[HEX_DIGEST_LEN+1];
  792.         base16_encode(fp, sizeof(fp), descriptor_digests ?
  793.                         ei->cache_info.signed_descriptor_digest :
  794.                         ei->cache_info.identity_digest,
  795.                       DIGEST_LEN);
  796.         smartlist_string_remove(requested_fingerprints, fp);
  797.         /* We silently let people stuff us with extrainfos we didn't ask for,
  798.          * so long as we would have wanted them anyway.  Since we always fetch
  799.          * all the extrainfos we want, and we never actually act on them
  800.          * inside Tor, this should be harmless. */
  801.       }
  802.     });
  803.   routerlist_assert_ok(routerlist);
  804.   router_rebuild_store(0, &router_get_routerlist()->extrainfo_store);
  805.   smartlist_free(extrainfo_list);
  806. }
  807. /** Return true iff any networkstatus includes a descriptor whose digest
  808.  * is that of <b>desc</b>. */
  809. static int
  810. signed_desc_digest_is_recognized(signed_descriptor_t *desc)
  811. {
  812.   routerstatus_t *rs;
  813.   networkstatus_t *consensus = networkstatus_get_latest_consensus();
  814.   int caches = directory_caches_dir_info(get_options());
  815.   const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
  816.   if (consensus) {
  817.     rs = networkstatus_vote_find_entry(consensus, desc->identity_digest);
  818.     if (rs && !memcmp(rs->descriptor_digest,
  819.                       desc->signed_descriptor_digest, DIGEST_LEN))
  820.       return 1;
  821.   }
  822.   if (caches && networkstatus_v2_list) {
  823.     SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
  824.     {
  825.       if (!(rs = networkstatus_v2_find_entry(ns, desc->identity_digest)))
  826.         continue;
  827.       if (!memcmp(rs->descriptor_digest,
  828.                   desc->signed_descriptor_digest, DIGEST_LEN))
  829.         return 1;
  830.     });
  831.   }
  832.   return 0;
  833. }
  834. /** Clear all our timeouts for fetching v2 and v3 directory stuff, and then
  835.  * give it all a try again. */
  836. void
  837. routerlist_retry_directory_downloads(time_t now)
  838. {
  839.   router_reset_status_download_failures();
  840.   router_reset_descriptor_download_failures();
  841.   update_networkstatus_downloads(now);
  842.   update_router_descriptor_downloads(now);
  843. }
  844. /** Return 1 if all running sufficiently-stable routers will reject
  845.  * addr:port, return 0 if any might accept it. */
  846. int
  847. router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port,
  848.                                           int need_uptime)
  849. {
  850.   addr_policy_result_t r;
  851.   if (!routerlist) return 1;
  852.   SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router,
  853.   {
  854.     if (router->is_running &&
  855.         !router_is_unreliable(router, need_uptime, 0, 0)) {
  856.       r = compare_addr_to_addr_policy(addr, port, router->exit_policy);
  857.       if (r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED)
  858.         return 0; /* this one could be ok. good enough. */
  859.     }
  860.   });
  861.   return 1; /* all will reject. */
  862. }
  863. /** Return true iff <b>router</b> does not permit exit streams.
  864.  */
  865. int
  866. router_exit_policy_rejects_all(routerinfo_t *router)
  867. {
  868.   return router->policy_is_reject_star;
  869. }
  870. /** Add to the list of authoritative directory servers one at
  871.  * <b>address</b>:<b>port</b>, with identity key <b>digest</b>.  If
  872.  * <b>address</b> is NULL, add ourself.  Return the new trusted directory
  873.  * server entry on success or NULL if we couldn't add it. */
  874. trusted_dir_server_t *
  875. add_trusted_dir_server(const char *nickname, const char *address,
  876.                        uint16_t dir_port, uint16_t or_port,
  877.                        const char *digest, const char *v3_auth_digest,
  878.                        authority_type_t type)
  879. {
  880.   trusted_dir_server_t *ent;
  881.   uint32_t a;
  882.   char *hostname = NULL;
  883.   size_t dlen;
  884.   if (!trusted_dir_servers)
  885.     trusted_dir_servers = smartlist_create();
  886.   if (!address) { /* The address is us; we should guess. */
  887.     if (resolve_my_address(LOG_WARN, get_options(), &a, &hostname) < 0) {
  888.       log_warn(LD_CONFIG,
  889.                "Couldn't find a suitable address when adding ourself as a "
  890.                "trusted directory server.");
  891.       return NULL;
  892.     }
  893.   } else {
  894.     if (tor_lookup_hostname(address, &a)) {
  895.       log_warn(LD_CONFIG,
  896.                "Unable to lookup address for directory server at '%s'",
  897.                address);
  898.       return NULL;
  899.     }
  900.     hostname = tor_strdup(address);
  901.   }
  902.   ent = tor_malloc_zero(sizeof(trusted_dir_server_t));
  903.   ent->nickname = nickname ? tor_strdup(nickname) : NULL;
  904.   ent->address = hostname;
  905.   ent->addr = a;
  906.   ent->dir_port = dir_port;
  907.   ent->or_port = or_port;
  908.   ent->is_running = 1;
  909.   ent->type = type;
  910.   memcpy(ent->digest, digest, DIGEST_LEN);
  911.   if (v3_auth_digest && (type & V3_AUTHORITY))
  912.     memcpy(ent->v3_identity_digest, v3_auth_digest, DIGEST_LEN);
  913.   dlen = 64 + strlen(hostname) + (nickname?strlen(nickname):0);
  914.   ent->description = tor_malloc(dlen);
  915.   if (nickname)
  916.     tor_snprintf(ent->description, dlen, "directory server "%s" at %s:%d",
  917.                  nickname, hostname, (int)dir_port);
  918.   else
  919.     tor_snprintf(ent->description, dlen, "directory server at %s:%d",
  920.                  hostname, (int)dir_port);
  921.   ent->fake_status.addr = ent->addr;
  922.   memcpy(ent->fake_status.identity_digest, digest, DIGEST_LEN);
  923.   if (nickname)
  924.     strlcpy(ent->fake_status.nickname, nickname,
  925.             sizeof(ent->fake_status.nickname));
  926.   else
  927.     ent->fake_status.nickname[0] = '';
  928.   ent->fake_status.dir_port = ent->dir_port;
  929.   ent->fake_status.or_port = ent->or_port;
  930.   if (ent->or_port)
  931.     ent->fake_status.version_supports_begindir = 1;
  932. /* XX021 - wait until authorities are upgraded */
  933. #if 0
  934.   ent->fake_status.version_supports_conditional_consensus = 1;
  935. #else
  936.   ent->fake_status.version_supports_conditional_consensus = 0;
  937. #endif
  938.   smartlist_add(trusted_dir_servers, ent);
  939.   router_dir_info_changed();
  940.   return ent;
  941. }
  942. /** Free storage held in <b>cert</b>. */
  943. void
  944. authority_cert_free(authority_cert_t *cert)
  945. {
  946.   if (!cert)
  947.     return;
  948.   tor_free(cert->cache_info.signed_descriptor_body);
  949.   if (cert->signing_key)
  950.     crypto_free_pk_env(cert->signing_key);
  951.   if (cert->identity_key)
  952.     crypto_free_pk_env(cert->identity_key);
  953.   tor_free(cert);
  954. }
  955. /** Free storage held in <b>ds</b>. */
  956. static void
  957. trusted_dir_server_free(trusted_dir_server_t *ds)
  958. {
  959.   tor_free(ds->nickname);
  960.   tor_free(ds->description);
  961.   tor_free(ds->address);
  962.   tor_free(ds);
  963. }
  964. /** Remove all members from the list of trusted dir servers. */
  965. void
  966. clear_trusted_dir_servers(void)
  967. {
  968.   if (trusted_dir_servers) {
  969.     SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, ent,
  970.                       trusted_dir_server_free(ent));
  971.     smartlist_clear(trusted_dir_servers);
  972.   } else {
  973.     trusted_dir_servers = smartlist_create();
  974.   }
  975.   router_dir_info_changed();
  976. }
  977. /** Return 1 if any trusted dir server supports v1 directories,
  978.  * else return 0. */
  979. int
  980. any_trusted_dir_is_v1_authority(void)
  981. {
  982.   if (trusted_dir_servers)
  983.     return get_n_authorities(V1_AUTHORITY) > 0;
  984.   return 0;
  985. }
  986. /** For every current directory connection whose purpose is <b>purpose</b>,
  987.  * and where the resource being downloaded begins with <b>prefix</b>, split
  988.  * rest of the resource into base16 fingerprints, decode them, and set the
  989.  * corresponding elements of <b>result</b> to a nonzero value. */
  990. static void
  991. list_pending_downloads(digestmap_t *result,
  992.                        int purpose, const char *prefix)
  993. {
  994.   const size_t p_len = strlen(prefix);
  995.   smartlist_t *tmp = smartlist_create();
  996.   smartlist_t *conns = get_connection_array();
  997.   tor_assert(result);
  998.   SMARTLIST_FOREACH(conns, connection_t *, conn,
  999.   {
  1000.     if (conn->type == CONN_TYPE_DIR &&
  1001.         conn->purpose == purpose &&
  1002.         !conn->marked_for_close) {
  1003.       const char *resource = TO_DIR_CONN(conn)->requested_resource;
  1004.       if (!strcmpstart(resource, prefix))
  1005.         dir_split_resource_into_fingerprints(resource + p_len,
  1006.                                              tmp, NULL, 1, 0);
  1007.     }
  1008.   });
  1009.   SMARTLIST_FOREACH(tmp, char *, d,
  1010.                     {
  1011.                       digestmap_set(result, d, (void*)1);
  1012.                       tor_free(d);
  1013.                     });
  1014.   smartlist_free(tmp);
  1015. }
  1016. /** For every router descriptor (or extra-info document if <b>extrainfo</b> is
  1017.  * true) we are currently downloading by descriptor digest, set result[d] to
  1018.  * (void*)1. */
  1019. static void
  1020. list_pending_descriptor_downloads(digestmap_t *result, int extrainfo)
  1021. {
  1022.   int purpose =
  1023.     extrainfo ? DIR_PURPOSE_FETCH_EXTRAINFO : DIR_PURPOSE_FETCH_SERVERDESC;
  1024.   list_pending_downloads(result, purpose, "d/");
  1025. }
  1026. /** Launch downloads for all the descriptors whose digests are listed
  1027.  * as digests[i] for lo <= i < hi.  (Lo and hi may be out of range.)
  1028.  * If <b>source</b> is given, download from <b>source</b>; otherwise,
  1029.  * download from an appropriate random directory server.
  1030.  */
  1031. static void
  1032. initiate_descriptor_downloads(routerstatus_t *source,
  1033.                               int purpose,
  1034.                               smartlist_t *digests,
  1035.                               int lo, int hi, int pds_flags)
  1036. {
  1037.   int i, n = hi-lo;
  1038.   char *resource, *cp;
  1039.   size_t r_len;
  1040.   if (n <= 0)
  1041.     return;
  1042.   if (lo < 0)
  1043.     lo = 0;
  1044.   if (hi > smartlist_len(digests))
  1045.     hi = smartlist_len(digests);
  1046.   r_len = 8 + (HEX_DIGEST_LEN+1)*n;
  1047.   cp = resource = tor_malloc(r_len);
  1048.   memcpy(cp, "d/", 2);
  1049.   cp += 2;
  1050.   for (i = lo; i < hi; ++i) {
  1051.     base16_encode(cp, r_len-(cp-resource),
  1052.                   smartlist_get(digests,i), DIGEST_LEN);
  1053.     cp += HEX_DIGEST_LEN;
  1054.     *cp++ = '+';
  1055.   }
  1056.   memcpy(cp-1, ".z", 3);
  1057.   if (source) {
  1058.     /* We know which authority we want. */
  1059.     directory_initiate_command_routerstatus(source, purpose,
  1060.                                             ROUTER_PURPOSE_GENERAL,
  1061.                                             0, /* not private */
  1062.                                             resource, NULL, 0, 0);
  1063.   } else {
  1064.     directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource,
  1065.                                  pds_flags);
  1066.   }
  1067.   tor_free(resource);
  1068. }
  1069. /** Return 0 if this routerstatus is obsolete, too new, isn't
  1070.  * running, or otherwise not a descriptor that we would make any
  1071.  * use of even if we had it. Else return 1. */
  1072. static INLINE int
  1073. client_would_use_router(routerstatus_t *rs, time_t now, or_options_t *options)
  1074. {
  1075.   if (!rs->is_running && !options->FetchUselessDescriptors) {
  1076.     /* If we had this router descriptor, we wouldn't even bother using it.
  1077.      * But, if we want to have a complete list, fetch it anyway. */
  1078.     return 0;
  1079.   }
  1080.   if (rs->published_on + options->TestingEstimatedDescriptorPropagationTime
  1081.       > now) {
  1082.     /* Most caches probably don't have this descriptor yet. */
  1083.     return 0;
  1084.   }
  1085.   if (rs->published_on + OLD_ROUTER_DESC_MAX_AGE < now) {
  1086.     /* We'd drop it immediately for being too old. */
  1087.     return 0;
  1088.   }
  1089.   return 1;
  1090. }
  1091. /** Max amount of hashes to download per request.
  1092.  * Since squid does not like URLs >= 4096 bytes we limit it to 96.
  1093.  *   4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058
  1094.  *   4058/41 (40 for the hash and 1 for the + that separates them) => 98
  1095.  *   So use 96 because it's a nice number.
  1096.  */
  1097. #define MAX_DL_PER_REQUEST 96
  1098. /** Don't split our requests so finely that we are requesting fewer than
  1099.  * this number per server. */
  1100. #define MIN_DL_PER_REQUEST 4
  1101. /** To prevent a single screwy cache from confusing us by selective reply,
  1102.  * try to split our requests into at least this this many requests. */
  1103. #define MIN_REQUESTS 3
  1104. /** If we want fewer than this many descriptors, wait until we
  1105.  * want more, or until MAX_CLIENT_INTERVAL_WITHOUT_REQUEST has
  1106.  * passed. */
  1107. #define MAX_DL_TO_DELAY 16
  1108. /** When directory clients have only a few servers to request, they batch
  1109.  * them until they have more, or until this amount of time has passed. */
  1110. #define MAX_CLIENT_INTERVAL_WITHOUT_REQUEST (10*60)
  1111. /** Given a list of router descriptor digests in <b>downloadable</b>, decide
  1112.  * whether to delay fetching until we have more.  If we don't want to delay,
  1113.  * launch one or more requests to the appropriate directory authorities. */
  1114. static void
  1115. launch_router_descriptor_downloads(smartlist_t *downloadable, time_t now)
  1116. {
  1117.   int should_delay = 0, n_downloadable;
  1118.   or_options_t *options = get_options();
  1119.   n_downloadable = smartlist_len(downloadable);
  1120.   if (!directory_fetches_dir_info_early(options)) {
  1121.     if (n_downloadable >= MAX_DL_TO_DELAY) {
  1122.       log_debug(LD_DIR,
  1123.              "There are enough downloadable routerdescs to launch requests.");
  1124.       should_delay = 0;
  1125.     } else {
  1126.       should_delay = (last_routerdesc_download_attempted +
  1127.                       MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
  1128.       if (!should_delay && n_downloadable) {
  1129.         if (last_routerdesc_download_attempted) {
  1130.           log_info(LD_DIR,
  1131.                    "There are not many downloadable routerdescs, but we've "
  1132.                    "been waiting long enough (%d seconds). Downloading.",
  1133.                    (int)(now-last_routerdesc_download_attempted));
  1134.         } else {
  1135.           log_info(LD_DIR,
  1136.                  "There are not many downloadable routerdescs, but we haven't "
  1137.                  "tried downloading descriptors recently. Downloading.");
  1138.         }
  1139.       }
  1140.     }
  1141.   }
  1142.   /* XXX should we consider having even the dir mirrors delay
  1143.    * a little bit, so we don't load the authorities as much? -RD
  1144.    * I don't think so.  If we do, clients that want those descriptors may
  1145.    * not actually find them if the caches haven't got them yet. -NM
  1146.    */
  1147.   if (! should_delay && n_downloadable) {
  1148.     int i, n_per_request;
  1149.     const char *req_plural = "", *rtr_plural = "";
  1150.     int pds_flags = PDS_RETRY_IF_NO_SERVERS;
  1151.     if (! authdir_mode_any_nonhidserv(options)) {
  1152.       /* If we wind up going to the authorities, we want to only open one
  1153.        * connection to each authority at a time, so that we don't overload
  1154.        * them.  We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH
  1155.        * regardless of whether we're a cache or not; it gets ignored if we're
  1156.        * not calling router_pick_trusteddirserver.
  1157.        *
  1158.        * Setting this flag can make initiate_descriptor_downloads() ignore
  1159.        * requests.  We need to make sure that we do in fact call
  1160.        * update_router_descriptor_downloads() later on, once the connections
  1161.        * have succeeded or failed.
  1162.        */
  1163.       pds_flags |= PDS_NO_EXISTING_SERVERDESC_FETCH;
  1164.     }
  1165.     n_per_request = (n_downloadable+MIN_REQUESTS-1) / MIN_REQUESTS;
  1166.     if (n_per_request > MAX_DL_PER_REQUEST)
  1167.       n_per_request = MAX_DL_PER_REQUEST;
  1168.     if (n_per_request < MIN_DL_PER_REQUEST)
  1169.       n_per_request = MIN_DL_PER_REQUEST;
  1170.     if (n_downloadable > n_per_request)
  1171.       req_plural = rtr_plural = "s";
  1172.     else if (n_downloadable > 1)
  1173.       rtr_plural = "s";
  1174.     log_info(LD_DIR,
  1175.              "Launching %d request%s for %d router%s, %d at a time",
  1176.              (n_downloadable+n_per_request-1)/n_per_request,
  1177.              req_plural, n_downloadable, rtr_plural, n_per_request);
  1178.     smartlist_sort_digests(downloadable);
  1179.     for (i=0; i < n_downloadable; i += n_per_request) {
  1180.       initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_SERVERDESC,
  1181.                                     downloadable, i, i+n_per_request,
  1182.                                     pds_flags);
  1183.     }
  1184.     last_routerdesc_download_attempted = now;
  1185.   }
  1186. }
  1187. /** Launch downloads for router status as needed, using the strategy used by
  1188.  * authorities and caches: based on the v2 networkstatuses we have, download
  1189.  * every descriptor we don't have but would serve, from a random authority
  1190.  * that lists it. */
  1191. static void
  1192. update_router_descriptor_cache_downloads_v2(time_t now)
  1193. {
  1194.   smartlist_t **downloadable; /* For each authority, what can we dl from it? */
  1195.   smartlist_t **download_from; /*          ... and, what will we dl from it? */
  1196.   digestmap_t *map; /* Which descs are in progress, or assigned? */
  1197.   int i, j, n;
  1198.   int n_download;
  1199.   or_options_t *options = get_options();
  1200.   const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
  1201.   if (! directory_fetches_dir_info_early(options)) {
  1202.     log_warn(LD_BUG, "Called update_router_descriptor_cache_downloads_v2() "
  1203.              "on a non-dir-mirror?");
  1204.   }
  1205.   if (!networkstatus_v2_list || !smartlist_len(networkstatus_v2_list))
  1206.     return;
  1207.   map = digestmap_new();
  1208.   n = smartlist_len(networkstatus_v2_list);
  1209.   downloadable = tor_malloc_zero(sizeof(smartlist_t*) * n);
  1210.   download_from = tor_malloc_zero(sizeof(smartlist_t*) * n);
  1211.   /* Set map[d]=1 for the digest of every descriptor that we are currently
  1212.    * downloading. */
  1213.   list_pending_descriptor_downloads(map, 0);
  1214.   /* For the digest of every descriptor that we don't have, and that we aren't
  1215.    * downloading, add d to downloadable[i] if the i'th networkstatus knows
  1216.    * about that descriptor, and we haven't already failed to get that
  1217.    * descriptor from the corresponding authority.
  1218.    */
  1219.   n_download = 0;
  1220.   SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
  1221.     {
  1222.       trusted_dir_server_t *ds;
  1223.       smartlist_t *dl;
  1224.       dl = downloadable[ns_sl_idx] = smartlist_create();
  1225.       download_from[ns_sl_idx] = smartlist_create();
  1226.       if (ns->published_on + MAX_NETWORKSTATUS_AGE+10*60 < now) {
  1227.         /* Don't download if the networkstatus is almost ancient. */
  1228.         /* Actually, I suspect what's happening here is that we ask
  1229.          * for the descriptor when we have a given networkstatus,
  1230.          * and then we get a newer networkstatus, and then we receive
  1231.          * the descriptor. Having a networkstatus actually expire is
  1232.          * probably a rare event, and we'll probably be happiest if
  1233.          * we take this clause out. -RD */
  1234.         continue;
  1235.       }
  1236.       /* Don't try dirservers that we think are down -- we might have
  1237.        * just tried them and just marked them as down. */
  1238.       ds = router_get_trusteddirserver_by_digest(ns->identity_digest);
  1239.       if (ds && !ds->is_running)
  1240.         continue;
  1241.       SMARTLIST_FOREACH(ns->entries, routerstatus_t * , rs,
  1242.         {
  1243.           if (!rs->need_to_mirror)
  1244.             continue;
  1245.           if (router_get_by_descriptor_digest(rs->descriptor_digest)) {
  1246.             log_warn(LD_BUG,
  1247.                      "We have a router descriptor, but need_to_mirror=1.");
  1248.             rs->need_to_mirror = 0;
  1249.             continue;
  1250.           }
  1251.           if (authdir_mode(options) && dirserv_would_reject_router(rs)) {
  1252.             rs->need_to_mirror = 0;
  1253.             continue;
  1254.           }
  1255.           if (digestmap_get(map, rs->descriptor_digest)) {
  1256.             /* We're downloading it already. */
  1257.             continue;
  1258.           } else {
  1259.             /* We could download it from this guy. */
  1260.             smartlist_add(dl, rs->descriptor_digest);
  1261.             ++n_download;
  1262.           }
  1263.         });
  1264.     });
  1265.   /* At random, assign descriptors to authorities such that:
  1266.    * - if d is a member of some downloadable[x], d is a member of some
  1267.    *   download_from[y].  (Everything we want to download, we try to download
  1268.    *   from somebody.)
  1269.    * - If d is a member of download_from[y], d is a member of downloadable[y].
  1270.    *   (We only try to download descriptors from authorities who claim to have
  1271.    *   them.)
  1272.    * - No d is a member of download_from[x] and download_from[y] s.t. x != y.
  1273.    *   (We don't try to download anything from two authorities concurrently.)
  1274.    */
  1275.   while (n_download) {
  1276.     int which_ns = crypto_rand_int(n);
  1277.     smartlist_t *dl = downloadable[which_ns];
  1278.     int idx;
  1279.     char *d;
  1280.     if (!smartlist_len(dl))
  1281.       continue;
  1282.     idx = crypto_rand_int(smartlist_len(dl));
  1283.     d = smartlist_get(dl, idx);
  1284.     if (! digestmap_get(map, d)) {
  1285.       smartlist_add(download_from[which_ns], d);
  1286.       digestmap_set(map, d, (void*) 1);
  1287.     }
  1288.     smartlist_del(dl, idx);
  1289.     --n_download;
  1290.   }
  1291.   /* Now, we can actually launch our requests. */
  1292.   for (i=0; i<n; ++i) {
  1293.     networkstatus_v2_t *ns = smartlist_get(networkstatus_v2_list, i);
  1294.     trusted_dir_server_t *ds =
  1295.       router_get_trusteddirserver_by_digest(ns->identity_digest);
  1296.     smartlist_t *dl = download_from[i];
  1297.     int pds_flags = PDS_RETRY_IF_NO_SERVERS;
  1298.     if (! authdir_mode_any_nonhidserv(options))
  1299.       pds_flags |= PDS_NO_EXISTING_SERVERDESC_FETCH; /* XXXX ignored*/
  1300.     if (!ds) {
  1301.       log_warn(LD_BUG, "Networkstatus with no corresponding authority!");
  1302.       continue;
  1303.     }
  1304.     if (! smartlist_len(dl))
  1305.       continue;
  1306.     log_info(LD_DIR, "Requesting %d descriptors from authority "%s"",
  1307.              smartlist_len(dl), ds->nickname);
  1308.     for (j=0; j < smartlist_len(dl); j += MAX_DL_PER_REQUEST) {
  1309.       initiate_descriptor_downloads(&(ds->fake_status),
  1310.                                     DIR_PURPOSE_FETCH_SERVERDESC, dl, j,
  1311.                                     j+MAX_DL_PER_REQUEST, pds_flags);
  1312.     }
  1313.   }
  1314.   for (i=0; i<n; ++i) {
  1315.     smartlist_free(download_from[i]);
  1316.     smartlist_free(downloadable[i]);
  1317.   }
  1318.   tor_free(download_from);
  1319.   tor_free(downloadable);
  1320.   digestmap_free(map,NULL);
  1321. }
  1322. /** For any descriptor that we want that's currently listed in the live
  1323.  * consensus, download it as appropriate. */
  1324. static void
  1325. update_consensus_router_descriptor_downloads(time_t now)
  1326. {
  1327.   or_options_t *options = get_options();
  1328.   digestmap_t *map = NULL;
  1329.   smartlist_t *no_longer_old = smartlist_create();
  1330.   smartlist_t *downloadable = smartlist_create();
  1331.   int authdir = authdir_mode(options);
  1332.   networkstatus_t *consensus =
  1333.     networkstatus_get_reasonably_live_consensus(now);
  1334.   int n_delayed=0, n_have=0, n_would_reject=0, n_wouldnt_use=0,
  1335.     n_inprogress=0, n_in_oldrouters=0;
  1336.   if (directory_too_idle_to_fetch_descriptors(options, now))
  1337.     goto done;
  1338.   if (!consensus)
  1339.     goto done;
  1340.   map = digestmap_new();
  1341.   list_pending_descriptor_downloads(map, 0);
  1342.   SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs,
  1343.     {
  1344.       signed_descriptor_t *sd;
  1345.       if ((sd = router_get_by_descriptor_digest(rs->descriptor_digest))) {
  1346.         routerinfo_t *ri;
  1347.         ++n_have;
  1348.         if (!(ri = router_get_by_digest(rs->identity_digest)) ||
  1349.             memcmp(ri->cache_info.signed_descriptor_digest,
  1350.                    sd->signed_descriptor_digest, DIGEST_LEN)) {
  1351.           /* We have a descriptor with this digest, but either there is no
  1352.            * entry in routerlist with the same ID (!ri), or there is one,
  1353.            * but the identity digest differs (memcmp).
  1354.            */
  1355.           smartlist_add(no_longer_old, sd);
  1356.           ++n_in_oldrouters; /* We have it in old_routers. */
  1357.         }
  1358.         continue; /* We have it already. */
  1359.       }
  1360.       if (digestmap_get(map, rs->descriptor_digest)) {
  1361.         ++n_inprogress;
  1362.         continue; /* We have an in-progress download. */
  1363.       }
  1364.       if (!download_status_is_ready(&rs->dl_status, now,
  1365.                                     MAX_ROUTERDESC_DOWNLOAD_FAILURES)) {
  1366.         ++n_delayed; /* Not ready for retry. */
  1367.         continue;
  1368.       }
  1369.       if (authdir && dirserv_would_reject_router(rs)) {
  1370.         ++n_would_reject;
  1371.         continue; /* We would throw it out immediately. */
  1372.       }
  1373.       if (!directory_caches_dir_info(options) &&
  1374.           !client_would_use_router(rs, now, options)) {
  1375.         ++n_wouldnt_use;
  1376.         continue; /* We would never use it ourself. */
  1377.       }
  1378.       smartlist_add(downloadable, rs->descriptor_digest);
  1379.     });
  1380.   if (!authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL)
  1381.       && smartlist_len(no_longer_old)) {
  1382.     routerlist_t *rl = router_get_routerlist();
  1383.     log_info(LD_DIR, "%d router descriptors listed in consensus are "
  1384.              "currently in old_routers; making them current.",
  1385.              smartlist_len(no_longer_old));
  1386.     SMARTLIST_FOREACH(no_longer_old, signed_descriptor_t *, sd, {
  1387.         const char *msg;
  1388.         was_router_added_t r;
  1389.         routerinfo_t *ri = routerlist_reparse_old(rl, sd);
  1390.         if (!ri) {
  1391.           log_warn(LD_BUG, "Failed to re-parse a router.");
  1392.           continue;
  1393.         }
  1394.         r = router_add_to_routerlist(ri, &msg, 1, 0);
  1395.         if (WRA_WAS_OUTDATED(r)) {
  1396.           log_warn(LD_DIR, "Couldn't add re-parsed router: %s",
  1397.                    msg?msg:"???");
  1398.         }
  1399.       });
  1400.     routerlist_assert_ok(rl);
  1401.   }
  1402.   log_info(LD_DIR,
  1403.            "%d router descriptors downloadable. %d delayed; %d present "
  1404.            "(%d of those were in old_routers); %d would_reject; "
  1405.            "%d wouldnt_use; %d in progress.",
  1406.            smartlist_len(downloadable), n_delayed, n_have, n_in_oldrouters,
  1407.            n_would_reject, n_wouldnt_use, n_inprogress);
  1408.   launch_router_descriptor_downloads(downloadable, now);
  1409.   digestmap_free(map, NULL);
  1410.  done:
  1411.   smartlist_free(downloadable);
  1412.   smartlist_free(no_longer_old);
  1413. }
  1414. /** How often should we launch a server/authority request to be sure of getting
  1415.  * a guess for our IP? */
  1416. /*XXXX021 this info should come from netinfo cells or something, or we should
  1417.  * do this only when we aren't seeing incoming data. see bug 652. */
  1418. #define DUMMY_DOWNLOAD_INTERVAL (20*60)
  1419. /** Launch downloads for router status as needed. */
  1420. void
  1421. update_router_descriptor_downloads(time_t now)
  1422. {
  1423.   or_options_t *options = get_options();
  1424.   static time_t last_dummy_download = 0;
  1425.   if (should_delay_dir_fetches(options))
  1426.     return;
  1427.   if (directory_fetches_dir_info_early(options)) {
  1428.     update_router_descriptor_cache_downloads_v2(now);
  1429.   }
  1430.   update_consensus_router_descriptor_downloads(now);
  1431.   /* XXXX021 we could be smarter here; see notes on bug 652. */
  1432.   /* If we're a server that doesn't have a configured address, we rely on
  1433.    * directory fetches to learn when our address changes.  So if we haven't
  1434.    * tried to get any routerdescs in a long time, try a dummy fetch now. */
  1435.   if (!options->Address &&
  1436.       server_mode(options) &&
  1437.       last_routerdesc_download_attempted + DUMMY_DOWNLOAD_INTERVAL < now &&
  1438.       last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) {
  1439.     last_dummy_download = now;
  1440.     directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC,
  1441.                                  ROUTER_PURPOSE_GENERAL, "authority.z",
  1442.                                  PDS_RETRY_IF_NO_SERVERS);
  1443.   }
  1444. }
  1445. /** Launch extrainfo downloads as needed. */
  1446. void
  1447. update_extrainfo_downloads(time_t now)
  1448. {
  1449.   or_options_t *options = get_options();
  1450.   routerlist_t *rl;
  1451.   smartlist_t *wanted;
  1452.   digestmap_t *pending;
  1453.   int old_routers, i;
  1454.   int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0;
  1455.   if (! options->DownloadExtraInfo)
  1456.     return;
  1457.   if (should_delay_dir_fetches(options))
  1458.     return;
  1459.   if (!router_have_minimum_dir_info())
  1460.     return;
  1461.   pending = digestmap_new();
  1462.   list_pending_descriptor_downloads(pending, 1);
  1463.   rl = router_get_routerlist();
  1464.   wanted = smartlist_create();
  1465.   for (old_routers = 0; old_routers < 2; ++old_routers) {
  1466.     smartlist_t *lst = old_routers ? rl->old_routers : rl->routers;
  1467.     for (i = 0; i < smartlist_len(lst); ++i) {
  1468.       signed_descriptor_t *sd;
  1469.       char *d;
  1470.       if (old_routers)
  1471.         sd = smartlist_get(lst, i);
  1472.       else
  1473.         sd = &((routerinfo_t*)smartlist_get(lst, i))->cache_info;
  1474.       if (sd->is_extrainfo)
  1475.         continue; /* This should never happen. */
  1476.       if (old_routers && !router_get_by_digest(sd->identity_digest))
  1477.         continue; /* Couldn't check the signature if we got it. */
  1478.       if (sd->extrainfo_is_bogus)
  1479.         continue;
  1480.       d = sd->extra_info_digest;
  1481.       if (tor_digest_is_zero(d)) {
  1482.         ++n_no_ei;
  1483.         continue;
  1484.       }
  1485.       if (eimap_get(rl->extra_info_map, d)) {
  1486.         ++n_have;
  1487.         continue;
  1488.       }
  1489.       if (!download_status_is_ready(&sd->ei_dl_status, now,
  1490.                                     MAX_ROUTERDESC_DOWNLOAD_FAILURES)) {
  1491.         ++n_delay;
  1492.         continue;
  1493.       }
  1494.       if (digestmap_get(pending, d)) {
  1495.         ++n_pending;
  1496.         continue;
  1497.       }
  1498.       smartlist_add(wanted, d);
  1499.     }
  1500.   }
  1501.   digestmap_free(pending, NULL);
  1502.   log_info(LD_DIR, "Extrainfo download status: %d router with no ei, %d "
  1503.            "with present ei, %d delaying, %d pending, %d downloadable.",
  1504.            n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted));
  1505.   smartlist_shuffle(wanted);
  1506.   for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) {
  1507.     initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO,
  1508.                                   wanted, i, i + MAX_DL_PER_REQUEST,
  1509.                 PDS_RETRY_IF_NO_SERVERS|PDS_NO_EXISTING_SERVERDESC_FETCH);
  1510.   }
  1511.   smartlist_free(wanted);
  1512. }
  1513. /** True iff, the last time we checked whether we had enough directory info
  1514.  * to build circuits, the answer was "yes". */
  1515. static int have_min_dir_info = 0;
  1516. /** True iff enough has changed since the last time we checked whether we had
  1517.  * enough directory info to build circuits that our old answer can no longer
  1518.  * be trusted. */
  1519. static int need_to_update_have_min_dir_info = 1;
  1520. /** String describing what we're missing before we have enough directory
  1521.  * info. */
  1522. static char dir_info_status[128] = "";
  1523. /** Return true iff we have enough networkstatus and router information to
  1524.  * start building circuits.  Right now, this means "more than half the
  1525.  * networkstatus documents, and at least 1/4 of expected routers." */
  1526. //XXX should consider whether we have enough exiting nodes here.
  1527. int
  1528. router_have_minimum_dir_info(void)
  1529. {
  1530.   if (PREDICT_UNLIKELY(need_to_update_have_min_dir_info)) {
  1531.     update_router_have_minimum_dir_info();
  1532.     need_to_update_have_min_dir_info = 0;
  1533.   }
  1534.   return have_min_dir_info;
  1535. }
  1536. /** Called when our internal view of the directory has changed.  This can be
  1537.  * when the authorities change, networkstatuses change, the list of routerdescs
  1538.  * changes, or number of running routers changes.
  1539.  */
  1540. void
  1541. router_dir_info_changed(void)
  1542. {
  1543.   need_to_update_have_min_dir_info = 1;
  1544.   rend_hsdir_routers_changed();
  1545. }
  1546. /** Return a string describing what we're missing before we have enough
  1547.  * directory info. */
  1548. const char *
  1549. get_dir_info_status_string(void)
  1550. {
  1551.   return dir_info_status;
  1552. }
  1553. /** Iterate over the servers listed in <b>consensus</b>, and count how many of
  1554.  * them seem like ones we'd use, and how many of <em>those</em> we have
  1555.  * descriptors for.  Store the former in *<b>num_usable</b> and the latter in
  1556.  * *<b>num_present</b>.  */
  1557. static void
  1558. count_usable_descriptors(int *num_present, int *num_usable,
  1559.                          const networkstatus_t *consensus,
  1560.                          or_options_t *options, time_t now)
  1561. {
  1562.   *num_present = 0, *num_usable=0;
  1563.   SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs,
  1564.      {
  1565.        if (client_would_use_router(rs, now, options)) {
  1566.          ++*num_usable; /* the consensus says we want it. */
  1567.          if (router_get_by_descriptor_digest(rs->descriptor_digest)) {
  1568.            /* we have the descriptor listed in the consensus. */
  1569.            ++*num_present;
  1570.          }
  1571.        }
  1572.      });
  1573.   log_debug(LD_DIR, "%d usable, %d present.", *num_usable, *num_present);
  1574. }
  1575. /** We just fetched a new set of descriptors. Compute how far through
  1576.  * the "loading descriptors" bootstrapping phase we are, so we can inform
  1577.  * the controller of our progress. */
  1578. int
  1579. count_loading_descriptors_progress(void)
  1580. {
  1581.   int num_present = 0, num_usable=0;
  1582.   time_t now = time(NULL);
  1583.   const networkstatus_t *consensus =
  1584.     networkstatus_get_reasonably_live_consensus(now);
  1585.   double fraction;
  1586.   if (!consensus)
  1587.     return 0; /* can't count descriptors if we have no list of them */
  1588.   count_usable_descriptors(&num_present, &num_usable,
  1589.                            consensus, get_options(), now);
  1590.   if (num_usable == 0)
  1591.     return 0; /* don't div by 0 */
  1592.   fraction = num_present / (num_usable/4.);
  1593.   if (fraction > 1.0)
  1594.     return 0; /* it's not the number of descriptors holding us back */
  1595.   return BOOTSTRAP_STATUS_LOADING_DESCRIPTORS + (int)
  1596.     (fraction*(BOOTSTRAP_STATUS_CONN_OR-1 -
  1597.                BOOTSTRAP_STATUS_LOADING_DESCRIPTORS));
  1598. }
  1599. /** Change the value of have_min_dir_info, setting it true iff we have enough
  1600.  * network and router information to build circuits.  Clear the value of
  1601.  * need_to_update_have_min_dir_info. */
  1602. static void
  1603. update_router_have_minimum_dir_info(void)
  1604. {
  1605.   int num_present = 0, num_usable=0;
  1606.   time_t now = time(NULL);
  1607.   int res;
  1608.   or_options_t *options = get_options();
  1609.   const networkstatus_t *consensus =
  1610.     networkstatus_get_reasonably_live_consensus(now);
  1611.   if (!consensus) {
  1612.     if (!networkstatus_get_latest_consensus())
  1613.       strlcpy(dir_info_status, "We have no network-status consensus.",
  1614.               sizeof(dir_info_status));
  1615.     else
  1616.       strlcpy(dir_info_status, "We have no recent network-status consensus.",
  1617.               sizeof(dir_info_status));
  1618.     res = 0;
  1619.     goto done;
  1620.   }
  1621.   if (should_delay_dir_fetches(get_options())) {
  1622.     log_notice(LD_DIR, "no known bridge descriptors running yet; stalling");
  1623.     strlcpy(dir_info_status, "No live bridge descriptors.",
  1624.             sizeof(dir_info_status));
  1625.     res = 0;
  1626.     goto done;
  1627.   }
  1628.   count_usable_descriptors(&num_present, &num_usable, consensus, options, now);
  1629.   if (num_present < num_usable/4) {
  1630.     tor_snprintf(dir_info_status, sizeof(dir_info_status),
  1631.             "We have only %d/%d usable descriptors.", num_present, num_usable);
  1632.     res = 0;
  1633.     control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0);
  1634.   } else if (num_present < 2) {
  1635.     tor_snprintf(dir_info_status, sizeof(dir_info_status),
  1636.                  "Only %d descriptor%s here and believed reachable!",
  1637.                  num_present, num_present ? "" : "s");
  1638.     res = 0;
  1639.   } else {
  1640.     res = 1;
  1641.   }
  1642.  done:
  1643.   if (res && !have_min_dir_info) {
  1644.     log(LOG_NOTICE, LD_DIR,
  1645.         "We now have enough directory information to build circuits.");
  1646.     control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO");
  1647.     control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0);
  1648.   }
  1649.   if (!res && have_min_dir_info) {
  1650.     int quiet = directory_too_idle_to_fetch_descriptors(options, now);
  1651.     log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
  1652.         "Our directory information is no longer up-to-date "
  1653.         "enough to build circuits: %s", dir_info_status);
  1654.     control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO");
  1655.   }
  1656.   have_min_dir_info = res;
  1657.   need_to_update_have_min_dir_info = 0;
  1658. }
  1659. /** Reset the descriptor download failure count on all routers, so that we
  1660.  * can retry any long-failed routers immediately.
  1661.  */
  1662. void
  1663. router_reset_descriptor_download_failures(void)
  1664. {
  1665.   networkstatus_reset_download_failures();
  1666.   last_routerdesc_download_attempted = 0;
  1667.   if (!routerlist)
  1668.     return;
  1669.   SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri,
  1670.   {
  1671.     download_status_reset(&ri->cache_info.ei_dl_status);
  1672.   });
  1673.   SMARTLIST_FOREACH(routerlist->old_routers, signed_descriptor_t *, sd,
  1674.   {
  1675.     download_status_reset(&sd->ei_dl_status);
  1676.   });
  1677. }
  1678. /** Any changes in a router descriptor's publication time larger than this are
  1679.  * automatically non-cosmetic. */
  1680. #define ROUTER_MAX_COSMETIC_TIME_DIFFERENCE (12*60*60)
  1681. /** We allow uptime to vary from how much it ought to be by this much. */
  1682. #define ROUTER_ALLOW_UPTIME_DRIFT (6*60*60)
  1683. /** Return true iff the only differences between r1 and r2 are such that
  1684.  * would not cause a recent (post 0.1.1.6) dirserver to republish.
  1685.  */
  1686. int
  1687. router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2)
  1688. {
  1689.   time_t r1pub, r2pub;
  1690.   long time_difference;
  1691.   tor_assert(r1 && r2);
  1692.   /* r1 should be the one that was published first. */
  1693.   if (r1->cache_info.published_on > r2->cache_info.published_on) {
  1694.     routerinfo_t *ri_tmp = r2;
  1695.     r2 = r1;
  1696.     r1 = ri_tmp;
  1697.   }
  1698.   /* If any key fields differ, they're different. */
  1699.   if (strcasecmp(r1->address, r2->address) ||
  1700.       strcasecmp(r1->nickname, r2->nickname) ||
  1701.       r1->or_port != r2->or_port ||
  1702.       r1->dir_port != r2->dir_port ||
  1703.       r1->purpose != r2->purpose ||
  1704.       crypto_pk_cmp_keys(r1->onion_pkey, r2->onion_pkey) ||
  1705.       crypto_pk_cmp_keys(r1->identity_pkey, r2->identity_pkey) ||
  1706.       strcasecmp(r1->platform, r2->platform) ||
  1707.       (r1->contact_info && !r2->contact_info) || /* contact_info is optional */
  1708.       (!r1->contact_info && r2->contact_info) ||
  1709.       (r1->contact_info && r2->contact_info &&
  1710.        strcasecmp(r1->contact_info, r2->contact_info)) ||
  1711.       r1->is_hibernating != r2->is_hibernating ||
  1712.       r1->has_old_dnsworkers != r2->has_old_dnsworkers ||
  1713.       cmp_addr_policies(r1->exit_policy, r2->exit_policy))
  1714.     return 0;
  1715.   if ((r1->declared_family == NULL) != (r2->declared_family == NULL))
  1716.     return 0;
  1717.   if (r1->declared_family && r2->declared_family) {
  1718.     int i, n;
  1719.     if (smartlist_len(r1->declared_family)!=smartlist_len(r2->declared_family))
  1720.       return 0;
  1721.     n = smartlist_len(r1->declared_family);
  1722.     for (i=0; i < n; ++i) {
  1723.       if (strcasecmp(smartlist_get(r1->declared_family, i),
  1724.                      smartlist_get(r2->declared_family, i)))
  1725.         return 0;
  1726.     }
  1727.   }
  1728.   /* Did bandwidth change a lot? */
  1729.   if ((r1->bandwidthcapacity < r2->bandwidthcapacity/2) ||
  1730.       (r2->bandwidthcapacity < r1->bandwidthcapacity/2))
  1731.     return 0;
  1732.   /* Did the bandwidthrate or bandwidthburst change? */
  1733.   if ((r1->bandwidthrate != r2->bandwidthrate) ||
  1734.       (r1->bandwidthburst != r2->bandwidthburst))
  1735.     return 0;
  1736.   /* Did more than 12 hours pass? */
  1737.   if (r1->cache_info.published_on + ROUTER_MAX_COSMETIC_TIME_DIFFERENCE
  1738.       < r2->cache_info.published_on)
  1739.     return 0;
  1740.   /* Did uptime fail to increase by approximately the amount we would think,
  1741.    * give or take some slop? */
  1742.   r1pub = r1->cache_info.published_on;
  1743.   r2pub = r2->cache_info.published_on;
  1744.   time_difference = labs(r2->uptime - (r1->uptime + (r2pub - r1pub)));
  1745.   if (time_difference > ROUTER_ALLOW_UPTIME_DRIFT &&
  1746.       time_difference > r1->uptime * .05 &&
  1747.       time_difference > r2->uptime * .05)
  1748.     return 0;
  1749.   /* Otherwise, the difference is cosmetic. */
  1750.   return 1;
  1751. }
  1752. /** Check whether <b>ri</b> (a.k.a. sd) is a router compatible with the
  1753.  * extrainfo document
  1754.  * <b>ei</b>.  If no router is compatible with <b>ei</b>, <b>ei</b> should be
  1755.  * dropped.  Return 0 for "compatible", return 1 for "reject, and inform
  1756.  * whoever uploaded <b>ei</b>, and return -1 for "reject silently.".  If
  1757.  * <b>msg</b> is present, set *<b>msg</b> to a description of the
  1758.  * incompatibility (if any).
  1759.  **/
  1760. int
  1761. routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei,
  1762.                                        signed_descriptor_t *sd,
  1763.                                        const char **msg)
  1764. {
  1765.   int digest_matches, r=1;
  1766.   tor_assert(ri);
  1767.   tor_assert(ei);
  1768.   if (!sd)
  1769.     sd = &ri->cache_info;
  1770.   if (ei->bad_sig) {
  1771.     if (msg) *msg = "Extrainfo signature was bad, or signed with wrong key.";
  1772.     return 1;
  1773.   }
  1774.   digest_matches = !memcmp(ei->cache_info.signed_descriptor_digest,
  1775.                            sd->extra_info_digest, DIGEST_LEN);
  1776.   /* The identity must match exactly to have been generated at the same time
  1777.    * by the same router. */
  1778.   if (memcmp(ri->cache_info.identity_digest, ei->cache_info.identity_digest,
  1779.              DIGEST_LEN)) {
  1780.     if (msg) *msg = "Extrainfo nickname or identity did not match routerinfo";
  1781.     goto err; /* different servers */
  1782.   }
  1783.   if (ei->pending_sig) {
  1784.     char signed_digest[128];
  1785.     if (crypto_pk_public_checksig(ri->identity_pkey, signed_digest,
  1786.                        ei->pending_sig, ei->pending_sig_len) != DIGEST_LEN ||
  1787.         memcmp(signed_digest, ei->cache_info.signed_descriptor_digest,
  1788.                DIGEST_LEN)) {
  1789.       ei->bad_sig = 1;
  1790.       tor_free(ei->pending_sig);
  1791.       if (msg) *msg = "Extrainfo signature bad, or signed with wrong key";
  1792.       goto err; /* Bad signature, or no match. */
  1793.     }
  1794.     ei->cache_info.send_unencrypted = ri->cache_info.send_unencrypted;
  1795.     tor_free(ei->pending_sig);
  1796.   }
  1797.   if (ei->cache_info.published_on < sd->published_on) {
  1798.     if (msg) *msg = "Extrainfo published time did not match routerdesc";
  1799.     goto err;
  1800.   } else if (ei->cache_info.published_on > sd->published_on) {
  1801.     if (msg) *msg = "Extrainfo published time did not match routerdesc";
  1802.     r = -1;
  1803.     goto err;
  1804.   }
  1805.   if (!digest_matches) {
  1806.     if (msg) *msg = "Extrainfo digest did not match value from routerdesc";
  1807.     goto err; /* Digest doesn't match declared value. */
  1808.   }
  1809.   return 0;
  1810.  err:
  1811.   if (digest_matches) {
  1812.     /* This signature was okay, and the digest was right: This is indeed the
  1813.      * corresponding extrainfo.  But insanely, it doesn't match the routerinfo
  1814.      * that lists it.  Don't try to fetch this one again. */
  1815.     sd->extrainfo_is_bogus = 1;
  1816.   }
  1817.   return r;
  1818. }
  1819. /** Assert that the internal representation of <b>rl</b> is
  1820.  * self-consistent. */
  1821. void
  1822. routerlist_assert_ok(routerlist_t *rl)
  1823. {
  1824.   routerinfo_t *r2;
  1825.   signed_descriptor_t *sd2;
  1826.   if (!rl)
  1827.     return;
  1828.   SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
  1829.   {
  1830.     r2 = rimap_get(rl->identity_map, r->cache_info.identity_digest);
  1831.     tor_assert(r == r2);
  1832.     sd2 = sdmap_get(rl->desc_digest_map,
  1833.                     r->cache_info.signed_descriptor_digest);
  1834.     tor_assert(&(r->cache_info) == sd2);
  1835.     tor_assert(r->cache_info.routerlist_index == r_sl_idx);
  1836.     /* XXXX
  1837.      *
  1838.      *   Hoo boy.  We need to fix this one, and the fix is a bit tricky, so
  1839.      * commenting this out is just a band-aid.
  1840.      *
  1841.      *   The problem is that, although well-behaved router descriptors
  1842.      * should never have the same value for their extra_info_digest, it's
  1843.      * possible for ill-behaved routers to claim whatever they like there.
  1844.      *
  1845.      *   The real answer is to trash desc_by_eid_map and instead have
  1846.      * something that indicates for a given extra-info digest we want,
  1847.      * what its download status is.  We'll do that as a part of routerlist
  1848.      * refactoring once consensus directories are in.  For now,
  1849.      * this rep violation is probably harmless: an adversary can make us
  1850.      * reset our retry count for an extrainfo, but that's not the end
  1851.      * of the world.  Changing the representation in 0.2.0.x would just
  1852.      * destabilize the codebase.
  1853.     if (!tor_digest_is_zero(r->cache_info.extra_info_digest)) {
  1854.       signed_descriptor_t *sd3 =
  1855.         sdmap_get(rl->desc_by_eid_map, r->cache_info.extra_info_digest);
  1856.       tor_assert(sd3 == &(r->cache_info));
  1857.     }
  1858.     */
  1859.   });
  1860.   SMARTLIST_FOREACH(rl->old_routers, signed_descriptor_t *, sd,
  1861.   {
  1862.     r2 = rimap_get(rl->identity_map, sd->identity_digest);
  1863.     tor_assert(sd != &(r2->cache_info));
  1864.     sd2 = sdmap_get(rl->desc_digest_map, sd->signed_descriptor_digest);
  1865.     tor_assert(sd == sd2);
  1866.     tor_assert(sd->routerlist_index == sd_sl_idx);
  1867.     /* XXXX see above.
  1868.     if (!tor_digest_is_zero(sd->extra_info_digest)) {
  1869.       signed_descriptor_t *sd3 =
  1870.         sdmap_get(rl->desc_by_eid_map, sd->extra_info_digest);
  1871.       tor_assert(sd3 == sd);
  1872.     }
  1873.     */
  1874.   });
  1875.   RIMAP_FOREACH(rl->identity_map, d, r) {
  1876.     tor_assert(!memcmp(r->cache_info.identity_digest, d, DIGEST_LEN));
  1877.   } DIGESTMAP_FOREACH_END;
  1878.   SDMAP_FOREACH(rl->desc_digest_map, d, sd) {
  1879.     tor_assert(!memcmp(sd->signed_descriptor_digest, d, DIGEST_LEN));
  1880.   } DIGESTMAP_FOREACH_END;
  1881.   SDMAP_FOREACH(rl->desc_by_eid_map, d, sd) {
  1882.     tor_assert(!tor_digest_is_zero(d));
  1883.     tor_assert(sd);
  1884.     tor_assert(!memcmp(sd->extra_info_digest, d, DIGEST_LEN));
  1885.   } DIGESTMAP_FOREACH_END;
  1886.   EIMAP_FOREACH(rl->extra_info_map, d, ei) {
  1887.     signed_descriptor_t *sd;
  1888.     tor_assert(!memcmp(ei->cache_info.signed_descriptor_digest,
  1889.                        d, DIGEST_LEN));
  1890.     sd = sdmap_get(rl->desc_by_eid_map,
  1891.                    ei->cache_info.signed_descriptor_digest);
  1892.     // tor_assert(sd); // XXXX see above
  1893.     if (sd) {
  1894.       tor_assert(!memcmp(ei->cache_info.signed_descriptor_digest,
  1895.                          sd->extra_info_digest, DIGEST_LEN));
  1896.     }
  1897.   } DIGESTMAP_FOREACH_END;
  1898. }
  1899. /** Allocate and return a new string representing the contact info
  1900.  * and platform string for <b>router</b>,
  1901.  * surrounded by quotes and using standard C escapes.
  1902.  *
  1903.  * THIS FUNCTION IS NOT REENTRANT.  Don't call it from outside the main
  1904.  * thread.  Also, each call invalidates the last-returned value, so don't
  1905.  * try log_warn(LD_GENERAL, "%s %s", esc_router_info(a), esc_router_info(b));
  1906.  *
  1907.  * If <b>router</b> is NULL, it just frees its internal memory and returns.
  1908.  */
  1909. const char *
  1910. esc_router_info(routerinfo_t *router)
  1911. {
  1912.   static char *info=NULL;
  1913.   char *esc_contact, *esc_platform;
  1914.   size_t len;
  1915.   if (info)
  1916.     tor_free(info);
  1917.   if (!router)
  1918.     return NULL; /* we're exiting; just free the memory we use */
  1919.   esc_contact = esc_for_log(router->contact_info);
  1920.   esc_platform = esc_for_log(router->platform);
  1921.   len = strlen(esc_contact)+strlen(esc_platform)+32;
  1922.   info = tor_malloc(len);
  1923.   tor_snprintf(info, len, "Contact %s, Platform %s", esc_contact,
  1924.                esc_platform);
  1925.   tor_free(esc_contact);
  1926.   tor_free(esc_platform);
  1927.   return info;
  1928. }
  1929. /** Helper for sorting: compare two routerinfos by their identity
  1930.  * digest. */
  1931. static int
  1932. _compare_routerinfo_by_id_digest(const void **a, const void **b)
  1933. {
  1934.   routerinfo_t *first = *(routerinfo_t **)a, *second = *(routerinfo_t **)b;
  1935.   return memcmp(first->cache_info.identity_digest,
  1936.                 second->cache_info.identity_digest,
  1937.                 DIGEST_LEN);
  1938. }
  1939. /** Sort a list of routerinfo_t in ascending order of identity digest. */
  1940. void
  1941. routers_sort_by_identity(smartlist_t *routers)
  1942. {
  1943.   smartlist_sort(routers, _compare_routerinfo_by_id_digest);
  1944. }
  1945. /** A routerset specifies constraints on a set of possible routerinfos, based
  1946.  * on their names, identities, or addresses.  It is optimized for determining
  1947.  * whether a router is a member or not, in O(1+P) time, where P is the number
  1948.  * of address policy constraints. */
  1949. struct routerset_t {
  1950.   /** A list of strings for the elements of the policy.  Each string is either
  1951.    * a nickname, a hexadecimal identity fingerprint, or an address policy.  A
  1952.    * router belongs to the set if its nickname OR its identity OR its address
  1953.    * matches an entry here. */
  1954.   smartlist_t *list;
  1955.   /** A map from lowercase nicknames of routers in the set to (void*)1 */
  1956.   strmap_t *names;
  1957.   /** A map from identity digests routers in the set to (void*)1 */
  1958.   digestmap_t *digests;
  1959.   /** An address policy for routers in the set.  For implementation reasons,
  1960.    * a router belongs to the set if it is _rejected_ by this policy. */
  1961.   smartlist_t *policies;
  1962.   /** A human-readable description of what this routerset is for.  Used in
  1963.    * log messages. */
  1964.   char *description;
  1965.   /** A list of the country codes in this set. */
  1966.   smartlist_t *country_names;
  1967.   /** Total number of countries we knew about when we built <b>countries</b>.*/
  1968.   int n_countries;
  1969.   /** Bit array mapping the return value of geoip_get_country() to 1 iff the
  1970.    * country is a member of this routerset.  Note that we MUST call
  1971.    * routerset_refresh_countries() whenever the geoip country list is
  1972.    * reloaded. */
  1973.   bitarray_t *countries;
  1974. };
  1975. /** Return a new empty routerset. */
  1976. routerset_t *
  1977. routerset_new(void)
  1978. {
  1979.   routerset_t *result = tor_malloc_zero(sizeof(routerset_t));
  1980.   result->list = smartlist_create();
  1981.   result->names = strmap_new();
  1982.   result->digests = digestmap_new();
  1983.   result->policies = smartlist_create();
  1984.   result->country_names = smartlist_create();
  1985.   return result;
  1986. }
  1987. /** If <b>c</b> is a country code in the form {cc}, return a newly allocated
  1988.  * string holding the "cc" part.  Else, return NULL. */
  1989. static char *
  1990. routerset_get_countryname(const char *c)
  1991. {
  1992.   char *country;
  1993.   if (strlen(c) < 4 || c[0] !='{' || c[3] !='}')
  1994.     return NULL;
  1995.   country = tor_strndup(c+1, 2);
  1996.   tor_strlower(country);
  1997.   return country;
  1998. }
  1999. #if 0
  2000. /** Add the GeoIP database's integer index (+1) of a valid two-character
  2001.  * country code to the routerset's <b>countries</b> bitarray. Return the
  2002.  * integer index if the country code is valid, -1 otherwise.*/
  2003. static int
  2004. routerset_add_country(const char *c)
  2005. {
  2006.   char country[3];
  2007.   country_t cc;
  2008.   /* XXXX: Country codes must be of the form {[a-z?]{2}} but this accepts
  2009.      {[.]{2}}. Do we need to be strict? -RH */
  2010.   /* Nope; if the country code is bad, we'll get 0 when we look it up. */
  2011.   if (!geoip_is_loaded()) {
  2012.     log(LOG_WARN, LD_CONFIG, "GeoIP database not loaded: Cannot add country"
  2013.                              "entry %s, ignoring.", c);
  2014.     return -1;
  2015.   }
  2016.   memcpy(country, c+1, 2);
  2017.   country[2] = '';
  2018.   tor_strlower(country);
  2019.   if ((cc=geoip_get_country(country))==-1) {
  2020.     log(LOG_WARN, LD_CONFIG, "Country code '%s' is not valid, ignoring.",
  2021.         country);
  2022.   }
  2023.   return cc;
  2024. }
  2025. #endif
  2026. /** Update the routerset's <b>countries</b> bitarray_t. Called whenever
  2027.  * the GeoIP database is reloaded.
  2028.  */
  2029. void
  2030. routerset_refresh_countries(routerset_t *target)
  2031. {
  2032.   int cc;
  2033.   if (target->countries) {
  2034.     bitarray_free(target->countries);
  2035.   }
  2036.   if (!geoip_is_loaded()) {
  2037.     target->countries = NULL;
  2038.     target->n_countries = 0;
  2039.     return;
  2040.   }
  2041.   target->n_countries = geoip_get_n_countries();
  2042.   target->countries = bitarray_init_zero(target->n_countries);
  2043.   SMARTLIST_FOREACH_BEGIN(target->country_names, const char *, country) {
  2044.     cc = geoip_get_country(country);
  2045.     if (cc >= 0) {
  2046.       tor_assert(cc < target->n_countries);
  2047.       bitarray_set(target->countries, cc);
  2048.     } else {
  2049.       log(LOG_WARN, LD_CONFIG, "Country code '%s' is not recognized.",
  2050.           country);
  2051.     }
  2052.   } SMARTLIST_FOREACH_END(country);
  2053. }
  2054. /** Parse the string <b>s</b> to create a set of routerset entries, and add
  2055.  * them to <b>target</b>.  In log messages, refer to the string as
  2056.  * <b>description</b>.  Return 0 on success, -1 on failure.
  2057.  *
  2058.  * Three kinds of elements are allowed in routersets: nicknames, IP address
  2059.  * patterns, and fingerprints.  They may be surrounded by optional space, and
  2060.  * must be separated by commas.
  2061.  */
  2062. int
  2063. routerset_parse(routerset_t *target, const char *s, const char *description)
  2064. {
  2065.   int r = 0;
  2066.   int added_countries = 0;
  2067.   char *countryname;
  2068.   smartlist_t *list = smartlist_create();
  2069.   smartlist_split_string(list, s, ",",
  2070.                          SPLIT_SKIP_SPACE | SPLIT_IGNORE_BLANK, 0);
  2071.   SMARTLIST_FOREACH_BEGIN(list, char *, nick) {
  2072.       addr_policy_t *p;
  2073.       if (is_legal_hexdigest(nick)) {
  2074.         char d[DIGEST_LEN];
  2075.         if (*nick == '$')
  2076.           ++nick;
  2077.         log_debug(LD_CONFIG, "Adding identity %s to %s", nick, description);
  2078.         base16_decode(d, sizeof(d), nick, HEX_DIGEST_LEN);
  2079.         digestmap_set(target->digests, d, (void*)1);
  2080.       } else if (is_legal_nickname(nick)) {
  2081.         log_debug(LD_CONFIG, "Adding nickname %s to %s", nick, description);
  2082.         strmap_set_lc(target->names, nick, (void*)1);
  2083.       } else if ((countryname = routerset_get_countryname(nick)) != NULL) {
  2084.         log_debug(LD_CONFIG, "Adding country %s to %s", nick,
  2085.                   description);
  2086.         smartlist_add(target->country_names, countryname);
  2087.         added_countries = 1;
  2088.       } else if ((strchr(nick,'.') || strchr(nick, '*')) &&
  2089.                  (p = router_parse_addr_policy_item_from_string(
  2090.                                      nick, ADDR_POLICY_REJECT))) {
  2091.         log_debug(LD_CONFIG, "Adding address %s to %s", nick, description);
  2092.         smartlist_add(target->policies, p);
  2093.       } else {
  2094.         log_warn(LD_CONFIG, "Entry '%s' in %s is misformed.", nick,
  2095.                  description);
  2096.         r = -1;
  2097.         tor_free(nick);
  2098.         SMARTLIST_DEL_CURRENT(list, nick);
  2099.       }
  2100.   } SMARTLIST_FOREACH_END(nick);
  2101.   smartlist_add_all(target->list, list);
  2102.   smartlist_free(list);
  2103.   if (added_countries)
  2104.     routerset_refresh_countries(target);
  2105.   return r;
  2106. }
  2107. /** DOCDOC */
  2108. void
  2109. refresh_all_country_info(void)
  2110. {
  2111.   or_options_t *options = get_options();
  2112.   if (options->EntryNodes)
  2113.     routerset_refresh_countries(options->EntryNodes);
  2114.   if (options->ExitNodes)
  2115.     routerset_refresh_countries(options->ExitNodes);
  2116.   if (options->ExcludeNodes)
  2117.     routerset_refresh_countries(options->ExcludeNodes);
  2118.   if (options->ExcludeExitNodes)
  2119.     routerset_refresh_countries(options->ExcludeExitNodes);
  2120.   if (options->_ExcludeExitNodesUnion)
  2121.     routerset_refresh_countries(options->_ExcludeExitNodesUnion);
  2122.   routerlist_refresh_countries();
  2123. }
  2124. /** Add all members of the set <b>source</b> to <b>target</b>. */
  2125. void
  2126. routerset_union(routerset_t *target, const routerset_t *source)
  2127. {
  2128.   char *s;
  2129.   tor_assert(target);
  2130.   if (!source || !source->list)
  2131.     return;
  2132.   s = routerset_to_string(source);
  2133.   routerset_parse(target, s, "other routerset");
  2134.   tor_free(s);
  2135. }
  2136. /** Return true iff <b>set</b> lists only nicknames and digests, and includes
  2137.  * no IP ranges or countries. */
  2138. int
  2139. routerset_is_list(const routerset_t *set)
  2140. {
  2141.   return smartlist_len(set->country_names) == 0 &&
  2142.     smartlist_len(set->policies) == 0;
  2143. }
  2144. /** Return true iff we need a GeoIP IP-to-country database to make sense of
  2145.  * <b>set</b>. */
  2146. int
  2147. routerset_needs_geoip(const routerset_t *set)
  2148. {
  2149.   return set && smartlist_len(set->country_names);
  2150. }
  2151. /** Return true iff there are no entries in <b>set</b>. */
  2152. static int
  2153. routerset_is_empty(const routerset_t *set)
  2154. {
  2155.   return !set || smartlist_len(set->list) == 0;
  2156. }
  2157. /** Helper.  Return true iff <b>set</b> contains a router based on the other
  2158.  * provided fields.  Return higher values for more specific subentries: a
  2159.  * single router is more specific than an address range of routers, which is
  2160.  * more specific in turn than a country code.
  2161.  *
  2162.  * (If country is -1, then we take the country
  2163.  * from addr.) */
  2164. static int
  2165. routerset_contains(const routerset_t *set, const tor_addr_t *addr,
  2166.                    uint16_t orport,
  2167.                    const char *nickname, const char *id_digest, int is_named,
  2168.                    country_t country)
  2169. {
  2170.   if (!set || !set->list) return 0;
  2171.   (void) is_named; /* not supported */
  2172.   if (nickname && strmap_get_lc(set->names, nickname))
  2173.     return 4;
  2174.   if (id_digest && digestmap_get(set->digests, id_digest))
  2175.     return 4;
  2176.   if (addr && compare_tor_addr_to_addr_policy(addr, orport, set->policies)
  2177.       == ADDR_POLICY_REJECTED)
  2178.     return 3;
  2179.   if (set->countries) {
  2180.     if (country < 0 && addr)
  2181.       country = geoip_get_country_by_ip(tor_addr_to_ipv4h(addr));
  2182.     if (country >= 0 && country < set->n_countries &&
  2183.         bitarray_is_set(set->countries, country))
  2184.       return 2;
  2185.   }
  2186.   return 0;
  2187. }
  2188. /** Return true iff we can tell that <b>ei</b> is a member of <b>set</b>. */
  2189. int
  2190. routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei)
  2191. {
  2192.   return routerset_contains(set,
  2193.                             &ei->addr,
  2194.                             ei->port,
  2195.                             ei->nickname,
  2196.                             ei->identity_digest,
  2197.                             -1, /*is_named*/
  2198.                             -1 /*country*/);
  2199. }
  2200. /** Return true iff <b>ri</b> is in <b>set</b>. */
  2201. int
  2202. routerset_contains_router(const routerset_t *set, routerinfo_t *ri)
  2203. {
  2204.   tor_addr_t addr;
  2205.   tor_addr_from_ipv4h(&addr, ri->addr);
  2206.   return routerset_contains(set,
  2207.                             &addr,
  2208.                             ri->or_port,
  2209.                             ri->nickname,
  2210.                             ri->cache_info.identity_digest,
  2211.                             ri->is_named,
  2212.                             ri->country);
  2213. }
  2214. /** Return true iff <b>rs</b> is in <b>set</b>. */
  2215. int
  2216. routerset_contains_routerstatus(const routerset_t *set, routerstatus_t *rs)
  2217. {
  2218.   tor_addr_t addr;
  2219.   tor_addr_from_ipv4h(&addr, rs->addr);
  2220.   return routerset_contains(set,
  2221.                             &addr,
  2222.                             rs->or_port,
  2223.                             rs->nickname,
  2224.                             rs->identity_digest,
  2225.                             rs->is_named,
  2226.                             -1);
  2227. }
  2228. /** Add every known routerinfo_t that is a member of <b>routerset</b> to
  2229.  * <b>out</b>.  If <b>running_only</b>, only add the running ones. */
  2230. void
  2231. routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset,
  2232.                           int running_only)
  2233. {
  2234.   tor_assert(out);
  2235.   if (!routerset || !routerset->list)
  2236.     return;
  2237.   if (!warned_nicknames)
  2238.     warned_nicknames = smartlist_create();
  2239.   if (routerset_is_list(routerset)) {
  2240.     /* No routers are specified by type; all are given by name or digest.
  2241.      * we can do a lookup in O(len(list)). */
  2242.     SMARTLIST_FOREACH(routerset->list, const char *, name, {
  2243.         routerinfo_t *router = router_get_by_nickname(name, 1);
  2244.         if (router) {
  2245.           if (!running_only || router->is_running)
  2246.             smartlist_add(out, router);
  2247.         }
  2248.     });
  2249.   } else {
  2250.     /* We need to iterate over the routerlist to get all the ones of the
  2251.      * right kind. */
  2252.     routerlist_t *rl = router_get_routerlist();
  2253.     SMARTLIST_FOREACH(rl->routers, routerinfo_t *, router, {
  2254.         if (running_only && !router->is_running)
  2255.           continue;
  2256.         if (routerset_contains_router(routerset, router))
  2257.           smartlist_add(out, router);
  2258.     });
  2259.   }
  2260. }
  2261. /** Add to <b>target</b> every routerinfo_t from <b>source</b> that is in
  2262.  * <b>include</b>, but not excluded in a more specific fashion by
  2263.  * <b>exclude</b>.  If <b>running_only</b>, only include running routers.
  2264.  */
  2265. void
  2266. routersets_get_disjunction(smartlist_t *target,
  2267.                            const smartlist_t *source,
  2268.                            const routerset_t *include,
  2269.                            const routerset_t *exclude, int running_only)
  2270. {
  2271.   SMARTLIST_FOREACH(source, routerinfo_t *, router, {
  2272.     int include_result;
  2273.     if (running_only && !router->is_running)
  2274.       continue;
  2275.     if (!routerset_is_empty(include))
  2276.       include_result = routerset_contains_router(include, router);
  2277.     else
  2278.       include_result = 1;
  2279.     if (include_result) {
  2280.       int exclude_result = routerset_contains_router(exclude, router);
  2281.       if (include_result >= exclude_result)
  2282.         smartlist_add(target, router);
  2283.     }
  2284.   });
  2285. }
  2286. /** Remove every routerinfo_t from <b>lst</b> that is in <b>routerset</b>. */
  2287. void
  2288. routerset_subtract_routers(smartlist_t *lst, const routerset_t *routerset)
  2289. {
  2290.   tor_assert(lst);
  2291.   if (!routerset)
  2292.     return;
  2293.   SMARTLIST_FOREACH(lst, routerinfo_t *, r, {
  2294.       if (routerset_contains_router(routerset, r)) {
  2295.         //log_debug(LD_DIR, "Subtracting %s",r->nickname);
  2296.         SMARTLIST_DEL_CURRENT(lst, r);
  2297.       }
  2298.     });
  2299. }
  2300. /** Return a new string that when parsed by routerset_parse_string() will
  2301.  * yield <b>set</b>. */
  2302. char *
  2303. routerset_to_string(const routerset_t *set)
  2304. {
  2305.   if (!set || !set->list)
  2306.     return tor_strdup("");
  2307.   return smartlist_join_strings(set->list, ",", 0, NULL);
  2308. }
  2309. /** Helper: return true iff old and new are both NULL, or both non-NULL
  2310.  * equal routersets. */
  2311. int
  2312. routerset_equal(const routerset_t *old, const routerset_t *new)
  2313. {
  2314.   if (old == NULL && new == NULL)
  2315.     return 1;
  2316.   else if (old == NULL || new == NULL)
  2317.     return 0;
  2318.   if (smartlist_len(old->list) != smartlist_len(new->list))
  2319.     return 0;
  2320.   SMARTLIST_FOREACH(old->list, const char *, cp1, {
  2321.     const char *cp2 = smartlist_get(new->list, cp1_sl_idx);
  2322.     if (strcmp(cp1, cp2))
  2323.       return 0;
  2324.   });
  2325.   return 1;
  2326. #if 0
  2327.   /* XXXX: This won't work if the names/digests are identical but in a
  2328.      different order. Checking for exact equality would be heavy going,
  2329.      is it worth it? -RH*/
  2330.   /* This code is totally bogus; sizeof doesn't work even remotely like this
  2331.    * code seems to think.  Let's revert to a string-based comparison for
  2332.    * now. -NM*/
  2333.   if (sizeof(old->names) != sizeof(new->names))
  2334.     return 0;
  2335.   if (memcmp(old->names,new->names,sizeof(new->names)))
  2336.     return 0;
  2337.   if (sizeof(old->digests) != sizeof(new->digests))
  2338.     return 0;
  2339.   if (memcmp(old->digests,new->digests,sizeof(new->digests)))
  2340.     return 0;
  2341.   if (sizeof(old->countries) != sizeof(new->countries))
  2342.     return 0;
  2343.   if (memcmp(old->countries,new->countries,sizeof(new->countries)))
  2344.     return 0;
  2345.   return 1;
  2346. #endif
  2347. }
  2348. /** Free all storage held in <b>routerset</b>. */
  2349. void
  2350. routerset_free(routerset_t *routerset)
  2351. {
  2352.   SMARTLIST_FOREACH(routerset->list, char *, cp, tor_free(cp));
  2353.   smartlist_free(routerset->list);
  2354.   SMARTLIST_FOREACH(routerset->policies, addr_policy_t *, p,
  2355.                     addr_policy_free(p));
  2356.   smartlist_free(routerset->policies);
  2357.   SMARTLIST_FOREACH(routerset->country_names, char *, cp, tor_free(cp));
  2358.   smartlist_free(routerset->country_names);
  2359.   strmap_free(routerset->names, NULL);
  2360.   digestmap_free(routerset->digests, NULL);
  2361.   if (routerset->countries)
  2362.     bitarray_free(routerset->countries);
  2363.   tor_free(routerset);
  2364. }
  2365. /** Refresh the country code of <b>ri</b>.  This function MUST be called on
  2366.  * each router when the GeoIP database is reloaded, and on all new routers. */
  2367. void
  2368. routerinfo_set_country(routerinfo_t *ri)
  2369. {
  2370.   ri->country = geoip_get_country_by_ip(ri->addr);
  2371. }
  2372. /** Set the country code of all routers in the routerlist. */
  2373. void
  2374. routerlist_refresh_countries(void)
  2375. {
  2376.   routerlist_t *rl = router_get_routerlist();
  2377.   SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri,
  2378.                     routerinfo_set_country(ri));
  2379. }
  2380. /** Determine the routers that are responsible for <b>id</b> (binary) and
  2381.  * add pointers to those routers' routerstatus_t to <b>responsible_dirs</b>.
  2382.  * Return -1 if we're returning an empty smartlist, else return 0.
  2383.  */
  2384. int
  2385. hid_serv_get_responsible_directories(smartlist_t *responsible_dirs,
  2386.                                      const char *id)
  2387. {
  2388.   int start, found, n_added = 0, i;
  2389.   networkstatus_t *c = networkstatus_get_latest_consensus();
  2390.   int use_begindir = get_options()->TunnelDirConns;
  2391.   if (!c || !smartlist_len(c->routerstatus_list)) {
  2392.     log_warn(LD_REND, "We don't have a consensus, so we can't perform v2 "
  2393.              "rendezvous operations.");
  2394.     return -1;
  2395.   }
  2396.   tor_assert(id);
  2397.   start = networkstatus_vote_find_entry_idx(c, id, &found);
  2398.   if (start == smartlist_len(c->routerstatus_list)) start = 0;
  2399.   i = start;
  2400.   do {
  2401.     routerstatus_t *r = smartlist_get(c->routerstatus_list, i);
  2402.     if (r->is_hs_dir) {
  2403.       if (r->dir_port || use_begindir)
  2404.         smartlist_add(responsible_dirs, r);
  2405.       else
  2406.         log_info(LD_REND, "Not adding router '%s' to list of responsible "
  2407.                  "hidden service directories, because we have no way of "
  2408.                  "reaching it.", r->nickname);
  2409.       if (++n_added == REND_NUMBER_OF_CONSECUTIVE_REPLICAS)
  2410.         break;
  2411.     }
  2412.     if (++i == smartlist_len(c->routerstatus_list))
  2413.       i = 0;
  2414.   } while (i != start);
  2415.   /* Even though we don't have the desired number of hidden service
  2416.    * directories, be happy if we got any. */
  2417.   return smartlist_len(responsible_dirs) ? 0 : -1;
  2418. }
  2419. /** Return true if this node is currently acting as hidden service
  2420.  * directory, false otherwise. */
  2421. int
  2422. hid_serv_acting_as_directory(void)
  2423. {
  2424.   routerinfo_t *me = router_get_my_routerinfo();
  2425.   networkstatus_t *c;
  2426.   routerstatus_t *rs;
  2427.   if (!me)
  2428.     return 0;
  2429.   if (!get_options()->HidServDirectoryV2) {
  2430.     log_info(LD_REND, "We are not acting as hidden service directory, "
  2431.                       "because we have not been configured as such.");
  2432.     return 0;
  2433.   }
  2434.   if (!(c = networkstatus_get_latest_consensus())) {
  2435.     log_info(LD_REND, "There's no consensus, so I can't tell if I'm a hidden "
  2436.              "service directory");
  2437.     return 0;
  2438.   }
  2439.   rs = networkstatus_vote_find_entry(c, me->cache_info.identity_digest);
  2440.   if (!rs) {
  2441.     log_info(LD_REND, "We're not listed in the consensus, so we're not "
  2442.              "being a hidden service directory.");
  2443.     return 0;
  2444.   }
  2445.   if (!rs->is_hs_dir) {
  2446.     log_info(LD_REND, "We're not listed as a hidden service directory in "
  2447.              "the consensus, so we won't be one.");
  2448.     return 0;
  2449.   }
  2450.   return 1;
  2451. }
  2452. /** Return true if this node is responsible for storing the descriptor ID
  2453.  * in <b>query</b> and false otherwise. */
  2454. int
  2455. hid_serv_responsible_for_desc_id(const char *query)
  2456. {
  2457.   routerinfo_t *me;
  2458.   routerstatus_t *last_rs;
  2459.   const char *my_id, *last_id;
  2460.   int result;
  2461.   smartlist_t *responsible;
  2462.   if (!hid_serv_acting_as_directory())
  2463.     return 0;
  2464.   if (!(me = router_get_my_routerinfo()))
  2465.     return 0; /* This is redundant, but let's be paranoid. */
  2466.   my_id = me->cache_info.identity_digest;
  2467.   responsible = smartlist_create();
  2468.   if (hid_serv_get_responsible_directories(responsible, query) < 0) {
  2469.     smartlist_free(responsible);
  2470.     return 0;
  2471.   }
  2472.   last_rs = smartlist_get(responsible, smartlist_len(responsible)-1);
  2473.   last_id = last_rs->identity_digest;
  2474.   result = rend_id_is_in_interval(my_id, query, last_id);
  2475.   smartlist_free(responsible);
  2476.   return result;
  2477. }