relay.c
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:69k
源码类别:

网络

开发平台:

Unix_Linux

  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-2009, The Tor Project, Inc. */
  5. /* See LICENSE for licensing information */
  6. /**
  7.  * file relay.c
  8.  * brief Handle relay cell encryption/decryption, plus packaging and
  9.  *    receiving from circuits, plus queuing on circuits.
  10.  **/
  11. #include "or.h"
  12. #include "mempool.h"
  13. static int relay_crypt(circuit_t *circ, cell_t *cell,
  14.                        cell_direction_t cell_direction,
  15.                        crypt_path_t **layer_hint, char *recognized);
  16. static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell,
  17.                                             cell_direction_t cell_direction,
  18.                                             crypt_path_t *layer_hint);
  19. static int
  20. connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
  21.                                    edge_connection_t *conn,
  22.                                    crypt_path_t *layer_hint);
  23. static void
  24. circuit_consider_sending_sendme(circuit_t *circ, crypt_path_t *layer_hint);
  25. static void
  26. circuit_resume_edge_reading(circuit_t *circ, crypt_path_t *layer_hint);
  27. static int
  28. circuit_resume_edge_reading_helper(edge_connection_t *conn,
  29.                                    circuit_t *circ,
  30.                                    crypt_path_t *layer_hint);
  31. static int
  32. circuit_consider_stop_edge_reading(circuit_t *circ, crypt_path_t *layer_hint);
  33. /** Stats: how many relay cells have originated at this hop, or have
  34.  * been relayed onward (not recognized at this hop)?
  35.  */
  36. uint64_t stats_n_relay_cells_relayed = 0;
  37. /** Stats: how many relay cells have been delivered to streams at this
  38.  * hop?
  39.  */
  40. uint64_t stats_n_relay_cells_delivered = 0;
  41. /** Update digest from the payload of cell. Assign integrity part to
  42.  * cell.
  43.  */
  44. static void
  45. relay_set_digest(crypto_digest_env_t *digest, cell_t *cell)
  46. {
  47.   char integrity[4];
  48.   relay_header_t rh;
  49.   crypto_digest_add_bytes(digest, cell->payload, CELL_PAYLOAD_SIZE);
  50.   crypto_digest_get_digest(digest, integrity, 4);
  51. //  log_fn(LOG_DEBUG,"Putting digest of %u %u %u %u into relay cell.",
  52. //    integrity[0], integrity[1], integrity[2], integrity[3]);
  53.   relay_header_unpack(&rh, cell->payload);
  54.   memcpy(rh.integrity, integrity, 4);
  55.   relay_header_pack(cell->payload, &rh);
  56. }
  57. /** Does the digest for this circuit indicate that this cell is for us?
  58.  *
  59.  * Update digest from the payload of cell (with the integrity part set
  60.  * to 0). If the integrity part is valid, return 1, else restore digest
  61.  * and cell to their original state and return 0.
  62.  */
  63. static int
  64. relay_digest_matches(crypto_digest_env_t *digest, cell_t *cell)
  65. {
  66.   char received_integrity[4], calculated_integrity[4];
  67.   relay_header_t rh;
  68.   crypto_digest_env_t *backup_digest=NULL;
  69.   backup_digest = crypto_digest_dup(digest);
  70.   relay_header_unpack(&rh, cell->payload);
  71.   memcpy(received_integrity, rh.integrity, 4);
  72.   memset(rh.integrity, 0, 4);
  73.   relay_header_pack(cell->payload, &rh);
  74. //  log_fn(LOG_DEBUG,"Reading digest of %u %u %u %u from relay cell.",
  75. //    received_integrity[0], received_integrity[1],
  76. //    received_integrity[2], received_integrity[3]);
  77.   crypto_digest_add_bytes(digest, cell->payload, CELL_PAYLOAD_SIZE);
  78.   crypto_digest_get_digest(digest, calculated_integrity, 4);
  79.   if (memcmp(received_integrity, calculated_integrity, 4)) {
  80. //    log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
  81. // (%d vs %d).", received_integrity, calculated_integrity);
  82.     /* restore digest to its old form */
  83.     crypto_digest_assign(digest, backup_digest);
  84.     /* restore the relay header */
  85.     memcpy(rh.integrity, received_integrity, 4);
  86.     relay_header_pack(cell->payload, &rh);
  87.     crypto_free_digest_env(backup_digest);
  88.     return 0;
  89.   }
  90.   crypto_free_digest_env(backup_digest);
  91.   return 1;
  92. }
  93. /** Apply <b>cipher</b> to CELL_PAYLOAD_SIZE bytes of <b>in</b>
  94.  * (in place).
  95.  *
  96.  * If <b>encrypt_mode</b> is 1 then encrypt, else decrypt.
  97.  *
  98.  * Return -1 if the crypto fails, else return 0.
  99.  */
  100. static int
  101. relay_crypt_one_payload(crypto_cipher_env_t *cipher, char *in,
  102.                         int encrypt_mode)
  103. {
  104.   int r;
  105.   (void)encrypt_mode;
  106.   r = crypto_cipher_crypt_inplace(cipher, in, CELL_PAYLOAD_SIZE);
  107.   if (r) {
  108.     log_warn(LD_BUG,"Error during relay encryption");
  109.     return -1;
  110.   }
  111.   return 0;
  112. }
  113. /** Receive a relay cell:
  114.  *  - Crypt it (encrypt if headed toward the origin or if we <b>are</b> the
  115.  *    origin; decrypt if we're headed toward the exit).
  116.  *  - Check if recognized (if exitward).
  117.  *  - If recognized and the digest checks out, then find if there's a stream
  118.  *    that the cell is intended for, and deliver it to the right
  119.  *    connection_edge.
  120.  *  - If not recognized, then we need to relay it: append it to the appropriate
  121.  *    cell_queue on <b>circ</b>.
  122.  *
  123.  * Return -<b>reason</b> on failure.
  124.  */
  125. int
  126. circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
  127.                            cell_direction_t cell_direction)
  128. {
  129.   or_connection_t *or_conn=NULL;
  130.   crypt_path_t *layer_hint=NULL;
  131.   char recognized=0;
  132.   int reason;
  133.   tor_assert(cell);
  134.   tor_assert(circ);
  135.   tor_assert(cell_direction == CELL_DIRECTION_OUT ||
  136.              cell_direction == CELL_DIRECTION_IN);
  137.   if (circ->marked_for_close)
  138.     return 0;
  139.   if (relay_crypt(circ, cell, cell_direction, &layer_hint, &recognized) < 0) {
  140.     log_warn(LD_BUG,"relay crypt failed. Dropping connection.");
  141.     return -END_CIRC_REASON_INTERNAL;
  142.   }
  143.   if (recognized) {
  144.     edge_connection_t *conn = relay_lookup_conn(circ, cell, cell_direction,
  145.                                                 layer_hint);
  146.     if (cell_direction == CELL_DIRECTION_OUT) {
  147.       ++stats_n_relay_cells_delivered;
  148.       log_debug(LD_OR,"Sending away from origin.");
  149.       if ((reason=connection_edge_process_relay_cell(cell, circ, conn, NULL))
  150.           < 0) {
  151.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  152.                "connection_edge_process_relay_cell (away from origin) "
  153.                "failed.");
  154.         return reason;
  155.       }
  156.     }
  157.     if (cell_direction == CELL_DIRECTION_IN) {
  158.       ++stats_n_relay_cells_delivered;
  159.       log_debug(LD_OR,"Sending to origin.");
  160.       if ((reason = connection_edge_process_relay_cell(cell, circ, conn,
  161.                                                        layer_hint)) < 0) {
  162.         log_warn(LD_OR,
  163.                  "connection_edge_process_relay_cell (at origin) failed.");
  164.         return reason;
  165.       }
  166.     }
  167.     return 0;
  168.   }
  169.   /* not recognized. pass it on. */
  170.   if (cell_direction == CELL_DIRECTION_OUT) {
  171.     cell->circ_id = circ->n_circ_id; /* switch it */
  172.     or_conn = circ->n_conn;
  173.   } else if (! CIRCUIT_IS_ORIGIN(circ)) {
  174.     cell->circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; /* switch it */
  175.     or_conn = TO_OR_CIRCUIT(circ)->p_conn;
  176.   } else {
  177.     log_fn(LOG_PROTOCOL_WARN, LD_OR,
  178.            "Dropping unrecognized inbound cell on origin circuit.");
  179.     return 0;
  180.   }
  181.   if (!or_conn) {
  182.     // XXXX Can this splice stuff be done more cleanly?
  183.     if (! CIRCUIT_IS_ORIGIN(circ) &&
  184.         TO_OR_CIRCUIT(circ)->rend_splice &&
  185.         cell_direction == CELL_DIRECTION_OUT) {
  186.       or_circuit_t *splice = TO_OR_CIRCUIT(circ)->rend_splice;
  187.       tor_assert(circ->purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED);
  188.       tor_assert(splice->_base.purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED);
  189.       cell->circ_id = splice->p_circ_id;
  190.       cell->command = CELL_RELAY; /* can't be relay_early anyway */
  191.       if ((reason = circuit_receive_relay_cell(cell, TO_CIRCUIT(splice),
  192.                                                CELL_DIRECTION_IN)) < 0) {
  193.         log_warn(LD_REND, "Error relaying cell across rendezvous; closing "
  194.                  "circuits");
  195.         /* XXXX Do this here, or just return -1? */
  196.         circuit_mark_for_close(circ, -reason);
  197.         return reason;
  198.       }
  199.       return 0;
  200.     }
  201.     log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  202.            "Didn't recognize cell, but circ stops here! Closing circ.");
  203.     return -END_CIRC_REASON_TORPROTOCOL;
  204.   }
  205.   log_debug(LD_OR,"Passing on unrecognized cell.");
  206.   ++stats_n_relay_cells_relayed; /* XXXX no longer quite accurate {cells}
  207.                                   * we might kill the circ before we relay
  208.                                   * the cells. */
  209.   append_cell_to_circuit_queue(circ, or_conn, cell, cell_direction);
  210.   return 0;
  211. }
  212. /** Do the appropriate en/decryptions for <b>cell</b> arriving on
  213.  * <b>circ</b> in direction <b>cell_direction</b>.
  214.  *
  215.  * If cell_direction == CELL_DIRECTION_IN:
  216.  *   - If we're at the origin (we're the OP), for hops 1..N,
  217.  *     decrypt cell. If recognized, stop.
  218.  *   - Else (we're not the OP), encrypt one hop. Cell is not recognized.
  219.  *
  220.  * If cell_direction == CELL_DIRECTION_OUT:
  221.  *   - decrypt one hop. Check if recognized.
  222.  *
  223.  * If cell is recognized, set *recognized to 1, and set
  224.  * *layer_hint to the hop that recognized it.
  225.  *
  226.  * Return -1 to indicate that we should mark the circuit for close,
  227.  * else return 0.
  228.  */
  229. static int
  230. relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
  231.             crypt_path_t **layer_hint, char *recognized)
  232. {
  233.   relay_header_t rh;
  234.   tor_assert(circ);
  235.   tor_assert(cell);
  236.   tor_assert(recognized);
  237.   tor_assert(cell_direction == CELL_DIRECTION_IN ||
  238.              cell_direction == CELL_DIRECTION_OUT);
  239.   if (cell_direction == CELL_DIRECTION_IN) {
  240.     if (CIRCUIT_IS_ORIGIN(circ)) { /* We're at the beginning of the circuit.
  241.                                     * We'll want to do layered decrypts. */
  242.       crypt_path_t *thishop, *cpath = TO_ORIGIN_CIRCUIT(circ)->cpath;
  243.       thishop = cpath;
  244.       if (thishop->state != CPATH_STATE_OPEN) {
  245.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  246.                "Relay cell before first created cell? Closing.");
  247.         return -1;
  248.       }
  249.       do { /* Remember: cpath is in forward order, that is, first hop first. */
  250.         tor_assert(thishop);
  251.         if (relay_crypt_one_payload(thishop->b_crypto, cell->payload, 0) < 0)
  252.           return -1;
  253.         relay_header_unpack(&rh, cell->payload);
  254.         if (rh.recognized == 0) {
  255.           /* it's possibly recognized. have to check digest to be sure. */
  256.           if (relay_digest_matches(thishop->b_digest, cell)) {
  257.             *recognized = 1;
  258.             *layer_hint = thishop;
  259.             return 0;
  260.           }
  261.         }
  262.         thishop = thishop->next;
  263.       } while (thishop != cpath && thishop->state == CPATH_STATE_OPEN);
  264.       log_fn(LOG_PROTOCOL_WARN, LD_OR,
  265.              "Incoming cell at client not recognized. Closing.");
  266.       return -1;
  267.     } else { /* we're in the middle. Just one crypt. */
  268.       if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->p_crypto,
  269.                                   cell->payload, 1) < 0)
  270.         return -1;
  271. //      log_fn(LOG_DEBUG,"Skipping recognized check, because we're not "
  272. //             "the client.");
  273.     }
  274.   } else /* cell_direction == CELL_DIRECTION_OUT */ {
  275.     /* we're in the middle. Just one crypt. */
  276.     if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->n_crypto,
  277.                                 cell->payload, 0) < 0)
  278.       return -1;
  279.     relay_header_unpack(&rh, cell->payload);
  280.     if (rh.recognized == 0) {
  281.       /* it's possibly recognized. have to check digest to be sure. */
  282.       if (relay_digest_matches(TO_OR_CIRCUIT(circ)->n_digest, cell)) {
  283.         *recognized = 1;
  284.         return 0;
  285.       }
  286.     }
  287.   }
  288.   return 0;
  289. }
  290. /** Package a relay cell from an edge:
  291.  *  - Encrypt it to the right layer
  292.  *  - Append it to the appropriate cell_queue on <b>circ</b>.
  293.  */
  294. static int
  295. circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
  296.                            cell_direction_t cell_direction,
  297.                            crypt_path_t *layer_hint)
  298. {
  299.   or_connection_t *conn; /* where to send the cell */
  300.   if (cell_direction == CELL_DIRECTION_OUT) {
  301.     crypt_path_t *thishop; /* counter for repeated crypts */
  302.     conn = circ->n_conn;
  303.     if (!CIRCUIT_IS_ORIGIN(circ) || !conn) {
  304.       log_warn(LD_BUG,"outgoing relay cell has n_conn==NULL. Dropping.");
  305.       return 0; /* just drop it */
  306.     }
  307.     relay_set_digest(layer_hint->f_digest, cell);
  308.     thishop = layer_hint;
  309.     /* moving from farthest to nearest hop */
  310.     do {
  311.       tor_assert(thishop);
  312.       /* XXXX RD This is a bug, right? */
  313.       log_debug(LD_OR,"crypting a layer of the relay cell.");
  314.       if (relay_crypt_one_payload(thishop->f_crypto, cell->payload, 1) < 0) {
  315.         return -1;
  316.       }
  317.       thishop = thishop->prev;
  318.     } while (thishop != TO_ORIGIN_CIRCUIT(circ)->cpath->prev);
  319.   } else { /* incoming cell */
  320.     or_circuit_t *or_circ;
  321.     if (CIRCUIT_IS_ORIGIN(circ)) {
  322.       /* We should never package an _incoming_ cell from the circuit
  323.        * origin; that means we messed up somewhere. */
  324.       log_warn(LD_BUG,"incoming relay cell at origin circuit. Dropping.");
  325.       assert_circuit_ok(circ);
  326.       return 0; /* just drop it */
  327.     }
  328.     or_circ = TO_OR_CIRCUIT(circ);
  329.     conn = or_circ->p_conn;
  330.     relay_set_digest(or_circ->p_digest, cell);
  331.     if (relay_crypt_one_payload(or_circ->p_crypto, cell->payload, 1) < 0)
  332.       return -1;
  333.   }
  334.   ++stats_n_relay_cells_relayed;
  335.   append_cell_to_circuit_queue(circ, conn, cell, cell_direction);
  336.   return 0;
  337. }
  338. /** If cell's stream_id matches the stream_id of any conn that's
  339.  * attached to circ, return that conn, else return NULL.
  340.  */
  341. static edge_connection_t *
  342. relay_lookup_conn(circuit_t *circ, cell_t *cell,
  343.                   cell_direction_t cell_direction, crypt_path_t *layer_hint)
  344. {
  345.   edge_connection_t *tmpconn;
  346.   relay_header_t rh;
  347.   relay_header_unpack(&rh, cell->payload);
  348.   if (!rh.stream_id)
  349.     return NULL;
  350.   /* IN or OUT cells could have come from either direction, now
  351.    * that we allow rendezvous *to* an OP.
  352.    */
  353.   if (CIRCUIT_IS_ORIGIN(circ)) {
  354.     for (tmpconn = TO_ORIGIN_CIRCUIT(circ)->p_streams; tmpconn;
  355.          tmpconn=tmpconn->next_stream) {
  356.       if (rh.stream_id == tmpconn->stream_id &&
  357.           !tmpconn->_base.marked_for_close &&
  358.           tmpconn->cpath_layer == layer_hint) {
  359.         log_debug(LD_APP,"found conn for stream %d.", rh.stream_id);
  360.         return tmpconn;
  361.       }
  362.     }
  363.   } else {
  364.     for (tmpconn = TO_OR_CIRCUIT(circ)->n_streams; tmpconn;
  365.          tmpconn=tmpconn->next_stream) {
  366.       if (rh.stream_id == tmpconn->stream_id &&
  367.           !tmpconn->_base.marked_for_close) {
  368.         log_debug(LD_EXIT,"found conn for stream %d.", rh.stream_id);
  369.         if (cell_direction == CELL_DIRECTION_OUT ||
  370.             connection_edge_is_rendezvous_stream(tmpconn))
  371.           return tmpconn;
  372.       }
  373.     }
  374.     for (tmpconn = TO_OR_CIRCUIT(circ)->resolving_streams; tmpconn;
  375.          tmpconn=tmpconn->next_stream) {
  376.       if (rh.stream_id == tmpconn->stream_id &&
  377.           !tmpconn->_base.marked_for_close) {
  378.         log_debug(LD_EXIT,"found conn for stream %d.", rh.stream_id);
  379.         return tmpconn;
  380.       }
  381.     }
  382.   }
  383.   return NULL; /* probably a begin relay cell */
  384. }
  385. /** Pack the relay_header_t host-order structure <b>src</b> into
  386.  * network-order in the buffer <b>dest</b>. See tor-spec.txt for details
  387.  * about the wire format.
  388.  */
  389. void
  390. relay_header_pack(char *dest, const relay_header_t *src)
  391. {
  392.   *(uint8_t*)(dest) = src->command;
  393.   set_uint16(dest+1, htons(src->recognized));
  394.   set_uint16(dest+3, htons(src->stream_id));
  395.   memcpy(dest+5, src->integrity, 4);
  396.   set_uint16(dest+9, htons(src->length));
  397. }
  398. /** Unpack the network-order buffer <b>src</b> into a host-order
  399.  * relay_header_t structure <b>dest</b>.
  400.  */
  401. void
  402. relay_header_unpack(relay_header_t *dest, const char *src)
  403. {
  404.   dest->command = *(uint8_t*)(src);
  405.   dest->recognized = ntohs(get_uint16(src+1));
  406.   dest->stream_id = ntohs(get_uint16(src+3));
  407.   memcpy(dest->integrity, src+5, 4);
  408.   dest->length = ntohs(get_uint16(src+9));
  409. }
  410. /** Convert the relay <b>command</b> into a human-readable string. */
  411. static const char *
  412. relay_command_to_string(uint8_t command)
  413. {
  414.   switch (command) {
  415.     case RELAY_COMMAND_BEGIN: return "BEGIN";
  416.     case RELAY_COMMAND_DATA: return "DATA";
  417.     case RELAY_COMMAND_END: return "END";
  418.     case RELAY_COMMAND_CONNECTED: return "CONNECTED";
  419.     case RELAY_COMMAND_SENDME: return "SENDME";
  420.     case RELAY_COMMAND_EXTEND: return "EXTEND";
  421.     case RELAY_COMMAND_EXTENDED: return "EXTENDED";
  422.     case RELAY_COMMAND_TRUNCATE: return "TRUNCATE";
  423.     case RELAY_COMMAND_TRUNCATED: return "TRUNCATED";
  424.     case RELAY_COMMAND_DROP: return "DROP";
  425.     case RELAY_COMMAND_RESOLVE: return "RESOLVE";
  426.     case RELAY_COMMAND_RESOLVED: return "RESOLVED";
  427.     case RELAY_COMMAND_BEGIN_DIR: return "BEGIN_DIR";
  428.     case RELAY_COMMAND_ESTABLISH_INTRO: return "ESTABLISH_INTRO";
  429.     case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: return "ESTABLISH_RENDEZVOUS";
  430.     case RELAY_COMMAND_INTRODUCE1: return "INTRODUCE1";
  431.     case RELAY_COMMAND_INTRODUCE2: return "INTRODUCE2";
  432.     case RELAY_COMMAND_RENDEZVOUS1: return "RENDEZVOUS1";
  433.     case RELAY_COMMAND_RENDEZVOUS2: return "RENDEZVOUS2";
  434.     case RELAY_COMMAND_INTRO_ESTABLISHED: return "INTRO_ESTABLISHED";
  435.     case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED:
  436.       return "RENDEZVOUS_ESTABLISHED";
  437.     case RELAY_COMMAND_INTRODUCE_ACK: return "INTRODUCE_ACK";
  438.     default: return "(unrecognized)";
  439.   }
  440. }
  441. /** Make a relay cell out of <b>relay_command</b> and <b>payload</b>, and send
  442.  * it onto the open circuit <b>circ</b>. <b>stream_id</b> is the ID on
  443.  * <b>circ</b> for the stream that's sending the relay cell, or 0 if it's a
  444.  * control cell.  <b>cpath_layer</b> is NULL for OR->OP cells, or the
  445.  * destination hop for OP->OR cells.
  446.  *
  447.  * If you can't send the cell, mark the circuit for close and return -1. Else
  448.  * return 0.
  449.  */
  450. int
  451. relay_send_command_from_edge(uint16_t stream_id, circuit_t *circ,
  452.                              uint8_t relay_command, const char *payload,
  453.                              size_t payload_len, crypt_path_t *cpath_layer)
  454. {
  455.   cell_t cell;
  456.   relay_header_t rh;
  457.   cell_direction_t cell_direction;
  458.   /* XXXX NM Split this function into a separate versions per circuit type? */
  459.   tor_assert(circ);
  460.   tor_assert(payload_len <= RELAY_PAYLOAD_SIZE);
  461.   memset(&cell, 0, sizeof(cell_t));
  462.   cell.command = CELL_RELAY;
  463.   if (cpath_layer) {
  464.     cell.circ_id = circ->n_circ_id;
  465.     cell_direction = CELL_DIRECTION_OUT;
  466.   } else if (! CIRCUIT_IS_ORIGIN(circ)) {
  467.     cell.circ_id = TO_OR_CIRCUIT(circ)->p_circ_id;
  468.     cell_direction = CELL_DIRECTION_IN;
  469.   } else {
  470.     return -1;
  471.   }
  472.   memset(&rh, 0, sizeof(rh));
  473.   rh.command = relay_command;
  474.   rh.stream_id = stream_id;
  475.   rh.length = payload_len;
  476.   relay_header_pack(cell.payload, &rh);
  477.   if (payload_len)
  478.     memcpy(cell.payload+RELAY_HEADER_SIZE, payload, payload_len);
  479.   log_debug(LD_OR,"delivering %d cell %s.", relay_command,
  480.             cell_direction == CELL_DIRECTION_OUT ? "forward" : "backward");
  481.   if (cell_direction == CELL_DIRECTION_OUT && circ->n_conn) {
  482.     /* if we're using relaybandwidthrate, this conn wants priority */
  483.     circ->n_conn->client_used = approx_time();
  484.   }
  485.   if (cell_direction == CELL_DIRECTION_OUT) {
  486.     origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
  487.     if (origin_circ->remaining_relay_early_cells > 0 &&
  488.         (relay_command == RELAY_COMMAND_EXTEND ||
  489.          (cpath_layer != origin_circ->cpath &&
  490.           !CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(circ->purpose)))) {
  491.       /* If we've got any relay_early cells left, and we're sending
  492.        * an extend cell or (we're not talking to the first hop and we're
  493.        * not talking to a rendezvous circuit), use one of them.
  494.        * Don't worry about the conn protocol version:
  495.        * append_cell_to_circuit_queue will fix it up. */
  496.       /* XXX For now, clients don't use RELAY_EARLY cells when sending
  497.        * relay cells on rendezvous circuits. See bug 1038. Eventually,
  498.        * we can take this behavior away in favor of having clients avoid
  499.        * rendezvous points running 0.2.1.3-alpha through 0.2.1.18. -RD */
  500.       cell.command = CELL_RELAY_EARLY;
  501.       --origin_circ->remaining_relay_early_cells;
  502.       log_debug(LD_OR, "Sending a RELAY_EARLY cell; %d remaining.",
  503.                 (int)origin_circ->remaining_relay_early_cells);
  504.       /* Memorize the command that is sent as RELAY_EARLY cell; helps debug
  505.        * task 878. */
  506.       origin_circ->relay_early_commands[
  507.           origin_circ->relay_early_cells_sent++] = relay_command;
  508.     } else if (relay_command == RELAY_COMMAND_EXTEND) {
  509.       /* If no RELAY_EARLY cells can be sent over this circuit, log which
  510.        * commands have been sent as RELAY_EARLY cells before; helps debug
  511.        * task 878. */
  512.       smartlist_t *commands_list = smartlist_create();
  513.       int i = 0;
  514.       char *commands = NULL;
  515.       for (; i < origin_circ->relay_early_cells_sent; i++)
  516.         smartlist_add(commands_list, (char *)
  517.             relay_command_to_string(origin_circ->relay_early_commands[i]));
  518.       commands = smartlist_join_strings(commands_list, ",", 0, NULL);
  519.       log_warn(LD_BUG, "Uh-oh.  We're sending a RELAY_COMMAND_EXTEND cell, "
  520.                "but we have run out of RELAY_EARLY cells on that circuit. "
  521.                "Commands sent before: %s", commands);
  522.       tor_free(commands);
  523.       smartlist_free(commands_list);
  524.     }
  525.   }
  526.   if (circuit_package_relay_cell(&cell, circ, cell_direction, cpath_layer)
  527.       < 0) {
  528.     log_warn(LD_BUG,"circuit_package_relay_cell failed. Closing.");
  529.     circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL);
  530.     return -1;
  531.   }
  532.   return 0;
  533. }
  534. /** Make a relay cell out of <b>relay_command</b> and <b>payload</b>, and
  535.  * send it onto the open circuit <b>circ</b>. <b>fromconn</b> is the stream
  536.  * that's sending the relay cell, or NULL if it's a control cell.
  537.  * <b>cpath_layer</b> is NULL for OR->OP cells, or the destination hop
  538.  * for OP->OR cells.
  539.  *
  540.  * If you can't send the cell, mark the circuit for close and
  541.  * return -1. Else return 0.
  542.  */
  543. int
  544. connection_edge_send_command(edge_connection_t *fromconn,
  545.                              uint8_t relay_command, const char *payload,
  546.                              size_t payload_len)
  547. {
  548.   /* XXXX NM Split this function into a separate versions per circuit type? */
  549.   circuit_t *circ;
  550.   tor_assert(fromconn);
  551.   circ = fromconn->on_circuit;
  552.   if (fromconn->_base.marked_for_close) {
  553.     log_warn(LD_BUG,
  554.              "called on conn that's already marked for close at %s:%d.",
  555.              fromconn->_base.marked_for_close_file,
  556.              fromconn->_base.marked_for_close);
  557.     return 0;
  558.   }
  559.   if (!circ) {
  560.     if (fromconn->_base.type == CONN_TYPE_AP) {
  561.       log_info(LD_APP,"no circ. Closing conn.");
  562.       connection_mark_unattached_ap(fromconn, END_STREAM_REASON_INTERNAL);
  563.     } else {
  564.       log_info(LD_EXIT,"no circ. Closing conn.");
  565.       fromconn->edge_has_sent_end = 1; /* no circ to send to */
  566.       fromconn->end_reason = END_STREAM_REASON_INTERNAL;
  567.       connection_mark_for_close(TO_CONN(fromconn));
  568.     }
  569.     return -1;
  570.   }
  571.   return relay_send_command_from_edge(fromconn->stream_id, circ,
  572.                                       relay_command, payload,
  573.                                       payload_len, fromconn->cpath_layer);
  574. }
  575. /** How many times will I retry a stream that fails due to DNS
  576.  * resolve failure or misc error?
  577.  */
  578. #define MAX_RESOLVE_FAILURES 3
  579. /** Return 1 if reason is something that you should retry if you
  580.  * get the end cell before you've connected; else return 0. */
  581. static int
  582. edge_reason_is_retriable(int reason)
  583. {
  584.   return reason == END_STREAM_REASON_HIBERNATING ||
  585.          reason == END_STREAM_REASON_RESOURCELIMIT ||
  586.          reason == END_STREAM_REASON_EXITPOLICY ||
  587.          reason == END_STREAM_REASON_RESOLVEFAILED ||
  588.          reason == END_STREAM_REASON_MISC;
  589. }
  590. /** Called when we receive an END cell on a stream that isn't open yet,
  591.  * from the client side.
  592.  * Arguments are as for connection_edge_process_relay_cell().
  593.  */
  594. static int
  595. connection_ap_process_end_not_open(
  596.     relay_header_t *rh, cell_t *cell, origin_circuit_t *circ,
  597.     edge_connection_t *conn, crypt_path_t *layer_hint)
  598. {
  599.   struct in_addr in;
  600.   routerinfo_t *exitrouter;
  601.   int reason = *(cell->payload+RELAY_HEADER_SIZE);
  602.   int control_reason = reason | END_STREAM_REASON_FLAG_REMOTE;
  603.   (void) layer_hint; /* unused */
  604.   if (rh->length > 0 && edge_reason_is_retriable(reason) &&
  605.       !connection_edge_is_rendezvous_stream(conn)  /* avoid retry if rend */
  606.       ) {
  607.     log_info(LD_APP,"Address '%s' refused due to '%s'. Considering retrying.",
  608.              safe_str(conn->socks_request->address),
  609.              stream_end_reason_to_string(reason));
  610.     exitrouter =
  611.       router_get_by_digest(circ->build_state->chosen_exit->identity_digest);
  612.     switch (reason) {
  613.       case END_STREAM_REASON_EXITPOLICY:
  614.         if (rh->length >= 5) {
  615.           uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+1));
  616.           int ttl;
  617.           if (!addr) {
  618.             log_info(LD_APP,"Address '%s' resolved to 0.0.0.0. Closing,",
  619.                      safe_str(conn->socks_request->address));
  620.             connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
  621.             return 0;
  622.           }
  623.           if (rh->length >= 9)
  624.             ttl = (int)ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+5));
  625.           else
  626.             ttl = -1;
  627.           if (get_options()->ClientDNSRejectInternalAddresses &&
  628.               is_internal_IP(addr, 0)) {
  629.             log_info(LD_APP,"Address '%s' resolved to internal. Closing,",
  630.                      safe_str(conn->socks_request->address));
  631.             connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
  632.             return 0;
  633.           }
  634.           client_dns_set_addressmap(conn->socks_request->address, addr,
  635.                                     conn->chosen_exit_name, ttl);
  636.         }
  637.         /* check if he *ought* to have allowed it */
  638.         if (exitrouter &&
  639.             (rh->length < 5 ||
  640.              (tor_inet_aton(conn->socks_request->address, &in) &&
  641.               !conn->chosen_exit_name))) {
  642.           log_info(LD_APP,
  643.                  "Exitrouter '%s' seems to be more restrictive than its exit "
  644.                  "policy. Not using this router as exit for now.",
  645.                  exitrouter->nickname);
  646.           policies_set_router_exitpolicy_to_reject_all(exitrouter);
  647.         }
  648.         /* rewrite it to an IP if we learned one. */
  649.         if (addressmap_rewrite(conn->socks_request->address,
  650.                                sizeof(conn->socks_request->address),
  651.                                NULL)) {
  652.           control_event_stream_status(conn, STREAM_EVENT_REMAP, 0);
  653.         }
  654.         if (conn->chosen_exit_optional ||
  655.             conn->chosen_exit_retries) {
  656.           /* stop wanting a specific exit */
  657.           conn->chosen_exit_optional = 0;
  658.           /* A non-zero chosen_exit_retries can happen if we set a
  659.            * TrackHostExits for this address under a port that the exit
  660.            * relay allows, but then try the same address with a different
  661.            * port that it doesn't allow to exit. We shouldn't unregister
  662.            * the mapping, since it is probably still wanted on the
  663.            * original port. But now we give away to the exit relay that
  664.            * we probably have a TrackHostExits on it. So be it. */
  665.           conn->chosen_exit_retries = 0;
  666.           tor_free(conn->chosen_exit_name); /* clears it */
  667.         }
  668.         if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0)
  669.           return 0;
  670.         /* else, conn will get closed below */
  671.         break;
  672.       case END_STREAM_REASON_CONNECTREFUSED:
  673.         if (!conn->chosen_exit_optional)
  674.           break; /* break means it'll close, below */
  675.         /* Else fall through: expire this circuit, clear the
  676.          * chosen_exit_name field, and try again. */
  677.       case END_STREAM_REASON_RESOLVEFAILED:
  678.       case END_STREAM_REASON_TIMEOUT:
  679.       case END_STREAM_REASON_MISC:
  680.         if (client_dns_incr_failures(conn->socks_request->address)
  681.             < MAX_RESOLVE_FAILURES) {
  682.           /* We haven't retried too many times; reattach the connection. */
  683.           circuit_log_path(LOG_INFO,LD_APP,circ);
  684.           tor_assert(circ->_base.timestamp_dirty);
  685.           circ->_base.timestamp_dirty -= get_options()->MaxCircuitDirtiness;
  686.           if (conn->chosen_exit_optional) {
  687.             /* stop wanting a specific exit */
  688.             conn->chosen_exit_optional = 0;
  689.             tor_free(conn->chosen_exit_name); /* clears it */
  690.           }
  691.           if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0)
  692.             return 0;
  693.           /* else, conn will get closed below */
  694.         } else {
  695.           log_notice(LD_APP,
  696.                      "Have tried resolving or connecting to address '%s' "
  697.                      "at %d different places. Giving up.",
  698.                      safe_str(conn->socks_request->address),
  699.                      MAX_RESOLVE_FAILURES);
  700.           /* clear the failures, so it will have a full try next time */
  701.           client_dns_clear_failures(conn->socks_request->address);
  702.         }
  703.         break;
  704.       case END_STREAM_REASON_HIBERNATING:
  705.       case END_STREAM_REASON_RESOURCELIMIT:
  706.         if (exitrouter) {
  707.           policies_set_router_exitpolicy_to_reject_all(exitrouter);
  708.         }
  709.         if (conn->chosen_exit_optional) {
  710.           /* stop wanting a specific exit */
  711.           conn->chosen_exit_optional = 0;
  712.           tor_free(conn->chosen_exit_name); /* clears it */
  713.         }
  714.         if (connection_ap_detach_retriable(conn, circ, control_reason) >= 0)
  715.           return 0;
  716.         /* else, will close below */
  717.         break;
  718.     } /* end switch */
  719.     log_info(LD_APP,"Giving up on retrying; conn can't be handled.");
  720.   }
  721.   log_info(LD_APP,
  722.            "Edge got end (%s) before we're connected. Marking for close.",
  723.        stream_end_reason_to_string(rh->length > 0 ? reason : -1));
  724.   circuit_log_path(LOG_INFO,LD_APP,circ);
  725.   /* need to test because of detach_retriable */
  726.   if (!conn->_base.marked_for_close)
  727.     connection_mark_unattached_ap(conn, control_reason);
  728.   return 0;
  729. }
  730. /** Helper: change the socks_request-&gt;address field on conn to the
  731.  * dotted-quad representation of <b>new_addr</b> (given in host order),
  732.  * and send an appropriate REMAP event. */
  733. static void
  734. remap_event_helper(edge_connection_t *conn, uint32_t new_addr)
  735. {
  736.   struct in_addr in;
  737.   in.s_addr = htonl(new_addr);
  738.   tor_inet_ntoa(&in, conn->socks_request->address,
  739.                 sizeof(conn->socks_request->address));
  740.   control_event_stream_status(conn, STREAM_EVENT_REMAP,
  741.                               REMAP_STREAM_SOURCE_EXIT);
  742. }
  743. /** An incoming relay cell has arrived from circuit <b>circ</b> to
  744.  * stream <b>conn</b>.
  745.  *
  746.  * The arguments here are the same as in
  747.  * connection_edge_process_relay_cell() below; this function is called
  748.  * from there when <b>conn</b> is defined and not in an open state.
  749.  */
  750. static int
  751. connection_edge_process_relay_cell_not_open(
  752.     relay_header_t *rh, cell_t *cell, circuit_t *circ,
  753.     edge_connection_t *conn, crypt_path_t *layer_hint)
  754. {
  755.   if (rh->command == RELAY_COMMAND_END) {
  756.     if (CIRCUIT_IS_ORIGIN(circ) && conn->_base.type == CONN_TYPE_AP) {
  757.       return connection_ap_process_end_not_open(rh, cell,
  758.                                                 TO_ORIGIN_CIRCUIT(circ), conn,
  759.                                                 layer_hint);
  760.     } else {
  761.       /* we just got an 'end', don't need to send one */
  762.       conn->edge_has_sent_end = 1;
  763.       conn->end_reason = *(cell->payload+RELAY_HEADER_SIZE) |
  764.                          END_STREAM_REASON_FLAG_REMOTE;
  765.       connection_mark_for_close(TO_CONN(conn));
  766.       return 0;
  767.     }
  768.   }
  769.   if (conn->_base.type == CONN_TYPE_AP &&
  770.       rh->command == RELAY_COMMAND_CONNECTED) {
  771.     tor_assert(CIRCUIT_IS_ORIGIN(circ));
  772.     if (conn->_base.state != AP_CONN_STATE_CONNECT_WAIT) {
  773.       log_fn(LOG_PROTOCOL_WARN, LD_APP,
  774.              "Got 'connected' while not in state connect_wait. Dropping.");
  775.       return 0;
  776.     }
  777.     conn->_base.state = AP_CONN_STATE_OPEN;
  778.     log_info(LD_APP,"'connected' received after %d seconds.",
  779.              (int)(time(NULL) - conn->_base.timestamp_lastread));
  780.     if (rh->length >= 4) {
  781.       uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE));
  782.       int ttl;
  783.       if (!addr || (get_options()->ClientDNSRejectInternalAddresses &&
  784.                     is_internal_IP(addr, 0))) {
  785.         char buf[INET_NTOA_BUF_LEN];
  786.         struct in_addr a;
  787.         a.s_addr = htonl(addr);
  788.         tor_inet_ntoa(&a, buf, sizeof(buf));
  789.         log_info(LD_APP,
  790.                  "...but it claims the IP address was %s. Closing.", buf);
  791.         connection_edge_end(conn, END_STREAM_REASON_TORPROTOCOL);
  792.         connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
  793.         return 0;
  794.       }
  795.       if (rh->length >= 8)
  796.         ttl = (int)ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+4));
  797.       else
  798.         ttl = -1;
  799.       client_dns_set_addressmap(conn->socks_request->address, addr,
  800.                                 conn->chosen_exit_name, ttl);
  801.       remap_event_helper(conn, addr);
  802.     }
  803.     circuit_log_path(LOG_INFO,LD_APP,TO_ORIGIN_CIRCUIT(circ));
  804.     /* don't send a socks reply to transparent conns */
  805.     if (!conn->socks_request->has_finished)
  806.       connection_ap_handshake_socks_reply(conn, NULL, 0, 0);
  807.     /* Was it a linked dir conn? If so, a dir request just started to
  808.      * fetch something; this could be a bootstrap status milestone. */
  809.     log_debug(LD_APP, "considering");
  810.     if (TO_CONN(conn)->linked_conn &&
  811.         TO_CONN(conn)->linked_conn->type == CONN_TYPE_DIR) {
  812.       connection_t *dirconn = TO_CONN(conn)->linked_conn;
  813.       log_debug(LD_APP, "it is! %d", dirconn->purpose);
  814.       switch (dirconn->purpose) {
  815.         case DIR_PURPOSE_FETCH_CERTIFICATE:
  816.           if (consensus_is_waiting_for_certs())
  817.             control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_KEYS, 0);
  818.           break;
  819.         case DIR_PURPOSE_FETCH_CONSENSUS:
  820.           control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_STATUS, 0);
  821.           break;
  822.         case DIR_PURPOSE_FETCH_SERVERDESC:
  823.           control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
  824.                                   count_loading_descriptors_progress());
  825.           break;
  826.       }
  827.     }
  828.     /* handle anything that might have queued */
  829.     if (connection_edge_package_raw_inbuf(conn, 1) < 0) {
  830.       /* (We already sent an end cell if possible) */
  831.       connection_mark_for_close(TO_CONN(conn));
  832.       return 0;
  833.     }
  834.     return 0;
  835.   }
  836.   if (conn->_base.type == CONN_TYPE_AP &&
  837.       rh->command == RELAY_COMMAND_RESOLVED) {
  838.     int ttl;
  839.     int answer_len;
  840.     uint8_t answer_type;
  841.     if (conn->_base.state != AP_CONN_STATE_RESOLVE_WAIT) {
  842.       log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while "
  843.              "not in state resolve_wait. Dropping.");
  844.       return 0;
  845.     }
  846.     tor_assert(SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command));
  847.     answer_len = cell->payload[RELAY_HEADER_SIZE+1];
  848.     if (rh->length < 2 || answer_len+2>rh->length) {
  849.       log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  850.              "Dropping malformed 'resolved' cell");
  851.       connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
  852.       return 0;
  853.     }
  854.     answer_type = cell->payload[RELAY_HEADER_SIZE];
  855.     if (rh->length >= answer_len+6)
  856.       ttl = (int)ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+
  857.                                   2+answer_len));
  858.     else
  859.       ttl = -1;
  860.     if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) {
  861.       uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2));
  862.       if (get_options()->ClientDNSRejectInternalAddresses &&
  863.           is_internal_IP(addr, 0)) {
  864.         char buf[INET_NTOA_BUF_LEN];
  865.         struct in_addr a;
  866.         a.s_addr = htonl(addr);
  867.         tor_inet_ntoa(&a, buf, sizeof(buf));
  868.         log_info(LD_APP,"Got a resolve with answer %s.  Rejecting.", buf);
  869.         connection_ap_handshake_socks_resolved(conn,
  870.                                                RESOLVED_TYPE_ERROR_TRANSIENT,
  871.                                                0, NULL, 0, TIME_MAX);
  872.         connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
  873.         return 0;
  874.       }
  875.     }
  876.     connection_ap_handshake_socks_resolved(conn,
  877.                    answer_type,
  878.                    cell->payload[RELAY_HEADER_SIZE+1], /*answer_len*/
  879.                    cell->payload+RELAY_HEADER_SIZE+2, /*answer*/
  880.                    ttl,
  881.                    -1);
  882.     if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) {
  883.       uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2));
  884.       remap_event_helper(conn, addr);
  885.     }
  886.     connection_mark_unattached_ap(conn,
  887.                               END_STREAM_REASON_DONE |
  888.                               END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
  889.     return 0;
  890.   }
  891.   log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  892.          "Got an unexpected relay command %d, in state %d (%s). Dropping.",
  893.          rh->command, conn->_base.state,
  894.          conn_state_to_string(conn->_base.type, conn->_base.state));
  895.   return 0; /* for forward compatibility, don't kill the circuit */
  896. //  connection_edge_end(conn, END_STREAM_REASON_TORPROTOCOL);
  897. //  connection_mark_for_close(conn);
  898. //  return -1;
  899. }
  900. /** An incoming relay cell has arrived on circuit <b>circ</b>. If
  901.  * <b>conn</b> is NULL this is a control cell, else <b>cell</b> is
  902.  * destined for <b>conn</b>.
  903.  *
  904.  * If <b>layer_hint</b> is defined, then we're the origin of the
  905.  * circuit, and it specifies the hop that packaged <b>cell</b>.
  906.  *
  907.  * Return -reason if you want to warn and tear down the circuit, else 0.
  908.  */
  909. static int
  910. connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
  911.                                    edge_connection_t *conn,
  912.                                    crypt_path_t *layer_hint)
  913. {
  914.   static int num_seen=0;
  915.   relay_header_t rh;
  916.   unsigned domain = layer_hint?LD_APP:LD_EXIT;
  917.   int reason;
  918.   tor_assert(cell);
  919.   tor_assert(circ);
  920.   relay_header_unpack(&rh, cell->payload);
  921. //  log_fn(LOG_DEBUG,"command %d stream %d", rh.command, rh.stream_id);
  922.   num_seen++;
  923.   log_debug(domain, "Now seen %d relay cells here.", num_seen);
  924.   if (rh.length > RELAY_PAYLOAD_SIZE) {
  925.     log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  926.            "Relay cell length field too long. Closing circuit.");
  927.     return - END_CIRC_REASON_TORPROTOCOL;
  928.   }
  929.   /* either conn is NULL, in which case we've got a control cell, or else
  930.    * conn points to the recognized stream. */
  931.   if (conn && !connection_state_is_open(TO_CONN(conn)))
  932.     return connection_edge_process_relay_cell_not_open(
  933.              &rh, cell, circ, conn, layer_hint);
  934.   switch (rh.command) {
  935.     case RELAY_COMMAND_DROP:
  936. //      log_info(domain,"Got a relay-level padding cell. Dropping.");
  937.       return 0;
  938.     case RELAY_COMMAND_BEGIN:
  939.     case RELAY_COMMAND_BEGIN_DIR:
  940.       if (layer_hint &&
  941.           circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED) {
  942.         log_fn(LOG_PROTOCOL_WARN, LD_APP,
  943.                "Relay begin request unsupported at AP. Dropping.");
  944.         return 0;
  945.       }
  946.       if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED &&
  947.           layer_hint != TO_ORIGIN_CIRCUIT(circ)->cpath->prev) {
  948.         log_fn(LOG_PROTOCOL_WARN, LD_APP,
  949.                "Relay begin request to Hidden Service "
  950.                "from intermediary node. Dropping.");
  951.         return 0;
  952.       }
  953.       if (conn) {
  954.         log_fn(LOG_PROTOCOL_WARN, domain,
  955.                "Begin cell for known stream. Dropping.");
  956.         return 0;
  957.       }
  958.       return connection_exit_begin_conn(cell, circ);
  959.     case RELAY_COMMAND_DATA:
  960.       ++stats_n_data_cells_received;
  961.       if (( layer_hint && --layer_hint->deliver_window < 0) ||
  962.           (!layer_hint && --circ->deliver_window < 0)) {
  963.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  964.                "(relay data) circ deliver_window below 0. Killing.");
  965.         connection_edge_end(conn, END_STREAM_REASON_TORPROTOCOL);
  966.         connection_mark_for_close(TO_CONN(conn));
  967.         return -END_CIRC_REASON_TORPROTOCOL;
  968.       }
  969.       log_debug(domain,"circ deliver_window now %d.", layer_hint ?
  970.                 layer_hint->deliver_window : circ->deliver_window);
  971.       circuit_consider_sending_sendme(circ, layer_hint);
  972.       if (!conn) {
  973.         log_info(domain,"data cell dropped, unknown stream (streamid %d).",
  974.                  rh.stream_id);
  975.         return 0;
  976.       }
  977.       if (--conn->deliver_window < 0) { /* is it below 0 after decrement? */
  978.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  979.                "(relay data) conn deliver_window below 0. Killing.");
  980.         return -END_CIRC_REASON_TORPROTOCOL;
  981.       }
  982.       stats_n_data_bytes_received += rh.length;
  983.       connection_write_to_buf(cell->payload + RELAY_HEADER_SIZE,
  984.                               rh.length, TO_CONN(conn));
  985.       connection_edge_consider_sending_sendme(conn);
  986.       return 0;
  987.     case RELAY_COMMAND_END:
  988.       reason = rh.length > 0 ?
  989.         *(uint8_t *)(cell->payload+RELAY_HEADER_SIZE) : END_STREAM_REASON_MISC;
  990.       if (!conn) {
  991.         log_info(domain,"end cell (%s) dropped, unknown stream.",
  992.                  stream_end_reason_to_string(reason));
  993.         return 0;
  994.       }
  995. /* XXX add to this log_fn the exit node's nickname? */
  996.       log_info(domain,"%d: end cell (%s) for stream %d. Removing stream.",
  997.                conn->_base.s,
  998.                stream_end_reason_to_string(reason),
  999.                conn->stream_id);
  1000.       if (conn->socks_request && !conn->socks_request->has_finished)
  1001.         log_warn(LD_BUG,
  1002.                  "open stream hasn't sent socks answer yet? Closing.");
  1003.       /* We just *got* an end; no reason to send one. */
  1004.       conn->edge_has_sent_end = 1;
  1005.       if (!conn->end_reason)
  1006.         conn->end_reason = reason | END_STREAM_REASON_FLAG_REMOTE;
  1007.       if (!conn->_base.marked_for_close) {
  1008.         /* only mark it if not already marked. it's possible to
  1009.          * get the 'end' right around when the client hangs up on us. */
  1010.         connection_mark_for_close(TO_CONN(conn));
  1011.         conn->_base.hold_open_until_flushed = 1;
  1012.       }
  1013.       return 0;
  1014.     case RELAY_COMMAND_EXTEND:
  1015.       if (conn) {
  1016.         log_fn(LOG_PROTOCOL_WARN, domain,
  1017.                "'extend' cell received for non-zero stream. Dropping.");
  1018.         return 0;
  1019.       }
  1020.       return circuit_extend(cell, circ);
  1021.     case RELAY_COMMAND_EXTENDED:
  1022.       if (!layer_hint) {
  1023.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  1024.                "'extended' unsupported at non-origin. Dropping.");
  1025.         return 0;
  1026.       }
  1027.       log_debug(domain,"Got an extended cell! Yay.");
  1028.       if ((reason = circuit_finish_handshake(TO_ORIGIN_CIRCUIT(circ),
  1029.                                        CELL_CREATED,
  1030.                                        cell->payload+RELAY_HEADER_SIZE)) < 0) {
  1031.         log_warn(domain,"circuit_finish_handshake failed.");
  1032.         return reason;
  1033.       }
  1034.       if ((reason=circuit_send_next_onion_skin(TO_ORIGIN_CIRCUIT(circ)))<0) {
  1035.         log_info(domain,"circuit_send_next_onion_skin() failed.");
  1036.         return reason;
  1037.       }
  1038.       return 0;
  1039.     case RELAY_COMMAND_TRUNCATE:
  1040.       if (layer_hint) {
  1041.         log_fn(LOG_PROTOCOL_WARN, LD_APP,
  1042.                "'truncate' unsupported at origin. Dropping.");
  1043.         return 0;
  1044.       }
  1045.       if (circ->n_conn) {
  1046.         uint8_t trunc_reason = *(uint8_t*)(cell->payload + RELAY_HEADER_SIZE);
  1047.         connection_or_send_destroy(circ->n_circ_id, circ->n_conn,
  1048.                                    trunc_reason);
  1049.         circuit_set_n_circid_orconn(circ, 0, NULL);
  1050.       }
  1051.       log_debug(LD_EXIT, "Processed 'truncate', replying.");
  1052.       {
  1053.         char payload[1];
  1054.         payload[0] = (char)END_CIRC_REASON_REQUESTED;
  1055.         relay_send_command_from_edge(0, circ, RELAY_COMMAND_TRUNCATED,
  1056.                                      payload, sizeof(payload), NULL);
  1057.       }
  1058.       return 0;
  1059.     case RELAY_COMMAND_TRUNCATED:
  1060.       if (!layer_hint) {
  1061.         log_fn(LOG_PROTOCOL_WARN, LD_EXIT,
  1062.                "'truncated' unsupported at non-origin. Dropping.");
  1063.         return 0;
  1064.       }
  1065.       circuit_truncated(TO_ORIGIN_CIRCUIT(circ), layer_hint);
  1066.       return 0;
  1067.     case RELAY_COMMAND_CONNECTED:
  1068.       if (conn) {
  1069.         log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  1070.                "'connected' unsupported while open. Closing circ.");
  1071.         return -END_CIRC_REASON_TORPROTOCOL;
  1072.       }
  1073.       log_info(domain,
  1074.                "'connected' received, no conn attached anymore. Ignoring.");
  1075.       return 0;
  1076.     case RELAY_COMMAND_SENDME:
  1077.       if (!conn) {
  1078.         if (layer_hint) {
  1079.           layer_hint->package_window += CIRCWINDOW_INCREMENT;
  1080.           log_debug(LD_APP,"circ-level sendme at origin, packagewindow %d.",
  1081.                     layer_hint->package_window);
  1082.           circuit_resume_edge_reading(circ, layer_hint);
  1083.         } else {
  1084.           circ->package_window += CIRCWINDOW_INCREMENT;
  1085.           log_debug(LD_APP,
  1086.                     "circ-level sendme at non-origin, packagewindow %d.",
  1087.                     circ->package_window);
  1088.           circuit_resume_edge_reading(circ, layer_hint);
  1089.         }
  1090.         return 0;
  1091.       }
  1092.       conn->package_window += STREAMWINDOW_INCREMENT;
  1093.       log_debug(domain,"stream-level sendme, packagewindow now %d.",
  1094.                 conn->package_window);
  1095.       connection_start_reading(TO_CONN(conn));
  1096.       /* handle whatever might still be on the inbuf */
  1097.       if (connection_edge_package_raw_inbuf(conn, 1) < 0) {
  1098.         /* (We already sent an end cell if possible) */
  1099.         connection_mark_for_close(TO_CONN(conn));
  1100.         return 0;
  1101.       }
  1102.       return 0;
  1103.     case RELAY_COMMAND_RESOLVE:
  1104.       if (layer_hint) {
  1105.         log_fn(LOG_PROTOCOL_WARN, LD_APP,
  1106.                "resolve request unsupported at AP; dropping.");
  1107.         return 0;
  1108.       } else if (conn) {
  1109.         log_fn(LOG_PROTOCOL_WARN, domain,
  1110.                "resolve request for known stream; dropping.");
  1111.         return 0;
  1112.       } else if (circ->purpose != CIRCUIT_PURPOSE_OR) {
  1113.         log_fn(LOG_PROTOCOL_WARN, domain,
  1114.                "resolve request on circ with purpose %d; dropping",
  1115.                circ->purpose);
  1116.         return 0;
  1117.       }
  1118.       connection_exit_begin_resolve(cell, TO_OR_CIRCUIT(circ));
  1119.       return 0;
  1120.     case RELAY_COMMAND_RESOLVED:
  1121.       if (conn) {
  1122.         log_fn(LOG_PROTOCOL_WARN, domain,
  1123.                "'resolved' unsupported while open. Closing circ.");
  1124.         return -END_CIRC_REASON_TORPROTOCOL;
  1125.       }
  1126.       log_info(domain,
  1127.                "'resolved' received, no conn attached anymore. Ignoring.");
  1128.       return 0;
  1129.     case RELAY_COMMAND_ESTABLISH_INTRO:
  1130.     case RELAY_COMMAND_ESTABLISH_RENDEZVOUS:
  1131.     case RELAY_COMMAND_INTRODUCE1:
  1132.     case RELAY_COMMAND_INTRODUCE2:
  1133.     case RELAY_COMMAND_INTRODUCE_ACK:
  1134.     case RELAY_COMMAND_RENDEZVOUS1:
  1135.     case RELAY_COMMAND_RENDEZVOUS2:
  1136.     case RELAY_COMMAND_INTRO_ESTABLISHED:
  1137.     case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED:
  1138.       rend_process_relay_cell(circ, layer_hint,
  1139.                               rh.command, rh.length,
  1140.                               cell->payload+RELAY_HEADER_SIZE);
  1141.       return 0;
  1142.   }
  1143.   log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
  1144.          "Received unknown relay command %d. Perhaps the other side is using "
  1145.          "a newer version of Tor? Dropping.",
  1146.          rh.command);
  1147.   return 0; /* for forward compatibility, don't kill the circuit */
  1148. }
  1149. /** How many relay_data cells have we built, ever? */
  1150. uint64_t stats_n_data_cells_packaged = 0;
  1151. /** How many bytes of data have we put in relay_data cells have we built,
  1152.  * ever? This would be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if
  1153.  * every relay cell we ever sent were completely full of data. */
  1154. uint64_t stats_n_data_bytes_packaged = 0;
  1155. /** How many relay_data cells have we received, ever? */
  1156. uint64_t stats_n_data_cells_received = 0;
  1157. /** How many bytes of data have we received relay_data cells, ever? This would
  1158.  * be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if every relay cell we
  1159.  * ever received were completely full of data. */
  1160. uint64_t stats_n_data_bytes_received = 0;
  1161. /** While conn->inbuf has an entire relay payload of bytes on it,
  1162.  * and the appropriate package windows aren't empty, grab a cell
  1163.  * and send it down the circuit.
  1164.  *
  1165.  * Return -1 (and send a RELAY_COMMAND_END cell if necessary) if conn should
  1166.  * be marked for close, else return 0.
  1167.  */
  1168. int
  1169. connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial)
  1170. {
  1171.   size_t amount_to_process, length;
  1172.   char payload[CELL_PAYLOAD_SIZE];
  1173.   circuit_t *circ;
  1174.   unsigned domain = conn->cpath_layer ? LD_APP : LD_EXIT;
  1175.   tor_assert(conn);
  1176.   if (conn->_base.marked_for_close) {
  1177.     log_warn(LD_BUG,
  1178.              "called on conn that's already marked for close at %s:%d.",
  1179.              conn->_base.marked_for_close_file, conn->_base.marked_for_close);
  1180.     return 0;
  1181.   }
  1182. repeat_connection_edge_package_raw_inbuf:
  1183.   circ = circuit_get_by_edge_conn(conn);
  1184.   if (!circ) {
  1185.     log_info(domain,"conn has no circuit! Closing.");
  1186.     conn->end_reason = END_STREAM_REASON_CANT_ATTACH;
  1187.     return -1;
  1188.   }
  1189.   if (circuit_consider_stop_edge_reading(circ, conn->cpath_layer))
  1190.     return 0;
  1191.   if (conn->package_window <= 0) {
  1192.     log_info(domain,"called with package_window %d. Skipping.",
  1193.              conn->package_window);
  1194.     connection_stop_reading(TO_CONN(conn));
  1195.     return 0;
  1196.   }
  1197.   amount_to_process = buf_datalen(conn->_base.inbuf);
  1198.   if (!amount_to_process)
  1199.     return 0;
  1200.   if (!package_partial && amount_to_process < RELAY_PAYLOAD_SIZE)
  1201.     return 0;
  1202.   if (amount_to_process > RELAY_PAYLOAD_SIZE) {
  1203.     length = RELAY_PAYLOAD_SIZE;
  1204.   } else {
  1205.     length = amount_to_process;
  1206.   }
  1207.   stats_n_data_bytes_packaged += length;
  1208.   stats_n_data_cells_packaged += 1;
  1209.   connection_fetch_from_buf(payload, length, TO_CONN(conn));
  1210.   log_debug(domain,"(%d) Packaging %d bytes (%d waiting).", conn->_base.s,
  1211.             (int)length, (int)buf_datalen(conn->_base.inbuf));
  1212.   if (connection_edge_send_command(conn, RELAY_COMMAND_DATA,
  1213.                                    payload, length) < 0 )
  1214.     /* circuit got marked for close, don't continue, don't need to mark conn */
  1215.     return 0;
  1216.   if (!conn->cpath_layer) { /* non-rendezvous exit */
  1217.     tor_assert(circ->package_window > 0);
  1218.     circ->package_window--;
  1219.   } else { /* we're an AP, or an exit on a rendezvous circ */
  1220.     tor_assert(conn->cpath_layer->package_window > 0);
  1221.     conn->cpath_layer->package_window--;
  1222.   }
  1223.   if (--conn->package_window <= 0) { /* is it 0 after decrement? */
  1224.     connection_stop_reading(TO_CONN(conn));
  1225.     log_debug(domain,"conn->package_window reached 0.");
  1226.     circuit_consider_stop_edge_reading(circ, conn->cpath_layer);
  1227.     return 0; /* don't process the inbuf any more */
  1228.   }
  1229.   log_debug(domain,"conn->package_window is now %d",conn->package_window);
  1230.   /* handle more if there's more, or return 0 if there isn't */
  1231.   goto repeat_connection_edge_package_raw_inbuf;
  1232. }
  1233. /** Called when we've just received a relay data cell, or when
  1234.  * we've just finished flushing all bytes to stream <b>conn</b>.
  1235.  *
  1236.  * If conn->outbuf is not too full, and our deliver window is
  1237.  * low, send back a suitable number of stream-level sendme cells.
  1238.  */
  1239. void
  1240. connection_edge_consider_sending_sendme(edge_connection_t *conn)
  1241. {
  1242.   circuit_t *circ;
  1243.   if (connection_outbuf_too_full(TO_CONN(conn)))
  1244.     return;
  1245.   circ = circuit_get_by_edge_conn(conn);
  1246.   if (!circ) {
  1247.     /* this can legitimately happen if the destroy has already
  1248.      * arrived and torn down the circuit */
  1249.     log_info(LD_APP,"No circuit associated with conn. Skipping.");
  1250.     return;
  1251.   }
  1252.   while (conn->deliver_window <= STREAMWINDOW_START - STREAMWINDOW_INCREMENT) {
  1253.     log_debug(conn->cpath_layer?LD_APP:LD_EXIT,
  1254.               "Outbuf %d, Queuing stream sendme.",
  1255.               (int)conn->_base.outbuf_flushlen);
  1256.     conn->deliver_window += STREAMWINDOW_INCREMENT;
  1257.     if (connection_edge_send_command(conn, RELAY_COMMAND_SENDME,
  1258.                                      NULL, 0) < 0) {
  1259.       log_warn(LD_APP,"connection_edge_send_command failed. Skipping.");
  1260.       return; /* the circuit's closed, don't continue */
  1261.     }
  1262.   }
  1263. }
  1264. /** The circuit <b>circ</b> has received a circuit-level sendme
  1265.  * (on hop <b>layer_hint</b>, if we're the OP). Go through all the
  1266.  * attached streams and let them resume reading and packaging, if
  1267.  * their stream windows allow it.
  1268.  */
  1269. static void
  1270. circuit_resume_edge_reading(circuit_t *circ, crypt_path_t *layer_hint)
  1271. {
  1272.   log_debug(layer_hint?LD_APP:LD_EXIT,"resuming");
  1273.   if (CIRCUIT_IS_ORIGIN(circ))
  1274.     circuit_resume_edge_reading_helper(TO_ORIGIN_CIRCUIT(circ)->p_streams,
  1275.                                        circ, layer_hint);
  1276.   else
  1277.     circuit_resume_edge_reading_helper(TO_OR_CIRCUIT(circ)->n_streams,
  1278.                                        circ, layer_hint);
  1279. }
  1280. /** A helper function for circuit_resume_edge_reading() above.
  1281.  * The arguments are the same, except that <b>conn</b> is the head
  1282.  * of a linked list of edge streams that should each be considered.
  1283.  */
  1284. static int
  1285. circuit_resume_edge_reading_helper(edge_connection_t *conn,
  1286.                                    circuit_t *circ,
  1287.                                    crypt_path_t *layer_hint)
  1288. {
  1289.   for ( ; conn; conn=conn->next_stream) {
  1290.     if (conn->_base.marked_for_close)
  1291.       continue;
  1292.     if ((!layer_hint && conn->package_window > 0) ||
  1293.         (layer_hint && conn->package_window > 0 &&
  1294.          conn->cpath_layer == layer_hint)) {
  1295.       connection_start_reading(TO_CONN(conn));
  1296.       /* handle whatever might still be on the inbuf */
  1297.       if (connection_edge_package_raw_inbuf(conn, 1)<0) {
  1298.         /* (We already sent an end cell if possible) */
  1299.         connection_mark_for_close(TO_CONN(conn));
  1300.         continue;
  1301.       }
  1302.       /* If the circuit won't accept any more data, return without looking
  1303.        * at any more of the streams. Any connections that should be stopped
  1304.        * have already been stopped by connection_edge_package_raw_inbuf. */
  1305.       if (circuit_consider_stop_edge_reading(circ, layer_hint))
  1306.         return -1;
  1307.     }
  1308.   }
  1309.   return 0;
  1310. }
  1311. /** Check if the package window for <b>circ</b> is empty (at
  1312.  * hop <b>layer_hint</b> if it's defined).
  1313.  *
  1314.  * If yes, tell edge streams to stop reading and return 1.
  1315.  * Else return 0.
  1316.  */
  1317. static int
  1318. circuit_consider_stop_edge_reading(circuit_t *circ, crypt_path_t *layer_hint)
  1319. {
  1320.   edge_connection_t *conn = NULL;
  1321.   unsigned domain = layer_hint ? LD_APP : LD_EXIT;
  1322.   if (!layer_hint) {
  1323.     or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
  1324.     log_debug(domain,"considering circ->package_window %d",
  1325.               circ->package_window);
  1326.     if (circ->package_window <= 0) {
  1327.       log_debug(domain,"yes, not-at-origin. stopped.");
  1328.       for (conn = or_circ->n_streams; conn; conn=conn->next_stream)
  1329.         connection_stop_reading(TO_CONN(conn));
  1330.       return 1;
  1331.     }
  1332.     return 0;
  1333.   }
  1334.   /* else, layer hint is defined, use it */
  1335.   log_debug(domain,"considering layer_hint->package_window %d",
  1336.             layer_hint->package_window);
  1337.   if (layer_hint->package_window <= 0) {
  1338.     log_debug(domain,"yes, at-origin. stopped.");
  1339.     for (conn = TO_ORIGIN_CIRCUIT(circ)->p_streams; conn;
  1340.          conn=conn->next_stream)
  1341.       if (conn->cpath_layer == layer_hint)
  1342.         connection_stop_reading(TO_CONN(conn));
  1343.     return 1;
  1344.   }
  1345.   return 0;
  1346. }
  1347. /** Check if the deliver_window for circuit <b>circ</b> (at hop
  1348.  * <b>layer_hint</b> if it's defined) is low enough that we should
  1349.  * send a circuit-level sendme back down the circuit. If so, send
  1350.  * enough sendmes that the window would be overfull if we sent any
  1351.  * more.
  1352.  */
  1353. static void
  1354. circuit_consider_sending_sendme(circuit_t *circ, crypt_path_t *layer_hint)
  1355. {
  1356. //  log_fn(LOG_INFO,"Considering: layer_hint is %s",
  1357. //         layer_hint ? "defined" : "null");
  1358.   while ((layer_hint ? layer_hint->deliver_window : circ->deliver_window) <=
  1359.           CIRCWINDOW_START - CIRCWINDOW_INCREMENT) {
  1360.     log_debug(LD_CIRC,"Queuing circuit sendme.");
  1361.     if (layer_hint)
  1362.       layer_hint->deliver_window += CIRCWINDOW_INCREMENT;
  1363.     else
  1364.       circ->deliver_window += CIRCWINDOW_INCREMENT;
  1365.     if (relay_send_command_from_edge(0, circ, RELAY_COMMAND_SENDME,
  1366.                                      NULL, 0, layer_hint) < 0) {
  1367.       log_warn(LD_CIRC,
  1368.                "relay_send_command_from_edge failed. Circuit's closed.");
  1369.       return; /* the circuit's closed, don't continue */
  1370.     }
  1371.   }
  1372. }
  1373. /** Stop reading on edge connections when we have this many cells
  1374.  * waiting on the appropriate queue. */
  1375. #define CELL_QUEUE_HIGHWATER_SIZE 256
  1376. /** Start reading from edge connections again when we get down to this many
  1377.  * cells. */
  1378. #define CELL_QUEUE_LOWWATER_SIZE 64
  1379. #ifdef ACTIVE_CIRCUITS_PARANOIA
  1380. #define assert_active_circuits_ok_paranoid(conn) 
  1381.      assert_active_circuits_ok(conn)
  1382. #else
  1383. #define assert_active_circuits_ok_paranoid(conn)
  1384. #endif
  1385. /** The total number of cells we have allocated from the memory pool. */
  1386. static int total_cells_allocated = 0;
  1387. /** A memory pool to allocate packed_cell_t objects. */
  1388. static mp_pool_t *cell_pool = NULL;
  1389. /** Allocate structures to hold cells. */
  1390. void
  1391. init_cell_pool(void)
  1392. {
  1393.   tor_assert(!cell_pool);
  1394.   cell_pool = mp_pool_new(sizeof(packed_cell_t), 128*1024);
  1395. }
  1396. /** Free all storage used to hold cells. */
  1397. void
  1398. free_cell_pool(void)
  1399. {
  1400.   /* Maybe we haven't called init_cell_pool yet; need to check for it. */
  1401.   if (cell_pool) {
  1402.     mp_pool_destroy(cell_pool);
  1403.     cell_pool = NULL;
  1404.   }
  1405. }
  1406. /** Free excess storage in cell pool. */
  1407. void
  1408. clean_cell_pool(void)
  1409. {
  1410.   tor_assert(cell_pool);
  1411.   mp_pool_clean(cell_pool, 0, 1);
  1412. }
  1413. /** Release storage held by <b>cell</b>. */
  1414. static INLINE void
  1415. packed_cell_free(packed_cell_t *cell)
  1416. {
  1417.   --total_cells_allocated;
  1418.   mp_pool_release(cell);
  1419. }
  1420. /** Allocate and return a new packed_cell_t. */
  1421. static INLINE packed_cell_t *
  1422. packed_cell_alloc(void)
  1423. {
  1424.   ++total_cells_allocated;
  1425.   return mp_pool_get(cell_pool);
  1426. }
  1427. /** Log current statistics for cell pool allocation at log level
  1428.  * <b>severity</b>. */
  1429. void
  1430. dump_cell_pool_usage(int severity)
  1431. {
  1432.   circuit_t *c;
  1433.   int n_circs = 0;
  1434.   int n_cells = 0;
  1435.   for (c = _circuit_get_global_list(); c; c = c->next) {
  1436.     n_cells += c->n_conn_cells.n;
  1437.     if (!CIRCUIT_IS_ORIGIN(c))
  1438.       n_cells += TO_OR_CIRCUIT(c)->p_conn_cells.n;
  1439.     ++n_circs;
  1440.   }
  1441.   log(severity, LD_MM, "%d cells allocated on %d circuits. %d cells leaked.",
  1442.       n_cells, n_circs, total_cells_allocated - n_cells);
  1443.   mp_pool_log_status(cell_pool, severity);
  1444. }
  1445. /** Allocate a new copy of packed <b>cell</b>. */
  1446. static INLINE packed_cell_t *
  1447. packed_cell_copy(const cell_t *cell)
  1448. {
  1449.   packed_cell_t *c = packed_cell_alloc();
  1450.   cell_pack(c, cell);
  1451.   c->next = NULL;
  1452.   return c;
  1453. }
  1454. /** Append <b>cell</b> to the end of <b>queue</b>. */
  1455. void
  1456. cell_queue_append(cell_queue_t *queue, packed_cell_t *cell)
  1457. {
  1458.   if (queue->tail) {
  1459.     tor_assert(!queue->tail->next);
  1460.     queue->tail->next = cell;
  1461.   } else {
  1462.     queue->head = cell;
  1463.   }
  1464.   queue->tail = cell;
  1465.   cell->next = NULL;
  1466.   ++queue->n;
  1467. }
  1468. /** Append a newly allocated copy of <b>cell</b> to the end of <b>queue</b> */
  1469. void
  1470. cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell)
  1471. {
  1472.   cell_queue_append(queue, packed_cell_copy(cell));
  1473. }
  1474. /** Remove and free every cell in <b>queue</b>. */
  1475. void
  1476. cell_queue_clear(cell_queue_t *queue)
  1477. {
  1478.   packed_cell_t *cell, *next;
  1479.   cell = queue->head;
  1480.   while (cell) {
  1481.     next = cell->next;
  1482.     packed_cell_free(cell);
  1483.     cell = next;
  1484.   }
  1485.   queue->head = queue->tail = NULL;
  1486.   queue->n = 0;
  1487. }
  1488. /** Extract and return the cell at the head of <b>queue</b>; return NULL if
  1489.  * <b>queue</b> is empty. */
  1490. static INLINE packed_cell_t *
  1491. cell_queue_pop(cell_queue_t *queue)
  1492. {
  1493.   packed_cell_t *cell = queue->head;
  1494.   if (!cell)
  1495.     return NULL;
  1496.   queue->head = cell->next;
  1497.   if (cell == queue->tail) {
  1498.     tor_assert(!queue->head);
  1499.     queue->tail = NULL;
  1500.   }
  1501.   --queue->n;
  1502.   return cell;
  1503. }
  1504. /** Return a pointer to the "next_active_on_{n,p}_conn" pointer of <b>circ</b>,
  1505.  * depending on whether <b>conn</b> matches n_conn or p_conn. */
  1506. static INLINE circuit_t **
  1507. next_circ_on_conn_p(circuit_t *circ, or_connection_t *conn)
  1508. {
  1509.   tor_assert(circ);
  1510.   tor_assert(conn);
  1511.   if (conn == circ->n_conn) {
  1512.     return &circ->next_active_on_n_conn;
  1513.   } else {
  1514.     or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
  1515.     tor_assert(conn == orcirc->p_conn);
  1516.     return &orcirc->next_active_on_p_conn;
  1517.   }
  1518. }
  1519. /** Return a pointer to the "prev_active_on_{n,p}_conn" pointer of <b>circ</b>,
  1520.  * depending on whether <b>conn</b> matches n_conn or p_conn. */
  1521. static INLINE circuit_t **
  1522. prev_circ_on_conn_p(circuit_t *circ, or_connection_t *conn)
  1523. {
  1524.   tor_assert(circ);
  1525.   tor_assert(conn);
  1526.   if (conn == circ->n_conn) {
  1527.     return &circ->prev_active_on_n_conn;
  1528.   } else {
  1529.     or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
  1530.     tor_assert(conn == orcirc->p_conn);
  1531.     return &orcirc->prev_active_on_p_conn;
  1532.   }
  1533. }
  1534. /** Add <b>circ</b> to the list of circuits with pending cells on
  1535.  * <b>conn</b>.  No effect if <b>circ</b> is already unlinked. */
  1536. void
  1537. make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn)
  1538. {
  1539.   circuit_t **nextp = next_circ_on_conn_p(circ, conn);
  1540.   circuit_t **prevp = prev_circ_on_conn_p(circ, conn);
  1541.   if (*nextp && *prevp) {
  1542.     /* Already active. */
  1543.     return;
  1544.   }
  1545.   if (! conn->active_circuits) {
  1546.     conn->active_circuits = circ;
  1547.     *prevp = *nextp = circ;
  1548.   } else {
  1549.     circuit_t *head = conn->active_circuits;
  1550.     circuit_t *old_tail = *prev_circ_on_conn_p(head, conn);
  1551.     *next_circ_on_conn_p(old_tail, conn) = circ;
  1552.     *nextp = head;
  1553.     *prev_circ_on_conn_p(head, conn) = circ;
  1554.     *prevp = old_tail;
  1555.   }
  1556.   assert_active_circuits_ok_paranoid(conn);
  1557. }
  1558. /** Remove <b>circ</b> to the list of circuits with pending cells on
  1559.  * <b>conn</b>.  No effect if <b>circ</b> is already unlinked. */
  1560. void
  1561. make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn)
  1562. {
  1563.   circuit_t **nextp = next_circ_on_conn_p(circ, conn);
  1564.   circuit_t **prevp = prev_circ_on_conn_p(circ, conn);
  1565.   circuit_t *next = *nextp, *prev = *prevp;
  1566.   if (!next && !prev) {
  1567.     /* Already inactive. */
  1568.     return;
  1569.   }
  1570.   tor_assert(next && prev);
  1571.   tor_assert(*prev_circ_on_conn_p(next, conn) == circ);
  1572.   tor_assert(*next_circ_on_conn_p(prev, conn) == circ);
  1573.   if (next == circ) {
  1574.     conn->active_circuits = NULL;
  1575.   } else {
  1576.     *prev_circ_on_conn_p(next, conn) = prev;
  1577.     *next_circ_on_conn_p(prev, conn) = next;
  1578.     if (conn->active_circuits == circ)
  1579.       conn->active_circuits = next;
  1580.   }
  1581.   *prevp = *nextp = NULL;
  1582.   assert_active_circuits_ok_paranoid(conn);
  1583. }
  1584. /** Remove all circuits from the list of circuits with pending cells on
  1585.  * <b>conn</b>. */
  1586. void
  1587. connection_or_unlink_all_active_circs(or_connection_t *orconn)
  1588. {
  1589.   circuit_t *head = orconn->active_circuits;
  1590.   circuit_t *cur = head;
  1591.   if (! head)
  1592.     return;
  1593.   do {
  1594.     circuit_t *next = *next_circ_on_conn_p(cur, orconn);
  1595.     *prev_circ_on_conn_p(cur, orconn) = NULL;
  1596.     *next_circ_on_conn_p(cur, orconn) = NULL;
  1597.     cur = next;
  1598.   } while (cur != head);
  1599.   orconn->active_circuits = NULL;
  1600. }
  1601. /** Block (if <b>block</b> is true) or unblock (if <b>block</b> is false)
  1602.  * every edge connection that is using <b>circ</b> to write to <b>orconn</b>,
  1603.  * and start or stop reading as appropriate. */
  1604. static void
  1605. set_streams_blocked_on_circ(circuit_t *circ, or_connection_t *orconn,
  1606.                             int block)
  1607. {
  1608.   edge_connection_t *edge = NULL;
  1609.   if (circ->n_conn == orconn) {
  1610.     circ->streams_blocked_on_n_conn = block;
  1611.     if (CIRCUIT_IS_ORIGIN(circ))
  1612.       edge = TO_ORIGIN_CIRCUIT(circ)->p_streams;
  1613.   } else {
  1614.     circ->streams_blocked_on_p_conn = block;
  1615.     tor_assert(!CIRCUIT_IS_ORIGIN(circ));
  1616.     edge = TO_OR_CIRCUIT(circ)->n_streams;
  1617.   }
  1618.   for (; edge; edge = edge->next_stream) {
  1619.     connection_t *conn = TO_CONN(edge);
  1620.     edge->edge_blocked_on_circ = block;
  1621.     if (!conn->read_event) {
  1622.       /* This connection is a placeholder for something; probably a DNS
  1623.        * request.  It can't actually stop or start reading.*/
  1624.       continue;
  1625.     }
  1626.     if (block) {
  1627.       if (connection_is_reading(conn))
  1628.         connection_stop_reading(conn);
  1629.     } else {
  1630.       /* Is this right? */
  1631.       if (!connection_is_reading(conn))
  1632.         connection_start_reading(conn);
  1633.     }
  1634.   }
  1635. }
  1636. /** Pull as many cells as possible (but no more than <b>max</b>) from the
  1637.  * queue of the first active circuit on <b>conn</b>, and write then to
  1638.  * <b>conn</b>-&gt;outbuf.  Return the number of cells written.  Advance
  1639.  * the active circuit pointer to the next active circuit in the ring. */
  1640. int
  1641. connection_or_flush_from_first_active_circuit(or_connection_t *conn, int max,
  1642.                                               time_t now)
  1643. {
  1644.   int n_flushed;
  1645.   cell_queue_t *queue;
  1646.   circuit_t *circ;
  1647.   int streams_blocked;
  1648.   circ = conn->active_circuits;
  1649.   if (!circ) return 0;
  1650.   assert_active_circuits_ok_paranoid(conn);
  1651.   if (circ->n_conn == conn) {
  1652.     queue = &circ->n_conn_cells;
  1653.     streams_blocked = circ->streams_blocked_on_n_conn;
  1654.   } else {
  1655.     queue = &TO_OR_CIRCUIT(circ)->p_conn_cells;
  1656.     streams_blocked = circ->streams_blocked_on_p_conn;
  1657.   }
  1658.   tor_assert(*next_circ_on_conn_p(circ,conn));
  1659.   for (n_flushed = 0; n_flushed < max && queue->head; ) {
  1660.     packed_cell_t *cell = cell_queue_pop(queue);
  1661.     tor_assert(*next_circ_on_conn_p(circ,conn));
  1662.     connection_write_to_buf(cell->body, CELL_NETWORK_SIZE, TO_CONN(conn));
  1663.     packed_cell_free(cell);
  1664.     ++n_flushed;
  1665.     if (circ != conn->active_circuits) {
  1666.       /* If this happens, the current circuit just got made inactive by
  1667.        * a call in connection_write_to_buf().  That's nothing to worry about:
  1668.        * circuit_make_inactive_on_conn() already advanced conn->active_circuits
  1669.        * for us.
  1670.        */
  1671.       assert_active_circuits_ok_paranoid(conn);
  1672.       goto done;
  1673.     }
  1674.   }
  1675.   tor_assert(*next_circ_on_conn_p(circ,conn));
  1676.   assert_active_circuits_ok_paranoid(conn);
  1677.   conn->active_circuits = *next_circ_on_conn_p(circ, conn);
  1678.   /* Is the cell queue low enough to unblock all the streams that are waiting
  1679.    * to write to this circuit? */
  1680.   if (streams_blocked && queue->n <= CELL_QUEUE_LOWWATER_SIZE)
  1681.     set_streams_blocked_on_circ(circ, conn, 0); /* unblock streams */
  1682.   /* Did we just ran out of cells on this queue? */
  1683.   if (queue->n == 0) {
  1684.     log_debug(LD_GENERAL, "Made a circuit inactive.");
  1685.     make_circuit_inactive_on_conn(circ, conn);
  1686.   }
  1687.  done:
  1688.   if (n_flushed)
  1689.     conn->timestamp_last_added_nonpadding = now;
  1690.   return n_flushed;
  1691. }
  1692. /** Add <b>cell</b> to the queue of <b>circ</b> writing to <b>orconn</b>
  1693.  * transmitting in <b>direction</b>. */
  1694. void
  1695. append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn,
  1696.                              cell_t *cell, cell_direction_t direction)
  1697. {
  1698.   cell_queue_t *queue;
  1699.   int streams_blocked;
  1700.   if (direction == CELL_DIRECTION_OUT) {
  1701.     queue = &circ->n_conn_cells;
  1702.     streams_blocked = circ->streams_blocked_on_n_conn;
  1703.   } else {
  1704.     or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
  1705.     queue = &orcirc->p_conn_cells;
  1706.     streams_blocked = circ->streams_blocked_on_p_conn;
  1707.   }
  1708.   if (cell->command == CELL_RELAY_EARLY && orconn->link_proto < 2) {
  1709.     /* V1 connections don't understand RELAY_EARLY. */
  1710.     cell->command = CELL_RELAY;
  1711.   }
  1712.   cell_queue_append_packed_copy(queue, cell);
  1713.   /* If we have too many cells on the circuit, we should stop reading from
  1714.    * the edge streams for a while. */
  1715.   if (!streams_blocked && queue->n >= CELL_QUEUE_HIGHWATER_SIZE)
  1716.     set_streams_blocked_on_circ(circ, orconn, 1); /* block streams */
  1717.   if (queue->n == 1) {
  1718.     /* This was the first cell added to the queue.  We need to make this
  1719.      * circuit active. */
  1720.     log_debug(LD_GENERAL, "Made a circuit active.");
  1721.     make_circuit_active_on_conn(circ, orconn);
  1722.   }
  1723.   if (! buf_datalen(orconn->_base.outbuf)) {
  1724.     /* There is no data at all waiting to be sent on the outbuf.  Add a
  1725.      * cell, so that we can notice when it gets flushed, flushed_some can
  1726.      * get called, and we can start putting more data onto the buffer then.
  1727.      */
  1728.     log_debug(LD_GENERAL, "Primed a buffer.");
  1729.     connection_or_flush_from_first_active_circuit(orconn, 1, approx_time());
  1730.   }
  1731. }
  1732. /** Append an encoded value of <b>addr</b> to <b>payload_out</b>, which must
  1733.  * have at least 18 bytes of free space.  The encoding is, as specified in
  1734.  * tor-spec.txt:
  1735.  *   RESOLVED_TYPE_IPV4 or RESOLVED_TYPE_IPV6  [1 byte]
  1736.  *   LENGTH                                    [1 byte]
  1737.  *   ADDRESS                                   [length bytes]
  1738.  * Return the number of bytes added, or -1 on error */
  1739. int
  1740. append_address_to_payload(char *payload_out, const tor_addr_t *addr)
  1741. {
  1742.   uint32_t a;
  1743.   switch (tor_addr_family(addr)) {
  1744.   case AF_INET:
  1745.     payload_out[0] = RESOLVED_TYPE_IPV4;
  1746.     payload_out[1] = 4;
  1747.     a = tor_addr_to_ipv4n(addr);
  1748.     memcpy(payload_out+2, &a, 4);
  1749.     return 6;
  1750.   case AF_INET6:
  1751.     payload_out[0] = RESOLVED_TYPE_IPV6;
  1752.     payload_out[1] = 16;
  1753.     memcpy(payload_out+2, tor_addr_to_in6_addr8(addr), 16);
  1754.     return 18;
  1755.   case AF_UNSPEC:
  1756.   default:
  1757.     return -1;
  1758.   }
  1759. }
  1760. /** Given <b>payload_len</b> bytes at <b>payload</b>, starting with an address
  1761.  * encoded as by append_address_to_payload(), try to decode the address into
  1762.  * *<b>addr_out</b>.  Return the next byte in the payload after the address on
  1763.  * success, or NULL on failure. */
  1764. const char *
  1765. decode_address_from_payload(tor_addr_t *addr_out, const char *payload,
  1766.                             int payload_len)
  1767. {
  1768.   if (payload_len < 2)
  1769.     return NULL;
  1770.   if (payload_len < 2+(uint8_t)payload[1])
  1771.     return NULL;
  1772.   switch (payload[0]) {
  1773.   case RESOLVED_TYPE_IPV4:
  1774.     if (payload[1] != 4)
  1775.       return NULL;
  1776.     tor_addr_from_ipv4n(addr_out, get_uint32(payload+2));
  1777.     break;
  1778.   case RESOLVED_TYPE_IPV6:
  1779.     if (payload[1] != 16)
  1780.       return NULL;
  1781.     tor_addr_from_ipv6_bytes(addr_out, payload+2);
  1782.     break;
  1783.   default:
  1784.     tor_addr_make_unspec(addr_out);
  1785.     break;
  1786.   }
  1787.   return payload + 2 + (uint8_t)payload[1];
  1788. }
  1789. /** Fail with an assert if the active circuits ring on <b>orconn</b> is
  1790.  * corrupt.  */
  1791. void
  1792. assert_active_circuits_ok(or_connection_t *orconn)
  1793. {
  1794.   circuit_t *head = orconn->active_circuits;
  1795.   circuit_t *cur = head;
  1796.   if (! head)
  1797.     return;
  1798.   do {
  1799.     circuit_t *next = *next_circ_on_conn_p(cur, orconn);
  1800.     circuit_t *prev = *prev_circ_on_conn_p(cur, orconn);
  1801.     tor_assert(next);
  1802.     tor_assert(prev);
  1803.     tor_assert(*next_circ_on_conn_p(prev, orconn) == cur);
  1804.     tor_assert(*prev_circ_on_conn_p(next, orconn) == cur);
  1805.     cur = next;
  1806.   } while (cur != head);
  1807. }