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-2013, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
9 * \brief Header file for control.c.
15 void control_update_global_event_mask(void);
16 void control_adjust_event_log_severity(void);
18 void control_ports_write_to_file(void);
20 /** Log information about the connection <b>conn</b>, protecting it as with
21 * CONN_LOG_PROTECT. Example:
23 * LOG_FN_CONN(conn, (LOG_DEBUG, "Socket %d wants to write", conn->s));
25 #define LOG_FN_CONN(conn, args) \
26 CONN_LOG_PROTECT(conn, log_fn args)
28 int connection_control_finished_flushing(control_connection_t
*conn
);
29 int connection_control_reached_eof(control_connection_t
*conn
);
30 void connection_control_closed(control_connection_t
*conn
);
32 int connection_control_process_inbuf(control_connection_t
*conn
);
34 #define EVENT_AUTHDIR_NEWDESCS 0x000D
35 #define EVENT_NS 0x000F
36 int control_event_is_interesting(int event
);
38 int control_event_circuit_status(origin_circuit_t
*circ
,
39 circuit_status_event_t e
, int reason
);
40 int control_event_circuit_purpose_changed(origin_circuit_t
*circ
,
42 int control_event_circuit_cannibalized(origin_circuit_t
*circ
,
44 const struct timeval
*old_tv_created
);
45 int control_event_stream_status(entry_connection_t
*conn
,
46 stream_status_event_t e
,
48 int control_event_or_conn_status(or_connection_t
*conn
,
49 or_conn_status_event_t e
, int reason
);
50 int control_event_bandwidth_used(uint32_t n_read
, uint32_t n_written
);
51 int control_event_stream_bandwidth(edge_connection_t
*edge_conn
);
52 int control_event_stream_bandwidth_used(void);
53 int control_event_circ_bandwidth_used(void);
54 int control_event_conn_bandwidth(connection_t
*conn
);
55 int control_event_conn_bandwidth_used(void);
56 int control_event_circuit_cell_stats(void);
57 int control_event_tb_empty(const char *bucket
, uint32_t read_empty_time
,
58 uint32_t write_empty_time
,
59 int milliseconds_elapsed
);
60 void control_event_logmsg(int severity
, uint32_t domain
, const char *msg
);
61 int control_event_descriptors_changed(smartlist_t
*routers
);
62 int control_event_address_mapped(const char *from
, const char *to
,
63 time_t expires
, const char *error
,
65 int control_event_or_authdir_new_descriptor(const char *action
,
69 int control_event_my_descriptor_changed(void);
70 int control_event_networkstatus_changed(smartlist_t
*statuses
);
72 int control_event_newconsensus(const networkstatus_t
*consensus
);
73 int control_event_networkstatus_changed_single(const routerstatus_t
*rs
);
74 int control_event_general_status(int severity
, const char *format
, ...)
76 int control_event_client_status(int severity
, const char *format
, ...)
78 int control_event_server_status(int severity
, const char *format
, ...)
80 int control_event_guard(const char *nickname
, const char *digest
,
82 int control_event_conf_changed(const smartlist_t
*elements
);
83 int control_event_buildtimeout_set(buildtimeout_set_event_t type
,
85 int control_event_signal(uintptr_t signal
);
87 int init_control_cookie_authentication(int enabled
);
88 char *get_controller_cookie_file_name(void);
89 smartlist_t
*decode_hashed_passwords(config_line_t
*passwords
);
90 void disable_control_logging(void);
91 void enable_control_logging(void);
93 void monitor_owning_controller_process(const char *process_spec
);
95 void control_event_bootstrap(bootstrap_status_t status
, int progress
);
96 MOCK_DECL(void, control_event_bootstrap_problem
,(const char *warn
,
98 or_connection_t
*or_conn
));
100 void control_event_clients_seen(const char *controller_str
);
101 void control_event_transport_launched(const char *mode
,
102 const char *transport_name
,
103 tor_addr_t
*addr
, uint16_t port
);
104 const char *rend_auth_type_to_string(rend_auth_type_t auth_type
);
105 MOCK_DECL(const char *, node_describe_longname_by_id
,(const char *id_digest
));
106 void control_event_hs_descriptor_requested(const rend_data_t
*rend_query
,
107 const char *desc_id_base32
,
109 void control_event_hs_descriptor_receive_end(const char *action
,
110 const rend_data_t
*rend_query
,
112 void control_event_hs_descriptor_received(const rend_data_t
*rend_query
,
114 void control_event_hs_descriptor_failed(const rend_data_t
*rend_query
,
117 void control_free_all(void);
119 #ifdef CONTROL_PRIVATE
120 /* Recognized asynchronous event types. It's okay to expand this list
121 * because it is used both as a list of v0 event types, and as indices
122 * into the bitfield to determine which controllers want which events.
124 #define EVENT_MIN_ 0x0001
125 #define EVENT_CIRCUIT_STATUS 0x0001
126 #define EVENT_STREAM_STATUS 0x0002
127 #define EVENT_OR_CONN_STATUS 0x0003
128 #define EVENT_BANDWIDTH_USED 0x0004
129 #define EVENT_CIRCUIT_STATUS_MINOR 0x0005
130 #define EVENT_NEW_DESC 0x0006
131 #define EVENT_DEBUG_MSG 0x0007
132 #define EVENT_INFO_MSG 0x0008
133 #define EVENT_NOTICE_MSG 0x0009
134 #define EVENT_WARN_MSG 0x000A
135 #define EVENT_ERR_MSG 0x000B
136 #define EVENT_ADDRMAP 0x000C
138 // #define EVENT_AUTHDIR_NEWDESCS 0x000D
139 #define EVENT_DESCCHANGED 0x000E
141 // #define EVENT_NS 0x000F
142 #define EVENT_STATUS_CLIENT 0x0010
143 #define EVENT_STATUS_SERVER 0x0011
144 #define EVENT_STATUS_GENERAL 0x0012
145 #define EVENT_GUARD 0x0013
146 #define EVENT_STREAM_BANDWIDTH_USED 0x0014
147 #define EVENT_CLIENTS_SEEN 0x0015
148 #define EVENT_NEWCONSENSUS 0x0016
149 #define EVENT_BUILDTIMEOUT_SET 0x0017
150 #define EVENT_SIGNAL 0x0018
151 #define EVENT_CONF_CHANGED 0x0019
152 #define EVENT_CONN_BW 0x001A
153 #define EVENT_CELL_STATS 0x001B
154 #define EVENT_TB_EMPTY 0x001C
155 #define EVENT_CIRC_BANDWIDTH_USED 0x001D
156 #define EVENT_TRANSPORT_LAUNCHED 0x0020
157 #define EVENT_HS_DESC 0x0021
158 #define EVENT_MAX_ 0x0021
159 /* If EVENT_MAX_ ever hits 0x003F, we need to make the mask into a
160 * different structure, as it can only handle a maximum left shift of 1<<63. */
162 /* Used only by control.c and test.c */
163 STATIC
size_t write_escaped_data(const char *data
, size_t len
, char **out
);
164 STATIC
size_t read_escaped_data(const char *data
, size_t len
, char **out
);
165 /** Flag for event_format_t. Indicates that we should use the one standard
166 format. (Other formats previous existed, and are now deprecated)
168 #define ALL_FORMATS 1
169 /** Bit field of flags to select how to format a controller event. Recognized
170 * flag is ALL_FORMATS. */
171 typedef int event_format_t
;
173 #ifdef TOR_UNIT_TESTS
174 MOCK_DECL(STATIC
void,
175 send_control_event_string
,(uint16_t event
, event_format_t which
,
178 void control_testing_set_global_event_mask(uint64_t mask
);
181 /** Helper structure: temporarily stores cell statistics for a circuit. */
182 typedef struct cell_stats_t
{
183 /** Number of cells added in app-ward direction by command. */
184 uint64_t added_cells_appward
[CELL_COMMAND_MAX_
+ 1];
185 /** Number of cells added in exit-ward direction by command. */
186 uint64_t added_cells_exitward
[CELL_COMMAND_MAX_
+ 1];
187 /** Number of cells removed in app-ward direction by command. */
188 uint64_t removed_cells_appward
[CELL_COMMAND_MAX_
+ 1];
189 /** Number of cells removed in exit-ward direction by command. */
190 uint64_t removed_cells_exitward
[CELL_COMMAND_MAX_
+ 1];
191 /** Total waiting time of cells in app-ward direction by command. */
192 uint64_t total_time_appward
[CELL_COMMAND_MAX_
+ 1];
193 /** Total waiting time of cells in exit-ward direction by command. */
194 uint64_t total_time_exitward
[CELL_COMMAND_MAX_
+ 1];
196 void sum_up_cell_stats_by_command(circuit_t
*circ
,
197 cell_stats_t
*cell_stats
);
198 void append_cell_stats_by_command(smartlist_t
*event_parts
,
200 const uint64_t *include_if_non_zero
,
201 const uint64_t *number_to_include
);
202 void format_cell_stats(char **event_string
, circuit_t
*circ
,
203 cell_stats_t
*cell_stats
);
204 STATIC
char *get_bw_samples(void);