Combine router_get_advertised_or_port{,by_af_}() functions

This commit is contained in:
Nick Mathewson 2020-07-21 12:34:56 -04:00
parent 39146383fc
commit f478080bd0
5 changed files with 27 additions and 43 deletions

View File

@ -3168,9 +3168,9 @@ retry_all_listeners(smartlist_t *new_conns, int close_all_noncontrol)
smartlist_t *replacements = smartlist_new(); smartlist_t *replacements = smartlist_new();
const or_options_t *options = get_options(); const or_options_t *options = get_options();
int retval = 0; int retval = 0;
const uint16_t old_or_port = router_get_advertised_or_port(options); const uint16_t old_or_port = router_get_advertised_or_port(options, AF_INET);
const uint16_t old_or_port_ipv6 = const uint16_t old_or_port_ipv6 =
router_get_advertised_or_port_by_af(options,AF_INET6); router_get_advertised_or_port(options,AF_INET6);
const uint16_t old_dir_port = router_get_advertised_dir_port(options, 0); const uint16_t old_dir_port = router_get_advertised_dir_port(options, 0);
SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) {
@ -3241,9 +3241,8 @@ retry_all_listeners(smartlist_t *new_conns, int close_all_noncontrol)
SMARTLIST_FOREACH(replacements, listener_replacement_t *, r, tor_free(r)); SMARTLIST_FOREACH(replacements, listener_replacement_t *, r, tor_free(r));
smartlist_free(replacements); smartlist_free(replacements);
if (old_or_port != router_get_advertised_or_port(options) || if (old_or_port != router_get_advertised_or_port(options, AF_INET) ||
old_or_port_ipv6 != router_get_advertised_or_port_by_af(options, old_or_port_ipv6 != router_get_advertised_or_port(options, AF_INET6) ||
AF_INET6) ||
old_dir_port != router_get_advertised_dir_port(options, 0)) { old_dir_port != router_get_advertised_dir_port(options, 0)) {
/* Our chosen ORPort or DirPort is not what it used to be: the /* Our chosen ORPort or DirPort is not what it used to be: the
* descriptor we had (if any) should be regenerated. (We won't * descriptor we had (if any) should be regenerated. (We won't

View File

@ -4725,7 +4725,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
voter->address = hostname; voter->address = hostname;
tor_addr_copy(&voter->ipv4_addr, &addr); tor_addr_copy(&voter->ipv4_addr, &addr);
voter->ipv4_dirport = router_get_advertised_dir_port(options, 0); voter->ipv4_dirport = router_get_advertised_dir_port(options, 0);
voter->ipv4_orport = router_get_advertised_or_port(options); voter->ipv4_orport = router_get_advertised_or_port(options, AF_INET);
voter->contact = tor_strdup(contact); voter->contact = tor_strdup(contact);
if (options->V3AuthUseLegacyKey) { if (options->V3AuthUseLegacyKey) {
authority_cert_t *c = get_my_v3_legacy_cert(); authority_cert_t *c = get_my_v3_legacy_cert();

View File

@ -1154,7 +1154,7 @@ init_keys(void)
router_get_advertised_ipv6_or_ap(options, &ipv6_orport); router_get_advertised_ipv6_or_ap(options, &ipv6_orport);
ds = trusted_dir_server_new(options->Nickname, NULL, ds = trusted_dir_server_new(options->Nickname, NULL,
router_get_advertised_dir_port(options, 0), router_get_advertised_dir_port(options, 0),
router_get_advertised_or_port(options), router_get_advertised_or_port(options,AF_INET),
&ipv6_orport, &ipv6_orport,
digest, digest,
v3_digest, v3_digest,
@ -1309,7 +1309,7 @@ decide_to_advertise_dir_impl(const or_options_t *options,
if (dir_port && !router_get_advertised_dir_port(options, dir_port)) if (dir_port && !router_get_advertised_dir_port(options, dir_port))
return 0; return 0;
if (supports_tunnelled_dir_requests && if (supports_tunnelled_dir_requests &&
!router_get_advertised_or_port(options)) !router_get_advertised_or_port(options, AF_INET))
return 0; return 0;
/* Part two: consider config options that could make us choose to /* Part two: consider config options that could make us choose to
@ -1390,7 +1390,7 @@ decide_if_publishable_server(void)
return 0; return 0;
if (authdir_mode(options)) if (authdir_mode(options))
return 1; return 1;
if (!router_get_advertised_or_port(options)) if (!router_get_advertised_or_port(options, AF_INET))
return 0; return 0;
if (!router_orport_seems_reachable(options, AF_INET)) { if (!router_orport_seems_reachable(options, AF_INET)) {
// We have an ipv4 orport, and it doesn't seem reachable. // We have an ipv4 orport, and it doesn't seem reachable.
@ -1459,20 +1459,12 @@ router_get_active_listener_port_by_type_af(int listener_type,
return 0; return 0;
} }
/** Return the port that we should advertise as our ORPort; this is either /** Return the port that we should advertise as our ORPort in a given address
* the one configured in the ORPort option, or the one we actually bound to * family; this is either the one configured in the ORPort option, or the one
* if ORPort is "auto". Returns 0 if no port is found. */ * we actually bound to if ORPort is "auto". Returns 0 if no port is found. */
uint16_t uint16_t
router_get_advertised_or_port(const or_options_t *options) router_get_advertised_or_port(const or_options_t *options,
{ sa_family_t family)
return router_get_advertised_or_port_by_af(options, AF_INET);
}
/** As router_get_advertised_or_port(), but allows an address family argument.
*/
uint16_t
router_get_advertised_or_port_by_af(const or_options_t *options,
sa_family_t family)
{ {
int port = portconf_get_first_advertised_port(CONN_TYPE_OR_LISTENER, int port = portconf_get_first_advertised_port(CONN_TYPE_OR_LISTENER,
family); family);
@ -1505,8 +1497,7 @@ router_get_advertised_ipv6_or_ap(const or_options_t *options,
const tor_addr_t *addr = portconf_get_first_advertised_addr( const tor_addr_t *addr = portconf_get_first_advertised_addr(
CONN_TYPE_OR_LISTENER, CONN_TYPE_OR_LISTENER,
AF_INET6); AF_INET6);
const uint16_t port = router_get_advertised_or_port_by_af( const uint16_t port = router_get_advertised_or_port(options,
options,
AF_INET6); AF_INET6);
if (!addr || port == 0) { if (!addr || port == 0) {
@ -2065,13 +2056,13 @@ router_build_fresh_unsigned_routerinfo,(routerinfo_t **ri_out))
/* IPv4. */ /* IPv4. */
tor_addr_copy(&ri->ipv4_addr, &ipv4_addr); tor_addr_copy(&ri->ipv4_addr, &ipv4_addr);
ri->ipv4_orport = router_get_advertised_or_port_by_af(options, AF_INET); ri->ipv4_orport = router_get_advertised_or_port(options, AF_INET);
ri->ipv4_dirport = router_get_advertised_dir_port(options, 0); ri->ipv4_dirport = router_get_advertised_dir_port(options, 0);
/* IPv6. Do not publish an IPv6 if we don't have an ORPort that can be used /* IPv6. Do not publish an IPv6 if we don't have an ORPort that can be used
* with the address. This is possible for instance if the ORPort is * with the address. This is possible for instance if the ORPort is
* IPv4Only. */ * IPv4Only. */
ipv6_orport = router_get_advertised_or_port_by_af(options, AF_INET6); ipv6_orport = router_get_advertised_or_port(options, AF_INET6);
if (have_v6 && ipv6_orport != 0) { if (have_v6 && ipv6_orport != 0) {
tor_addr_copy(&ri->ipv6_addr, &ipv6_addr); tor_addr_copy(&ri->ipv6_addr, &ipv6_addr);
ri->ipv6_orport = ipv6_orport; ri->ipv6_orport = ipv6_orport;

View File

@ -65,13 +65,12 @@ int init_keys_client(void);
uint16_t router_get_active_listener_port_by_type_af(int listener_type, uint16_t router_get_active_listener_port_by_type_af(int listener_type,
sa_family_t family); sa_family_t family);
uint16_t router_get_advertised_or_port(const or_options_t *options);
void router_get_advertised_ipv6_or_ap(const or_options_t *options, void router_get_advertised_ipv6_or_ap(const or_options_t *options,
tor_addr_port_t *ipv6_ap_out); tor_addr_port_t *ipv6_ap_out);
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)); 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, uint16_t router_get_advertised_or_port(const or_options_t *options,
sa_family_t family); sa_family_t family);
uint16_t router_get_advertised_dir_port(const or_options_t *options, uint16_t router_get_advertised_dir_port(const or_options_t *options,
uint16_t dirport); uint16_t dirport);

View File

@ -512,8 +512,7 @@ test_router_get_advertised_or_port(void *arg)
tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0"); tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0");
// And one failing case of router_get_advertised_or_port(). // And one failing case of router_get_advertised_or_port().
tt_int_op(0, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET)); tt_int_op(0, OP_EQ, router_get_advertised_or_port(opts, AF_INET));
tt_int_op(0, OP_EQ, router_get_advertised_or_port(opts));
// Set up a couple of configured ports. // Set up a couple of configured ports.
config_line_append(&opts->ORPort_lines, "ORPort", "[1234::5678]:auto"); config_line_append(&opts->ORPort_lines, "ORPort", "[1234::5678]:auto");
@ -522,13 +521,12 @@ test_router_get_advertised_or_port(void *arg)
tt_assert(r == 0); tt_assert(r == 0);
// There are no listeners, so the "auto" case will turn up no results. // There are no listeners, so the "auto" case will turn up no results.
tt_int_op(0, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET6)); tt_int_op(0, OP_EQ, router_get_advertised_or_port(opts, AF_INET6));
router_get_advertised_ipv6_or_ap(opts, &ipv6); router_get_advertised_ipv6_or_ap(opts, &ipv6);
tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0"); tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0");
// This will return the matching value from the configured port. // This will return the matching value from the configured port.
tt_int_op(9999, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET)); tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts, AF_INET));
tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts));
// Now set up a dummy listener. // Now set up a dummy listener.
MOCK(get_connection_array, mock_get_connection_array); MOCK(get_connection_array, mock_get_connection_array);
@ -538,7 +536,7 @@ test_router_get_advertised_or_port(void *arg)
smartlist_add(fake_connection_array, TO_CONN(listener)); smartlist_add(fake_connection_array, TO_CONN(listener));
// We should get a port this time. // We should get a port this time.
tt_int_op(54321, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET6)); tt_int_op(54321, OP_EQ, router_get_advertised_or_port(opts, AF_INET6));
// Test one succeeding case of router_get_advertised_ipv6_or_ap(). // Test one succeeding case of router_get_advertised_ipv6_or_ap().
router_get_advertised_ipv6_or_ap(opts, &ipv6); router_get_advertised_ipv6_or_ap(opts, &ipv6);
@ -546,8 +544,7 @@ test_router_get_advertised_or_port(void *arg)
"[1234::5678]:54321"); "[1234::5678]:54321");
// This will return the matching value from the configured port. // This will return the matching value from the configured port.
tt_int_op(9999, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET)); tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts, AF_INET));
tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts));
done: done:
or_options_free(opts); or_options_free(opts);
@ -576,25 +573,23 @@ test_router_get_advertised_or_port_localhost(void *arg)
router_get_advertised_ipv6_or_ap(opts, &ipv6); router_get_advertised_ipv6_or_ap(opts, &ipv6);
tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0"); tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::]:0");
// But the lower-level function should still report the correct value // But the lower-level function should still report the correct value
tt_int_op(9999, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET6)); tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts, AF_INET6));
// The IPv4 checks are done in resolve_my_address(), which doesn't use // The IPv4 checks are done in resolve_my_address(), which doesn't use
// ORPorts so we can't test them here. (See #33681.) Both these lower-level // ORPorts so we can't test them here. (See #33681.) Both these lower-level
// functions should still report the correct value. // functions should still report the correct value.
tt_int_op(8888, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET)); tt_int_op(8888, OP_EQ, router_get_advertised_or_port(opts, AF_INET));
tt_int_op(8888, OP_EQ, router_get_advertised_or_port(opts));
// Now try with a fake authority set up. // Now try with a fake authority set up.
config_line_append(&opts->DirAuthorities, "DirAuthority", config_line_append(&opts->DirAuthorities, "DirAuthority",
"127.0.0.1:1066 " "127.0.0.1:1066 "
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
tt_int_op(9999, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET6)); tt_int_op(9999, OP_EQ, router_get_advertised_or_port(opts, AF_INET6));
router_get_advertised_ipv6_or_ap(opts, &ipv6); router_get_advertised_ipv6_or_ap(opts, &ipv6);
tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::1]:9999"); tt_str_op(fmt_addrport(&ipv6.addr, ipv6.port), OP_EQ, "[::1]:9999");
tt_int_op(8888, OP_EQ, router_get_advertised_or_port_by_af(opts, AF_INET)); tt_int_op(8888, OP_EQ, router_get_advertised_or_port(opts, AF_INET));
tt_int_op(8888, OP_EQ, router_get_advertised_or_port(opts));
done: done:
or_options_free(opts); or_options_free(opts);