]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
relay: Refactor can extend over IPv6 checks
authorteor <teor@torproject.org>
Wed, 29 Apr 2020 20:47:46 +0000 (06:47 +1000)
committerteor <teor@torproject.org>
Wed, 29 Apr 2020 20:54:42 +0000 (06:54 +1000)
Split "can extend over IPv6" and "has advertised IPv6 ORPort" into
separate functions. They currently have the same result, but this may
change in 33818 with ExtendAllowIPv6Addresses.

Part of 33817.

src/feature/relay/circuitbuild_relay.c
src/feature/relay/router.c
src/feature/relay/router.h
src/test/test_circuitbuild.c

index 75b2767b82a2009d4f7615eb235c9c7b161d3405..b89866b477a870072e99eb6c726c8f147fa3afa3 100644 (file)
@@ -251,7 +251,7 @@ STATIC const tor_addr_port_t *
 circuit_choose_ip_ap_for_extend(const tor_addr_port_t *ipv4_ap,
                                 const tor_addr_port_t *ipv6_ap)
 {
-  const bool ipv6_supported = router_has_advertised_ipv6_orport(get_options());
+  const bool ipv6_supported = router_can_extend_over_ipv6(get_options());
 
   /* If IPv6 is not supported, we can't use the IPv6 address. */
   if (!ipv6_supported) {
index b0a56012dbd41b0540c08bfe9a83391310385fce..2858371af5ab31385309d83086be314df99bd9ec 100644 (file)
@@ -1491,14 +1491,23 @@ router_get_advertised_ipv6_or_ap(const or_options_t *options,
 }
 
 /** Returns true if this router has an advertised IPv6 ORPort. */
-MOCK_IMPL(bool,
-router_has_advertised_ipv6_orport,(const or_options_t *options))
+bool
+router_has_advertised_ipv6_orport(const or_options_t *options)
 {
   tor_addr_port_t ipv6_ap;
   router_get_advertised_ipv6_or_ap(options, &ipv6_ap);
   return tor_addr_port_is_valid_ap(&ipv6_ap, 0);
 }
 
+/** Returns true if this router has an advertised IPv6 ORPort. */
+MOCK_IMPL(bool,
+router_can_extend_over_ipv6,(const or_options_t *options))
+{
+  /* We might add some extra checks here, such as ExtendAllowIPv6Addresses
+  * from ticket 33818. */
+  return router_has_advertised_ipv6_orport(options);
+}
+
 /** Return the port that we should advertise as our DirPort;
  * this is one of three possibilities:
  * The one that is passed as <b>dirport</b> if the DirPort option is 0, or
index 1a262a6799a18c9ff8463ee53390fd417f8bb597..39c550dd254bc106bc83ca169c9f24a8a2bac524 100644 (file)
@@ -68,8 +68,8 @@ uint16_t router_get_active_listener_port_by_type_af(int listener_type,
 uint16_t router_get_advertised_or_port(const or_options_t *options);
 void router_get_advertised_ipv6_or_ap(const or_options_t *options,
                                       tor_addr_port_t *ipv6_ap_out);
-MOCK_DECL(bool, router_has_advertised_ipv6_orport,(
-                                             const or_options_t *options));
+bool router_has_advertised_ipv6_orport(const or_options_t *options);
+MOCK_DECL(bool, router_can_extend_over_ipv6,(const or_options_t *options));
 uint16_t router_get_advertised_or_port_by_af(const or_options_t *options,
                                              sa_family_t family);
 uint16_t router_get_advertised_dir_port(const or_options_t *options,
index ed75d102b9d6592a91638cd9d7e3b8f4d7d25ef5..03fd176ead7cbf88c005b44d7e1243548737c475 100644 (file)
@@ -821,14 +821,14 @@ test_circuit_extend_lspec_valid(void *arg)
   tor_free(p_chan);
 }
 
-static bool router_has_ipv6_orport_result = false;
-static int mock_router_ipv6_orport_calls = 0;
+static bool can_extend_over_ipv6_result = false;
+static int mock_router_can_extend_over_ipv6_calls = 0;
 static bool
-mock_router_has_advertised_ipv6_orport(const or_options_t *options)
+mock_router_can_extend_over_ipv6(const or_options_t *options)
 {
   (void)options;
-  mock_router_ipv6_orport_calls++;
-  return router_has_ipv6_orport_result;
+  mock_router_can_extend_over_ipv6_calls++;
+  return can_extend_over_ipv6_result;
 }
 
 /* Test the different cases in circuit_choose_ip_ap_for_extend(). */
@@ -849,65 +849,65 @@ test_circuit_choose_ip_ap_for_extend(void *arg)
   MOCK(get_options, mock_get_options);
   mocked_options = fake_options;
 
-  MOCK(router_has_advertised_ipv6_orport,
-       mock_router_has_advertised_ipv6_orport);
-  router_has_ipv6_orport_result = true;
-  mock_router_ipv6_orport_calls = 0;
+  MOCK(router_can_extend_over_ipv6,
+       mock_router_can_extend_over_ipv6);
+  can_extend_over_ipv6_result = true;
+  mock_router_can_extend_over_ipv6_calls = 0;
 
   /* No valid addresses */
-  router_has_ipv6_orport_result = true;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = true;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, NULL), OP_EQ, NULL);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
-  router_has_ipv6_orport_result = false;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = false;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, NULL), OP_EQ, NULL);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
   /* One valid address: IPv4 */
