10 #define CONTROL_MODULE_PRIVATE 11 #define CONTROL_EVENTS_PRIVATE 12 #define OCIRC_EVENT_PRIVATE 37 #include "core/or/or_circuit_st.h" 48 #define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN) 59 #define EVENT_IS_INTERESTING(e) \ 60 (!! (global_event_mask & EVENT_MASK_(e))) 63 #define ANY_EVENT_IS_INTERESTING(e) \ 64 (!! (global_event_mask & (e))) 67 const char *format, va_list ap)
74 const char *format, ...)
80 { EVENT_CIRCUIT_STATUS,
"CIRC" },
81 { EVENT_CIRCUIT_STATUS_MINOR,
"CIRC_MINOR" },
82 { EVENT_STREAM_STATUS,
"STREAM" },
83 { EVENT_OR_CONN_STATUS,
"ORCONN" },
84 { EVENT_BANDWIDTH_USED,
"BW" },
85 { EVENT_DEBUG_MSG,
"DEBUG" },
86 { EVENT_INFO_MSG,
"INFO" },
87 { EVENT_NOTICE_MSG,
"NOTICE" },
88 { EVENT_WARN_MSG,
"WARN" },
89 { EVENT_ERR_MSG,
"ERR" },
90 { EVENT_NEW_DESC,
"NEWDESC" },
91 { EVENT_ADDRMAP,
"ADDRMAP" },
92 { EVENT_DESCCHANGED,
"DESCCHANGED" },
94 { EVENT_STATUS_GENERAL,
"STATUS_GENERAL" },
95 { EVENT_STATUS_CLIENT,
"STATUS_CLIENT" },
96 { EVENT_STATUS_SERVER,
"STATUS_SERVER" },
97 { EVENT_GUARD,
"GUARD" },
98 { EVENT_STREAM_BANDWIDTH_USED,
"STREAM_BW" },
99 { EVENT_CLIENTS_SEEN,
"CLIENTS_SEEN" },
100 { EVENT_NEWCONSENSUS,
"NEWCONSENSUS" },
101 { EVENT_BUILDTIMEOUT_SET,
"BUILDTIMEOUT_SET" },
102 { EVENT_GOT_SIGNAL,
"SIGNAL" },
103 { EVENT_CONF_CHANGED,
"CONF_CHANGED"},
104 { EVENT_CONN_BW,
"CONN_BW" },
105 { EVENT_CELL_STATS,
"CELL_STATS" },
106 { EVENT_CIRC_BANDWIDTH_USED,
"CIRC_BW" },
107 { EVENT_TRANSPORT_LAUNCHED,
"TRANSPORT_LAUNCHED" },
108 { EVENT_HS_DESC,
"HS_DESC" },
109 { EVENT_HS_DESC_CONTENT,
"HS_DESC_CONTENT" },
110 { EVENT_NETWORK_LIVENESS,
"NETWORK_LIVENESS" },
120 case LOG_INFO:
return EVENT_INFO_MSG;
122 case LOG_WARN:
return EVENT_WARN_MSG;
123 case LOG_ERR:
return EVENT_ERR_MSG;
141 SMARTLIST_FOREACH_END(circ);
150 event_mask_t old_mask, new_mask;
159 control_connection_t *conn = TO_CONTROL_CONN(_conn);
160 global_event_mask |= conn->event_mask;
171 #define NEWLY_ENABLED(ev) \ 172 (! (old_mask & (ev)) && (new_mask & (ev))) 176 if (NEWLY_ENABLED(EVENT_STREAM_BANDWIDTH_USED)) {
180 edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
181 edge_conn->n_written = edge_conn->n_read = 0;
185 if (NEWLY_ENABLED(EVENT_CIRC_BANDWIDTH_USED)) {
188 if (NEWLY_ENABLED(EVENT_BANDWIDTH_USED)) {
206 case EVENT_INFO_MSG:
return LOG_INFO;
208 case EVENT_WARN_MSG:
return LOG_WARN;
209 case EVENT_ERR_MSG:
return LOG_ERR;
221 int min_log_event=EVENT_ERR_MSG, max_log_event=EVENT_DEBUG_MSG;
223 for (i = EVENT_DEBUG_MSG; i <= EVENT_ERR_MSG; ++i) {
229 for (i = EVENT_ERR_MSG; i >= EVENT_DEBUG_MSG; --i) {
236 if (min_log_event > EVENT_NOTICE_MSG)
237 min_log_event = EVENT_NOTICE_MSG;
238 if (max_log_event < EVENT_ERR_MSG)
239 max_log_event = EVENT_ERR_MSG;
241 if (min_log_event <= max_log_event)
265 EVENT_MASK_(EVENT_BANDWIDTH_USED) |
266 EVENT_MASK_(EVENT_CELL_STATS) |
267 EVENT_MASK_(EVENT_CIRC_BANDWIDTH_USED) |
268 EVENT_MASK_(EVENT_CONN_BW) |
269 EVENT_MASK_(EVENT_STREAM_BANDWIDTH_USED)
275 static uint64_t stats_prev_n_read = 0;
278 static uint64_t stats_prev_n_written = 0;
309 uint64_t bytes_read, bytes_written;
345 control_initialize_event_queue(
void)
367 get_block_event_queue(
void)
370 if (PREDICT_UNLIKELY(val == NULL)) {
371 val = tor_malloc_zero(
sizeof(
int));
398 int *block_event_queue = get_block_event_queue();
399 if (*block_event_queue) {
409 ++*block_event_queue;
415 int activate_event = 0;
423 --*block_event_queue;
429 if (activate_event) {
435 #define queued_event_free(ev) \ 436 FREE_AND_NULL(queued_event_t, queued_event_free_, (ev)) 466 int *block_event_queue = get_block_event_queue();
467 ++*block_event_queue;
479 !conn->marked_for_close &&
485 } SMARTLIST_FOREACH_END(conn);
488 const event_mask_t bit = ((event_mask_t)1) << ev->event;
489 const size_t msg_len = strlen(ev->msg);
492 if (control_conn->event_mask & bit) {
493 connection_buf_add(ev->msg, msg_len,
TO_CONN(control_conn));
495 } SMARTLIST_FOREACH_END(control_conn);
497 queued_event_free(ev);
498 } SMARTLIST_FOREACH_END(ev);
504 } SMARTLIST_FOREACH_END(control_conn);
507 smartlist_free(queued_events);
508 smartlist_free(controllers);
510 --*block_event_queue;
532 tor_assert(event >= EVENT_MIN_ && event <= EVENT_MAX_);
542 const char *format, va_list ap)
549 log_warn(
LD_BUG,
"Unable to format event for controller.");
561 const char *format, ...)
564 va_start(ap, format);
576 char reasons[64] =
"";
584 case CIRC_EVENT_LAUNCHED: status =
"LAUNCHED";
break;
585 case CIRC_EVENT_BUILT: status =
"BUILT";
break;
586 case CIRC_EVENT_EXTENDED: status =
"EXTENDED";
break;
587 case CIRC_EVENT_FAILED: status =
"FAILED";
break;
588 case CIRC_EVENT_CLOSED: status =
"CLOSED";
break;
590 log_warn(
LD_BUG,
"Unrecognized status code %d", (
int)tp);
595 if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) {
597 char unk_reason_buf[16];
599 tor_snprintf(unk_reason_buf, 16,
"UNKNOWN_%d", reason_code);
600 reason_str = unk_reason_buf;
604 " REASON=DESTROYED REMOTE_REASON=%s", reason_str);
607 " REASON=%s", reason_str);
613 const char *sp = strlen(circdesc) ?
" " :
"";
615 "650 CIRC %lu %s%s%s%s\r\n",
631 int purpose,
const struct timeval *tv)
633 const char *event_desc;
634 char event_tail[160] =
"";
641 case CIRC_MINOR_EVENT_PURPOSE_CHANGED:
642 event_desc =
"PURPOSE_CHANGED";
646 const char *hs_state_str =
649 " OLD_PURPOSE=%s%s%s",
651 (hs_state_str != NULL) ?
" OLD_HS_STATE=" :
"",
652 (hs_state_str != NULL) ? hs_state_str :
"");
656 case CIRC_MINOR_EVENT_CANNIBALIZED:
657 event_desc =
"CANNIBALIZED";
661 const char *hs_state_str =
663 const struct timeval *old_timestamp_began = tv;
664 char tbuf[ISO_TIME_USEC_LEN+1];
668 " OLD_PURPOSE=%s%s%s OLD_TIME_CREATED=%s",
670 (hs_state_str != NULL) ?
" OLD_HS_STATE=" :
"",
671 (hs_state_str != NULL) ? hs_state_str :
"",
677 log_warn(
LD_BUG,
"Unrecognized status code %d", (
int)e);
684 const char *sp = strlen(circdesc) ?
" " :
"";
686 "650 CIRC_MINOR %lu %s%s%s%s\r\n",
706 CIRC_MINOR_EVENT_PURPOSE_CHANGED,
718 const struct timeval *old_tv_created)
721 CIRC_MINOR_EVENT_CANNIBALIZED,
733 char addrport_buf[64];
738 const char *purpose =
"";
744 if (tp == STREAM_EVENT_CLOSED &&
750 reason_buf[0] =
'\0';
753 case STREAM_EVENT_SENT_CONNECT: status =
"SENTCONNECT";
break;
754 case STREAM_EVENT_SENT_RESOLVE: status =
"SENTRESOLVE";
break;
755 case STREAM_EVENT_SUCCEEDED: status =
"SUCCEEDED";
break;
756 case STREAM_EVENT_FAILED: status =
"FAILED";
break;
757 case STREAM_EVENT_CLOSED: status =
"CLOSED";
break;
758 case STREAM_EVENT_NEW: status =
"NEW";
break;
759 case STREAM_EVENT_NEW_RESOLVE: status =
"NEWRESOLVE";
break;
760 case STREAM_EVENT_FAILED_RETRIABLE: status =
"DETACHED";
break;
761 case STREAM_EVENT_REMAP: status =
"REMAP";
break;
763 log_warn(
LD_BUG,
"Unrecognized status code %d", (
int)tp);
766 if (reason_code && (tp == STREAM_EVENT_FAILED ||
767 tp == STREAM_EVENT_CLOSED ||
768 tp == STREAM_EVENT_FAILED_RETRIABLE)) {
777 " REASON=END REMOTE_REASON=%s", reason_str);
780 " REASON=%s", reason_str);
782 }
else if (reason_code && tp == STREAM_EVENT_REMAP) {
783 switch (reason_code) {
785 strlcpy(reason_buf,
" SOURCE=CACHE",
sizeof(reason_buf));
788 strlcpy(reason_buf,
" SOURCE=EXIT",
sizeof(reason_buf));
791 tor_snprintf(reason_buf,
sizeof(reason_buf),
" REASON=UNKNOWN_%d",
798 if (tp == STREAM_EVENT_NEW || tp == STREAM_EVENT_NEW_RESOLVE) {
804 if (strcmp(
ENTRY_TO_CONN(conn)->address,
"(Tor_internal)") != 0) {
805 tor_snprintf(addrport_buf,
sizeof(addrport_buf),
" SOURCE_ADDR=%s:%d",
812 addrport_buf[0] =
'\0';
815 addrport_buf[0] =
'\0';
818 if (tp == STREAM_EVENT_NEW_RESOLVE) {
819 purpose =
" PURPOSE=DNS_REQUEST";
820 }
else if (tp == STREAM_EVENT_NEW) {
823 int linked_dir_purpose = -1;
825 linked_dir_purpose = linked->
purpose;
827 purpose =
" PURPOSE=DIR_UPLOAD";
829 purpose =
" PURPOSE=DIR_FETCH";
831 purpose =
" PURPOSE=USER";
840 const char *sp = strlen(conndesc) ?
" " :
"";
842 "650 STREAM %"PRIu64
" %s %lu %s%s%s%s%s%s\r\n",
847 buf, reason_buf, addrport_buf, purpose, sp, conndesc);
868 char ncircs_buf[32] = {0};
875 case OR_CONN_EVENT_LAUNCHED: status =
"LAUNCHED";
break;
876 case OR_CONN_EVENT_CONNECTED: status =
"CONNECTED";
break;
877 case OR_CONN_EVENT_FAILED: status =
"FAILED";
break;
878 case OR_CONN_EVENT_CLOSED: status =
"CLOSED";
break;
879 case OR_CONN_EVENT_NEW: status =
"NEW";
break;
881 log_warn(
LD_BUG,
"Unrecognized status code %d", (
int)tp);
890 if (ncircs && (tp == OR_CONN_EVENT_FAILED || tp == OR_CONN_EVENT_CLOSED)) {
891 tor_snprintf(ncircs_buf,
sizeof(ncircs_buf),
" NCIRCS=%d", ncircs);
896 "650 ORCONN %s %s%s%s%s ID=%"PRIu64
"\r\n",
898 reason ?
" REASON=" :
"",
913 char tbuf[ISO_TIME_USEC_LEN+1];
921 "650 STREAM_BW %"PRIu64
" %lu %lu %s\r\n",
923 (
unsigned long)edge_conn->
n_read,
942 char tbuf[ISO_TIME_USEC_LEN+1];
955 "650 STREAM_BW %"PRIu64
" %lu %lu %s\r\n",
957 (
unsigned long)edge_conn->
n_read,
963 SMARTLIST_FOREACH_END(conn);
983 SMARTLIST_FOREACH_END(circ);
1000 char tbuf[ISO_TIME_USEC_LEN+1];
1019 "650 CIRC_BW ID=%d READ=%lu WRITTEN=%lu TIME=%s " 1020 "DELIVERED_READ=%lu OVERHEAD_READ=%lu " 1021 "DELIVERED_WRITTEN=%lu OVERHEAD_WRITTEN=%lu\r\n",
1042 const char *conn_type_str;
1048 switch (conn->
type) {
1050 conn_type_str =
"OR";
1053 conn_type_str =
"DIR";
1056 conn_type_str =
"EXIT";
1062 "650 CONN_BW ID=%"PRIu64
" TYPE=%s " 1063 "READ=%lu WRITTEN=%lu\r\n",
1092 memset(cell_stats, 0,
sizeof(cell_stats_t));
1095 tor_assert(ent->command <= CELL_COMMAND_MAX_);
1096 if (!ent->removed && !ent->exitward) {
1097 cell_stats->added_cells_appward[ent->command] += 1;
1098 }
else if (!ent->removed && ent->exitward) {
1099 cell_stats->added_cells_exitward[ent->command] += 1;
1100 }
else if (!ent->exitward) {
1101 cell_stats->removed_cells_appward[ent->command] += 1;
1102 cell_stats->total_time_appward[ent->command] += ent->waiting_time * 10;
1104 cell_stats->removed_cells_exitward[ent->command] += 1;
1105 cell_stats->total_time_exitward[ent->command] += ent->waiting_time * 10;
1107 } SMARTLIST_FOREACH_END(ent);
1122 const uint64_t *include_if_non_zero,
1123 const uint64_t *number_to_include)
1127 for (i = 0; i <= CELL_COMMAND_MAX_; i++) {
1128 if (include_if_non_zero[i] > 0) {
1131 (number_to_include[i]));
1134 if (smartlist_len(key_value_strings) > 0) {
1140 smartlist_free(key_value_strings);
1147 cell_stats_t *cell_stats)
1161 cell_stats->added_cells_appward,
1162 cell_stats->added_cells_appward);
1164 cell_stats->removed_cells_appward,
1165 cell_stats->removed_cells_appward);
1167 cell_stats->removed_cells_appward,
1168 cell_stats->total_time_appward);
1176 cell_stats->added_cells_exitward,
1177 cell_stats->added_cells_exitward);
1179 cell_stats->removed_cells_exitward,
1180 cell_stats->removed_cells_exitward);
1182 cell_stats->removed_cells_exitward,
1183 cell_stats->total_time_exitward);
1187 smartlist_free(event_parts);
1195 cell_stats_t *cell_stats;
1197 if (!
get_options()->TestingEnableCellStatsEvent ||
1200 cell_stats = tor_malloc(
sizeof(cell_stats_t));
1202 if (!circ->testing_cell_stats)
1207 "650 CELL_STATS %s\r\n", event_string);
1210 SMARTLIST_FOREACH_END(circ);
1216 #define N_BW_EVENTS_TO_CACHE 300 1218 static int next_measurement_idx = 0;
1220 static int n_measurements = 0;
1224 } cached_bw_events[N_BW_EVENTS_TO_CACHE];
1231 cached_bw_events[next_measurement_idx].n_read = n_read;
1232 cached_bw_events[next_measurement_idx].n_written = n_written;
1233 if (++next_measurement_idx == N_BW_EVENTS_TO_CACHE)
1234 next_measurement_idx = 0;
1235 if (n_measurements < N_BW_EVENTS_TO_CACHE)
1240 "650 BW %lu %lu\r\n",
1241 (
unsigned long)n_read,
1242 (
unsigned long)n_written);
1249 get_bw_samples(
void)
1252 int idx = (next_measurement_idx + N_BW_EVENTS_TO_CACHE - n_measurements)
1253 % N_BW_EVENTS_TO_CACHE;
1254 tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE);
1258 for (i = 0; i < n_measurements; ++i) {
1259 tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE);
1263 (
unsigned)bwe->n_read,
1264 (
unsigned)bwe->n_written);
1266 idx = (idx + 1) % N_BW_EVENTS_TO_CACHE;
1272 smartlist_free(elements);
1322 if (strchr(msg,
'\n')) {
1324 b = tor_strdup(msg);
1325 for (cp = b; *cp; ++cp)
1326 if (*cp ==
'\r' || *cp ==
'\n')
1334 case LOG_ERR: s =
"ERR";
break;
1335 default: s =
"UnknownLogSeverity";
break;
1391 smartlist_free(names);
1403 const char *error,
const int cached)
1408 if (expires < 3 || expires == TIME_MAX)
1410 "650 ADDRMAP %s %s NEVER %s%s" 1411 "CACHED=\"%s\"\r\n",
1412 from, to, error?error:
"", error?
" ":
"",
1415 char buf[ISO_TIME_LEN+1];
1416 char buf2[ISO_TIME_LEN+1];
1420 "650 ADDRMAP %s %s \"%s\"" 1421 " %s%sEXPIRES=\"%s\" CACHED=\"%s\"\r\n",
1423 error?error:
"", error?
" ":
"",
1424 buf2, cached?
"YES":
"NO");
1436 if (get_cached_network_liveness() <= 0) {
1438 set_cached_network_liveness(1);
1439 log_debug(
LD_CONTROL,
"Sending NETWORK_LIVENESS UP");
1441 "650 NETWORK_LIVENESS UP\r\n");
1445 if (get_cached_network_liveness() > 0) {
1447 set_cached_network_liveness(0);
1448 log_debug(
LD_CONTROL,
"Sending NETWORK_LIVENESS DOWN");
1450 "650 NETWORK_LIVENESS DOWN\r\n");
1465 const char *event_string)
1468 char *s, *esc = NULL;
1486 smartlist_free(strs);
1520 const char *type_string = NULL;
1526 case BUILDTIMEOUT_SET_EVENT_COMPUTED:
1527 type_string =
"COMPUTED";
1529 case BUILDTIMEOUT_SET_EVENT_RESET:
1530 type_string =
"RESET";
1532 case BUILDTIMEOUT_SET_EVENT_SUSPENDED:
1533 type_string =
"SUSPENDED";
1535 case BUILDTIMEOUT_SET_EVENT_DISCARD:
1536 type_string =
"DISCARD";
1538 case BUILDTIMEOUT_SET_EVENT_RESUME:
1539 type_string =
"RESUME";
1542 type_string =
"UNKNOWN";
1547 "650 BUILDTIMEOUT_SET %s %s\r\n",
1557 const char *signal_string = NULL;
1562 switch (signal_num) {
1564 signal_string =
"RELOAD";
1567 signal_string =
"DUMP";
1570 signal_string =
"DEBUG";
1573 signal_string =
"NEWNYM";
1575 case SIGCLEARDNSCACHE:
1576 signal_string =
"CLEARDNSCACHE";
1579 signal_string =
"HEARTBEAT";
1582 log_warn(
LD_BUG,
"Unrecognized signal %lu in control_event_signal",
1583 (
unsigned long)signal_num);
1606 smartlist_free(statuses);
1626 char *user_buf = NULL;
1627 char format_buf[160];
1628 const char *status, *sev;
1631 case EVENT_STATUS_GENERAL:
1632 status =
"STATUS_GENERAL";
1634 case EVENT_STATUS_CLIENT:
1635 status =
"STATUS_CLIENT";
1637 case EVENT_STATUS_SERVER:
1638 status =
"STATUS_SERVER";
1641 log_warn(
LD_BUG,
"Unrecognized status type %d", type);
1655 log_warn(
LD_BUG,
"Unrecognized status severity %d", severity);
1658 if (
tor_snprintf(format_buf,
sizeof(format_buf),
"650 %s %s",
1660 log_warn(
LD_BUG,
"Format string too long.");
1664 log_warn(
LD_BUG,
"Failed to create user buffer.");
1674 #define CONTROL_EVENT_STATUS_BODY(event, sev) \ 1678 if (!EVENT_IS_INTERESTING(event)) \ 1681 va_start(ap, format); \ 1682 r = control_event_status((event), (sev), format, ap); \ 1692 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_GENERAL, severity);
1701 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_GENERAL,
LOG_ERR);
1712 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_CLIENT, severity);
1721 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_CLIENT,
LOG_ERR);
1732 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_SERVER, severity);
1741 CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_SERVER,
LOG_ERR);
1765 tor_snprintf(buf,
sizeof(buf),
"$%s~%s", hbuf, nickname);
1768 "650 GUARD ENTRY %s %s\r\n", buf, status);
1787 for (
const config_line_t *line = changes; line; line = line->next) {
1788 if (line->value == NULL) {
1796 "650-CONF_CHANGED\r\n%s\r\n650 OK\r\n", result);
1799 smartlist_free(lines);
1809 "650 CLIENTS_SEEN %s\r\n", controller_str);
1823 "650 TRANSPORT_LAUNCHED %s %s %s %u\r\n",
1824 mode, transport_name,
fmt_addr(addr), port);
1833 "650 PT_LOG %s\r\n",
1843 "650 PT_STATUS %s\r\n",
1854 switch (auth_type) {
1858 case REND_BASIC_AUTH:
1861 case REND_STEALTH_AUTH:
1862 str =
"STEALTH_AUTH";
1876 static const char *str_unknown =
"UNKNOWN";
1877 const char *str_ret = str_unknown;
1880 if (!onion_address) {
1884 if (onion_address[0] ==
'\0') {
1888 str_ret = onion_address;
1904 const char *id_digest,
1905 const char *desc_id,
1906 const char *hsdir_index)
1908 char *hsdir_index_field = NULL;
1910 if (BUG(!id_digest || !desc_id)) {
1915 tor_asprintf(&hsdir_index_field,
" HSDIR_INDEX=%s", hsdir_index);
1919 "650 HS_DESC REQUESTED %s %s %s %s%s\r\n",
1924 hsdir_index_field ? hsdir_index_field :
"");
1937 const char *desc_id,
1940 char *replica_field = NULL;
1942 if (BUG(!onion_address || !desc_id)) {
1951 "650 HS_DESC CREATED %s UNKNOWN UNKNOWN %s%s\r\n",
1952 onion_address, desc_id,
1953 replica_field ? replica_field :
"");
1965 const char *id_digest,
1966 const char *desc_id,
1967 const char *hsdir_index)
1969 char *hsdir_index_field = NULL;
1971 if (BUG(!onion_address || !id_digest || !desc_id)) {
1976 tor_asprintf(&hsdir_index_field,
" HSDIR_INDEX=%s", hsdir_index);
1980 "650 HS_DESC UPLOAD %s UNKNOWN %s %s%s\r\n",
1984 hsdir_index_field ? hsdir_index_field :
"");
1999 const char *onion_address,
2000 const char *desc_id,
2002 const char *hsdir_id_digest,
2005 char *reason_field = NULL;
2007 if (BUG(!action || !onion_address)) {
2016 "650 HS_DESC %s %s %s %s%s%s\r\n",
2023 desc_id ? desc_id :
"",
2024 reason_field ? reason_field :
"");
2039 const char *onion_address,
2040 const char *id_digest,
2043 char *reason_field = NULL;
2045 if (BUG(!action || !id_digest)) {
2054 "650 HS_DESC %s %s UNKNOWN %s%s\r\n",
2058 reason_field ? reason_field :
"");
2073 const char *desc_id = NULL;
2084 if (hsdir_fp == NULL) {
2100 } SMARTLIST_FOREACH_END(fingerprint);
2114 const char *hsdir_id_digest)
2116 char *desc_id_field = NULL;
2117 const char *desc_id;
2119 if (BUG(!rend_data || !hsdir_id_digest || !onion_address)) {
2124 if (desc_id != NULL) {
2127 base32_encode(desc_id_base32,
sizeof(desc_id_base32), desc_id,
2134 TO_REND_DATA_V2(rend_data)->auth_type,
2135 hsdir_id_digest, NULL);
2143 control_event_hsv3_descriptor_received(
const char *onion_address,
2144 const char *desc_id,
2145 const char *hsdir_id_digest)
2147 char *desc_id_field = NULL;
2149 if (BUG(!onion_address || !desc_id || !hsdir_id_digest)) {
2158 REND_NO_AUTH, hsdir_id_digest, NULL);
2168 const char *onion_address)
2170 if (BUG(!id_digest)) {
2185 const char *hsdir_id_digest,
2188 char *desc_id_field = NULL;
2189 const char *desc_id;
2191 if (BUG(!rend_data)) {
2196 if (desc_id != NULL) {
2199 base32_encode(desc_id_base32,
sizeof(desc_id_base32), desc_id,
2207 TO_REND_DATA_V2(rend_data)->auth_type,
2208 hsdir_id_digest, reason);
2219 const char *desc_id,
2220 const char *hsdir_id_digest,
2223 char *desc_id_field = NULL;
2225 if (BUG(!onion_address || !desc_id || !reason)) {
2234 REND_NO_AUTH, hsdir_id_digest, reason);
2245 const char *desc_id,
2246 const char *hsdir_id_digest,
2247 const char *content)
2249 static const char *event_name =
"HS_DESC_CONTENT";
2250 char *esc_content = NULL;
2252 if (!onion_address || !desc_id) {
2253 log_warn(
LD_BUG,
"Called with onion_address==%p, desc_id==%p, ",
2254 onion_address, desc_id);
2258 if (content == NULL) {
2265 "650+%s %s %s %s\r\n%s650 OK\r\n",
2282 const char *onion_address,
2285 if (BUG(!id_digest)) {
2293 control_events_free_all(
void)
2297 stats_prev_n_read = stats_prev_n_written = 0;
2306 if (queued_events) {
2308 queued_event_free(ev));
2309 smartlist_free(queued_events);
2319 #ifdef TOR_UNIT_TESTS 2322 control_testing_set_global_event_mask(uint64_t mask)
int control_event_circ_bandwidth_used(void)
uint64_t global_identifier
smartlist_t * get_connection_array(void)
void control_event_clients_seen(const char *controller_str)
int control_event_conn_bandwidth_used(void)
static tor_mutex_t * queued_control_events_lock
Header file for channeltls.c.
static void clear_circ_bw_fields(void)
void control_event_hs_descriptor_requested(const char *onion_address, rend_auth_type_t auth_type, const char *id_digest, const char *desc_id, const char *hsdir_index)
smartlist_t * testing_cell_stats
void tor_mutex_release(tor_mutex_t *m)
int write_stream_target_to_buf(entry_connection_t *conn, char *buf, size_t len)
void control_event_hs_descriptor_created(const char *onion_address, const char *desc_id, int replica)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
int connection_flush(connection_t *conn)
#define MOCK_IMPL(rv, funcname, arglist)
Header file for command.c.
void format_local_iso_time(char *buf, time_t t)
uint32_t n_written_conn_bw
Header file for connection.c.
STATIC void queue_control_event_string(uint16_t event, char *msg)
static void static int static void const struct control_event_t control_event_table[]
void smartlist_add_strdup(struct smartlist_t *sl, const char *string)
#define CIRCUIT_IS_ORIGIN(c)
int control_event_circuit_cell_stats(void)
void control_event_hs_descriptor_upload_end(const char *action, const char *onion_address, const char *id_digest, const char *reason)
#define END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED
static uint64_t stats_n_bytes_written
static void control_get_bytes_rw_last_sec(uint64_t *r, uint64_t *w)
Header file for describe.c.
Header file for nodelist.c.
Header file for directory.c.
void format_cell_stats(char **event_string, circuit_t *circ, cell_stats_t *cell_stats)
int tor_vasprintf(char **strp, const char *fmt, va_list args)
void smartlist_add(smartlist_t *sl, void *element)
Header file for control_fmt.c.
const char * circuit_purpose_to_controller_hs_state_string(uint8_t purpose)
const char * cell_command_to_string(uint8_t command)
#define CONTROL_CONN_STATE_OPEN
void circuit_clear_testing_cell_stats(circuit_t *circ)
#define REND_DESC_ID_V2_LEN_BASE32
int circuit_count_pending_on_channel(channel_t *chan)
static tor_threadlocal_t block_event_queue_flag
Header file for config.c.
control_connection_t * TO_CONTROL_CONN(connection_t *c)
uint32_t n_delivered_read_circ_bw
char * networkstatus_getinfo_helper_single(const routerstatus_t *rs)
static event_mask_t global_event_mask
const or_options_t * get_options(void)
int control_event_stream_bandwidth(edge_connection_t *edge_conn)
void base32_encode(char *dest, size_t destlen, const char *src, size_t srclen)
void format_iso_time_nospace_usec(char *buf, const struct timeval *tv)
uint32_t n_overhead_read_circ_bw
void tor_gettimeofday(struct timeval *timeval)
int control_event_signal(uintptr_t signal_num)
static void static int static void send_control_event(uint16_t event, const char *format,...) CHECK_PRINTF(2
void control_event_pt_status(const char *status)
uint32_t n_overhead_written_circ_bw
uint64_t get_bytes_written(void)
void control_event_transport_launched(const char *mode, const char *transport_name, tor_addr_t *addr, uint16_t port)
char desc_id_fetch[DIGEST_LEN]
int control_event_client_error(const char *format,...)
void enable_control_logging(void)
static void queued_events_flush_all(int force)
#define tor_fragile_assert()
void control_event_logmsg(int severity, log_domain_mask_t domain, const char *msg)
Header file for mainloop.c.
static mainloop_event_t * flush_queued_events_event
void mainloop_event_activate(mainloop_event_t *event)
smartlist_t * smartlist_new(void)
int control_event_descriptors_changed(smartlist_t *routers)
const char * rend_data_get_desc_id(const rend_data_t *rend_data, uint8_t replica, size_t *len_out)
int control_event_stream_bandwidth_used(void)
int control_event_circ_bandwidth_used_for_circ(origin_circuit_t *ocirc)
static void event_hs_descriptor_receive_end(const char *action, const char *onion_address, const char *desc_id, rend_auth_type_t auth_type, const char *hsdir_id_digest, const char *reason)
edge_connection_t * TO_EDGE_CONN(connection_t *c)
int control_event_newconsensus(const networkstatus_t *consensus)
#define END_CIRC_REASON_FLAG_REMOTE
static void static int control_event_status(int type, int severity, const char *format, va_list args) CHECK_PRINTF(3
smartlist_t * circuit_get_global_list(void)
int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written)
void flush_pending_log_callbacks(void)
void orconn_target_get_name(char *name, size_t len, or_connection_t *conn)
int tor_threadlocal_init(tor_threadlocal_t *threadlocal)
void control_event_hs_descriptor_uploaded(const char *id_digest, const char *onion_address)
int control_event_general_status(int severity, const char *format,...)
void router_get_verbose_nickname(char *buf, const routerinfo_t *router)
uint32_t n_delivered_written_circ_bw
#define MAX_VERBOSE_NICKNAME_LEN
void control_per_second_events(void)
const char * rend_auth_type_to_string(rend_auth_type_t auth_type)
const char * circuit_end_reason_to_control_string(int reason)
int tor_memcmp(const void *a, const void *b, size_t len)
void sum_up_cell_stats_by_command(circuit_t *circ, cell_stats_t *cell_stats)
int tor_asprintf(char **strp, const char *fmt,...)
const char * stream_end_reason_to_control_string(int reason)
void control_update_global_event_mask(void)
Origin circuit structure.
static void send_control_event_impl(uint16_t event, const char *format, va_list ap) CHECK_PRINTF(2
size_t write_escaped_data(const char *data, size_t len, char **out)
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern,...)
static int disable_log_messages
int control_event_general_error(const char *format,...)
int control_event_circuit_purpose_changed(origin_circuit_t *circ, int old_purpose)
char * entry_connection_describe_status_for_controller(const entry_connection_t *conn)
Master header file for Tor-specific functionality.
int connection_or_get_num_circuits(or_connection_t *conn)
void change_callback_log_severity(int loglevelMin, int loglevelMax, log_callback cb)
void control_event_hs_descriptor_content(const char *onion_address, const char *desc_id, const char *hsdir_id_digest, const char *content)
#define ANY_EVENT_IS_INTERESTING(e)
uint32_t global_identifier
static int event_to_log_severity(int event)
int control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp, int reason)
int control_event_stream_status(entry_connection_t *conn, stream_status_event_t tp, int reason_code)
void node_get_verbose_nickname(const node_t *node, char *verbose_name_out)
#define END_STREAM_REASON_FLAG_REMOTE
static const char * rend_hsaddress_str_or_unknown(const char *onion_address)
const node_t * node_get_by_id(const char *identity_digest)
Entry connection structure.
uint32_t n_written_circ_bw
struct event_base * tor_libevent_get_base(void)
static int flush_queued_event_pending
void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
#define CONN_TYPE_CONTROL
#define DIR_PURPOSE_IS_UPLOAD(p)
char * circuit_describe_status_for_controller(origin_circuit_t *circ)
static int log_severity_to_event(int severity)
static void flush_queued_events_cb(mainloop_event_t *event, void *arg)
Header file for circuitlist.c.
void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value)
int control_event_client_status(int severity, const char *format,...)
uint64_t get_bytes_read(void)
#define REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS
void control_event_hsv2_descriptor_received(const char *onion_address, const rend_data_t *rend_data, const char *hsdir_id_digest)
int tor_digest_is_zero(const char *digest)
int control_event_network_liveness_update(int liveness)
static const char * get_desc_id_from_query(const rend_data_t *rend_data, const char *hsdir_fp)
#define ENTRY_TO_EDGE_CONN(c)
void control_adjust_event_log_severity(void)
int control_event_networkstatus_changed_single(const routerstatus_t *rs)
uint64_t global_identifier
Header file for connection_edge.c.
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
#define REMAP_STREAM_SOURCE_CACHE
static int control_event_circuit_status_minor(origin_circuit_t *circ, circuit_status_minor_event_t e, int purpose, const struct timeval *tv)
int tor_snprintf(char *str, size_t size, const char *format,...)
void format_iso_time(char *buf, time_t t)
char * smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, size_t *len_out)
const char * rend_data_get_address(const rend_data_t *rend_data)
const char * node_describe_longname_by_id(const char *id_digest)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
static uint64_t stats_n_bytes_read
uint64_t log_domain_mask_t
mainloop_event_t * mainloop_event_new(void(*cb)(mainloop_event_t *, void *), void *userdata)
void disable_control_logging(void)
smartlist_t * routerstatus_list
int control_event_is_interesting(int event)
STATIC void send_control_event_string(uint16_t event, const char *msg)
void control_event_pt_log(const char *log)
Controller connection structure.
or_circuit_t * TO_OR_CIRCUIT(circuit_t *x)
void control_event_logmsg_pending(void)
Header file for control.c.
void tor_mutex_acquire(tor_mutex_t *m)
void control_event_hs_descriptor_upload_failed(const char *id_digest, const char *onion_address, const char *reason)
static int control_event_networkstatus_changed_helper(smartlist_t *statuses, uint16_t event, const char *event_string)
tor_mutex_t * tor_mutex_new(void)
unsigned int use_begindir
void control_event_hsv3_descriptor_failed(const char *onion_address, const char *desc_id, const char *hsdir_id_digest, const char *reason)
void rescan_periodic_events(const or_options_t *options)
const char * circuit_purpose_to_controller_string(uint8_t purpose)
void append_cell_stats_by_command(smartlist_t *event_parts, const char *key, const uint64_t *include_if_non_zero, const uint64_t *number_to_include)
#define REMAP_STREAM_SOURCE_EXIT
int control_any_per_second_event_enabled(void)
static void queued_event_free_(queued_event_t *ev)
Header file for control_proto.c.
int control_event_server_error(const char *format,...)
Header file for reasons.c.
void * tor_threadlocal_get(tor_threadlocal_t *threadlocal)
circuit_t * circuit_get_by_edge_conn(edge_connection_t *conn)
Header file for connection_or.c.
int control_event_server_status(int severity, const char *format,...)
char * esc_for_log(const char *s)
void control_event_conf_changed(const config_line_t *changes)
int control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, int reason_code)
Header for compat_libevent.c.
socks_request_t * socks_request
Header file for control_events.c.
void control_event_hs_descriptor_upload(const char *onion_address, const char *id_digest, const char *desc_id, const char *hsdir_index)
const char * orconn_end_reason_to_control_string(int r)
int control_event_guard(const char *nickname, const char *digest, const char *status)
#define EVENT_IS_INTERESTING(e)
int control_event_address_mapped(const char *from, const char *to, time_t expires, const char *error, const int cached)
Header file for networkstatus.c.
int control_event_my_descriptor_changed(void)
circuit_status_minor_event_t
int control_event_networkstatus_changed(smartlist_t *statuses)
static smartlist_t * queued_control_events
int control_event_circuit_cannibalized(origin_circuit_t *circ, int old_purpose, const struct timeval *old_tv_created)
int control_event_buildtimeout_set(buildtimeout_set_event_t type, const char *args)
Networkstatus consensus/vote structure.
void control_event_hsv2_descriptor_failed(const rend_data_t *rend_data, const char *hsdir_id_digest, const char *reason)
int control_event_conn_bandwidth(connection_t *conn)