tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

circuitbuild_relay.c (20348B)


      1 /* Copyright (c) 2001 Matej Pfajfar.
      2 * Copyright (c) 2001-2004, Roger Dingledine.
      3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      5 /* See LICENSE for licensing information */
      6 
      7 /**
      8 * @file circuitbuild_relay.c
      9 * @brief Implements the details of exteding circuits (by relaying extend
     10 * cells as create cells, and answering create cells).
     11 *
     12 * On the server side, this module handles the logic of responding to
     13 * RELAY_EXTEND requests, using circuit_extend() and onionskin_answer().
     14 *
     15 * The shared client and server code is in core/or/circuitbuild.c.
     16 **/
     17 
     18 #include "orconfig.h"
     19 #include "feature/relay/circuitbuild_relay.h"
     20 
     21 #include "lib/crypt_ops/crypto_rand.h"
     22 
     23 #include "core/or/or.h"
     24 #include "app/config/config.h"
     25 
     26 #include "core/crypto/relay_crypto.h"
     27 
     28 #include "core/or/cell_st.h"
     29 #include "core/or/circuit_st.h"
     30 #include "core/or/extend_info_st.h"
     31 #include "core/or/or_circuit_st.h"
     32 
     33 #include "core/or/channel.h"
     34 #include "core/or/circuitbuild.h"
     35 #include "core/or/circuitlist.h"
     36 #include "core/or/extendinfo.h"
     37 #include "core/or/onion.h"
     38 #include "core/or/relay.h"
     39 
     40 #include "feature/nodelist/nodelist.h"
     41 
     42 #include "feature/relay/router.h"
     43 #include "feature/relay/routermode.h"
     44 #include "feature/relay/selftest.h"
     45 
     46 /* Before replying to an extend cell, check the state of the circuit
     47 * <b>circ</b>, and the configured tor mode.
     48 *
     49 * <b>circ</b> must not be NULL.
     50 *
     51 * If the state and mode are valid, return 0.
     52 * Otherwise, if they are invalid, log a protocol warning, and return -1.
     53 */
     54 STATIC int
     55 circuit_extend_state_valid_helper(const struct circuit_t *circ)
     56 {
     57  if (!server_mode(get_options())) {
     58    circuitbuild_warn_client_extend();
     59    return -1;
     60  }
     61 
     62  IF_BUG_ONCE(!circ) {
     63    return -1;
     64  }
     65 
     66  if (circ->n_chan) {
     67    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
     68           "n_chan already set. Bug/attack. Closing.");
     69    return -1;
     70  }
     71 
     72  if (circ->n_hop) {
     73    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
     74           "conn to next hop already launched. Bug/attack. Closing.");
     75    return -1;
     76  }
     77 
     78  return 0;
     79 }
     80 
     81 /* Make sure the extend cell <b>ec</b> has an ed25519 link specifier.
     82 *
     83 * First, check that the RSA node id is valid.
     84 * If the node id is valid, add the ed25519 link specifier (if required),
     85 * and return 0.
     86 *
     87 * Otherwise, if the node id is invalid, log a protocol warning,
     88 * and return -1.(And do not modify the extend cell.)
     89 *
     90 * Must be called before circuit_extend_lspec_valid_helper().
     91 */
     92 STATIC int
     93 circuit_extend_add_ed25519_helper(struct extend_cell_t *ec)
     94 {
     95  IF_BUG_ONCE(!ec) {
     96    return -1;
     97  }
     98 
     99  /* Check if they asked us for 0000..0000. We support using
    100   * an empty fingerprint for the first hop (e.g. for a bridge relay),
    101   * but we don't want to let clients send us extend cells for empty
    102   * fingerprints -- a) because it opens the user up to a mitm attack,
    103   * and b) because it lets an attacker force the relay to hold open a
    104   * new TLS connection for each extend request. */
    105  if (tor_digest_is_zero((const char*)ec->node_id)) {
    106    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
    107           "Client asked me to extend without specifying an id_digest.");
    108    return -1;
    109  }
    110 
    111  /* Fill in ed_pubkey if it was not provided and we can infer it from
    112   * our networkstatus */
    113  if (ed25519_public_key_is_zero(&ec->ed_pubkey)) {
    114    const node_t *node = node_get_by_id((const char*)ec->node_id);
    115    const ed25519_public_key_t *node_ed_id = NULL;
    116    if (node &&
    117        node_supports_ed25519_link_authentication(node, 1) &&
    118        (node_ed_id = node_get_ed25519_id(node))) {
    119      ed25519_pubkey_copy(&ec->ed_pubkey, node_ed_id);
    120    }
    121  }
    122 
    123  return 0;
    124 }
    125 
    126 /* Make sure the extend cell <b>ec</b> has an IPv4 address if the relay
    127 * supports in, and if not, fill it in. */
    128 STATIC int
    129 circuit_extend_add_ipv4_helper(struct extend_cell_t *ec)
    130 {
    131  IF_BUG_ONCE(!ec) {
    132    return -1;
    133  }
    134 
    135  const node_t *node = node_get_by_id((const char *) ec->node_id);
    136  if (node) {
    137    tor_addr_port_t node_ipv4;
    138    node_get_prim_orport(node, &node_ipv4);
    139    if (tor_addr_is_null(&ec->orport_ipv4.addr) &&
    140        !tor_addr_is_null(&node_ipv4.addr)) {
    141      tor_addr_copy(&ec->orport_ipv4.addr, &node_ipv4.addr);
    142      ec->orport_ipv4.port = node_ipv4.port;
    143    }
    144  }
    145 
    146  return 0;
    147 }
    148 
    149 /* Make sure the extend cell <b>ec</b> has an IPv6 address if the relay
    150 * supports in, and if not, fill it in. */
    151 STATIC int
    152 circuit_extend_add_ipv6_helper(struct extend_cell_t *ec)
    153 {
    154  IF_BUG_ONCE(!ec) {
    155    return -1;
    156  }
    157 
    158  const node_t *node = node_get_by_id((const char *) ec->node_id);
    159  if (node) {
    160    tor_addr_port_t node_ipv6;
    161    node_get_pref_ipv6_orport(node, &node_ipv6);
    162    if (tor_addr_is_null(&ec->orport_ipv6.addr) &&
    163        !tor_addr_is_null(&node_ipv6.addr)) {
    164      tor_addr_copy(&ec->orport_ipv6.addr, &node_ipv6.addr);
    165      ec->orport_ipv6.port = node_ipv6.port;
    166    }
    167  }
    168 
    169  return 0;
    170 }
    171 
    172 /* Check if the address and port in the tor_addr_port_t <b>ap</b> are valid,
    173 * and are allowed by the current ExtendAllowPrivateAddresses config.
    174 *
    175 * If they are valid, return true.
    176 * Otherwise, if they are invalid, return false.
    177 *
    178 * If <b>log_zero_addrs</b> is true, log warnings about zero addresses at
    179 * <b>log_level</b>. If <b>log_internal_addrs</b> is true, log warnings about
    180 * internal addresses at <b>log_level</b>.
    181 */
    182 static bool
    183 circuit_extend_addr_port_is_valid(const struct tor_addr_port_t *ap,
    184                                  bool log_zero_addrs, bool log_internal_addrs,
    185                                  int log_level)
    186 {
    187  /* It's safe to print the family. But we don't want to print the address,
    188   * unless specifically configured to do so. (Zero addresses aren't sensitive,
    189   * But some internal addresses might be.)*/
    190 
    191  if (!tor_addr_port_is_valid_ap(ap, 0)) {
    192    if (log_zero_addrs) {
    193      log_fn(log_level, LD_PROTOCOL,
    194             "Client asked me to extend to a zero destination port or "
    195             "%s address '%s'.",
    196             fmt_addr_family(&ap->addr), safe_str(fmt_addrport_ap(ap)));
    197    }
    198    return false;
    199  }
    200 
    201  if (tor_addr_is_internal(&ap->addr, 0) &&
    202      !get_options()->ExtendAllowPrivateAddresses) {
    203    if (log_internal_addrs) {
    204      log_fn(log_level, LD_PROTOCOL,
    205             "Client asked me to extend to a private %s address '%s'.",
    206             fmt_addr_family(&ap->addr),
    207             safe_str(fmt_and_decorate_addr(&ap->addr)));
    208    }
    209    return false;
    210  }
    211 
    212  return true;
    213 }
    214 
    215 /* Before replying to an extend cell, check the link specifiers in the extend
    216 * cell <b>ec</b>, which was received on the circuit <b>circ</b>.
    217 *
    218 * If they are valid, return 0.
    219 * Otherwise, if they are invalid, log a protocol warning, and return -1.
    220 *
    221 * Must be called after circuit_extend_add_ed25519_helper().
    222 */
    223 STATIC int
    224 circuit_extend_lspec_valid_helper(const struct extend_cell_t *ec,
    225                                  const struct circuit_t *circ)
    226 {
    227  IF_BUG_ONCE(!ec) {
    228    return -1;
    229  }
    230 
    231  IF_BUG_ONCE(!circ) {
    232    return -1;
    233  }
    234 
    235  /* Check the addresses, without logging */
    236  const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv4,
    237                                                           false, false, 0);
    238  const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv6,
    239                                                           false, false, 0);
    240  /* We need at least one valid address */
    241  if (!ipv4_valid && !ipv6_valid) {
    242    /* Now, log the invalid addresses at protocol warning level */
    243    circuit_extend_addr_port_is_valid(&ec->orport_ipv4,
    244                                      true, true, LOG_PROTOCOL_WARN);
    245    circuit_extend_addr_port_is_valid(&ec->orport_ipv6,
    246                                      true, true, LOG_PROTOCOL_WARN);
    247    /* And fail */
    248    return -1;
    249  } else if (!ipv4_valid) {
    250    /* Always log unexpected internal addresses, but go on to use the other
    251     * valid address */
    252    circuit_extend_addr_port_is_valid(&ec->orport_ipv4,
    253                                      false, true, LOG_PROTOCOL_WARN);
    254  } else if (!ipv6_valid) {
    255    circuit_extend_addr_port_is_valid(&ec->orport_ipv6,
    256                                      false, true, LOG_PROTOCOL_WARN);
    257  }
    258 
    259  IF_BUG_ONCE(circ->magic != OR_CIRCUIT_MAGIC) {
    260    return -1;
    261  }
    262 
    263  const channel_t *p_chan = CONST_TO_OR_CIRCUIT(circ)->p_chan;
    264 
    265  IF_BUG_ONCE(!p_chan) {
    266    return -1;
    267  }
    268 
    269  /* Next, check if we're being asked to connect to the hop that the
    270   * extend cell came from. There isn't any reason for that, and it can
    271   * assist circular-path attacks. */
    272  if (tor_memeq(ec->node_id, p_chan->identity_digest, DIGEST_LEN)) {
    273    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
    274           "Client asked me to extend back to the previous hop.");
    275    return -1;
    276  }
    277 
    278  /* Check the previous hop Ed25519 ID too */
    279  if (! ed25519_public_key_is_zero(&ec->ed_pubkey) &&
    280      ed25519_pubkey_eq(&ec->ed_pubkey, &p_chan->ed25519_identity)) {
    281    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
    282           "Client asked me to extend back to the previous hop "
    283           "(by Ed25519 ID).");
    284    return -1;
    285  }
    286 
    287  return 0;
    288 }
    289 
    290 /* If possible, return a supported, non-NULL IP address.
    291 *
    292 * If both addresses are supported and non-NULL, choose one uniformly at
    293 * random.
    294 *
    295 * If we have an IPv6-only extend, but IPv6 is not supported, returns NULL.
    296 * If both addresses are NULL, also returns NULL. */
    297 STATIC const tor_addr_port_t *
    298 circuit_choose_ip_ap_for_extend(const tor_addr_port_t *ipv4_ap,
    299                                const tor_addr_port_t *ipv6_ap)
    300 {
    301  const bool ipv6_supported = router_can_extend_over_ipv6(get_options());
    302 
    303  /* If IPv6 is not supported, we can't use the IPv6 address. */
    304  if (!ipv6_supported) {
    305    ipv6_ap = NULL;
    306  }
    307 
    308  /* If there is no IPv6 address, IPv4 is always supported.
    309   * Until clients include IPv6 ORPorts, and most relays support IPv6,
    310   * this is the most common case. */
    311  if (!ipv6_ap) {
    312    return ipv4_ap;
    313  }
    314 
    315  /* If there is no IPv4 address, return the (possibly NULL) IPv6 address. */
    316  if (!ipv4_ap) {
    317    return ipv6_ap;
    318  }
    319 
    320  /* Now we have an IPv4 and an IPv6 address, and IPv6 is supported.
    321   * So make an IPv6 connection at random, with probability 1 in N.
    322   *   1 means "always IPv6 (and no IPv4)"
    323   *   2 means "equal probability of IPv4 or IPv6"
    324   *   ... (and so on) ...
    325   *   (UINT_MAX - 1) means "almost always IPv4 (and almost never IPv6)"
    326   * To disable IPv6, set ipv6_supported to 0.
    327   */
    328 #define IPV6_CONNECTION_ONE_IN_N 2
    329 
    330  bool choose_ipv6 = crypto_fast_rng_one_in_n(get_thread_fast_rng(),
    331                                              IPV6_CONNECTION_ONE_IN_N);
    332  if (choose_ipv6) {
    333    return ipv6_ap;
    334  } else {
    335    return ipv4_ap;
    336  }
    337 }
    338 
    339 /* When there is no open channel for an extend cell <b>ec</b>, set up the
    340 * circuit <b>circ</b> to wait for a new connection.
    341 *
    342 * If <b>should_launch</b> is true, open a new connection. (Otherwise, we are
    343 * already waiting for a new connection to the same relay.)
    344 *
    345 * Check if IPv6 extends are supported by our current configuration. If they
    346 * are, new connections may be made over IPv4 or IPv6. (IPv4 connections are
    347 * always supported.)
    348 */
    349 STATIC void
    350 circuit_open_connection_for_extend(const struct extend_cell_t *ec,
    351                                   struct circuit_t *circ,
    352                                   int should_launch)
    353 {
    354  /* We have to check circ first, so we can close it on all other failures */
    355  IF_BUG_ONCE(!circ) {
    356    /* We can't mark a NULL circuit for close. */
    357    return;
    358  }
    359 
    360  /* Now we know that circ is not NULL */
    361  IF_BUG_ONCE(!ec) {
    362    circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED);
    363    return;
    364  }
    365 
    366  /* Check the addresses, without logging */
    367  const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv4,
    368                                                           false, false, 0);
    369  const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv6,
    370                                                           false, false, 0);
    371 
    372  IF_BUG_ONCE(!ipv4_valid && !ipv6_valid) {
    373    /* circuit_extend_lspec_valid_helper() should have caught this */
    374    circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED);
    375    return;
    376  }
    377 
    378  const tor_addr_port_t *chosen_ap = circuit_choose_ip_ap_for_extend(
    379                                        ipv4_valid ? &ec->orport_ipv4 : NULL,
    380                                        ipv6_valid ? &ec->orport_ipv6 : NULL);
    381  if (!chosen_ap) {
    382    /* An IPv6-only extend, but IPv6 is not supported */
    383    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
    384           "Received IPv6-only extend, but we don't have an IPv6 ORPort.");
    385    circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED);
    386    return;
    387  }
    388 
    389  circ->n_hop = extend_info_new(NULL /*nickname*/,
    390                                (const char*)ec->node_id,
    391                                &ec->ed_pubkey,
    392                                NULL, /*curve25519_key*/
    393                                &chosen_ap->addr,
    394                                chosen_ap->port,
    395                                NULL /* protover summary */,
    396                                false);
    397 
    398  circ->n_chan_create_cell = tor_memdup(&ec->create_cell,
    399                                        sizeof(ec->create_cell));
    400 
    401  circuit_set_state(circ, CIRCUIT_STATE_CHAN_WAIT);
    402 
    403  if (should_launch) {
    404    /* we should try to open a connection */
    405    channel_t *n_chan = channel_connect_for_circuit(circ->n_hop);
    406    if (!n_chan) {
    407      log_info(LD_CIRC,"Launching n_chan failed. Closing circuit.");
    408      circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED);
    409      return;
    410    }
    411    log_debug(LD_CIRC,"connecting in progress (or finished). Good.");
    412  }
    413 }
    414 
    415 /** Take the 'extend' <b>cell</b>, pull out addr/port plus the onion
    416 * skin and identity digest for the next hop. If we're already connected,
    417 * pass the onion skin to the next hop using a create cell; otherwise
    418 * launch a new OR connection, and <b>circ</b> will notice when the
    419 * connection succeeds or fails.
    420 *
    421 * Return -1 if we want to warn and tear down the circuit, else return 0.
    422 */
    423 int
    424 circuit_extend(const relay_msg_t *rmsg, struct circuit_t *circ)
    425 {
    426  channel_t *n_chan;
    427  extend_cell_t ec;
    428  const char *msg = NULL;
    429  int should_launch = 0;
    430 
    431  IF_BUG_ONCE(!rmsg) {
    432    return -1;
    433  }
    434 
    435  IF_BUG_ONCE(!circ) {
    436    return -1;
    437  }
    438 
    439  if (circuit_extend_state_valid_helper(circ) < 0)
    440    return -1;
    441 
    442  /* We no longer accept EXTEND messages; only EXTEND2. */
    443  if (rmsg->command == RELAY_COMMAND_EXTEND) {
    444    /* TODO: Should we log this? */
    445    return -1;
    446  }
    447 
    448  if (extend_cell_parse(&ec, rmsg->command, rmsg->body, rmsg->length) < 0) {
    449    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
    450           "Can't parse extend cell. Closing circuit.");
    451    return -1;
    452  }
    453 
    454  if (circuit_extend_add_ed25519_helper(&ec) < 0)
    455    return -1;
    456 
    457  if (circuit_extend_lspec_valid_helper(&ec, circ) < 0)
    458    return -1;
    459 
    460  if (circuit_extend_add_ipv4_helper(&ec) < 0)
    461    return -1;
    462 
    463  if (circuit_extend_add_ipv6_helper(&ec) < 0)
    464    return -1;
    465 
    466  /* Check the addresses, without logging */
    467  const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec.orport_ipv4,
    468                                                           false, false, 0);
    469  const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec.orport_ipv6,
    470                                                           false, false, 0);
    471  IF_BUG_ONCE(!ipv4_valid && !ipv6_valid) {
    472    /* circuit_extend_lspec_valid_helper() should have caught this */
    473    return -1;
    474  }
    475 
    476  n_chan = channel_get_for_extend((const char*)ec.node_id,
    477                                  &ec.ed_pubkey,
    478                                  ipv4_valid ? &ec.orport_ipv4.addr : NULL,
    479                                  ipv6_valid ? &ec.orport_ipv6.addr : NULL,
    480                                  false,
    481                                  &msg,
    482                                  &should_launch);
    483 
    484  if (!n_chan) {
    485    /* We can't use fmt_addr*() twice in the same function call,
    486     * because it uses a static buffer. */
    487    log_debug(LD_CIRC|LD_OR, "Next router IPv4 (%s): %s.",
    488              fmt_addrport_ap(&ec.orport_ipv4),
    489              msg ? msg : "????");
    490    log_debug(LD_CIRC|LD_OR, "Next router IPv6 (%s).",
    491              fmt_addrport_ap(&ec.orport_ipv6));
    492 
    493    circuit_open_connection_for_extend(&ec, circ, should_launch);
    494 
    495    /* return success. The onion/circuit/etc will be taken care of
    496     * automatically (may already have been) whenever n_chan reaches
    497     * OR_CONN_STATE_OPEN.
    498     */
    499    return 0;
    500  } else {
    501    /* Connection is already established.
    502     * So we need to extend the circuit to the next hop. */
    503    tor_assert(!circ->n_hop);
    504    circ->n_chan = n_chan;
    505    log_debug(LD_CIRC,
    506              "n_chan is %s.",
    507              channel_describe_peer(n_chan));
    508 
    509    if (circuit_deliver_create_cell(circ, &ec.create_cell, 1) < 0)
    510      return -1;
    511 
    512    return 0;
    513  }
    514 }
    515 
    516 /** On a relay, accept a create cell, initialise a circuit, and send a
    517 * created cell back.
    518 *
    519 * Given:
    520 *   - a response payload consisting of:
    521 *     - the <b>created_cell</b> and
    522 *     - an optional <b>rend_circ_nonce</b>, and
    523 *   - <b>keys</b> of length <b>keys_len</b>, which must be
    524 *     CPATH_KEY_MATERIAL_LEN;
    525 * then:
    526 *   - initialize the circuit <b>circ</b>'s cryptographic material,
    527 *   - set the circuit's state to open, and
    528 *   - send a created cell back on that circuit.
    529 *
    530 * If we haven't found our ORPorts reachable yet, and the channel meets the
    531 * necessary conditions, mark the relevant ORPorts as reachable.
    532 *
    533 * Returns -1 if cell or circuit initialisation fails.
    534 */
    535 int
    536 onionskin_answer(struct or_circuit_t *circ,
    537                 const created_cell_t *created_cell,
    538                 relay_crypto_alg_t crypto_alg,
    539                 const char *keys, size_t keys_len,
    540                 const uint8_t *rend_circ_nonce)
    541 {
    542  cell_t cell;
    543 
    544  IF_BUG_ONCE(!circ) {
    545    return -1;
    546  }
    547 
    548  IF_BUG_ONCE(!created_cell) {
    549    return -1;
    550  }
    551 
    552  IF_BUG_ONCE(!keys) {
    553    return -1;
    554  }
    555 
    556  IF_BUG_ONCE(!rend_circ_nonce) {
    557    return -1;
    558  }
    559 
    560  if (created_cell_format(&cell, created_cell) < 0) {
    561    log_warn(LD_BUG,"couldn't format created cell (type=%d, len=%d).",
    562             (int)created_cell->cell_type, (int)created_cell->handshake_len);
    563    return -1;
    564  }
    565  cell.circ_id = circ->p_circ_id;
    566 
    567  circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN);
    568 
    569  if (relay_crypto_init(crypto_alg,
    570                        &circ->crypto, keys, keys_len)<0) {
    571    log_warn(LD_BUG,"Circuit initialization failed.");
    572    return -1;
    573  }
    574 
    575  memcpy(circ->rend_circ_nonce, rend_circ_nonce, DIGEST_LEN);
    576 
    577  int used_create_fast = (created_cell->cell_type == CELL_CREATED_FAST);
    578 
    579  if (append_cell_to_circuit_queue(TO_CIRCUIT(circ), circ->p_chan,
    580                                   &cell, CELL_DIRECTION_IN, 0) < 0) {
    581    return -1;
    582  }
    583  log_debug(LD_CIRC,"Finished sending '%s' cell.",
    584            used_create_fast ? "created_fast" : "created");
    585 
    586  /* Ignore the local bit when ExtendAllowPrivateAddresses is set:
    587   * it violates the assumption that private addresses are local.
    588   * Also, many test networks run on local addresses, and
    589   * TestingTorNetwork sets ExtendAllowPrivateAddresses. */
    590  if ((!channel_is_local(circ->p_chan)
    591       || get_options()->ExtendAllowPrivateAddresses)
    592      && !channel_is_outgoing(circ->p_chan)) {
    593    /* Okay, it's a create cell from a non-local connection
    594     * that we didn't initiate. Presumably this means that create cells
    595     * can reach us too. But what address can they reach us on? */
    596    const tor_addr_t *my_supposed_addr = &circ->p_chan->addr_according_to_peer;
    597    if (router_addr_is_my_published_addr(my_supposed_addr)) {
    598      /* Great, this create cell came on connection where the peer says
    599       * that the our address is an address we're actually advertising!
    600       * That should mean that we're reachable.  But before we finally
    601       * declare ourselves reachable, make sure that the address listed
    602       * by the peer is the same family as the peer is actually using.
    603       */
    604      tor_addr_t remote_addr;
    605      int family = tor_addr_family(my_supposed_addr);
    606      if (channel_get_addr_if_possible(circ->p_chan, &remote_addr) &&
    607          tor_addr_family(&remote_addr) == family) {
    608        router_orport_found_reachable(family);
    609      }
    610    }
    611  }
    612 
    613  return 0;
    614 }