Browse Source

Per-listener option to prefer IPv6 automaps when possible.

Nick Mathewson 11 years ago
parent
commit
8d080d0b01
4 changed files with 22 additions and 3 deletions
  1. 8 1
      src/or/config.c
  2. 3 0
      src/or/connection.c
  3. 8 2
      src/or/connection_edge.c
  4. 3 0
      src/or/or.h

+ 8 - 1
src/or/config.c

@@ -4605,6 +4605,7 @@ port_cfg_new(void)
   port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t));
   cfg->ipv4_traffic = 1;
   cfg->cache_ipv4_answers = 1;
+  cfg->prefer_ipv6_virtaddr = 1;
   return cfg;
 }
 
@@ -4789,6 +4790,7 @@ parse_port_config(smartlist_t *out,
       cfg->no_listen = 1;
       cfg->bind_ipv4_only = 1;
       cfg->ipv4_traffic = 1;
+      cfg->prefer_ipv6_virtaddr = 1;
       smartlist_add(out, cfg);
     }
 
@@ -4853,7 +4855,8 @@ parse_port_config(smartlist_t *out,
       bind_ipv4_only = 0, bind_ipv6_only = 0,
       ipv4_traffic = 1, ipv6_traffic = 0, prefer_ipv6 = 0,
       cache_ipv4 = 1, use_cached_ipv4 = 0,
-      cache_ipv6 = 0, use_cached_ipv6 = 0;
+      cache_ipv6 = 0, use_cached_ipv6 = 0,
+      prefer_ipv6_automap = 1;
 
     smartlist_split_string(elts, ports->value, NULL,
                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
@@ -5008,6 +5011,9 @@ parse_port_config(smartlist_t *out,
         } else if (!strcasecmp(elt, "UseDNSCache")) {
           use_cached_ipv4 = use_cached_ipv6 = ! no;
           continue;
+        } else if (!strcasecmp(elt, "PreferIPv6Automap")) {
+          prefer_ipv6_automap = ! no;
+          continue;
         }
 
         if (!strcasecmpend(elt, "s"))
@@ -5066,6 +5072,7 @@ parse_port_config(smartlist_t *out,
       cfg->cache_ipv6_answers = cache_ipv6;
       cfg->use_cached_ipv4_answers = use_cached_ipv4;
       cfg->use_cached_ipv6_answers = use_cached_ipv6;
+      cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap;
 
       smartlist_add(out, cfg);
     }

+ 3 - 0
src/or/connection.c

@@ -1134,6 +1134,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
   lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers;
   lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers;
   lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers;
+  lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr;
 
   if (connection_add(conn) < 0) { /* no space, forget it */
     log_warn(LD_NET,"connection_add for listener failed. Giving up.");
@@ -1376,6 +1377,8 @@ connection_init_accepted_conn(connection_t *conn,
         listener->use_cached_ipv4_answers;
       TO_ENTRY_CONN(conn)->use_cached_ipv6_answers =
         listener->use_cached_ipv6_answers;
+      TO_ENTRY_CONN(conn)->prefer_ipv6_virtaddr =
+        listener->prefer_ipv6_virtaddr;
 
       switch (TO_CONN(listener)->type) {
         case CONN_TYPE_AP_LISTENER:

+ 8 - 2
src/or/connection_edge.c

@@ -932,9 +932,15 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
     automap = addressmap_address_should_automap(socks->address, options);
     if (automap) {
       const char *new_addr;
-      /*XXXX IPv6 Sometimes this should be RESOLVED_TYPE_IPV6 */
+      int addr_type = RESOLVED_TYPE_IPV4;
+      if (conn->socks_request->socks_version != 4) {
+        if (!conn->ipv4_traffic_ok ||
+            (conn->ipv6_traffic_ok && conn->prefer_ipv6_traffic) ||
+            conn->prefer_ipv6_virtaddr)
+          addr_type = RESOLVED_TYPE_IPV6;
+      }
       new_addr = addressmap_register_virtual_address(
-                              RESOLVED_TYPE_IPV4, tor_strdup(socks->address));
+                                    addr_type, tor_strdup(socks->address));
       if (! new_addr) {
         log_warn(LD_APP, "Unable to automap address %s",
                  escaped_safe_str(socks->address));

+ 3 - 0
src/or/or.h

@@ -1242,6 +1242,7 @@ typedef struct listener_connection_t {
   unsigned int cache_ipv6_answers : 1;
   unsigned int use_cached_ipv4_answers : 1;
   unsigned int use_cached_ipv6_answers : 1;
+  unsigned int prefer_ipv6_virtaddr : 1;
 
 } listener_connection_t;
 
@@ -1556,6 +1557,7 @@ typedef struct entry_connection_t {
   unsigned int cache_ipv6_answers : 1;
   unsigned int use_cached_ipv4_answers : 1;
   unsigned int use_cached_ipv6_answers : 1;
+  unsigned int prefer_ipv6_virtaddr : 1;
 
 } entry_connection_t;
 
@@ -3107,6 +3109,7 @@ typedef struct port_cfg_t {
   unsigned int cache_ipv6_answers : 1;
   unsigned int use_cached_ipv4_answers : 1;
   unsigned int use_cached_ipv6_answers : 1;
+  unsigned int prefer_ipv6_virtaddr : 1;
 
   /* Unix sockets only: */
   /** Path for an AF_UNIX address */