Authorities should assume their configured IPv6 address is reachable, just like they do for IPv4.
Also strange: dannenberg votes on ReachableIPv6 but is not itself granted ReachableIPv6
That's not surprising: voting on ReachableIPv6 requires outbound IPv6 connectivity (like IPv6Exit).
But receiving ReachableIPv6 requires inbound connectivity to an IPv6 ORPort. Does it declare one in its descriptor?
If it does, I'll email the dirauth list to let them know there's a misconfiguration, because it could end up with dannenberg not being marked Running,
If an authority votes for its own IPv6 address, and it's the only one to do this, then its IPv6 address will always be in the consensus, even if it's actually unreachable. (A single IPv6-voting authority can determine an IPv6 address by voting for it.)
When we make IPv6 mandatory on authorities, and change the consensus method so IPv6 votes are a simple majority, then we can fix this issue.
Trac: Sponsor: SponsorV-can toN/A Milestone: Tor: 0.3.3.x-final to Tor: very long term Keywords: IPv6 deleted, needs-mandatory-IPv6 added
Hang on, we will need authorities to unconditionally advertise their own IPv6 address.
When we implement relay IPv6 reachability checks, relays in a new network will need IPv6 addresses to bootstrap off.
If an authority votes for its own IPv6 address, and it's the only one to do this, then its IPv6 address will always be in the consensus, even if it's actually unreachable. (A single IPv6-voting authority can determine an IPv6 address by voting for it.)
This is ok, because if we have a majority of authorities on IPv6 (that doesn't include that authority), that authority won't be marked Running, and its operator will notice.
Also, we should do reachability checks on authority IPv6 addresses, but just warn if they fail. This is what we do for authority IPv4 addresses.
Trac: Milestone: Tor: very long term to Tor: 0.3.3.x-final Parent: #20916 (moved)toN/A
If an authority has an IPv6 ORPort, it should assume its own IPv6 ORPort is reachable, and vote for it.
This is what authorities do for their own Reachable flag, so we should be able to use the same code for this fix.
Hi! I'd suggest that instead of overriding the last_reachable6 flag in node, we should override the place where we assign the ipv6_addr in the routerstatus:
if (options->AuthDirHasIPv6Connectivity == 1 && !tor_addr_is_null(&ri->ipv6_addr) && node->last_reachable6 >= now - REACHABLE_TIMEOUT) { /* We're configured as having IPv6 connectivity. There's an IPv6 OR port and it's reachable so copy it to the routerstatus. */ tor_addr_copy(&rs->ipv6_addr, &ri->ipv6_addr); rs->ipv6_orport = ri->ipv6_orport;
(in set_routerstatus_from_routerinfo())
Instead of checking whether last_reachable6 is recent, we could check whether it is recent OR the router is ourself.
Note that I think this change will make the test expression above way too complicated, and we should extract it into its own function, maybe called something like should_publish_node_ipv6().