[tor-commits] [tor/master] addr: Refactor last resolved address cache accessors

dgoulet at torproject.org dgoulet at torproject.org
Wed Jun 24 17:58:40 UTC 2020


commit 7795dd7ef6fa01202b91d20a0ac82eda1456cef8
Author: David Goulet <dgoulet at torproject.org>
Date:   Tue Jun 23 10:06:19 2020 -0400

    addr: Refactor last resolved address cache accessors
    
    Series of things done in this commit:
    
      1. Rename the functions to better reflect the namespace of the file.
    
      2. Make both reset and get function to operate on the last_resolved_addrs
         cache that is per family.
    
      3. Make the get function to take a tor_addr_t.
    
      4. Change all callsite to use the new convention.
    
    Part of #33233
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 src/app/config/resolve_addr.c       | 19 ++++++++++++-------
 src/app/config/resolve_addr.h       |  4 ++--
 src/core/mainloop/connection.c      |  2 +-
 src/feature/relay/relay_find_addr.c | 26 +++++++++++++++++++-------
 4 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/src/app/config/resolve_addr.c b/src/app/config/resolve_addr.c
index 9a7fbde16..1e861217d 100644
--- a/src/app/config/resolve_addr.c
+++ b/src/app/config/resolve_addr.c
@@ -47,18 +47,23 @@ static tor_addr_t last_resolved_addrs[IDX_SIZE];
 /** Last value actually set by resolve_my_address. */
 static uint32_t last_resolved_addr_v4 = 0;
 
-/** Accessor for last_resolved_addr_v4 from outside this file. */
-uint32_t
-get_last_resolved_addr_v4(void)
+/** Copy the last resolved address of family into addr_out.
+ *
+ * If not last resolved address existed, the addr_out is a null address (use
+ * tor_addr_is_null()). */
+void
+resolved_addr_get_last(int family, tor_addr_t *addr_out)
 {
-  return last_resolved_addr_v4;
+  tor_addr_copy(addr_out, &last_resolved_addrs[family]);
 }
 
-/** Reset last_resolved_addr_v4 from outside this file. */
+/** Reset the last resolved address of family.
+ *
+ * This makes it null address. */
 void
-reset_last_resolved_addr_v4(void)
+resolved_addr_reset_last(int family)
 {
-  last_resolved_addr_v4 = 0;
+  tor_addr_make_null(&last_resolved_addrs[family], family);
 }
 
 /** @brief Return true iff the given IP address can be used as a valid
diff --git a/src/app/config/resolve_addr.h b/src/app/config/resolve_addr.h
index 2cd27d170..17e940203 100644
--- a/src/app/config/resolve_addr.h
+++ b/src/app/config/resolve_addr.h
@@ -19,8 +19,8 @@ bool find_my_address(const or_options_t *options, int family,
                      int warn_severity, tor_addr_t *addr_out,
                      const char **method_out, char **hostname_out);
 
-uint32_t get_last_resolved_addr_v4(void);
-void reset_last_resolved_addr_v4(void);
+void resolved_addr_get_last(int family, tor_addr_t *addr_out);
+void resolved_addr_reset_last(int family);
 
 MOCK_DECL(int, is_local_addr, (const tor_addr_t *addr));
 
diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c
index 9fff71ee0..3ebe18cd3 100644
--- a/src/core/mainloop/connection.c
+++ b/src/core/mainloop/connection.c
@@ -4870,7 +4870,7 @@ client_check_address_changed(tor_socket_t sock)
     smartlist_clear(outgoing_addrs);
     smartlist_add(outgoing_addrs, tor_memdup(&out_addr, sizeof(tor_addr_t)));
     /* We'll need to resolve ourselves again. */
-    reset_last_resolved_addr_v4();
+    resolved_addr_reset_last(AF_INET);
     /* Okay, now change our keys. */
     ip_address_changed(1);
   }
diff --git a/src/feature/relay/relay_find_addr.c b/src/feature/relay/relay_find_addr.c
index cc08914f6..70cb77d4b 100644
--- a/src/feature/relay/relay_find_addr.c
+++ b/src/feature/relay/relay_find_addr.c
@@ -45,7 +45,7 @@ void
 router_new_address_suggestion(const char *suggestion,
                               const dir_connection_t *d_conn)
 {
-  tor_addr_t addr;
+  tor_addr_t addr, last_resolved_addr;
   uint32_t cur = 0;             /* Current IPv4 address.  */
   const or_options_t *options = get_options();
 
@@ -64,14 +64,22 @@ router_new_address_suggestion(const char *suggestion,
   }
 
   /* XXXX ipv6 */
-  cur = get_last_resolved_addr_v4();
-  if (cur ||
-      resolve_my_address_v4(LOG_INFO, options, &cur, NULL, NULL) >= 0) {
+  resolved_addr_get_last(AF_INET, &last_resolved_addr);
+  if (!tor_addr_is_null(&last_resolved_addr)) {
+    /* Lets use this one. */
+    tor_addr_copy(&last_guessed_ip, &last_resolved_addr);
+    return;
+  }
+
+  /* Attempt to find our address. */
+  if (resolve_my_address_v4(LOG_INFO, options, &cur, NULL, NULL) >= 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 */
     return;
   }
+
+  /* Consider the suggestion from the directory. */
   if (tor_addr_is_internal(&addr, 0)) {
     /* Don't believe anybody who says our IP is, say, 127.0.0.1. */
     return;
@@ -111,10 +119,14 @@ MOCK_IMPL(int,
 router_pick_published_address, (const or_options_t *options, uint32_t *addr,
                                 int cache_only))
 {
-  /* First, check the cached output from resolve_my_address(). */
-  *addr = get_last_resolved_addr_v4();
-  if (*addr)
+  tor_addr_t last_resolved_addr;
+
+  /* First, check the cached output from resolve_my_address_v4(). */
+  resolved_addr_get_last(AF_INET, &last_resolved_addr);
+  if (!tor_addr_is_null(&last_resolved_addr)) {
+    *addr = tor_addr_to_ipv4h(&last_resolved_addr);
     return 0;
+  }
 
   /* Second, consider doing a resolve attempt right here. */
   if (!cache_only) {





More information about the tor-commits mailing list