Commit cc896f7c authored by Roger Dingledine's avatar Roger Dingledine
Browse files

Teach resolve_my_address() to return a cached answer

I didn't make any of the callers use this feature yet.
parent 719940df
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -1908,12 +1908,16 @@ static uint32_t last_resolved_addr = 0;
 *     holding that hostname. (If we didn't get our address by resolving a
 *     hostname, set *<b>hostname_out</b> to NULL.)
 *
 * If <b>use_cached_addr</b> is true, and we have a plausible answer,
 * provide that answer and return.
 *
 * XXXX ipv6
 */
int
resolve_my_address(int warn_severity, const or_options_t *options,
                   uint32_t *addr_out,
                   const char **method_out, char **hostname_out)
                   const char **method_out, char **hostname_out,
                   int use_cached_addr)
{
  struct in_addr in;
  uint32_t addr; /* host order */
@@ -1930,6 +1934,18 @@ resolve_my_address(int warn_severity, const or_options_t *options,

  tor_assert(addr_out);

  /*
   * Step zero: if used_cached_addr is true, and we have a cached answer,
   * just return it and be done.
   */

  if (use_cached_addr && last_resolved_addr) {
    *addr_out = last_resolved_addr;
    if (method_out)
      *method_out = "CACHED";
    return 0;
  }

  /*
   * Step one: Fill in 'hostname' to be our best guess.
   */
@@ -2343,7 +2359,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
  if (authdir_mode(options)) {
    /* confirm that our address isn't broken, so we can complain now */
    uint32_t tmp;
    if (resolve_my_address(LOG_WARN, options, &tmp, NULL, NULL) < 0)
    if (resolve_my_address(LOG_WARN, options, &tmp, NULL, NULL, 0) < 0)
      REJECT("Failed to resolve/guess local address. See logs for details.");
  }

+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ setopt_err_t options_trial_assign(config_line_t *list, int use_defaults,

int resolve_my_address(int warn_severity, const or_options_t *options,
                       uint32_t *addr_out,
                       const char **method_out, char **hostname_out);
                       const char **method_out, char **hostname_out,
                       int use_cached_addr);
int is_local_addr(const tor_addr_t *addr);
void options_init(or_options_t *options);
char *options_dump(const or_options_t *options, int minimal);
+2 −2
Original line number Diff line number Diff line
@@ -2750,7 +2750,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
  tor_assert(private_key);
  tor_assert(cert);

  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname, 0)<0) {
    log_warn(LD_NET, "Couldn't resolve my hostname");
    return NULL;
  }
@@ -2960,7 +2960,7 @@ generate_v2_networkstatus_opinion(void)

  private_key = get_server_identity_key();

  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname, 0)<0) {
    log_warn(LD_NET, "Couldn't resolve my hostname");
    goto done;
  }
+3 −3
Original line number Diff line number Diff line
@@ -1712,7 +1712,7 @@ static int router_guess_address_from_dir_headers(uint32_t *guess);
int
router_pick_published_address(const or_options_t *options, uint32_t *addr)
{
  if (resolve_my_address(LOG_INFO, options, addr, NULL, NULL) < 0) {
  if (resolve_my_address(LOG_INFO, options, addr, NULL, NULL, 0) < 0) {
    log_info(LD_CONFIG, "Could not determine our address locally. "
             "Checking if directory headers provide any hints.");
    if (router_guess_address_from_dir_headers(addr) < 0) {
@@ -2103,7 +2103,7 @@ check_descriptor_ipaddress_changed(time_t now)

  /* XXXX ipv6 */
  prev = desc_routerinfo->addr;
  if (resolve_my_address(LOG_INFO, options, &cur, &method, &hostname) < 0) {
  if (resolve_my_address(LOG_INFO, options, &cur, &method, &hostname, 0) < 0) {
    log_info(LD_CONFIG,"options->Address didn't resolve into an IP.");
    return;
  }
@@ -2159,7 +2159,7 @@ router_new_address_suggestion(const char *suggestion,
  }

  /* XXXX ipv6 */
  if (resolve_my_address(LOG_INFO, options, &cur, NULL, NULL) >= 0) {
  if (resolve_my_address(LOG_INFO, options, &cur, NULL, NULL, 0) >= 0) {
    /* We're all set -- we already know our address. Great. */
    tor_addr_from_ipv4h(&last_guessed_ip, cur); /* store it in case we
                                                   need it later */
+2 −1
Original line number Diff line number Diff line
@@ -3951,7 +3951,8 @@ trusted_dir_server_new(const char *nickname, const char *address,
  dir_server_t *result;

  if (!address) { /* The address is us; we should guess. */
    if (resolve_my_address(LOG_WARN, get_options(), &a, NULL, &hostname) < 0) {
    if (resolve_my_address(LOG_WARN, get_options(),
                           &a, NULL, &hostname, 0) < 0) {
      log_warn(LD_CONFIG,
               "Couldn't find a suitable address when adding ourself as a "
               "trusted directory server.");