54#define CHANNEL_OBJECT_PRIVATE
57#define CHANNEL_FILE_PRIVATE
63#include "core/or/channelpadding.h"
70#include "core/or/dos.h"
110static HT_HEAD(channel_gid_map,
channel_t) channel_gid_map = HT_INITIALIZER();
110static HT_HEAD(channel_gid_map,
channel_t) channel_gid_map = HT_INITIALIZER(); {
…}
122HT_PROTOTYPE(channel_gid_map,
channel_t, gidmap_node,
123 channel_id_hash, channel_id_eq);
124HT_GENERATE2(channel_gid_map,
channel_t, gidmap_node,
125 channel_id_hash, channel_id_eq,
131static uint64_t n_channels_allocated = 0;
141static HT_HEAD(channel_idmap, channel_idmap_entry_t) channel_identity_map =
144typedef struct channel_idmap_entry_t {
145 HT_ENTRY(channel_idmap_entry_t) node;
147 TOR_LIST_HEAD(channel_list_t,
channel_t) channel_list;
148} channel_idmap_entry_t;
150static inline unsigned
151channel_idmap_hash(
const channel_idmap_entry_t *ent)
153 return (
unsigned) siphash24g(ent->digest,
DIGEST_LEN);
157channel_idmap_eq(
const channel_idmap_entry_t *a,
158 const channel_idmap_entry_t *b)
163HT_PROTOTYPE(channel_idmap, channel_idmap_entry_t, node, channel_idmap_hash,
165HT_GENERATE2(channel_idmap, channel_idmap_entry_t, node, channel_idmap_hash,
328 descr =
"channel error";
331 descr =
"temporarily suspended for maintenance";
341 descr =
"unknown or invalid channel state";
363 descr =
"channel listener error";
370 descr =
"unknown or invalid channel listener state";
396 "Registering channel %p (ID %"PRIu64
") "
397 "in state %s (%d) with digest %s",
405 channel_t *oldval = HT_REPLACE(channel_gid_map, &channel_gid_map, chan);
409 if (CHANNEL_FINISHED(chan)) {
419 if (!CHANNEL_IS_CLOSING(chan)) {
426 "Channel %p (global ID %"PRIu64
") "
427 "in state %s (%d) registered with no identity digest",
453 if (CHANNEL_FINISHED(chan)) {
463 channel_t *oldval = HT_REMOVE(channel_gid_map, &channel_gid_map, chan);
471 !(CHANNEL_CONDEMNED(chan))) {
492 "Registering channel listener %p (ID %"PRIu64
") "
506 if (!finished_listeners) finished_listeners =
smartlist_new();
563 channel_idmap_entry_t *ent, search;
574 ent = HT_FIND(channel_idmap, &channel_identity_map, &search);
576 ent = tor_malloc(
sizeof(channel_idmap_entry_t));
578 TOR_LIST_INIT(&ent->channel_list);
579 HT_INSERT(channel_idmap, &channel_identity_map, ent);
581 TOR_LIST_INSERT_HEAD(&ent->channel_list, chan, next_with_same_id);
584 "Added channel %p (global ID %"PRIu64
") "
585 "to identity map in state %s (%d) with digest %s",
600 channel_idmap_entry_t *ent, search;
608 TOR_LIST_REMOVE(chan, next_with_same_id);
611 ent = HT_FIND(channel_idmap, &channel_identity_map, &search);
617 if (TOR_LIST_EMPTY(&ent->channel_list)) {
618 HT_REMOVE(channel_idmap, &channel_identity_map, ent);
623 "Removed channel %p (global ID %"PRIu64
") from "
624 "identity map in state %s (%d) with digest %s",
631 "Trying to remove channel %p (global ID %"PRIu64
") with "
632 "digest %s from identity map, but couldn't find any with "
657 rv = HT_FIND(channel_gid_map, &channel_gid_map, &lookup);
669 const char *rsa_id_digest,
702 channel_idmap_entry_t *ent, search;
713 memcpy(search.digest, rsa_id_digest,
DIGEST_LEN);
714 ent = HT_FIND(channel_idmap, &channel_identity_map, &search);
716 rv = TOR_LIST_FIRST(&ent->channel_list);
736 return TOR_LIST_NEXT(chan, next_with_same_id);
751 channel_idmap_entry_t **iter;
753 int total_dirauth_connections = 0, total_dirauths = 0;
754 int total_relay_connections = 0, total_relays = 0, total_canonical = 0;
755 int total_half_canonical = 0;
756 int total_gt_one_connection = 0, total_gt_two_connections = 0;
757 int total_gt_four_connections = 0;
759 HT_FOREACH(iter, channel_idmap, &channel_identity_map) {
760 int connections_to_relay = 0;
761 const char *id_digest = (
char *) (*iter)->digest;
769 const bool is_dirauth = router_digest_is_trusted_dir(id_digest);
773 for (chan = TOR_LIST_FIRST(&(*iter)->channel_list); chan;
776 if (CHANNEL_CONDEMNED(chan) || !CHANNEL_IS_OPEN(chan))
779 connections_to_relay++;
780 total_relay_connections++;
782 total_dirauth_connections++;
787 total_half_canonical++;
791 if (connections_to_relay > 1) total_gt_one_connection++;
792 if (connections_to_relay > 2) total_gt_two_connections++;
793 if (connections_to_relay > 4) total_gt_four_connections++;
799#define MIN_RELAY_CONNECTIONS_TO_WARN 25
803#define MAX_AVG_RELAY_CONNECTIONS 1.5
807#define MAX_AVG_DIRAUTH_CONNECTIONS 4
811 const int max_tolerable_connections = (int)(
812 (total_relays-total_dirauths) * MAX_AVG_RELAY_CONNECTIONS +
813 total_dirauths * MAX_AVG_DIRAUTH_CONNECTIONS);
816 if (total_relays > MIN_RELAY_CONNECTIONS_TO_WARN &&
817 total_relay_connections > max_tolerable_connections) {
819 "Your relay has a very large number of connections to other relays. "
820 "Is your outbound address the same as your relay address? "
821 "Found %d connections to authorities, %d connections to %d relays. "
822 "Found %d current canonical connections, "
823 "in %d of which we were a non-canonical peer. "
824 "%d relays had more than 1 connection, %d had more than 2, and "
825 "%d had more than 4 connections.",
826 total_dirauth_connections, total_relay_connections,
827 total_relays, total_canonical, total_half_canonical,
828 total_gt_one_connection, total_gt_two_connections,
829 total_gt_four_connections);
831 log_info(
LD_OR,
"Performed connection pruning. "
832 "Found %d connections to authorities, %d connections to %d relays. "
833 "Found %d current canonical connections, "
834 "in %d of which we were a non-canonical peer. "
835 "%d relays had more than 1 connection, %d had more than 2, and "
836 "%d had more than 4 connections.",
837 total_dirauth_connections, total_relay_connections,
838 total_relays, total_canonical, total_half_canonical,
839 total_gt_one_connection, total_gt_two_connections,
840 total_gt_four_connections);
866 memset(&chan->next_with_same_id, 0,
sizeof(chan->next_with_same_id));
918 "Freeing channel %"PRIu64
" at %p",
922 scheduler_release_channel(chan);
935 channel_handles_clear(chan);
946 circuitmux_free(chan->
cmux);
964 "Freeing channel_listener_t %"PRIu64
" at %p",
991 "Force-freeing channel %"PRIu64
" at %p",
995 scheduler_release_channel(chan);
1008 channel_handles_clear(chan);
1017 circuitmux_free(chan->
cmux);
1035 "Force-freeing channel_listener_t %"PRIu64
" at %p",
1051 } SMARTLIST_FOREACH_END(qchan);
1068 channel_listener_fn_ptr listener)
1074 "Setting listener callback for channel listener %p "
1075 "(global ID %"PRIu64
") to %p",
1089channel_cell_handler_fn_ptr
1094 if (CHANNEL_CAN_HANDLE_CELLS(chan))
1108 channel_cell_handler_fn_ptr cell_handler)
1114 "Setting cell_handler callback for channel %p to %p",
1115 chan, cell_handler);
1148 if (CHANNEL_CONDEMNED(chan))
1152 "Closing channel %p (global ID %"PRIu64
") "
1192 "Closing channel listener %p (global ID %"PRIu64
") "
1203 chan_l->
close(chan_l);
1226 if (CHANNEL_CONDEMNED(chan))
1230 "Closing channel %p (global ID %"PRIu64
") "
1231 "due to lower-layer event",
1254 if (CHANNEL_CONDEMNED(chan))
1258 "Closing channel %p due to lower-layer error",
1282 if (CHANNEL_FINISHED(chan))
1309 int state_not_in_map;
1314 "Clearing remote endpoint digest on channel %p with "
1315 "global ID %"PRIu64,
1318 state_not_in_map = CHANNEL_CONDEMNED(chan);
1337 const char *identity_digest,
1340 int was_in_digest_map, should_be_in_digest_map, state_not_in_map;
1345 "Setting remote endpoint digest on channel %p with "
1346 "global ID %"PRIu64
" to digest %s",
1351 state_not_in_map = CHANNEL_CONDEMNED(chan);
1354 !state_not_in_map &&
1357 should_be_in_digest_map =
1358 !state_not_in_map &&
1363 if (was_in_digest_map)
1369 if (identity_digest) {
1384 if (should_be_in_digest_map)
1397 int state_not_in_map;
1402 "Clearing remote endpoint identity on channel %p with "
1403 "global ID %"PRIu64,
1406 state_not_in_map = CHANNEL_CONDEMNED(chan);
1445 cell_bytes = get_cell_network_size(chan->wide_circ_ids);
1448 if (!CHANNEL_IS_OPEN(chan)) {
1460 chan->n_bytes_xmitted += cell_bytes;
1496 if (CHANNEL_IS_CLOSING(chan)) {
1497 log_debug(
LD_CHANNEL,
"Discarding %p on closing channel %p with "
1498 "global ID %"PRIu64, cell, chan,
1503 "Writing %p to channel %p with global ID "
1512 packed_cell_free(cell);
1527 unsigned char was_active, is_active;
1528 unsigned char was_in_id_map, is_in_id_map;
1531 from_state = chan->
state;
1538 if (from_state == to_state) {
1540 "Got no-op transition from \"%s\" to itself on channel %p"
1541 "(global ID %"PRIu64
")",
1555 "Changing state of channel %p (global ID %"PRIu64
1556 ") from \"%s\" to \"%s\"",
1562 chan->
state = to_state;
1572 if (was_active && !is_active) {
1574 if (!finished_channels) finished_channels =
smartlist_new();
1579 else if (!was_active && is_active) {
1595 else if (was_in_id_map && !is_in_id_map)
1607 scheduler_release_channel(chan);
1648 unsigned char was_active, is_active;
1651 from_state = chan_l->
state;
1658 if (from_state == to_state) {
1660 "Got no-op transition from \"%s\" to itself on channel "
1661 "listener %p (global ID %"PRIu64
")",
1675 "Changing state of channel listener %p (global ID %"PRIu64
1676 "from \"%s\" to \"%s\"",
1681 chan_l->
state = to_state;
1691 if (was_active && !is_active) {
1693 if (!finished_listeners) finished_listeners =
smartlist_new();
1698 else if (!was_active && is_active) {
1714#define MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED 256
1737 unsigned int unlimited = 0;
1738 ssize_t flushed = 0;
1739 int clamped_num_cells;
1743 if (num_cells < 0) unlimited = 1;
1744 if (!unlimited && num_cells <= flushed)
goto done;
1747 if (CHANNEL_IS_OPEN(chan)) {
1751 clamped_num_cells = MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED;
1753 if (num_cells - flushed >
1754 MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED) {
1755 clamped_num_cells = MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED;
1757 clamped_num_cells = (int)(num_cells - flushed);
1763 chan, clamped_num_cells);
1800 geoip_change_dirreq_state(chan->
dirreq_id,
1825 "Processing queue of incoming connections for channel "
1826 "listener %p (global ID %"PRIu64
")",
1836 "Handling incoming channel %p (%"PRIu64
") "
1837 "for listener %p (%"PRIu64
")",
1844 listener->
listener(listener, chan);
1845 } SMARTLIST_FOREACH_END(chan);
1882 channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
1883 if (!tlschan->conn->tracked_for_dos_mitigation) {
1884 char *transport_name = NULL;
1885 if (chan->get_transport_name(chan, &transport_name) < 0) {
1886 transport_name = NULL;
1889 &remote_addr, transport_name,
1891 if (tlschan && tlschan->conn) {
1892 dos_new_client_conn(tlschan->conn, transport_name);
1906 }
else if (hs_service_allow_non_anonymous_connection(
get_options()) &&
1908 CHANNELPADDING_SOS_PARAM,
1909 CHANNELPADDING_SOS_DEFAULT, 0, 1)) {
1913 }
else if (
get_options()->ReducedConnectionPadding) {
1934 int need_to_queue = 0;
1941 "Queueing incoming channel %p (global ID %"PRIu64
") on "
1942 "channel listener %p (global ID %"PRIu64
")",
1947 if (!(listener->
listener)) need_to_queue = 1;
1963 if (!need_to_queue) {
1965 listener->
listener(listener, incoming);
1985 tor_assert(CHANNEL_IS_CLOSING(chan) || CHANNEL_IS_MAINT(chan) ||
1986 CHANNEL_IS_OPEN(chan));
1997 chan->n_bytes_recved += get_cell_network_size(chan->wide_circ_ids);
2000 "Processing incoming cell_t %p for channel %p (global ID "
2001 "%"PRIu64
")", cell, chan,
2015 if (chan->wide_circ_ids) {
2016 if (packed_cell->
body[4] == CELL_DESTROY) {
2021 if (packed_cell->
body[2] == CELL_DESTROY) {
2041 log_warn(
LD_BUG,
"Attempted to send a destroy cell for circID 0 "
2042 "on a channel %"PRIu64
" at %p in state %s (%d)",
2050 if (!CHANNEL_CONDEMNED(chan) && chan->
cmux) {
2052 circuitmux_append_destroy_cell(chan, chan->
cmux, circ_id, reason);
2054 "Sending destroy (circID %u) on channel %p "
2055 "(global ID %"PRIu64
")",
2056 (
unsigned)circ_id, chan,
2060 "Someone called channel_send_destroy() for circID %u "
2061 "on a channel %"PRIu64
" at %p in state %s (%d)",
2079 if (all_channels && smartlist_len(all_channels) > 0) {
2081 "Dumping statistics about %d channels:",
2082 smartlist_len(all_channels));
2084 "%d are active, and %d are done and waiting for cleanup",
2085 (active_channels != NULL) ?
2086 smartlist_len(active_channels) : 0,
2087 (finished_channels != NULL) ?
2088 smartlist_len(finished_channels) : 0);
2094 "Done spamming about channels now");
2097 "No channels to dump");
2110 if (all_listeners && smartlist_len(all_listeners) > 0) {
2112 "Dumping statistics about %d channel listeners:",
2113 smartlist_len(all_listeners));
2115 "%d are active and %d are done and waiting for cleanup",
2116 (active_listeners != NULL) ?
2117 smartlist_len(active_listeners) : 0,
2118 (finished_listeners != NULL) ?
2119 smartlist_len(finished_listeners) : 0);
2125 "Done spamming about channel listeners now");
2128 "No channel listeners to dump");
2144 if (!finished_channels || smartlist_len(finished_channels) == 0)
return;
2155 } SMARTLIST_FOREACH_END(curr);
2170 if (!finished_listeners || smartlist_len(finished_listeners) == 0)
return;
2180 channel_listener_free(tmp);
2181 } SMARTLIST_FOREACH_END(curr);
2190 if (!channels)
return;
2196 "Cleaning up channel %p (global ID %"PRIu64
") "
2198 curr, (curr->global_identifier),
2206 if (mark_for_close) {
2207 if (!CHANNEL_CONDEMNED(curr)) {
2211 }
else channel_free(curr);
2212 } SMARTLIST_FOREACH_END(curr);
2221 if (!listeners)
return;
2227 "Cleaning up channel listener %p (global ID %"PRIu64
") "
2229 curr, (curr->global_identifier),
2232 if (mark_for_close) {
2239 }
else channel_listener_free(curr);
2240 } SMARTLIST_FOREACH_END(curr);
2255 "Shutting down channels...");
2258 if (finished_channels) {
2260 smartlist_free(finished_channels);
2261 finished_channels = NULL;
2265 if (finished_listeners) {
2267 smartlist_free(finished_listeners);
2268 finished_listeners = NULL;
2272 if (active_channels) {
2274 smartlist_free(active_channels);
2275 active_channels = NULL;
2279 if (active_listeners) {
2281 smartlist_free(active_listeners);
2282 active_listeners = NULL;
2288 smartlist_free(all_channels);
2289 all_channels = NULL;
2293 if (all_listeners) {
2295 smartlist_free(all_listeners);
2296 all_listeners = NULL;
2301 "Freeing channel_identity_map");
2303 HT_CLEAR(channel_idmap, &channel_identity_map);
2307 "Freeing channel_gid_map");
2308 HT_CLEAR(channel_gid_map, &channel_gid_map);
2311 "Done cleaning up after channels");
2326 const char *id_digest,
2345 int a_is_canonical, b_is_canonical;
2361 if (a_is_canonical && !b_is_canonical)
return 1;
2362 if (!a_is_canonical && b_is_canonical)
return 0;
2413 bool for_origin_circ,
2414 const char **msg_out,
2418 int n_inprogress_goodaddr = 0, n_old = 0;
2419 int n_noncanonical = 0;
2431 if (CHANNEL_CONDEMNED(chan))
2445 const bool matches_target =
2450 if (!CHANNEL_IS_OPEN(chan)) {
2453 if (matches_target) {
2454 ++n_inprogress_goodaddr;
2455 if (for_origin_circ) {
2488 *msg_out =
"Connection is fine; using it.";
2491 }
else if (n_inprogress_goodaddr) {
2492 *msg_out =
"Connection in progress; waiting.";
2495 }
else if (n_old || n_noncanonical) {
2496 *msg_out =
"Connections all too old, or too non-canonical. "
2497 " Launching a new one.";
2501 *msg_out =
"Not connected. Connecting.";
2415 int *launch_out)) {
…}
2545 double avg, interval, age;
2546 time_t now = time(NULL);
2548 int have_remote_addr;
2549 char *remote_addr_str;
2556 "Channel %"PRIu64
" (at %p) with transport %s is in state "
2562 " * Channel %"PRIu64
" was created at %"PRIu64
2563 " (%"PRIu64
" seconds ago) "
2564 "and last active at %"PRIu64
" (%"PRIu64
" seconds ago)",
2568 (uint64_t)(chan->timestamp_active),
2569 (uint64_t)(now - chan->timestamp_active));
2574 " * Channel %"PRIu64
" says it is connected "
2575 "to an OR with digest %s",
2580 " * Channel %"PRIu64
" does not know the digest"
2581 " of the OR it is connected to",
2587 if (have_remote_addr) {
2591 " * Channel %"PRIu64
" says its remote address"
2592 " is %s, and gives a canonical description of \"%s\" and an "
2593 "actual description of \"%s\"",
2595 safe_str(remote_addr_str),
2603 " * Channel %"PRIu64
" does not know its remote "
2604 "address, but gives a canonical description of \"%s\" and an "
2605 "actual description of \"%s\"",
2614 " * Channel %"PRIu64
" has these marks: %s %s %s %s %s",
2617 "bad_for_new_circs" :
"!bad_for_new_circs",
2619 "canonical" :
"!canonical",
2621 "client" :
"!client",
2625 "incoming" :
"outgoing");
2629 " * Channel %"PRIu64
" has %d active circuits out of"
2632 (chan->
cmux != NULL) ?
2634 (chan->
cmux != NULL) ?
2640 " * Channel %"PRIu64
" was never used by a "
2644 " * Channel %"PRIu64
" was last used by a "
2645 "client at %"PRIu64
" (%"PRIu64
" seconds ago)",
2652 " * Channel %"PRIu64
" never received a cell",
2656 " * Channel %"PRIu64
" last received a cell "
2657 "at %"PRIu64
" (%"PRIu64
" seconds ago)",
2664 " * Channel %"PRIu64
" never transmitted a cell",
2668 " * Channel %"PRIu64
" last transmitted a cell "
2669 "at %"PRIu64
" (%"PRIu64
" seconds ago)",
2677 " * Channel %"PRIu64
" has received "
2678 "%"PRIu64
" bytes in %"PRIu64
" cells and transmitted "
2679 "%"PRIu64
" bytes in %"PRIu64
" cells",
2681 (chan->n_bytes_recved),
2683 (chan->n_bytes_xmitted),
2687 if (chan->n_bytes_recved > 0) {
2688 avg = (double)(chan->n_bytes_recved) / age;
2690 " * Channel %"PRIu64
" has averaged %f "
2691 "bytes received per second",
2698 " * Channel %"PRIu64
" has averaged %f "
2699 "cells received per second",
2701 }
else if (avg >= 0.0) {
2702 interval = 1.0 / avg;
2704 " * Channel %"PRIu64
" has averaged %f "
2705 "seconds between received cells",
2709 if (chan->n_bytes_xmitted > 0) {
2710 avg = (double)(chan->n_bytes_xmitted) / age;
2712 " * Channel %"PRIu64
" has averaged %f "
2713 "bytes transmitted per second",
2720 " * Channel %"PRIu64
" has averaged %f "
2721 "cells transmitted per second",
2723 }
else if (avg >= 0.0) {
2724 interval = 1.0 / avg;
2726 " * Channel %"PRIu64
" has averaged %f "
2727 "seconds between transmitted cells",
2745 double avg, interval, age;
2746 time_t now = time(NULL);
2753 "Channel listener %"PRIu64
" (at %p) with transport %s is in "
2759 " * Channel listener %"PRIu64
" was created at %"PRIu64
2760 " (%"PRIu64
" seconds ago) "
2761 "and last active at %"PRIu64
" (%"PRIu64
" seconds ago)",
2765 (uint64_t)(chan_l->timestamp_active),
2766 (uint64_t)(now - chan_l->timestamp_active));
2769 " * Channel listener %"PRIu64
" last accepted an incoming "
2770 "channel at %"PRIu64
" (%"PRIu64
" seconds ago) "
2771 "and has accepted %"PRIu64
" channels in total",
2787 " * Channel listener %"PRIu64
" has averaged %f incoming "
2788 "channels per second",
2790 }
else if (avg >= 0.0) {
2791 interval = 1.0 / avg;
2793 " * Channel listener %"PRIu64
" has averaged %f seconds "
2794 "between incoming channels",
2865 return chan->get_remote_addr(chan, addr_out);
3089 result = chan->num_cells_writeable(chan);
3090 if (result < 0) result = 0;
3112 time_t now = time(NULL);
3128 time_t now = time(NULL);
3148 time_t now = time(NULL);
3153 chan->timestamp_active = now;
3165 time_t now = time(NULL);
3169 chan_l->timestamp_active = now;
3182 time_t now = time(NULL);
3186 chan_l->timestamp_active = now;
3199 time_t now = time(NULL);
3215 time_t now = time(NULL);
3219 chan->timestamp_active = now;
3235 time_t now = time(NULL);
3240 chan->timestamp_active = now;
3321 IF_BUG_ONCE(!target_ipv4_addr && !target_ipv6_addr)
3324 if (target_ipv4_addr && chan->
matches_target(chan, target_ipv4_addr))
3327 if (target_ipv6_addr && chan->
matches_target(chan, target_ipv6_addr))
3345 chan->num_p_circuits;
3357 int consider_identity))
3366 if (! consider_identity) {
3374 our_identity = started_here ?
3377 if (identity_rcvd) {
3357 int consider_identity)) {
…}
3389channel_sort_by_ed25519_identity(
const void **a_,
const void **b_)
3394 &b->ed25519_identity.pubkey,
3412 if (PREDICT_LIKELY(!TOR_LIST_NEXT(chan, next_with_same_id))) {
3414 time(NULL), BASE_CHAN_TO_TLS(chan)->conn, force);
3420 TOR_LIST_FOREACH(chan, lst, next_with_same_id) {
3421 if (BASE_CHAN_TO_TLS(chan)->conn) {
3434 if (!common_ed25519_identity)
3435 common_ed25519_identity = &channel->ed25519_identity;
3438 common_ed25519_identity)) {
3441 common_ed25519_identity = &channel->ed25519_identity;
3445 } SMARTLIST_FOREACH_END(channel);
3452 smartlist_free(or_conns);
3453 smartlist_free(channels);
3465 channel_idmap_entry_t *ent;
3466 channel_idmap_entry_t search;
3467 memset(&search, 0,
sizeof(search));
3469 ent = HT_FIND(channel_idmap, &channel_identity_map, &search);
3477 channel_idmap_entry_t **iter;
3478 HT_FOREACH(iter, channel_idmap, &channel_identity_map) {
void tor_addr_make_unspec(tor_addr_t *a)
char * tor_addr_to_str_dup(const tor_addr_t *addr)
const char * hex_str(const char *from, size_t fromlen)
static uint16_t get_uint16(const void *cp)
static uint32_t get_uint32(const void *cp)
int channel_has_queued_writes(channel_t *chan)
void channel_timestamp_active(channel_t *chan)
void channel_set_circid_type(channel_t *chan, crypto_pk_t *identity_rcvd, int consider_identity)
int channel_is_better(channel_t *a, channel_t *b)
int channel_is_bad_for_new_circs(channel_t *chan)
static void channel_remove_from_digest_map(channel_t *chan)
int channel_is_outgoing(channel_t *chan)
void channel_listener_process_incoming(channel_listener_t *listener)
void channel_timestamp_recv(channel_t *chan)
void channel_run_cleanup(void)
void channel_update_bad_for_new_circs(const char *digest, int force)
void channel_dumpstats(int severity)
void channel_timestamp_client(channel_t *chan)
void channel_set_identity_digest(channel_t *chan, const char *identity_digest, const ed25519_public_key_t *ed_identity)
void channel_listener_unregister(channel_listener_t *chan_l)
void channel_listener_dump_statistics(channel_listener_t *chan_l, int severity)
void channel_mark_local(channel_t *chan)
void channel_set_cell_handlers(channel_t *chan, channel_cell_handler_fn_ptr cell_handler)
void channel_mark_client(channel_t *chan)
time_t channel_when_last_xmit(channel_t *chan)
void channel_listener_run_cleanup(void)
static void channel_force_xfree(channel_t *chan)
void channel_mark_incoming(channel_t *chan)
void channel_closed(channel_t *chan)
void channel_init_listener(channel_listener_t *chan_l)
int channel_listener_state_can_transition(channel_listener_state_t from, channel_listener_state_t to)
STATIC void channel_add_to_digest_map(channel_t *chan)
int channel_state_is_valid(channel_state_t state)
channel_t * channel_get_for_extend(const char *rsa_id_digest, const ed25519_public_key_t *ed_id, const tor_addr_t *target_ipv4_addr, const tor_addr_t *target_ipv6_addr, bool for_origin_circ, const char **msg_out, int *launch_out)
void channel_do_open_actions(channel_t *chan)
void channel_listener_mark_for_close(channel_listener_t *chan_l)
void channel_close_from_lower_layer(channel_t *chan)
void channel_check_for_duplicates(void)
void channel_process_cell(channel_t *chan, cell_t *cell)
void channel_change_state_open(channel_t *chan)
void channel_listener_queue_incoming(channel_listener_t *listener, channel_t *incoming)
int channel_is_canonical(channel_t *chan)
int channel_listener_state_is_valid(channel_listener_state_t state)
const char * channel_state_to_string(channel_state_t state)
void channel_timestamp_created(channel_t *chan)
static void channel_free_list(smartlist_t *channels, int mark_for_close)
int channel_matches_extend_info(channel_t *chan, extend_info_t *extend_info)
int channel_state_can_transition(channel_state_t from, channel_state_t to)
const char * channel_describe_transport(channel_t *chan)
int channel_remote_identity_matches(const channel_t *chan, const char *rsa_id_digest, const ed25519_public_key_t *ed_id)
void channel_listener_set_listener_fn(channel_listener_t *chan_l, channel_listener_fn_ptr listener)
void channel_register(channel_t *chan)
time_t channel_when_last_client(channel_t *chan)
void channel_listener_timestamp_created(channel_listener_t *chan_l)
void channel_listener_timestamp_active(channel_listener_t *chan_l)
void channel_listener_register(channel_listener_t *chan_l)
const char * channel_listener_describe_transport(channel_listener_t *chan_l)
void channel_listener_dump_transport_statistics(channel_listener_t *chan_l, int severity)
static void channel_change_state_(channel_t *chan, channel_state_t to_state)
int channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
channel_t * channel_connect(const tor_addr_t *addr, uint16_t port, const char *id_digest, const ed25519_public_key_t *ed_id)
void channel_mark_bad_for_new_circs(channel_t *chan)
int channel_is_incoming(channel_t *chan)
int channel_is_client(const channel_t *chan)
const char * channel_listener_state_to_string(channel_listener_state_t state)
channel_t * channel_find_by_remote_identity(const char *rsa_id_digest, const ed25519_public_key_t *ed_id)
void channel_mark_remote(channel_t *chan)
void channel_unregister(channel_t *chan)
static void channel_rsa_id_group_set_badness(struct channel_list_t *lst, int force)
channel_cell_handler_fn_ptr channel_get_cell_handler(channel_t *chan)
ssize_t channel_flush_some_cells(channel_t *chan, ssize_t num_cells)
static void channel_listener_free_list(smartlist_t *channels, int mark_for_close)
int packed_cell_is_destroy(channel_t *chan, const packed_cell_t *packed_cell, circid_t *circid_out)
STATIC bool channel_matches_target_addr_for_extend(channel_t *chan, const tor_addr_t *target_ipv4_addr, const tor_addr_t *target_ipv6_addr)
void channel_close_for_error(channel_t *chan)
void channel_listener_free_(channel_listener_t *chan_l)
void channel_listener_dumpstats(int severity)
static int write_packed_cell(channel_t *chan, packed_cell_t *cell)
int channel_is_local(channel_t *chan)
void channel_listener_timestamp_accepted(channel_listener_t *chan_l)
void channel_notify_flushed(channel_t *chan)
int channel_num_cells_writeable(channel_t *chan)
channel_t * channel_find_by_global_id(uint64_t global_identifier)
void channel_timestamp_xmit(channel_t *chan)
int channel_get_addr_if_possible(const channel_t *chan, tor_addr_t *addr_out)
channel_t * channel_next_with_rsa_identity(channel_t *chan)
const char * channel_describe_peer(channel_t *chan)
void channel_mark_for_close(channel_t *chan)
void channel_clear_identity_digest(channel_t *chan)
void channel_clear_remote_end(channel_t *chan)
void channel_listener_change_state(channel_listener_t *chan_l, channel_listener_state_t to_state)
void channel_mark_outgoing(channel_t *chan)
static void channel_listener_force_xfree(channel_listener_t *chan_l)
void channel_dump_statistics(channel_t *chan, int severity)
void channel_free_all(void)
int channel_more_to_flush(channel_t *chan)
void channel_dump_transport_statistics(channel_t *chan, int severity)
unsigned int channel_num_circuits(channel_t *chan)
void channel_clear_client(channel_t *chan)
int channel_write_packed_cell(channel_t *chan, packed_cell_t *cell)
time_t channel_when_created(channel_t *chan)
void channel_init(channel_t *chan)
void channel_free_(channel_t *chan)
void channel_change_state(channel_t *chan, channel_state_t to_state)
Header file for channel.c.
void channel_mark_as_used_for_origin_circuit(channel_t *chan)
@ CHANNEL_LISTENER_STATE_ERROR
@ CHANNEL_LISTENER_STATE_LAST
@ CHANNEL_LISTENER_STATE_LISTENING
@ CHANNEL_LISTENER_STATE_CLOSING
@ CHANNEL_LISTENER_STATE_CLOSED
void channelpadding_disable_padding_on_channel(channel_t *chan)
void channelpadding_reduce_padding_on_channel(channel_t *chan)
channel_t * channel_tls_connect(const tor_addr_t *addr, uint16_t port, const char *id_digest, const ed25519_public_key_t *ed_id)
Header file for channeltls.c.
void circuit_n_chan_done(channel_t *chan, int status)
Header file for circuitbuild.c.
void channel_note_destroy_pending(channel_t *chan, circid_t id)
void channel_note_destroy_not_pending(channel_t *chan, circid_t id)
void circuit_unlink_all_from_channel(channel_t *chan, int reason)
Header file for circuitlist.c.
void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan)
void circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out)
void circuitmux_set_policy(circuitmux_t *cmux, const circuitmux_policy_t *pol)
unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux)
unsigned int circuitmux_num_circuits(circuitmux_t *cmux)
unsigned int circuitmux_num_cells(circuitmux_t *cmux)
Header file for circuitmux.c.
circuit_build_times_t * get_circuit_build_times_mutable(void)
void circuit_build_times_network_is_live(circuit_build_times_t *cbt)
Header file for circuitstats.c.
Functions and types for monotonic times.
const or_options_t * get_options(void)
tor_cmdline_mode_t command
Header file for config.c.
int connection_or_single_set_badness_(time_t now, or_connection_t *or_conn, int force)
int connection_or_digest_is_known_relay(const char *id_digest)
void connection_or_group_set_badness_(smartlist_t *group, int force)
Header file for connection_or.c.
int ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey)
int ed25519_pubkey_eq(const ed25519_public_key_t *key1, const ed25519_public_key_t *key2)
int crypto_pk_cmp_keys(const crypto_pk_t *a, const crypto_pk_t *b)
int tor_memeq(const void *a, const void *b, size_t sz)
#define fast_memcmp(a, b, c)
#define tor_memneq(a, b, sz)
Header file for dirlist.c.
Header file for circuitbuild.c.
Header file for geoip_stats.c.
@ DIRREQ_CHANNEL_BUFFER_FLUSHED
Header file containing service data for the HS subsystem.
void tor_log(int severity, log_domain_mask_t domain, const char *format,...)
void mainloop_schedule_postloop_cleanup(void)
Header file for mainloop.c.
void * tor_reallocarray_(void *ptr, size_t sz1, size_t sz2)
void tor_free_(void *mem)
int32_t networkstatus_get_param(const networkstatus_t *ns, const char *param_name, int32_t default_val, int32_t min_val, int32_t max_val)
Header file for networkstatus.c.
void router_set_status(const char *digest, int up)
Header file for nodelist.c.
Master header file for Tor-specific functionality.
int channel_flush_from_first_active_circuit(channel_t *chan, int max)
uint8_t packed_cell_get_command(const packed_cell_t *cell, int wide_circ_ids)
void rep_hist_padding_count_write(padding_type_t type)
Header file for rephist.c.
@ PADDING_TYPE_ENABLED_CELL
@ PADDING_TYPE_ENABLED_TOTAL
crypto_pk_t * get_tlsclient_identity_key(void)
Header file for router.c.
Header file for routerlist.c.
void scheduler_channel_doesnt_want_writes(channel_t *chan)
Header file for scheduler*.c.
void smartlist_sort(smartlist_t *sl, int(*compare)(const void **a, const void **b))
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_clear(smartlist_t *sl)
void smartlist_remove(smartlist_t *sl, const void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
#define SMARTLIST_DEL_CURRENT(sl, var)
channel_listener_state_t state
const char *(* describe_transport)(channel_listener_t *)
enum channel_listener_t::@11 reason_for_closing
void(* dumpstats)(channel_listener_t *, int)
uint64_t global_identifier
void(* free_fn)(channel_listener_t *)
smartlist_t * incoming_list
channel_listener_fn_ptr listener
time_t timestamp_accepted
void(* close)(channel_listener_t *)
void(* free_fn)(channel_t *)
int(* is_canonical)(channel_t *)
void(* close)(channel_t *)
monotime_coarse_t next_padding_time
void(* dumpstats)(channel_t *, int)
enum channel_t::@9 reason_for_closing
time_t timestamp_last_had_circuits
unsigned int num_n_circuits
int(* matches_extend_info)(channel_t *, extend_info_t *)
circ_id_type_bitfield_t circ_id_type
unsigned int padding_enabled
char identity_digest[DIGEST_LEN]
uint64_t global_identifier
int(* write_packed_cell)(channel_t *, packed_cell_t *)
struct channel_handle_t * timer_handle
const char *(* describe_transport)(channel_t *)
tor_addr_t addr_according_to_peer
channel_cell_handler_fn_ptr cell_handler
int(* matches_target)(channel_t *, const tor_addr_t *)
const char *(* describe_peer)(const channel_t *)
struct ed25519_public_key_t ed25519_identity
unsigned int has_been_open
monotime_coarse_t timestamp_xfer
unsigned int is_bad_for_new_circs
unsigned int is_canonical_to_peer
enum channel_t::@10 scheduler_state
struct tor_timer_t * padding_timer
ratelim_t last_warned_circ_ids_exhausted
int(* has_queued_writes)(channel_t *)
char body[CELL_MAX_NETWORK_SIZE]
#define MOCK_IMPL(rv, funcname, arglist)
#define IF_BUG_ONCE(cond)
int tor_digest_is_zero(const char *digest)
#define ED25519_PUBKEY_LEN