-  router_has_ipv6_orport_result = true;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = true;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, NULL), OP_EQ, &ipv4_ap);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
-  router_has_ipv6_orport_result = false;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = false;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, NULL), OP_EQ, &ipv4_ap);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
   /* One valid address: IPv6 */
-  router_has_ipv6_orport_result = true;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = true;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, &ipv6_ap), OP_EQ, &ipv6_ap);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
-  router_has_ipv6_orport_result = false;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = false;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, &ipv6_ap), OP_EQ, NULL);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
   /* Two valid addresses */
   const tor_addr_port_t *chosen_addr = NULL;
 
-  router_has_ipv6_orport_result = true;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = true;
+  mock_router_can_extend_over_ipv6_calls = 0;
   chosen_addr = circuit_choose_ip_ap_for_extend(&ipv4_ap, &ipv6_ap);
   tt_assert(chosen_addr == &ipv4_ap || chosen_addr == &ipv6_ap);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
-  router_has_ipv6_orport_result = false;
-  mock_router_ipv6_orport_calls = 0;
+  can_extend_over_ipv6_result = false;
+  mock_router_can_extend_over_ipv6_calls = 0;
   tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, &ipv6_ap),
             OP_EQ, &ipv4_ap);
-  tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
+  tt_int_op(mock_router_can_extend_over_ipv6_calls, OP_EQ, 1);
 
  done:
   UNMOCK(get_options);
   or_options_free(fake_options);
   mocked_options = NULL;
 
-  UNMOCK(router_has_advertised_ipv6_orport);
+  UNMOCK(router_can_extend_over_ipv6);
 
   tor_free(fake_options);
 }
@@ -968,9 +968,9 @@ test_circuit_open_connection_for_extend(void *arg)
   mock_channel_connect_calls = 0;
   mock_channel_connect_nchan = NULL;
 
-  MOCK(router_has_advertised_ipv6_orport,
-       mock_router_has_advertised_ipv6_orport);
-  router_has_ipv6_orport_result = true;
+  MOCK(router_can_extend_over_ipv6,
+       mock_router_can_extend_over_ipv6);
+  can_extend_over_ipv6_result = true;
 
   setup_full_capture_of_logs(LOG_INFO);
 
@@ -1110,7 +1110,7 @@ test_circuit_open_connection_for_extend(void *arg)
   or_options_free(fake_options);
   mocked_options = NULL;
 
-  UNMOCK(router_has_advertised_ipv6_orport);
+  UNMOCK(router_can_extend_over_ipv6);
 
   tor_free(ec);
   tor_free(circ->n_hop);