00001
00002
00003
00004
00005
00006
00012 #ifndef _TOR_OR_H
00013 #define _TOR_OR_H
00014
00015 #include "orconfig.h"
00016
00017 #ifdef __COVERITY__
00018
00019
00020 #ifndef INSTRUMENT_DOWNLOADS
00021 #define INSTRUMENT_DOWNLOADS 1
00022 #endif
00023 #endif
00024
00025 #ifdef MS_WINDOWS
00026 #define WIN32_WINNT 0x400
00027 #define _WIN32_WINNT 0x400
00028 #define WIN32_LEAN_AND_MEAN
00029 #endif
00030
00031 #ifdef HAVE_UNISTD_H
00032 #include <unistd.h>
00033 #endif
00034 #ifdef HAVE_SIGNAL_H
00035 #include <signal.h>
00036 #endif
00037 #ifdef HAVE_NETDB_H
00038 #include <netdb.h>
00039 #endif
00040 #ifdef HAVE_SYS_PARAM_H
00041 #include <sys/param.h>
00042 #endif
00043 #include "torint.h"
00044 #ifdef HAVE_SYS_WAIT_H
00045 #include <sys/wait.h>
00046 #endif
00047 #ifdef HAVE_SYS_FCNTL_H
00048 #include <sys/fcntl.h>
00049 #endif
00050 #ifdef HAVE_FCNTL_H
00051 #include <fcntl.h>
00052 #endif
00053 #ifdef HAVE_SYS_IOCTL_H
00054 #include <sys/ioctl.h>
00055 #endif
00056 #ifdef HAVE_SYS_UN_H
00057 #include <sys/un.h>
00058 #endif
00059 #ifdef HAVE_SYS_STAT_H
00060 #include <sys/stat.h>
00061 #endif
00062 #ifdef HAVE_ARPA_INET_H
00063 #include <arpa/inet.h>
00064 #endif
00065 #ifdef HAVE_ERRNO_H
00066 #include <errno.h>
00067 #endif
00068 #ifdef HAVE_ASSERT_H
00069 #include <assert.h>
00070 #endif
00071 #ifdef HAVE_TIME_H
00072 #include <time.h>
00073 #endif
00074
00075 #ifdef MS_WINDOWS
00076 #include <io.h>
00077 #include <process.h>
00078 #include <direct.h>
00079 #include <windows.h>
00080 #define snprintf _snprintf
00081 #endif
00082
00083 #include "crypto.h"
00084 #include "tortls.h"
00085 #include "../common/log.h"
00086 #include "compat.h"
00087 #include "container.h"
00088 #include "util.h"
00089 #include "torgzip.h"
00090 #include "address.h"
00091 #include "compat_libevent.h"
00092 #include "ht.h"
00093
00094
00095
00096 #ifndef SIGHUP
00097 #define SIGHUP 1
00098 #endif
00099 #ifndef SIGINT
00100 #define SIGINT 2
00101 #endif
00102 #ifndef SIGUSR1
00103 #define SIGUSR1 10
00104 #endif
00105 #ifndef SIGUSR2
00106 #define SIGUSR2 12
00107 #endif
00108 #ifndef SIGTERM
00109 #define SIGTERM 15
00110 #endif
00111
00112
00113 #define SIGNEWNYM 129
00114 #define SIGCLEARDNSCACHE 130
00115
00116 #if (SIZEOF_CELL_T != 0)
00117
00118
00119 #define cell_t tor_cell_t
00120 #endif
00121
00123 #define MAX_NICKNAME_LEN 19
00124
00126 #define MAX_HEX_NICKNAME_LEN (HEX_DIGEST_LEN+1)
00127
00129 #define MAX_VERBOSE_NICKNAME_LEN (1+HEX_DIGEST_LEN+1+MAX_NICKNAME_LEN)
00130
00132 #define MAX_BUF_SIZE ((1<<24)-1)
00133
00134 #define MAX_DIR_DL_SIZE MAX_BUF_SIZE
00135
00138 #define MAX_HEADERS_SIZE 50000
00139
00141 #define MAX_DIR_UL_SIZE MAX_BUF_SIZE
00142
00146 #define MAX_DESCRIPTOR_UPLOAD_SIZE 20000
00147
00149 #define MAX_EXTRAINFO_UPLOAD_SIZE 50000
00150
00153 #define MAX_DNS_ENTRY_AGE (30*60)
00154
00156 #define DEFAULT_DNS_TTL (30*60)
00157
00158 #define MAX_DNS_TTL (3*60*60)
00159
00161 #define MIN_DNS_TTL (60)
00162
00164 #define MIN_ONION_KEY_LIFETIME (7*24*60*60)
00165
00166 #define MAX_SSL_KEY_LIFETIME (2*60*60)
00167
00170 #define ROUTER_MAX_AGE (60*60*48)
00171
00173 #define ROUTER_MAX_AGE_TO_PUBLISH (60*60*20)
00174
00175 #define OLD_ROUTER_DESC_MAX_AGE (60*60*24*5)
00176
00178 typedef enum {
00179 CIRC_ID_TYPE_LOWER=0,
00180 CIRC_ID_TYPE_HIGHER=1,
00183 CIRC_ID_TYPE_NEITHER=2
00184 } circ_id_type_t;
00185
00186 #define _CONN_TYPE_MIN 3
00187
00188 #define CONN_TYPE_OR_LISTENER 3
00189
00191 #define CONN_TYPE_OR 4
00192
00193 #define CONN_TYPE_EXIT 5
00194
00195 #define CONN_TYPE_AP_LISTENER 6
00196
00198 #define CONN_TYPE_AP 7
00199
00200 #define CONN_TYPE_DIR_LISTENER 8
00201
00202 #define CONN_TYPE_DIR 9
00203
00204 #define CONN_TYPE_CPUWORKER 10
00205
00206 #define CONN_TYPE_CONTROL_LISTENER 11
00207
00208 #define CONN_TYPE_CONTROL 12
00209
00211 #define CONN_TYPE_AP_TRANS_LISTENER 13
00212
00214 #define CONN_TYPE_AP_NATD_LISTENER 14
00215
00216 #define CONN_TYPE_AP_DNS_LISTENER 15
00217 #define _CONN_TYPE_MAX 15
00218
00219
00220
00221
00222 #define PROXY_NONE 0
00223 #define PROXY_CONNECT 1
00224 #define PROXY_SOCKS4 2
00225 #define PROXY_SOCKS5 3
00226
00227
00228 #define PROXY_HTTPS_WANT_CONNECT_OK 1
00229 #define PROXY_SOCKS4_WANT_CONNECT_OK 2
00230 #define PROXY_SOCKS5_WANT_AUTH_METHOD_NONE 3
00231 #define PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929 4
00232 #define PROXY_SOCKS5_WANT_AUTH_RFC1929_OK 5
00233 #define PROXY_SOCKS5_WANT_CONNECT_OK 6
00234 #define PROXY_CONNECTED 7
00235
00237 #define CONN_IS_EDGE(x) \
00238 ((x)->type == CONN_TYPE_EXIT || (x)->type == CONN_TYPE_AP)
00239
00241 #define LISTENER_STATE_READY 0
00242
00243 #define _CPUWORKER_STATE_MIN 1
00244
00245 #define CPUWORKER_STATE_IDLE 1
00246
00248 #define CPUWORKER_STATE_BUSY_ONION 2
00249 #define _CPUWORKER_STATE_MAX 2
00250
00251 #define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION
00252
00253 #define _OR_CONN_STATE_MIN 1
00254
00255 #define OR_CONN_STATE_CONNECTING 1
00256
00257 #define OR_CONN_STATE_PROXY_HANDSHAKING 2
00258
00260 #define OR_CONN_STATE_TLS_HANDSHAKING 3
00261
00263 #define OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING 4
00264
00266 #define OR_CONN_STATE_TLS_SERVER_RENEGOTIATING 5
00267
00270 #define OR_CONN_STATE_OR_HANDSHAKING 6
00271
00272 #define OR_CONN_STATE_OPEN 7
00273 #define _OR_CONN_STATE_MAX 7
00274
00275 #define _EXIT_CONN_STATE_MIN 1
00276
00277 #define EXIT_CONN_STATE_RESOLVING 1
00278
00279 #define EXIT_CONN_STATE_CONNECTING 2
00280
00281 #define EXIT_CONN_STATE_OPEN 3
00282
00283 #define EXIT_CONN_STATE_RESOLVEFAILED 4
00284 #define _EXIT_CONN_STATE_MAX 4
00285
00286
00287 #define _AP_CONN_STATE_MIN 5
00288
00289 #define AP_CONN_STATE_SOCKS_WAIT 5
00290
00292 #define AP_CONN_STATE_RENDDESC_WAIT 6
00293
00295 #define AP_CONN_STATE_CONTROLLER_WAIT 7
00296
00297 #define AP_CONN_STATE_CIRCUIT_WAIT 8
00298
00299 #define AP_CONN_STATE_CONNECT_WAIT 9
00300
00301 #define AP_CONN_STATE_RESOLVE_WAIT 10
00302
00303 #define AP_CONN_STATE_OPEN 11
00304
00306 #define AP_CONN_STATE_NATD_WAIT 12
00307 #define _AP_CONN_STATE_MAX 12
00308
00311 #define AP_CONN_STATE_IS_UNATTACHED(s) \
00312 ((s) <= AP_CONN_STATE_CIRCUIT_WAIT || (s) == AP_CONN_STATE_NATD_WAIT)
00313
00314 #define _DIR_CONN_STATE_MIN 1
00315
00316 #define DIR_CONN_STATE_CONNECTING 1
00317
00318 #define DIR_CONN_STATE_CLIENT_SENDING 2
00319
00320 #define DIR_CONN_STATE_CLIENT_READING 3
00321
00322 #define DIR_CONN_STATE_CLIENT_FINISHED 4
00323
00324 #define DIR_CONN_STATE_SERVER_COMMAND_WAIT 5
00325
00326 #define DIR_CONN_STATE_SERVER_WRITING 6
00327 #define _DIR_CONN_STATE_MAX 6
00328
00331 #define DIR_CONN_IS_SERVER(conn) ((conn)->purpose == DIR_PURPOSE_SERVER)
00332
00333 #define _CONTROL_CONN_STATE_MIN 1
00334
00335 #define CONTROL_CONN_STATE_OPEN 1
00336
00338 #define CONTROL_CONN_STATE_NEEDAUTH 2
00339 #define _CONTROL_CONN_STATE_MAX 2
00340
00341 #define _DIR_PURPOSE_MIN 3
00342
00344 #define DIR_PURPOSE_FETCH_RENDDESC 3
00345
00347 #define DIR_PURPOSE_HAS_FETCHED_RENDDESC 4
00348
00350 #define DIR_PURPOSE_FETCH_V2_NETWORKSTATUS 5
00351
00353 #define DIR_PURPOSE_FETCH_SERVERDESC 6
00354
00356 #define DIR_PURPOSE_FETCH_EXTRAINFO 7
00357
00358 #define DIR_PURPOSE_UPLOAD_DIR 8
00359
00361 #define DIR_PURPOSE_UPLOAD_RENDDESC 9
00362
00363 #define DIR_PURPOSE_UPLOAD_VOTE 10
00364
00365 #define DIR_PURPOSE_UPLOAD_SIGNATURES 11
00366
00368 #define DIR_PURPOSE_FETCH_STATUS_VOTE 12
00369
00371 #define DIR_PURPOSE_FETCH_DETACHED_SIGNATURES 13
00372
00374 #define DIR_PURPOSE_FETCH_CONSENSUS 14
00375
00377 #define DIR_PURPOSE_FETCH_CERTIFICATE 15
00378
00380 #define DIR_PURPOSE_SERVER 16
00381
00383 #define DIR_PURPOSE_UPLOAD_RENDDESC_V2 17
00384
00386 #define DIR_PURPOSE_FETCH_RENDDESC_V2 18
00387 #define _DIR_PURPOSE_MAX 18
00388
00391 #define DIR_PURPOSE_IS_UPLOAD(p) \
00392 ((p)==DIR_PURPOSE_UPLOAD_DIR || \
00393 (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \
00394 (p)==DIR_PURPOSE_UPLOAD_VOTE || \
00395 (p)==DIR_PURPOSE_UPLOAD_SIGNATURES)
00396
00397 #define _EXIT_PURPOSE_MIN 1
00398
00399 #define EXIT_PURPOSE_CONNECT 1
00400
00401 #define EXIT_PURPOSE_RESOLVE 2
00402 #define _EXIT_PURPOSE_MAX 2
00403
00404
00405
00406
00408 #define CIRCUIT_STATE_BUILDING 0
00409
00410 #define CIRCUIT_STATE_ONIONSKIN_PENDING 1
00411
00413 #define CIRCUIT_STATE_OR_WAIT 2
00414
00415 #define CIRCUIT_STATE_OPEN 3
00416
00417 #define _CIRCUIT_PURPOSE_MIN 1
00418
00419
00420 #define _CIRCUIT_PURPOSE_OR_MIN 1
00421
00422 #define CIRCUIT_PURPOSE_OR 1
00423
00424 #define CIRCUIT_PURPOSE_INTRO_POINT 2
00425
00426 #define CIRCUIT_PURPOSE_REND_POINT_WAITING 3
00427
00428 #define CIRCUIT_PURPOSE_REND_ESTABLISHED 4
00429 #define _CIRCUIT_PURPOSE_OR_MAX 4
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00453 #define CIRCUIT_PURPOSE_C_GENERAL 5
00454
00455 #define CIRCUIT_PURPOSE_C_INTRODUCING 6
00456
00458 #define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7
00459
00460 #define CIRCUIT_PURPOSE_C_INTRODUCE_ACKED 8
00461
00462 #define CIRCUIT_PURPOSE_C_ESTABLISH_REND 9
00463
00464 #define CIRCUIT_PURPOSE_C_REND_READY 10
00465
00467 #define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11
00468
00469 #define CIRCUIT_PURPOSE_C_REND_JOINED 12
00470
00471 #define _CIRCUIT_PURPOSE_C_MAX 12
00472
00474 #define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 13
00475
00477 #define CIRCUIT_PURPOSE_S_INTRO 14
00478
00479 #define CIRCUIT_PURPOSE_S_CONNECT_REND 15
00480
00481 #define CIRCUIT_PURPOSE_S_REND_JOINED 16
00482
00483 #define CIRCUIT_PURPOSE_TESTING 17
00484
00485 #define CIRCUIT_PURPOSE_CONTROLLER 18
00486 #define _CIRCUIT_PURPOSE_MAX 18
00487
00489 #define CIRCUIT_PURPOSE_UNKNOWN 255
00490
00493 #define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>_CIRCUIT_PURPOSE_OR_MAX)
00494
00496 #define CIRCUIT_PURPOSE_IS_CLIENT(p) \
00497 ((p)> _CIRCUIT_PURPOSE_OR_MAX && \
00498 (p)<=_CIRCUIT_PURPOSE_C_MAX)
00499
00500 #define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose))
00501
00503 #define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \
00504 ((p) == CIRCUIT_PURPOSE_C_REND_JOINED || \
00505 (p) == CIRCUIT_PURPOSE_S_REND_JOINED)
00506
00509 #define MIN_CIRCUITS_HANDLING_STREAM 2
00510
00511
00512
00513 #define RELAY_COMMAND_BEGIN 1
00514 #define RELAY_COMMAND_DATA 2
00515 #define RELAY_COMMAND_END 3
00516 #define RELAY_COMMAND_CONNECTED 4
00517 #define RELAY_COMMAND_SENDME 5
00518 #define RELAY_COMMAND_EXTEND 6
00519 #define RELAY_COMMAND_EXTENDED 7
00520 #define RELAY_COMMAND_TRUNCATE 8
00521 #define RELAY_COMMAND_TRUNCATED 9
00522 #define RELAY_COMMAND_DROP 10
00523 #define RELAY_COMMAND_RESOLVE 11
00524 #define RELAY_COMMAND_RESOLVED 12
00525 #define RELAY_COMMAND_BEGIN_DIR 13
00526
00527 #define RELAY_COMMAND_ESTABLISH_INTRO 32
00528 #define RELAY_COMMAND_ESTABLISH_RENDEZVOUS 33
00529 #define RELAY_COMMAND_INTRODUCE1 34
00530 #define RELAY_COMMAND_INTRODUCE2 35
00531 #define RELAY_COMMAND_RENDEZVOUS1 36
00532 #define RELAY_COMMAND_RENDEZVOUS2 37
00533 #define RELAY_COMMAND_INTRO_ESTABLISHED 38
00534 #define RELAY_COMMAND_RENDEZVOUS_ESTABLISHED 39
00535 #define RELAY_COMMAND_INTRODUCE_ACK 40
00536
00537
00538 #define END_OR_CONN_REASON_DONE 1
00539 #define END_OR_CONN_REASON_REFUSED 2
00540 #define END_OR_CONN_REASON_OR_IDENTITY 3
00541 #define END_OR_CONN_REASON_CONNRESET 4
00542 #define END_OR_CONN_REASON_TIMEOUT 5
00543 #define END_OR_CONN_REASON_NO_ROUTE 6
00544 #define END_OR_CONN_REASON_IO_ERROR 7
00545 #define END_OR_CONN_REASON_RESOURCE_LIMIT 8
00546 #define END_OR_CONN_REASON_MISC 9
00547
00548
00549
00550 #define END_STREAM_REASON_MISC 1
00551 #define END_STREAM_REASON_RESOLVEFAILED 2
00552 #define END_STREAM_REASON_CONNECTREFUSED 3
00553 #define END_STREAM_REASON_EXITPOLICY 4
00554 #define END_STREAM_REASON_DESTROY 5
00555 #define END_STREAM_REASON_DONE 6
00556 #define END_STREAM_REASON_TIMEOUT 7
00557
00558 #define END_STREAM_REASON_HIBERNATING 9
00559 #define END_STREAM_REASON_INTERNAL 10
00560 #define END_STREAM_REASON_RESOURCELIMIT 11
00561 #define END_STREAM_REASON_CONNRESET 12
00562 #define END_STREAM_REASON_TORPROTOCOL 13
00563 #define END_STREAM_REASON_NOTDIRECTORY 14
00564 #define END_STREAM_REASON_ENTRYPOLICY 15
00565
00566
00567
00568
00569
00570
00572
00573 #define END_STREAM_REASON_CANT_ATTACH 257
00574
00576 #define END_STREAM_REASON_NET_UNREACHABLE 258
00577
00579 #define END_STREAM_REASON_SOCKSPROTOCOL 259
00580
00582 #define END_STREAM_REASON_CANT_FETCH_ORIG_DEST 260
00583
00585 #define END_STREAM_REASON_INVALID_NATD_DEST 261
00586
00588 #define END_STREAM_REASON_MASK 511
00589
00592 #define END_STREAM_REASON_FLAG_REMOTE 512
00593
00595 #define END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED 1024
00596
00599 #define END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED 2048
00600
00603 #define REMAP_STREAM_SOURCE_CACHE 1
00604
00606 #define REMAP_STREAM_SOURCE_EXIT 2
00607
00608
00609 #define RESOLVED_TYPE_HOSTNAME 0
00610 #define RESOLVED_TYPE_IPV4 4
00611 #define RESOLVED_TYPE_IPV6 6
00612 #define RESOLVED_TYPE_ERROR_TRANSIENT 0xF0
00613 #define RESOLVED_TYPE_ERROR 0xF1
00614
00615
00616
00618 #define END_CIRC_REASON_NOPATH -2
00619
00620 #define END_CIRC_AT_ORIGIN -1
00621
00622
00623
00624 #define _END_CIRC_REASON_MIN 0
00625 #define END_CIRC_REASON_NONE 0
00626 #define END_CIRC_REASON_TORPROTOCOL 1
00627 #define END_CIRC_REASON_INTERNAL 2
00628 #define END_CIRC_REASON_REQUESTED 3
00629 #define END_CIRC_REASON_HIBERNATING 4
00630 #define END_CIRC_REASON_RESOURCELIMIT 5
00631 #define END_CIRC_REASON_CONNECTFAILED 6
00632 #define END_CIRC_REASON_OR_IDENTITY 7
00633 #define END_CIRC_REASON_OR_CONN_CLOSED 8
00634 #define END_CIRC_REASON_FINISHED 9
00635 #define END_CIRC_REASON_TIMEOUT 10
00636 #define END_CIRC_REASON_DESTROYED 11
00637 #define END_CIRC_REASON_NOSUCHSERVICE 12
00638 #define _END_CIRC_REASON_MAX 12
00639
00643 #define END_CIRC_REASON_FLAG_REMOTE 512
00644
00646 #define REND_SERVICE_ID_LEN_BASE32 16
00647
00649 #define REND_SERVICE_ADDRESS_LEN (16+1+5)
00650
00652 #define REND_SERVICE_ID_LEN 10
00653
00655 #define REND_TIME_PERIOD_V2_DESC_VALIDITY (24*60*60)
00656
00659 #define REND_TIME_PERIOD_OVERLAPPING_V2_DESCS (60*60)
00660
00663 #define REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS 2
00664
00666 #define REND_NUMBER_OF_CONSECUTIVE_REPLICAS 3
00667
00669 #define REND_DESC_ID_V2_LEN_BASE32 32
00670
00673 #define REND_SECRET_ID_PART_LEN_BASE32 32
00674
00677 #define REND_INTRO_POINT_ID_LEN_BASE32 32
00678
00681 #define REND_DESC_COOKIE_LEN 16
00682
00685 #define REND_DESC_COOKIE_LEN_BASE64 22
00686
00689 #define REND_BASIC_AUTH_CLIENT_ID_LEN 4
00690
00694 #define REND_BASIC_AUTH_CLIENT_MULTIPLE 16
00695
00698 #define REND_BASIC_AUTH_CLIENT_ENTRY_LEN (REND_BASIC_AUTH_CLIENT_ID_LEN \
00699 + CIPHER_KEY_LEN)
00700
00702 #define REND_DESC_MAX_SIZE (20 * 1024)
00703
00706 #define REND_LEGAL_CLIENTNAME_CHARACTERS \
00707 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-_"
00708
00710 #define REND_CLIENTNAME_MAX_LEN 16
00711
00714 #define REND_COOKIE_LEN DIGEST_LEN
00715
00717 typedef enum rend_auth_type_t {
00718 REND_NO_AUTH = 0,
00719 REND_BASIC_AUTH = 1,
00720 REND_STEALTH_AUTH = 2,
00721 } rend_auth_type_t;
00722
00724 typedef struct rend_service_authorization_t {
00725 char descriptor_cookie[REND_DESC_COOKIE_LEN];
00726 char onion_address[REND_SERVICE_ADDRESS_LEN+1];
00727 rend_auth_type_t auth_type;
00728 } rend_service_authorization_t;
00729
00733 typedef struct rend_data_t {
00735 char onion_address[REND_SERVICE_ID_LEN_BASE32+1];
00736
00738 char descriptor_cookie[REND_DESC_COOKIE_LEN];
00739
00741 rend_auth_type_t auth_type;
00742
00744 char rend_pk_digest[DIGEST_LEN];
00745
00747 char rend_cookie[REND_COOKIE_LEN];
00748 } rend_data_t;
00749
00753 #define REND_REPLAY_TIME_INTERVAL (60 * 60)
00754
00756 typedef enum {
00757 CELL_DIRECTION_IN=1,
00758 CELL_DIRECTION_OUT=2,
00759 } cell_direction_t;
00760
00763 #define CIRCWINDOW_START 1000
00764
00765 #define CIRCWINDOW_INCREMENT 100
00766
00768 #define STREAMWINDOW_START 500
00769
00770 #define STREAMWINDOW_INCREMENT 50
00771
00772
00773 #define CELL_PADDING 0
00774 #define CELL_CREATE 1
00775 #define CELL_CREATED 2
00776 #define CELL_RELAY 3
00777 #define CELL_DESTROY 4
00778 #define CELL_CREATE_FAST 5
00779 #define CELL_CREATED_FAST 6
00780 #define CELL_VERSIONS 7
00781 #define CELL_NETINFO 8
00782 #define CELL_RELAY_EARLY 9
00783
00786 #define CELL_COMMAND_IS_VAR_LENGTH(x) ((x) == CELL_VERSIONS)
00787
00789 #define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT (20*60)
00790
00792 #define LEGAL_NICKNAME_CHARACTERS \
00793 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
00794
00797 #define DEFAULT_CLIENT_NICKNAME "client"
00798
00800 #define SOCKS4_NETWORK_LEN 8
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00813 #define CELL_PAYLOAD_SIZE 509
00814
00815 #define CELL_NETWORK_SIZE 512
00816
00818 #define VAR_CELL_HEADER_SIZE 5
00819
00822 #define RELAY_HEADER_SIZE (1+2+2+4+2)
00823
00824 #define RELAY_PAYLOAD_SIZE (CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE)
00825
00827 typedef uint16_t circid_t;
00829 typedef uint16_t streamid_t;
00830
00833 typedef struct cell_t {
00834 circid_t circ_id;
00835 uint8_t command;
00837 char payload[CELL_PAYLOAD_SIZE];
00838 } cell_t;
00839
00841 typedef struct var_cell_t {
00842 uint8_t command;
00843 circid_t circ_id;
00844 uint16_t payload_len;
00845 char payload[1];
00846 } var_cell_t;
00847
00849 typedef struct packed_cell_t {
00850 struct packed_cell_t *next;
00851 char body[CELL_NETWORK_SIZE];
00852 } packed_cell_t;
00853
00856 typedef struct insertion_time_elem_t {
00857 struct insertion_time_elem_t *next;
00858 uint32_t insertion_time;
00860 unsigned counter;
00861 } insertion_time_elem_t;
00862
00864 typedef struct insertion_time_queue_t {
00865 struct insertion_time_elem_t *first;
00866 struct insertion_time_elem_t *last;
00867 } insertion_time_queue_t;
00868
00871 typedef struct cell_queue_t {
00872 packed_cell_t *head;
00873 packed_cell_t *tail;
00874 int n;
00875 insertion_time_queue_t *insertion_times;
00876 } cell_queue_t;
00877
00879 typedef struct {
00880 uint8_t command;
00881 uint16_t recognized;
00882 streamid_t stream_id;
00883 char integrity[4];
00884 uint16_t length;
00885 } relay_header_t;
00886
00887 typedef struct buf_t buf_t;
00888 typedef struct socks_request_t socks_request_t;
00889
00890
00891
00892 #define BASE_CONNECTION_MAGIC 0x7C3C304Eu
00893 #define OR_CONNECTION_MAGIC 0x7D31FF03u
00894 #define EDGE_CONNECTION_MAGIC 0xF0374013u
00895 #define DIR_CONNECTION_MAGIC 0x9988ffeeu
00896 #define CONTROL_CONNECTION_MAGIC 0x8abc765du
00897
00916 typedef struct connection_t {
00917 uint32_t magic;
00920 uint8_t state;
00921 unsigned int type:4;
00922 unsigned int purpose:5;
00924
00925
00926
00927 unsigned int read_blocked_on_bw:1;
00929 unsigned int write_blocked_on_bw:1;
00932 unsigned int hold_open_until_flushed:1;
00935 unsigned int inbuf_reached_eof:1;
00939 unsigned int in_flushed_some:1;
00940
00941
00942
00943 unsigned int linked:1;
00946 unsigned int reading_from_linked_conn:1;
00948 unsigned int writing_to_linked_conn:1;
00951 unsigned int active_on_link:1;
00954 unsigned int linked_conn_is_closed:1;
00955
00957 unsigned int proxy_state:4;
00958
00960 evutil_socket_t s;
00961 int conn_array_index;
00962 struct event *read_event;
00963 struct event *write_event;
00964 buf_t *inbuf;
00965 buf_t *outbuf;
00966 size_t outbuf_flushlen;
00968 time_t timestamp_lastread;
00970 time_t timestamp_lastwritten;
00972 time_t timestamp_created;
00974
00975 int socket_family;
00978 tor_addr_t addr;
00980 uint16_t port;
00982 uint16_t marked_for_close;
00986 const char *marked_for_close_file;
00988 char *address;
00991 struct connection_t *linked_conn;
00992
00994 uint64_t global_identifier;
00995
00996
00997
01000 struct evdns_server_port *dns_server_port;
01001
01003 uint64_t dirreq_id;
01004 } connection_t;
01005
01009 typedef struct or_handshake_state_t {
01012 time_t sent_versions_at;
01014 unsigned int started_here : 1;
01016 unsigned int received_versions : 1;
01017 } or_handshake_state_t;
01018
01021 typedef struct or_connection_t {
01022 connection_t _base;
01023
01026 char identity_digest[DIGEST_LEN];
01027 char *nickname;
01029 tor_tls_t *tls;
01030 int tls_error;
01033 time_t client_used;
01034
01035 tor_addr_t real_addr;
01040 circ_id_type_t circ_id_type:2;
01048 unsigned int is_canonical:1;
01052 unsigned int is_bad_for_new_circs:1;
01053 uint8_t link_proto;
01055 circid_t next_circ_id;
01059 or_handshake_state_t *handshake_state;
01061 time_t timestamp_lastempty;
01062 time_t timestamp_last_added_nonpadding;
01065
01066 int bandwidthrate;
01067 int bandwidthburst;
01068 int read_bucket;
01071 int write_bucket;
01072 int n_circuits;
01078 struct circuit_t *active_circuits;
01086 smartlist_t *active_circuit_pqueue;
01089 unsigned active_circuit_pqueue_last_recalibrated;
01090 struct or_connection_t *next_with_same_id;
01092 } or_connection_t;
01093
01096 typedef struct edge_connection_t {
01097 connection_t _base;
01098
01099 struct edge_connection_t *next_stream;
01101 struct crypt_path_t *cpath_layer;
01103 int package_window;
01105 int deliver_window;
01108 char *chosen_exit_name;
01109
01110 socks_request_t *socks_request;
01112 struct circuit_t *on_circuit;
01115 uint32_t address_ttl;
01118 streamid_t stream_id;
01122 uint16_t end_reason;
01123
01125 uint32_t n_read;
01126
01128 uint32_t n_written;
01129
01131 rend_data_t *rend_data;
01132
01136 uint8_t num_socks_retries;
01137
01139 unsigned int is_dns_request:1;
01140
01143 unsigned int want_onehop:1;
01146 unsigned int use_begindir:1;
01147
01148 unsigned int edge_has_sent_end:1;
01154 unsigned int edge_blocked_on_circ:1;
01157 unsigned int chosen_exit_optional:1;
01162 unsigned int chosen_exit_retries:3;
01163
01166 struct evdns_server_request *dns_server_request;
01167
01168 } edge_connection_t;
01169
01172 typedef struct dir_connection_t {
01173 connection_t _base;
01174
01175 char *requested_resource;
01177 unsigned int dirconn_direct:1;
01179
01180
01181
01183 enum {
01184 DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP,
01185 DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
01186 DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS,
01187 DIR_SPOOL_MICRODESC,
01188 } dir_spool_src : 3;
01191 uint8_t router_purpose;
01193 smartlist_t *fingerprint_stack;
01195 struct cached_dir_t *cached_dir;
01197 off_t cached_dir_offset;
01199 tor_zlib_state_t *zlib_state;
01200
01202 rend_data_t *rend_data;
01203
01204 char identity_digest[DIGEST_LEN];
01207 } dir_connection_t;
01208
01210 typedef struct control_connection_t {
01211 connection_t _base;
01212
01213 uint32_t event_mask;
01217 unsigned int have_sent_protocolinfo:1;
01218
01220 uint32_t incoming_cmd_len;
01222 uint32_t incoming_cmd_cur_len;
01225 char *incoming_cmd;
01226 } control_connection_t;
01227
01229 #define TO_CONN(c) (&(((c)->_base)))
01230
01231 #define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, _base))
01232
01235 static or_connection_t *TO_OR_CONN(connection_t *);
01238 static dir_connection_t *TO_DIR_CONN(connection_t *);
01241 static edge_connection_t *TO_EDGE_CONN(connection_t *);
01244 static control_connection_t *TO_CONTROL_CONN(connection_t *);
01245
01246 static INLINE or_connection_t *TO_OR_CONN(connection_t *c)
01247 {
01248 tor_assert(c->magic == OR_CONNECTION_MAGIC);
01249 return DOWNCAST(or_connection_t, c);
01250 }
01251 static INLINE dir_connection_t *TO_DIR_CONN(connection_t *c)
01252 {
01253 tor_assert(c->magic == DIR_CONNECTION_MAGIC);
01254 return DOWNCAST(dir_connection_t, c);
01255 }
01256 static INLINE edge_connection_t *TO_EDGE_CONN(connection_t *c)
01257 {
01258 tor_assert(c->magic == EDGE_CONNECTION_MAGIC);
01259 return DOWNCAST(edge_connection_t, c);
01260 }
01261 static INLINE control_connection_t *TO_CONTROL_CONN(connection_t *c)
01262 {
01263 tor_assert(c->magic == CONTROL_CONNECTION_MAGIC);
01264 return DOWNCAST(control_connection_t, c);
01265 }
01266
01268 typedef enum {
01269 ADDR_POLICY_ACCEPT=1,
01270 ADDR_POLICY_REJECT=2,
01271 } addr_policy_action_t;
01272
01274 typedef struct addr_policy_t {
01275 int refcnt;
01276 addr_policy_action_t policy_type:2;
01277 unsigned int is_private:1;
01279 unsigned int is_canonical:1;
01282 maskbits_t maskbits;
01285 tor_addr_t addr;
01286 uint16_t prt_min;
01287 uint16_t prt_max;
01288 } addr_policy_t;
01289
01292 typedef struct cached_dir_t {
01293 char *dir;
01294 char *dir_z;
01295 size_t dir_len;
01296 size_t dir_z_len;
01297 time_t published;
01298 digests_t digests;
01299 int refcnt;
01300 } cached_dir_t;
01301
01304 typedef enum {
01307 SAVED_NOWHERE=0,
01311 SAVED_IN_CACHE,
01314
01315
01316
01317
01318 SAVED_IN_JOURNAL
01319 } saved_location_t;
01320
01323 typedef enum {
01324 DL_SCHED_GENERIC = 0,
01325 DL_SCHED_CONSENSUS = 1,
01326 DL_SCHED_BRIDGE = 2,
01327 } download_schedule_t;
01328
01331 typedef struct download_status_t {
01332 time_t next_attempt_at;
01334 uint8_t n_download_failures;
01336 download_schedule_t schedule : 8;
01337 } download_status_t;
01338
01340 #define IMPOSSIBLE_TO_DOWNLOAD 255
01341
01345 #define ROUTER_ANNOTATION_BUF_LEN 256
01346
01348 typedef struct signed_descriptor_t {
01352 char *signed_descriptor_body;
01354 size_t annotations_len;
01356 size_t signed_descriptor_len;
01359 char signed_descriptor_digest[DIGEST_LEN];
01361 char identity_digest[DIGEST_LEN];
01363 time_t published_on;
01365 char extra_info_digest[DIGEST_LEN];
01368 download_status_t ei_dl_status;
01370 saved_location_t saved_location;
01373 off_t saved_offset;
01376 int routerlist_index;
01381 time_t last_listed_as_valid_until;
01382 #ifdef TRACK_SERVED_TIME
01383
01385 time_t last_served_at;
01386 #endif
01387
01388 unsigned int do_not_cache : 1;
01389
01390 unsigned int is_extrainfo : 1;
01391
01392
01393 unsigned int extrainfo_is_bogus : 1;
01394
01395 unsigned int send_unencrypted : 1;
01396 } signed_descriptor_t;
01397
01399 typedef int16_t country_t;
01400
01402 typedef struct {
01403 signed_descriptor_t cache_info;
01404 char *address;
01405 char *nickname;
01407 uint32_t addr;
01408 uint16_t or_port;
01409 uint16_t dir_port;
01411 crypto_pk_env_t *onion_pkey;
01412 crypto_pk_env_t *identity_pkey;
01414 char *platform;
01416
01417 uint32_t bandwidthrate;
01419 uint32_t bandwidthburst;
01421 uint32_t bandwidthcapacity;
01422 smartlist_t *exit_policy;
01424 long uptime;
01425 smartlist_t *declared_family;
01427 char *contact_info;
01428 unsigned int is_hibernating:1;
01430 unsigned int has_old_dnsworkers:1;
01432 unsigned int caches_extra_info:1;
01434 unsigned int allow_single_hop_exits:1;
01437
01438 unsigned int is_running:1;
01440 unsigned int is_valid:1;
01443 unsigned int is_named:1;
01445 unsigned int is_fast:1;
01446 unsigned int is_stable:1;
01447 unsigned int is_possible_guard:1;
01448 unsigned int is_exit:1;
01449 unsigned int is_bad_exit:1;
01451 unsigned int is_bad_directory:1;
01453 unsigned int wants_to_be_hs_dir:1;
01455 unsigned int is_hs_dir:1;
01457 unsigned int policy_is_reject_star:1;
01461 #define ROUTER_PURPOSE_GENERAL 0
01462
01463 #define ROUTER_PURPOSE_CONTROLLER 1
01464
01465 #define ROUTER_PURPOSE_BRIDGE 2
01466
01468 #define ROUTER_PURPOSE_UNKNOWN 255
01469
01470 uint8_t purpose;
01472
01473
01475 time_t last_reachable;
01477 time_t testing_since;
01479 country_t country;
01480 } routerinfo_t;
01481
01483 typedef struct extrainfo_t {
01484 signed_descriptor_t cache_info;
01486 char nickname[MAX_NICKNAME_LEN+1];
01489 unsigned int bad_sig : 1;
01492 char *pending_sig;
01494 size_t pending_sig_len;
01495 } extrainfo_t;
01496
01499 typedef struct routerstatus_t {
01500 time_t published_on;
01501 char nickname[MAX_NICKNAME_LEN+1];
01503 char identity_digest[DIGEST_LEN];
01505 char descriptor_digest[DIGEST_LEN];
01507 uint32_t addr;
01508 uint16_t or_port;
01509 uint16_t dir_port;
01510 unsigned int is_authority:1;
01511 unsigned int is_exit:1;
01512 unsigned int is_stable:1;
01513 unsigned int is_fast:1;
01514 unsigned int is_running:1;
01515 unsigned int is_named:1;
01516 unsigned int is_unnamed:1;
01518 unsigned int is_valid:1;
01519 unsigned int is_v2_dir:1;
01523 unsigned int is_possible_guard:1;
01525 unsigned int is_bad_exit:1;
01527 unsigned int is_bad_directory:1;
01529 unsigned int is_hs_dir:1;
01534 unsigned int version_known:1;
01536 unsigned int version_supports_begindir:1;
01539 unsigned int version_supports_conditional_consensus:1;
01541 unsigned int version_supports_extrainfo_upload:1;
01544 unsigned int version_supports_v3_dir:1;
01545
01546 unsigned int has_bandwidth:1;
01547 unsigned int has_exitsummary:1;
01548 unsigned int has_measured_bw:1;
01550 uint32_t measured_bw;
01552 uint32_t bandwidth;
01554 char *exitsummary;
01557
01558
01559
01565 unsigned int need_to_mirror:1;
01566 unsigned int name_lookup_warned:1;
01569 time_t last_dir_503_at;
01571 download_status_t dl_status;
01572
01573 } routerstatus_t;
01574
01580 typedef struct microdesc_t {
01582 HT_ENTRY(microdesc_t) node;
01583
01584
01585
01589 time_t last_listed;
01591 saved_location_t saved_location : 3;
01593 unsigned int no_save : 1;
01596 off_t off;
01597
01598
01599
01604 char *body;
01606 size_t bodylen;
01608 char digest[DIGEST256_LEN];
01609
01610
01611
01613 crypto_pk_env_t *onion_pkey;
01615 smartlist_t *family;
01617 char *exitsummary;
01619 } microdesc_t;
01620
01623 #define MAX_ROUTERDESC_DOWNLOAD_FAILURES 8
01624
01626 typedef struct networkstatus_v2_t {
01628 time_t received_on;
01629
01631 char networkstatus_digest[DIGEST_LEN];
01632
01633
01634 time_t published_on;
01636 char *source_address;
01637 uint32_t source_addr;
01638 uint16_t source_dirport;
01640 unsigned int binds_names:1;
01642 unsigned int recommends_versions:1;
01645 unsigned int lists_bad_exits:1;
01649 unsigned int lists_bad_directories:1;
01650
01651 char identity_digest[DIGEST_LEN];
01652 char *contact;
01653 crypto_pk_env_t *signing_key;
01654 char *client_versions;
01656 char *server_versions;
01659 smartlist_t *entries;
01661 } networkstatus_v2_t;
01662
01663 typedef struct vote_microdesc_hash_t {
01664 struct vote_microdesc_hash_t *next;
01665 char *microdesc_hash_line;
01666 } vote_microdesc_hash_t;
01667
01669 typedef struct vote_routerstatus_t {
01670 routerstatus_t status;
01672 uint64_t flags;
01674 char *version;
01676 vote_microdesc_hash_t *microdesc;
01677 } vote_routerstatus_t;
01678
01680 typedef struct document_signature_t {
01682 char identity_digest[DIGEST_LEN];
01684 char signing_key_digest[DIGEST_LEN];
01686 digest_algorithm_t alg;
01688 char *signature;
01690 int signature_len;
01691 unsigned int bad_signature : 1;
01693 unsigned int good_signature : 1;
01695 } document_signature_t;
01696
01698 typedef struct networkstatus_voter_info_t {
01700 char identity_digest[DIGEST_LEN];
01701 char *nickname;
01704 char legacy_id_digest[DIGEST_LEN];
01705 char *address;
01706 uint32_t addr;
01707 uint16_t dir_port;
01708 uint16_t or_port;
01709 char *contact;
01710 char vote_digest[DIGEST_LEN];
01712
01714 smartlist_t *sigs;
01715 } networkstatus_voter_info_t;
01716
01718 typedef enum {
01719 NS_TYPE_VOTE,
01720 NS_TYPE_CONSENSUS,
01721 NS_TYPE_OPINION,
01722 } networkstatus_type_t;
01723
01727 typedef enum {
01728 FLAV_NS = 0,
01729 FLAV_MICRODESC = 1,
01730 } consensus_flavor_t;
01731
01733 #define USABLE_CONSENSUS_FLAVOR FLAV_NS
01734
01736 #define N_CONSENSUS_FLAVORS ((int)(FLAV_MICRODESC)+1)
01737
01740 typedef struct networkstatus_t {
01741 networkstatus_type_t type : 8;
01742 consensus_flavor_t flavor : 8;
01743 time_t published;
01744 time_t valid_after;
01745 time_t fresh_until;
01747 time_t valid_until;
01751 int consensus_method;
01753 smartlist_t *supported_methods;
01754
01757 int vote_seconds;
01760 int dist_seconds;
01761
01764 char *client_versions;
01765 char *server_versions;
01768 smartlist_t *known_flags;
01769
01772 smartlist_t *net_params;
01773
01776 smartlist_t *weight_params;
01777
01781 smartlist_t *voters;
01782
01783 struct authority_cert_t *cert;
01786 digests_t digests;
01787
01791 smartlist_t *routerstatus_list;
01792
01795 digestmap_t *desc_digest_map;
01796 } networkstatus_t;
01797
01800 typedef struct ns_detached_signatures_t {
01801 time_t valid_after;
01802 time_t fresh_until;
01803 time_t valid_until;
01804 strmap_t *digests;
01805 strmap_t *signatures;
01807 } ns_detached_signatures_t;
01808
01810 typedef enum store_type_t {
01811 ROUTER_STORE = 0,
01812 EXTRAINFO_STORE = 1
01813 } store_type_t;
01814
01817 typedef struct desc_store_t {
01821 const char *fname_base;
01825 const char *fname_alt_base;
01827 const char *description;
01828
01829 tor_mmap_t *mmap;
01831 store_type_t type;
01834 size_t journal_len;
01836 size_t store_len;
01839 size_t bytes_dropped;
01840 } desc_store_t;
01841
01843 typedef struct {
01845 struct digest_ri_map_t *identity_map;
01848 struct digest_sd_map_t *desc_digest_map;
01851 struct digest_ei_map_t *extra_info_map;
01855 struct digest_sd_map_t *desc_by_eid_map;
01857 smartlist_t *routers;
01860 smartlist_t *old_routers;
01864 desc_store_t desc_store;
01866 desc_store_t extrainfo_store;
01867 } routerlist_t;
01868
01873 typedef struct extend_info_t {
01874 char nickname[MAX_HEX_NICKNAME_LEN+1];
01876 char identity_digest[DIGEST_LEN];
01877 uint16_t port;
01878 tor_addr_t addr;
01879 crypto_pk_env_t *onion_key;
01880 } extend_info_t;
01881
01884 typedef struct authority_cert_t {
01886 signed_descriptor_t cache_info;
01888 crypto_pk_env_t *identity_key;
01890 crypto_pk_env_t *signing_key;
01892 char signing_key_digest[DIGEST_LEN];
01894 time_t expires;
01896 uint32_t addr;
01898 uint16_t dir_port;
01901 uint8_t is_cross_certified;
01902 } authority_cert_t;
01903
01906 typedef enum {
01907 NO_AUTHORITY = 0,
01910 V1_AUTHORITY = 1 << 0,
01912 V2_AUTHORITY = 1 << 1,
01914 V3_AUTHORITY = 1 << 2,
01916 HIDSERV_AUTHORITY = 1 << 3,
01918 BRIDGE_AUTHORITY = 1 << 4,
01920 EXTRAINFO_CACHE = 1 << 5,
01921 } authority_type_t;
01922
01923 #define CRYPT_PATH_MAGIC 0x70127012u
01924
01927 typedef struct crypt_path_t {
01928 uint32_t magic;
01929
01930
01933 crypto_cipher_env_t *f_crypto;
01936 crypto_cipher_env_t *b_crypto;
01937
01939 crypto_digest_env_t *f_digest;
01941 crypto_digest_env_t *b_digest;
01942
01945 crypto_dh_env_t *dh_handshake_state;
01951 char fast_handshake_state[DIGEST_LEN];
01953 char handshake_digest[DIGEST_LEN];
01954
01956 extend_info_t *extend_info;
01957
01963 uint8_t state;
01964 #define CPATH_STATE_CLOSED 0
01965 #define CPATH_STATE_AWAITING_KEYS 1
01966 #define CPATH_STATE_OPEN 2
01967 struct crypt_path_t *next;
01970 struct crypt_path_t *prev;
01973 int package_window;
01975 int deliver_window;
01977 } crypt_path_t;
01978
01979 #define CPATH_KEY_MATERIAL_LEN (20*2+16*2)
01980
01981 #define DH_KEY_LEN DH_BYTES
01982 #define ONIONSKIN_CHALLENGE_LEN (PKCS1_OAEP_PADDING_OVERHEAD+\
01983 CIPHER_KEY_LEN+\
01984 DH_KEY_LEN)
01985 #define ONIONSKIN_REPLY_LEN (DH_KEY_LEN+DIGEST_LEN)
01986
01988 typedef struct {
01990 int desired_path_len;
01992 extend_info_t *chosen_exit;
01994 int need_uptime;
01996 int need_capacity;
01998 int is_internal;
02002 int onehop_tunnel;
02004 crypt_path_t *pending_final_cpath;
02006 int failure_count;
02008 time_t expiry_time;
02009 } cpath_build_state_t;
02010
02017 typedef struct {
02023 unsigned last_adjusted_tick;
02025 double cell_count;
02028 unsigned int is_for_p_conn : 1;
02031 int heap_index;
02032 } cell_ewma_t;
02033
02034 #define ORIGIN_CIRCUIT_MAGIC 0x35315243u
02035 #define OR_CIRCUIT_MAGIC 0x98ABC04Fu
02036
02060 typedef struct circuit_t {
02061 uint32_t magic;
02065 cell_queue_t n_conn_cells;
02067 or_connection_t *n_conn;
02069 circid_t n_circ_id;
02070
02073 extend_info_t *n_hop;
02074
02077 unsigned int streams_blocked_on_n_conn : 1;
02080 unsigned int streams_blocked_on_p_conn : 1;
02081
02082 uint8_t state;
02083 uint8_t purpose;
02088 int package_window;
02093 int deliver_window;
02094
02098 char *n_conn_onionskin;
02099
02100 time_t timestamp_created;
02101 time_t timestamp_dirty;
02103 struct timeval highres_created;
02105 uint16_t marked_for_close;
02108 const char *marked_for_close_file;
02114 struct circuit_t *next_active_on_n_conn;
02118 struct circuit_t *prev_active_on_n_conn;
02119 struct circuit_t *next;
02122 uint64_t dirreq_id;
02123
02127 cell_ewma_t n_cell_ewma;
02128 } circuit_t;
02129
02132 #define MAX_RELAY_EARLY_CELLS_PER_CIRCUIT 8
02133
02136 typedef struct origin_circuit_t {
02137 circuit_t _base;
02138
02141 edge_connection_t *p_streams;
02145 cpath_build_state_t *build_state;
02151 crypt_path_t *cpath;
02152
02154 rend_data_t *rend_data;
02155
02158 unsigned int remaining_relay_early_cells : 4;
02159
02162 uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT];
02163
02166 int relay_early_cells_sent;
02167
02170 streamid_t next_stream_id;
02171
02172
02173
02174
02175 crypto_pk_env_t *intro_key;
02176
02178
02179 uint32_t global_identifier;
02180
02181 } origin_circuit_t;
02182
02185 typedef struct or_circuit_t {
02186 circuit_t _base;
02187
02191 struct circuit_t *next_active_on_p_conn;
02195 struct circuit_t *prev_active_on_p_conn;
02196
02198 circid_t p_circ_id;
02200 cell_queue_t p_conn_cells;
02202 or_connection_t *p_conn;
02204 edge_connection_t *n_streams;
02207 edge_connection_t *resolving_streams;
02210 crypto_cipher_env_t *p_crypto;
02213 crypto_cipher_env_t *n_crypto;
02214
02218 crypto_digest_env_t *p_digest;
02222 crypto_digest_env_t *n_digest;
02223
02226 struct or_circuit_t *rend_splice;
02227
02228 #if REND_COOKIE_LEN >= DIGEST_LEN
02229 #define REND_TOKEN_LEN REND_COOKIE_LEN
02230 #else
02231 #define REND_TOKEN_LEN DIGEST_LEN
02232 #endif
02233
02239 char rend_token[REND_TOKEN_LEN];
02240
02241
02242 char handshake_digest[DIGEST_LEN];
02246 unsigned int remaining_relay_early_cells : 4;
02247
02249 unsigned int is_first_hop : 1;
02250
02253 uint32_t processed_cells;
02254
02258 uint64_t total_cell_waiting_time;
02259
02262 cell_ewma_t p_cell_ewma;
02263 } or_circuit_t;
02264
02266 #define TO_CIRCUIT(x) (&((x)->_base))
02267
02270 static or_circuit_t *TO_OR_CIRCUIT(circuit_t *);
02273 static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *);
02274
02275 static INLINE or_circuit_t *TO_OR_CIRCUIT(circuit_t *x)
02276 {
02277 tor_assert(x->magic == OR_CIRCUIT_MAGIC);
02278 return DOWNCAST(or_circuit_t, x);
02279 }
02280 static INLINE origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x)
02281 {
02282 tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC);
02283 return DOWNCAST(origin_circuit_t, x);
02284 }
02285
02287 typedef enum invalid_router_usage_t {
02288 ALLOW_INVALID_ENTRY =1,
02289 ALLOW_INVALID_EXIT =2,
02290 ALLOW_INVALID_MIDDLE =4,
02291 ALLOW_INVALID_RENDEZVOUS =8,
02292 ALLOW_INVALID_INTRODUCTION=16,
02293 } invalid_router_usage_t;
02294
02295
02296 #define MIN_CONSTRAINED_TCP_BUFFER 2048
02297 #define MAX_CONSTRAINED_TCP_BUFFER 262144
02298
02300 typedef struct config_line_t {
02301 char *key;
02302 char *value;
02303 struct config_line_t *next;
02304 } config_line_t;
02305
02306 typedef struct routerset_t routerset_t;
02307
02309 typedef struct {
02310 uint32_t _magic;
02311
02313 enum {
02314 CMD_RUN_TOR=0, CMD_LIST_FINGERPRINT, CMD_HASH_PASSWORD,
02315 CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS
02316 } command;
02317 const char *command_arg;
02319 config_line_t *Logs;
02322 char *DebugLogFile;
02323 char *DataDirectory;
02324 char *Nickname;
02325 char *Address;
02326 char *PidFile;
02328 routerset_t *ExitNodes;
02331 routerset_t *EntryNodes;
02334 int StrictNodes;
02337 routerset_t *ExcludeNodes;
02341 routerset_t *ExcludeExitNodes;
02346 struct routerset_t *_ExcludeExitNodesUnion;
02347
02348 int DisableAllSwap;
02352 smartlist_t *AllowInvalidNodes;
02354 invalid_router_usage_t _AllowInvalid;
02355 config_line_t *ExitPolicy;
02356 int ExitPolicyRejectPrivate;
02357 config_line_t *SocksPolicy;
02358 config_line_t *DirPolicy;
02360 config_line_t *SocksListenAddress;
02363 config_line_t *TransListenAddress;
02365 config_line_t *NatdListenAddress;
02367 config_line_t *DNSListenAddress;
02369 config_line_t *ORListenAddress;
02371 config_line_t *DirListenAddress;
02373 config_line_t *ControlListenAddress;
02375 char *OutboundBindAddress;
02378 config_line_t *RecommendedVersions;
02379 config_line_t *RecommendedClientVersions;
02380 config_line_t *RecommendedServerVersions;
02382 int DirAllowPrivateAddresses;
02383 char *User;
02384 char *Group;
02385 int ORPort;
02386 int SocksPort;
02388 int TransPort;
02389 int NatdPort;
02390 int ControlPort;
02391 config_line_t *ControlSocket;
02393 int DirPort;
02394 int DNSPort;
02395 int AssumeReachable;
02396 int AuthoritativeDir;
02397 int V1AuthoritativeDir;
02399 int V2AuthoritativeDir;
02401 int V3AuthoritativeDir;
02403 int HSAuthoritativeDir;
02405 int NamingAuthoritativeDir;
02407 int VersioningAuthoritativeDir;
02410 int BridgeAuthoritativeDir;
02417 char *BridgePassword;
02418
02419 int UseBridges;
02420 config_line_t *Bridges;
02422 int BridgeRelay;
02428 int UpdateBridgesFromAuthority;
02429
02430 int AvoidDiskWrites;
02432 int ClientOnly;
02434 int NoPublish;
02437 smartlist_t *PublishServerDescriptor;
02439 authority_type_t _PublishServerDescriptor;
02441 int PublishHidServDescriptors;
02442 int FetchServerDescriptors;
02443 int FetchHidServDescriptors;
02444 int HidServDirectoryV2;
02446 int MinUptimeHidServDirectoryV2;
02448 int FetchUselessDescriptors;
02449 int AllDirActionsPrivate;
02452 int ConnLimit;
02453 int _ConnLimit;
02454 int RunAsDaemon;
02455 int FascistFirewall;
02456 smartlist_t *FirewallPorts;
02458 config_line_t *ReachableAddresses;
02459 config_line_t *ReachableORAddresses;
02460 config_line_t *ReachableDirAddresses;
02462 int ConstrainedSockets;
02463 uint64_t ConstrainedSockSize;
02468 int RefuseUnknownExits;
02469
02472 smartlist_t *LongLivedPorts;
02477 smartlist_t *RejectPlaintextPorts;
02481 smartlist_t *WarnPlaintextPorts;
02483 smartlist_t *TrackHostExits;
02484 int TrackHostExitsExpire;
02486 config_line_t *AddressMap;
02487 int AutomapHostsOnResolve;
02491 smartlist_t *AutomapHostsSuffixes;
02493 int RendPostPeriod;
02495 int KeepalivePeriod;
02497 int SocksTimeout;
02499 int CircuitBuildTimeout;
02502 int CircuitIdleTimeout;
02504 int CircuitStreamTimeout;
02508 int MaxOnionsPending;
02511 int NewCircuitPeriod;
02513 int MaxCircuitDirtiness;
02515 uint64_t BandwidthRate;
02517 uint64_t BandwidthBurst;
02519 uint64_t MaxAdvertisedBandwidth;
02521 uint64_t RelayBandwidthRate;
02523 uint64_t RelayBandwidthBurst;
02525 uint64_t PerConnBWRate;
02526 uint64_t PerConnBWBurst;
02527 int NumCpus;
02528 int RunTesting;
02530 config_line_t *RendConfigLines;
02532 config_line_t *HidServAuth;
02534 char *ContactInfo;
02536 char *HttpProxy;
02537 tor_addr_t HttpProxyAddr;
02538 uint16_t HttpProxyPort;
02539 char *HttpProxyAuthenticator;
02541 char *HttpsProxy;
02542 tor_addr_t HttpsProxyAddr;
02543 uint16_t HttpsProxyPort;
02544 char *HttpsProxyAuthenticator;
02546 char *Socks4Proxy;
02547 tor_addr_t Socks4ProxyAddr;
02548 uint16_t Socks4ProxyPort;
02550 char *Socks5Proxy;
02551 tor_addr_t Socks5ProxyAddr;
02552 uint16_t Socks5ProxyPort;
02553 char *Socks5ProxyUsername;
02554 char *Socks5ProxyPassword;
02559 config_line_t *DirServers;
02560
02563 config_line_t *AlternateDirAuthority;
02564
02566 config_line_t *AlternateBridgeAuthority;
02567
02569 config_line_t *AlternateHSAuthority;
02570
02571 char *MyFamily;
02572 config_line_t *NodeFamilies;
02574 config_line_t *AuthDirBadDir;
02576 config_line_t *AuthDirBadExit;
02578 config_line_t *AuthDirReject;
02580 config_line_t *AuthDirInvalid;
02582 int AuthDirListBadDirs;
02584 int AuthDirListBadExits;
02586 int AuthDirRejectUnlisted;
02588 int AuthDirMaxServersPerAddr;
02590 int AuthDirMaxServersPerAuthAddr;
02594 char *AccountingStart;
02596 uint64_t AccountingMax;
02601 config_line_t *HashedControlPassword;
02603 config_line_t *HashedControlSessionPassword;
02604
02605 int CookieAuthentication;
02607 char *CookieAuthFile;
02608 int CookieAuthFileGroupReadable;
02609 int LeaveStreamsUnattached;
02612 int DisablePredictedCircuits;
02615 int ShutdownWaitLength;
02617 char *SafeLogging;
02619
02620 enum {
02621 SAFELOG_SCRUB_ALL, SAFELOG_SCRUB_RELAY, SAFELOG_SCRUB_NONE
02622 } _SafeLogging;
02623
02624 int SafeSocks;
02626 #define LOG_PROTOCOL_WARN (get_options()->ProtocolWarnings ? \
02627 LOG_WARN : LOG_INFO)
02628 int ProtocolWarnings;
02630 int TestSocks;
02632 int HardwareAccel;
02634 char *AccelName;
02635 char *AccelDir;
02636 int UseEntryGuards;
02638 int NumEntryGuards;
02639 int RephistTrackTime;
02640 int FastFirstHopPK;
02644 int FetchDirInfoEarly;
02645
02647 int FetchDirInfoExtraEarly;
02648
02649 char *VirtualAddrNetwork;
02651 int ServerDNSSearchDomains;
02654 int ServerDNSDetectHijacking;
02656 int ServerDNSRandomizeCase;
02658 char *ServerDNSResolvConfFile;
02661 char *DirPortFrontPage;
02667 int ServerDNSAllowBrokenConfig;
02668
02669 smartlist_t *ServerDNSTestAddresses;
02672 int EnforceDistinctSubnets;
02674 int TunnelDirConns;
02676 int PreferTunneledDirConns;
02678 int AllowNonRFC953Hostnames;
02681 int ServerDNSAllowNonRFC953Hostnames;
02682
02685 int DownloadExtraInfo;
02686
02689 int AllowSingleHopExits;
02692 int ExcludeSingleHopRelays;
02695 int AllowSingleHopCircuits;
02696
02702 int AllowDotExit;
02703
02706 int DirReqStatistics;
02707
02709 int ExitPortStatistics;
02710
02712 int CellStatistics;
02713
02715 int EntryStatistics;
02716
02718 int ExtraInfoStatistics;
02719
02723 int ClientDNSRejectInternalAddresses;
02724
02726 int V3AuthVotingInterval;
02728 int V3AuthVoteDelay;
02730 int V3AuthDistDelay;
02732 int V3AuthNIntervalsValid;
02733
02736 int V3AuthUseLegacyKey;
02737
02739 char *V3BandwidthsFile;
02740
02743 char *ConsensusParams;
02744
02747 int TestingV3AuthInitialVotingInterval;
02748
02751 int TestingV3AuthInitialVoteDelay;
02752
02755 int TestingV3AuthInitialDistDelay;
02756
02760 int TestingAuthDirTimeToLearnReachability;
02761
02765 int TestingEstimatedDescriptorPropagationTime;
02766
02770 int TestingTorNetwork;
02771
02774 char *FallbackNetworkstatusFile;
02775
02779 int BridgeRecordUsageByCountry;
02780
02782 char *GeoIPFile;
02783
02786 int ReloadTorrcOnSIGHUP;
02787
02788
02789
02790
02791
02792
02793
02794
02795
02796
02797
02798
02799
02800
02801 double CircuitPriorityHalflife;
02802
02803 } or_options_t;
02804
02806 typedef struct {
02807 uint32_t _magic;
02811 time_t next_write;
02812
02814 time_t LastWritten;
02815
02817 time_t AccountingIntervalStart;
02818 uint64_t AccountingBytesReadInInterval;
02819 uint64_t AccountingBytesWrittenInInterval;
02820 int AccountingSecondsActive;
02821 uint64_t AccountingExpectedUsage;
02822
02824 config_line_t *EntryGuards;
02825
02832 time_t BWHistoryReadEnds;
02833 int BWHistoryReadInterval;
02834 smartlist_t *BWHistoryReadValues;
02835 time_t BWHistoryWriteEnds;
02836 int BWHistoryWriteInterval;
02837 smartlist_t *BWHistoryWriteValues;
02838
02840 config_line_t * BuildtimeHistogram;
02841 uint16_t TotalBuildTimes;
02842
02844 char *TorVersion;
02845
02848 config_line_t *ExtraLines;
02849
02851 time_t LastRotatedOnionKey;
02852 } or_state_t;
02853
02857 static INLINE void or_state_mark_dirty(or_state_t *state, time_t when)
02858 {
02859 if (state->next_write > when)
02860 state->next_write = when;
02861 }
02862
02863 #define MAX_SOCKS_REPLY_LEN 1024
02864 #define MAX_SOCKS_ADDR_LEN 256
02865
02867 #define SOCKS_COMMAND_CONNECT 0x01
02868
02869 #define SOCKS_COMMAND_RESOLVE 0xF0
02870
02871 #define SOCKS_COMMAND_RESOLVE_PTR 0xF1
02872
02873 #define SOCKS_COMMAND_IS_CONNECT(c) ((c)==SOCKS_COMMAND_CONNECT)
02874 #define SOCKS_COMMAND_IS_RESOLVE(c) ((c)==SOCKS_COMMAND_RESOLVE || \
02875 (c)==SOCKS_COMMAND_RESOLVE_PTR)
02876
02880 struct socks_request_t {
02884 char socks_version;
02885 int command;
02886 size_t replylen;
02887 char reply[MAX_SOCKS_REPLY_LEN];
02893 char address[MAX_SOCKS_ADDR_LEN];
02895 uint16_t port;
02896 unsigned int has_finished : 1;
02899 };
02900
02901
02902
02903
02904
02905 buf_t *buf_new(void);
02906 buf_t *buf_new_with_capacity(size_t size);
02907 void buf_free(buf_t *buf);
02908 void buf_clear(buf_t *buf);
02909 void buf_shrink(buf_t *buf);
02910 void buf_shrink_freelists(int free_all);
02911 void buf_dump_freelist_sizes(int severity);
02912
02913 size_t buf_datalen(const buf_t *buf);
02914 size_t buf_allocation(const buf_t *buf);
02915 size_t buf_slack(const buf_t *buf);
02916 const char *_buf_peek_raw_buffer(const buf_t *buf);
02917
02918 int read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof,
02919 int *socket_error);
02920 int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf);
02921
02922 int flush_buf(int s, buf_t *buf, size_t sz, size_t *buf_flushlen);
02923 int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen);
02924
02925 int write_to_buf(const char *string, size_t string_len, buf_t *buf);
02926 int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
02927 const char *data, size_t data_len, int done);
02928 int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen);
02929 int fetch_from_buf(char *string, size_t string_len, buf_t *buf);
02930 int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto);
02931 int fetch_from_buf_http(buf_t *buf,
02932 char **headers_out, size_t max_headerlen,
02933 char **body_out, size_t *body_used, size_t max_bodylen,
02934 int force_complete);
02935 int fetch_from_buf_socks(buf_t *buf, socks_request_t *req,
02936 int log_sockstype, int safe_socks);
02937 int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason);
02938 int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len);
02939
02940 int peek_buf_has_control0_command(buf_t *buf);
02941
02942 void assert_buf_ok(buf_t *buf);
02943
02944 #ifdef BUFFERS_PRIVATE
02945 int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
02946 #endif
02947
02948
02949
02950 char *circuit_list_path(origin_circuit_t *circ, int verbose);
02951 char *circuit_list_path_for_controller(origin_circuit_t *circ);
02952 void circuit_log_path(int severity, unsigned int domain,
02953 origin_circuit_t *circ);
02954 void circuit_rep_hist_note_result(origin_circuit_t *circ);
02955 origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags);
02956 origin_circuit_t *circuit_establish_circuit(uint8_t purpose,
02957 extend_info_t *exit,
02958 int flags);
02959 int circuit_handle_first_hop(origin_circuit_t *circ);
02960 void circuit_n_conn_done(or_connection_t *or_conn, int status);
02961 int inform_testing_reachability(void);
02962 int circuit_send_next_onion_skin(origin_circuit_t *circ);
02963 void circuit_note_clock_jumped(int seconds_elapsed);
02964 int circuit_extend(cell_t *cell, circuit_t *circ);
02965 int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
02966 int reverse);
02967 int circuit_finish_handshake(origin_circuit_t *circ, uint8_t cell_type,
02968 const char *reply);
02969 int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer);
02970 int onionskin_answer(or_circuit_t *circ, uint8_t cell_type,
02971 const char *payload, const char *keys);
02972 int circuit_all_predicted_ports_handled(time_t now, int *need_uptime,
02973 int *need_capacity);
02974
02975 int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info);
02976 int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info);
02977 void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop);
02978 extend_info_t *extend_info_alloc(const char *nickname, const char *digest,
02979 crypto_pk_env_t *onion_key,
02980 const tor_addr_t *addr, uint16_t port);
02981 extend_info_t *extend_info_from_router(routerinfo_t *r);
02982 extend_info_t *extend_info_dup(extend_info_t *info);
02983 void extend_info_free(extend_info_t *info);
02984 routerinfo_t *build_state_get_exit_router(cpath_build_state_t *state);
02985 const char *build_state_get_exit_nickname(cpath_build_state_t *state);
02986
02987 void entry_guards_compute_status(void);
02988 int entry_guard_register_connect_status(const char *digest, int succeeded,
02989 int mark_relay_status, time_t now);
02990 void entry_nodes_should_be_added(void);
02991 int entry_list_is_constrained(or_options_t *options);
02992 routerinfo_t *choose_random_entry(cpath_build_state_t *state);
02993 int entry_guards_parse_state(or_state_t *state, int set, char **msg);
02994 void entry_guards_update_state(or_state_t *state);
02995 int getinfo_helper_entry_guards(control_connection_t *conn,
02996 const char *question, char **answer);
02997
02998 void clear_bridge_list(void);
02999 int routerinfo_is_a_configured_bridge(routerinfo_t *ri);
03000 void bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
03001 char *digest);
03002 void retry_bridge_descriptor_fetch_directly(const char *digest);
03003 void fetch_bridge_descriptors(time_t now);
03004 void learned_bridge_descriptor(routerinfo_t *ri, int from_cache);
03005 int any_bridge_descriptors_known(void);
03006 int any_pending_bridge_descriptor_fetches(void);
03007 int bridges_known_but_down(void);
03008 void bridges_retry_all(void);
03009
03010 void entry_guards_free_all(void);
03011
03012
03013
03016 #define CBT_NCIRCUITS_TO_OBSERVE 1000
03017
03021 #define CBT_MAX_SYNTHETIC_QUANTILE 0.985
03022
03024 #define CBT_BIN_WIDTH ((build_time_t)50)
03025
03027 typedef uint32_t build_time_t;
03028 #define CBT_BUILD_TIME_MAX ((build_time_t)(INT32_MAX))
03029
03031 #define CBT_SAVE_STATE_EVERY 10
03032
03033
03034
03043 #define CBT_NETWORK_NONLIVE_TIMEOUT_COUNT (3)
03044
03051 #define CBT_NETWORK_NONLIVE_DISCARD_COUNT (CBT_NETWORK_NONLIVE_TIMEOUT_COUNT*2)
03052
03053
03054
03059 #define CBT_DEFAULT_RECENT_CIRCUITS 20
03060
03068 #define CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT (CBT_DEFAULT_RECENT_CIRCUITS*9/10)
03069
03071 #define CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE 100
03072
03074 #define CBT_DEFAULT_QUANTILE_CUTOFF 80
03075 double circuit_build_times_quantile_cutoff(void);
03076
03078 #define CBT_DEFAULT_TEST_FREQUENCY 60
03079
03081 #define CBT_DEFAULT_TIMEOUT_MIN_VALUE (2*1000)
03082
03084 #define CBT_DEFAULT_TIMEOUT_INITIAL_VALUE (60*1000)
03085 int32_t circuit_build_times_initial_timeout(void);
03086
03087 #if CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT < 1 || \
03088 CBT_NETWORK_NONLIVE_DISCARD_COUNT < 1 || \
03089 CBT_NETWORK_NONLIVE_TIMEOUT_COUNT < 1
03090 #error "RECENT_CIRCUITS is set too low."
03091 #endif
03092
03094 typedef struct {
03096 time_t network_last_live;
03098 int nonlive_timeouts;
03100 int nonlive_discarded;
03103 int8_t *timeouts_after_firsthop;
03105 int num_recent_circs;
03107 int after_firsthop_idx;
03109 int net_suspended;
03110 } network_liveness_t;
03111
03113 typedef struct {
03115 build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE];
03117 int build_times_idx;
03119 int total_build_times;
03121 network_liveness_t liveness;
03123 time_t last_circ_at;
03126 int pre_timeouts;
03128 build_time_t Xm;
03130 double alpha;
03132 int have_computed_timeout;
03134 double timeout_ms;
03135 } circuit_build_times_t;
03136
03137 extern circuit_build_times_t circ_times;
03138 void circuit_build_times_update_state(circuit_build_times_t *cbt,
03139 or_state_t *state);
03140 int circuit_build_times_parse_state(circuit_build_times_t *cbt,
03141 or_state_t *state, char **msg);
03142 int circuit_build_times_add_timeout(circuit_build_times_t *cbt,
03143 int did_onehop, time_t start_time);
03144 void circuit_build_times_set_timeout(circuit_build_times_t *cbt);
03145 int circuit_build_times_add_time(circuit_build_times_t *cbt,
03146 build_time_t time);
03147 int circuit_build_times_needs_circuits(circuit_build_times_t *cbt);
03148 int circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt);
03149 void circuit_build_times_init(circuit_build_times_t *cbt);
03150 void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
03151 networkstatus_t *ns);
03152
03153 #ifdef CIRCUIT_PRIVATE
03154 double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
03155 double quantile);
03156 build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt,
03157 double q_lo, double q_hi);
03158 void circuit_build_times_initial_alpha(circuit_build_times_t *cbt,
03159 double quantile, double time_ms);
03160 void circuit_build_times_update_alpha(circuit_build_times_t *cbt);
03161 double circuit_build_times_cdf(circuit_build_times_t *cbt, double x);
03162 void circuit_build_times_add_timeout_worker(circuit_build_times_t *cbt,
03163 double quantile_cutoff);
03164 void circuitbuild_running_unit_tests(void);
03165 void circuit_build_times_reset(circuit_build_times_t *cbt);
03166
03167
03168 int circuit_build_times_network_check_changed(circuit_build_times_t *cbt);
03169 #endif
03170
03171
03172 void circuit_build_times_network_is_live(circuit_build_times_t *cbt);
03173 int circuit_build_times_network_check_live(circuit_build_times_t *cbt);
03174 void circuit_build_times_network_circ_success(circuit_build_times_t *cbt);
03175
03176
03177
03178 circuit_t * _circuit_get_global_list(void);
03179 const char *circuit_state_to_string(int state);
03180 const char *circuit_purpose_to_controller_string(uint8_t purpose);
03181 void circuit_dump_by_conn(connection_t *conn, int severity);
03182 void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id,
03183 or_connection_t *conn);
03184 void circuit_set_n_circid_orconn(circuit_t *circ, circid_t id,
03185 or_connection_t *conn);
03186 void circuit_set_state(circuit_t *circ, uint8_t state);
03187 void circuit_close_all_marked(void);
03188 int32_t circuit_initial_package_window(void);
03189 origin_circuit_t *origin_circuit_new(void);
03190 or_circuit_t *or_circuit_new(circid_t p_circ_id, or_connection_t *p_conn);
03191 circuit_t *circuit_get_by_circid_orconn(circid_t circ_id,
03192 or_connection_t *conn);
03193 int circuit_id_in_use_on_orconn(circid_t circ_id, or_connection_t *conn);
03194 circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn);
03195 void circuit_unlink_all_from_or_conn(or_connection_t *conn, int reason);
03196 origin_circuit_t *circuit_get_by_global_id(uint32_t id);
03197 origin_circuit_t *circuit_get_by_rend_query_and_purpose(const char *rend_query,
03198 uint8_t purpose);
03199 origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
03200 const char *digest, uint8_t purpose);
03201 or_circuit_t *circuit_get_rendezvous(const char *cookie);
03202 or_circuit_t *circuit_get_intro_point(const char *digest);
03203 origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
03204 extend_info_t *info, int flags);
03205 void circuit_mark_all_unused_circs(void);
03206 void circuit_expire_all_dirty_circs(void);
03207 void _circuit_mark_for_close(circuit_t *circ, int reason,
03208 int line, const char *file);
03209 int circuit_get_cpath_len(origin_circuit_t *circ);
03210 crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum);
03211 void circuit_get_all_pending_on_or_conn(smartlist_t *out,
03212 or_connection_t *or_conn);
03213 int circuit_count_pending_on_or_conn(or_connection_t *or_conn);
03214
03215 #define circuit_mark_for_close(c, reason) \
03216 _circuit_mark_for_close((c), (reason), __LINE__, _SHORT_FILE_)
03217
03218 void assert_cpath_layer_ok(const crypt_path_t *cp);
03219 void assert_circuit_ok(const circuit_t *c);
03220 void circuit_free_all(void);
03221
03222
03223
03224 void circuit_expire_building(time_t now);
03225 void circuit_remove_handled_ports(smartlist_t *needed_ports);
03226 int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port,
03227 int min);
03228 int circuit_conforms_to_options(const origin_circuit_t *circ,
03229 const or_options_t *options);
03230 void circuit_build_needed_circs(time_t now);
03231 void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn);
03232
03233 void circuit_expire_old_circuits_serverside(time_t now);
03234
03235 void reset_bandwidth_test(void);
03236 int circuit_enough_testing_circs(void);
03237
03238 void circuit_has_opened(origin_circuit_t *circ);
03239 void circuit_build_failed(origin_circuit_t *circ);
03240
03242 #define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0)
03243
03244 #define CIRCLAUNCH_NEED_UPTIME (1<<1)
03245
03246 #define CIRCLAUNCH_NEED_CAPACITY (1<<2)
03247
03249 #define CIRCLAUNCH_IS_INTERNAL (1<<3)
03250 origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose,
03251 extend_info_t *info,
03252 int flags);
03253 origin_circuit_t *circuit_launch_by_router(uint8_t purpose,
03254 routerinfo_t *exit, int flags);
03255 void circuit_reset_failure_count(int timeout);
03256 int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn,
03257 origin_circuit_t *circ,
03258 crypt_path_t *cpath);
03259 int connection_ap_handshake_attach_circuit(edge_connection_t *conn);
03260
03261
03262
03263 void command_process_cell(cell_t *cell, or_connection_t *conn);
03264 void command_process_var_cell(var_cell_t *cell, or_connection_t *conn);
03265
03266 extern uint64_t stats_n_padding_cells_processed;
03267 extern uint64_t stats_n_create_cells_processed;
03268 extern uint64_t stats_n_created_cells_processed;
03269 extern uint64_t stats_n_relay_cells_processed;
03270 extern uint64_t stats_n_destroy_cells_processed;
03271
03272
03273
03275 typedef enum setopt_err_t {
03276 SETOPT_OK = 0,
03277 SETOPT_ERR_MISC = -1,
03278 SETOPT_ERR_PARSE = -2,
03279 SETOPT_ERR_TRANSITION = -3,
03280 SETOPT_ERR_SETTING = -4,
03281 } setopt_err_t;
03282
03283 const char *get_dirportfrontpage(void);
03284 or_options_t *get_options(void);
03285 int set_options(or_options_t *new_val, char **msg);
03286 void config_free_all(void);
03287 const char *safe_str_client(const char *address);
03288 const char *safe_str(const char *address);
03289 const char *escaped_safe_str_client(const char *address);
03290 const char *escaped_safe_str(const char *address);
03291 const char *get_version(void);
03292
03293 int config_get_lines(const char *string, config_line_t **result);
03294 void config_free_lines(config_line_t *front);
03295 setopt_err_t options_trial_assign(config_line_t *list, int use_defaults,
03296 int clear_first, char **msg);
03297 int resolve_my_address(int warn_severity, or_options_t *options,
03298 uint32_t *addr, char **hostname_out);
03299 int is_local_addr(const tor_addr_t *addr) ATTR_PURE;
03300 void options_init(or_options_t *options);
03301 char *options_dump(or_options_t *options, int minimal);
03302 int options_init_from_torrc(int argc, char **argv);
03303 setopt_err_t options_init_from_string(const char *cf,
03304 int command, const char *command_arg, char **msg);
03305 int option_is_recognized(const char *key);
03306 const char *option_get_canonical_name(const char *key);
03307 config_line_t *option_get_assignment(or_options_t *options,
03308 const char *key);
03309 int options_save_current(void);
03310 const char *get_torrc_fname(void);
03311 char *options_get_datadir_fname2_suffix(or_options_t *options,
03312 const char *sub1, const char *sub2,
03313 const char *suffix);
03314 #define get_datadir_fname2_suffix(sub1, sub2, suffix) \
03315 options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix))
03316
03318 #define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL)
03319
03321 #define get_datadir_fname2(sub1,sub2) \
03322 get_datadir_fname2_suffix((sub1), (sub2), NULL)
03323
03325 #define get_datadir_fname_suffix(sub1, suffix) \
03326 get_datadir_fname2_suffix((sub1), NULL, (suffix))
03327
03328 or_state_t *get_or_state(void);
03329 int or_state_save(time_t now);
03330
03331 int options_need_geoip_info(or_options_t *options, const char **reason_out);
03332 int getinfo_helper_config(control_connection_t *conn,
03333 const char *question, char **answer);
03334
03335 const char *tor_get_digests(void);
03336 uint32_t get_effective_bwrate(or_options_t *options);
03337 uint32_t get_effective_bwburst(or_options_t *options);
03338
03339 #ifdef CONFIG_PRIVATE
03340
03341 or_options_t *options_new(void);
03342 #endif
03343
03344
03345
03346 const char *conn_type_to_string(int type);
03347 const char *conn_state_to_string(int type, int state);
03348
03349 dir_connection_t *dir_connection_new(int socket_family);
03350 or_connection_t *or_connection_new(int socket_family);
03351 edge_connection_t *edge_connection_new(int type, int socket_family);
03352 control_connection_t *control_connection_new(int socket_family);
03353 connection_t *connection_new(int type, int socket_family);
03354
03355 void connection_link_connections(connection_t *conn_a, connection_t *conn_b);
03356 void connection_free(connection_t *conn);
03357 void connection_free_all(void);
03358 void connection_about_to_close_connection(connection_t *conn);
03359 void connection_close_immediate(connection_t *conn);
03360 void _connection_mark_for_close(connection_t *conn,int line, const char *file);
03361
03362 #define connection_mark_for_close(c) \
03363 _connection_mark_for_close((c), __LINE__, _SHORT_FILE_)
03364
03365 void connection_expire_held_open(void);
03366
03367 int connection_connect(connection_t *conn, const char *address,
03368 const tor_addr_t *addr,
03369 uint16_t port, int *socket_error);
03370
03371 int connection_proxy_connect(connection_t *conn, int type);
03372 int connection_read_proxy_handshake(connection_t *conn);
03373
03374 int retry_all_listeners(smartlist_t *replaced_conns,
03375 smartlist_t *new_conns);
03376
03377 ssize_t connection_bucket_write_limit(connection_t *conn, time_t now);
03378 int global_write_bucket_low(connection_t *conn, size_t attempt, int priority);
03379 void connection_bucket_init(void);
03380 void connection_bucket_refill(int seconds_elapsed, time_t now);
03381
03382 int connection_handle_read(connection_t *conn);
03383
03384 int connection_fetch_from_buf(char *string, size_t len, connection_t *conn);
03385
03386 int connection_wants_to_flush(connection_t *conn);
03387 int connection_outbuf_too_full(connection_t *conn);
03388 int connection_handle_write(connection_t *conn, int force);
03389 void _connection_write_to_buf_impl(const char *string, size_t len,
03390 connection_t *conn, int zlib);
03391 static void connection_write_to_buf(const char *string, size_t len,
03392 connection_t *conn);
03393 static void connection_write_to_buf_zlib(const char *string, size_t len,
03394 dir_connection_t *conn, int done);
03395 static INLINE void
03396 connection_write_to_buf(const char *string, size_t len, connection_t *conn)
03397 {
03398 _connection_write_to_buf_impl(string, len, conn, 0);
03399 }
03400 static INLINE void
03401 connection_write_to_buf_zlib(const char *string, size_t len,
03402 dir_connection_t *conn, int done)
03403 {
03404 _connection_write_to_buf_impl(string, len, TO_CONN(conn), done ? -1 : 1);
03405 }
03406
03407 connection_t *connection_get_by_global_id(uint64_t id);
03408
03409 connection_t *connection_get_by_type(int type);
03410 connection_t *connection_get_by_type_purpose(int type, int purpose);
03411 connection_t *connection_get_by_type_addr_port_purpose(int type,
03412 const tor_addr_t *addr,
03413 uint16_t port, int purpose);
03414 connection_t *connection_get_by_type_state(int type, int state);
03415 connection_t *connection_get_by_type_state_rendquery(int type, int state,
03416 const char *rendquery);
03417
03418 #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
03419 int connection_is_listener(connection_t *conn);
03420 int connection_state_is_open(connection_t *conn);
03421 int connection_state_is_connecting(connection_t *conn);
03422
03423 char *alloc_http_authenticator(const char *authenticator);
03424
03425 void assert_connection_ok(connection_t *conn, time_t now);
03426 int connection_or_nonopen_was_started_here(or_connection_t *conn);
03427 void connection_dump_buffer_mem_stats(int severity);
03428 void remove_file_if_very_old(const char *fname, time_t now);
03429
03430
03431
03432 #define connection_mark_unattached_ap(conn, endreason) \
03433 _connection_mark_unattached_ap((conn), (endreason), __LINE__, _SHORT_FILE_)
03434
03435 void _connection_mark_unattached_ap(edge_connection_t *conn, int endreason,
03436 int line, const char *file);
03437 int connection_edge_reached_eof(edge_connection_t *conn);
03438 int connection_edge_process_inbuf(edge_connection_t *conn,
03439 int package_partial);
03440 int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn);
03441 int connection_edge_end(edge_connection_t *conn, uint8_t reason);
03442 int connection_edge_end_errno(edge_connection_t *conn);
03443 int connection_edge_finished_flushing(edge_connection_t *conn);
03444 int connection_edge_finished_connecting(edge_connection_t *conn);
03445
03446 int connection_ap_handshake_send_begin(edge_connection_t *ap_conn);
03447 int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn);
03448
03449 edge_connection_t *connection_ap_make_link(char *address, uint16_t port,
03450 const char *digest,
03451 int use_begindir, int want_onehop);
03452 void connection_ap_handshake_socks_reply(edge_connection_t *conn, char *reply,
03453 size_t replylen,
03454 int endreason);
03455 void connection_ap_handshake_socks_resolved(edge_connection_t *conn,
03456 int answer_type,
03457 size_t answer_len,
03458 const char *answer,
03459 int ttl,
03460 time_t expires);
03461
03462 int connection_exit_begin_conn(cell_t *cell, circuit_t *circ);
03463 int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ);
03464 void connection_exit_connect(edge_connection_t *conn);
03465 int connection_edge_is_rendezvous_stream(edge_connection_t *conn);
03466 int connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit,
03467 int excluded_means_no);
03468 void connection_ap_expire_beginning(void);
03469 void connection_ap_attach_pending(void);
03470 void connection_ap_fail_onehop(const char *failed_digest,
03471 cpath_build_state_t *build_state);
03472 void circuit_discard_optional_exit_enclaves(extend_info_t *info);
03473 int connection_ap_detach_retriable(edge_connection_t *conn,
03474 origin_circuit_t *circ,
03475 int reason);
03476 int connection_ap_process_transparent(edge_connection_t *conn);
03477
03478 int address_is_invalid_destination(const char *address, int client);
03479
03480 void addressmap_init(void);
03481 void addressmap_clean(time_t now);
03482 void addressmap_clear_configured(void);
03483 void addressmap_clear_transient(void);
03484 void addressmap_free_all(void);
03485 int addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out);
03486 int addressmap_have_mapping(const char *address, int update_timeout);
03488 typedef enum {
03490 ADDRMAPSRC_CONTROLLER,
03493 ADDRMAPSRC_TORRC,
03496 ADDRMAPSRC_TRACKEXIT,
03499 ADDRMAPSRC_DNS,
03500 } addressmap_entry_source_t;
03501 void addressmap_register(const char *address, char *new_address,
03502 time_t expires, addressmap_entry_source_t source);
03503 int parse_virtual_addr_network(const char *val, int validate_only,
03504 char **msg);
03505 int client_dns_incr_failures(const char *address);
03506 void client_dns_clear_failures(const char *address);
03507 void client_dns_set_addressmap(const char *address, uint32_t val,
03508 const char *exitname, int ttl);
03509 const char *addressmap_register_virtual_address(int type, char *new_address);
03510 void addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
03511 time_t max_expires, int want_expiry);
03512 int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn,
03513 origin_circuit_t *circ,
03514 crypt_path_t *cpath);
03515 int hostname_is_noconnect_address(const char *address);
03516
03518 typedef enum hostname_type_t {
03519 NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME
03520 } hostname_type_t;
03521 hostname_type_t parse_extended_hostname(char *address, int allowdotexit);
03522
03523 #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H)
03524 int get_pf_socket(void);
03525 #endif
03526
03527
03528
03529 void connection_or_remove_from_identity_map(or_connection_t *conn);
03530 void connection_or_clear_identity_map(void);
03531 or_connection_t *connection_or_get_for_extend(const char *digest,
03532 const tor_addr_t *target_addr,
03533 const char **msg_out,
03534 int *launch_out);
03535 void connection_or_set_bad_connections(void);
03536
03537 int connection_or_reached_eof(or_connection_t *conn);
03538 int connection_or_process_inbuf(or_connection_t *conn);
03539 int connection_or_flushed_some(or_connection_t *conn);
03540 int connection_or_finished_flushing(or_connection_t *conn);
03541 int connection_or_finished_connecting(or_connection_t *conn);
03542 int connection_or_digest_is_known_relay(const char *id_digest);
03543
03544 void connection_or_connect_failed(or_connection_t *conn,
03545 int reason, const char *msg);
03546 or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port,
03547 const char *id_digest);
03548
03549 int connection_tls_start_handshake(or_connection_t *conn, int receiving);
03550 int connection_tls_continue_handshake(or_connection_t *conn);
03551
03552 void or_handshake_state_free(or_handshake_state_t *state);
03553 int connection_or_set_state_open(or_connection_t *conn);
03554 void connection_or_write_cell_to_buf(const cell_t *cell,
03555 or_connection_t *conn);
03556 void connection_or_write_var_cell_to_buf(const var_cell_t *cell,
03557 or_connection_t *conn);
03558 int connection_or_send_destroy(circid_t circ_id, or_connection_t *conn,
03559 int reason);
03560 int connection_or_send_netinfo(or_connection_t *conn);
03561 int connection_or_send_cert(or_connection_t *conn);
03562 int connection_or_send_link_auth(or_connection_t *conn);
03563 int connection_or_compute_link_auth_hmac(or_connection_t *conn,
03564 char *hmac_out);
03565 int is_or_protocol_version_known(uint16_t version);
03566
03567 void cell_pack(packed_cell_t *dest, const cell_t *src);
03568 void var_cell_pack_header(const var_cell_t *cell, char *hdr_out);
03569 var_cell_t *var_cell_new(uint16_t payload_len);
03570 void var_cell_free(var_cell_t *cell);
03571
03572
03573
03576 typedef enum circuit_status_event_t {
03577 CIRC_EVENT_LAUNCHED = 0,
03578 CIRC_EVENT_BUILT = 1,
03579 CIRC_EVENT_EXTENDED = 2,
03580 CIRC_EVENT_FAILED = 3,
03581 CIRC_EVENT_CLOSED = 4,
03582 } circuit_status_event_t;
03583
03586 typedef enum stream_status_event_t {
03587 STREAM_EVENT_SENT_CONNECT = 0,
03588 STREAM_EVENT_SENT_RESOLVE = 1,
03589 STREAM_EVENT_SUCCEEDED = 2,
03590 STREAM_EVENT_FAILED = 3,
03591 STREAM_EVENT_CLOSED = 4,
03592 STREAM_EVENT_NEW = 5,
03593 STREAM_EVENT_NEW_RESOLVE = 6,
03594 STREAM_EVENT_FAILED_RETRIABLE = 7,
03595 STREAM_EVENT_REMAP = 8
03596 } stream_status_event_t;
03597
03600 typedef enum or_conn_status_event_t {
03601 OR_CONN_EVENT_LAUNCHED = 0,
03602 OR_CONN_EVENT_CONNECTED = 1,
03603 OR_CONN_EVENT_FAILED = 2,
03604 OR_CONN_EVENT_CLOSED = 3,
03605 OR_CONN_EVENT_NEW = 4,
03606 } or_conn_status_event_t;
03607
03609 typedef enum buildtimeout_set_event_t {
03610 BUILDTIMEOUT_SET_EVENT_COMPUTED = 0,
03611 BUILDTIMEOUT_SET_EVENT_RESET = 1,
03612 BUILDTIMEOUT_SET_EVENT_SUSPENDED = 2,
03613 BUILDTIMEOUT_SET_EVENT_DISCARD = 3,
03614 BUILDTIMEOUT_SET_EVENT_RESUME = 4
03615 } buildtimeout_set_event_t;
03616
03617 void control_update_global_event_mask(void);
03618 void control_adjust_event_log_severity(void);
03619
03626 #define CONN_LOG_PROTECT(conn, stmt) \
03627 STMT_BEGIN \
03628 int _log_conn_is_control = (conn && conn->type == CONN_TYPE_CONTROL); \
03629 if (_log_conn_is_control) \
03630 disable_control_logging(); \
03631 STMT_BEGIN stmt; STMT_END; \
03632 if (_log_conn_is_control) \
03633 enable_control_logging(); \
03634 STMT_END
03635
03641 #define LOG_FN_CONN(conn, args) \
03642 CONN_LOG_PROTECT(conn, log_fn args)
03643
03644 int connection_control_finished_flushing(control_connection_t *conn);
03645 int connection_control_reached_eof(control_connection_t *conn);
03646 int connection_control_process_inbuf(control_connection_t *conn);
03647
03648 #define EVENT_AUTHDIR_NEWDESCS 0x000D
03649 #define EVENT_NS 0x000F
03650 int control_event_is_interesting(int event);
03651
03652 int control_event_circuit_status(origin_circuit_t *circ,
03653 circuit_status_event_t e, int reason);
03654 int control_event_stream_status(edge_connection_t *conn,
03655 stream_status_event_t e,
03656 int reason);
03657 int control_event_or_conn_status(or_connection_t *conn,
03658 or_conn_status_event_t e, int reason);
03659 int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
03660 int control_event_stream_bandwidth(edge_connection_t *edge_conn);
03661 int control_event_stream_bandwidth_used(void);
03662 void control_event_logmsg(int severity, unsigned int domain, const char *msg);
03663 int control_event_descriptors_changed(smartlist_t *routers);
03664 int control_event_address_mapped(const char *from, const char *to,
03665 time_t expires, const char *error);
03666 int control_event_or_authdir_new_descriptor(const char *action,
03667 const char *desc,
03668 size_t desclen,
03669 const char *msg);
03670 int control_event_my_descriptor_changed(void);
03671 int control_event_networkstatus_changed(smartlist_t *statuses);
03672 int control_event_newconsensus(const networkstatus_t *consensus);
03673 int control_event_networkstatus_changed_single(routerstatus_t *rs);
03674 int control_event_general_status(int severity, const char *format, ...)
03675 CHECK_PRINTF(2,3);
03676 int control_event_client_status(int severity, const char *format, ...)
03677 CHECK_PRINTF(2,3);
03678 int control_event_server_status(int severity, const char *format, ...)
03679 CHECK_PRINTF(2,3);
03680 int control_event_guard(const char *nickname, const char *digest,
03681 const char *status);
03682 int control_event_buildtimeout_set(const circuit_build_times_t *cbt,
03683 buildtimeout_set_event_t type);
03684
03685 int init_cookie_authentication(int enabled);
03686 smartlist_t *decode_hashed_passwords(config_line_t *passwords);
03687 void disable_control_logging(void);
03688 void enable_control_logging(void);
03689
03692 typedef enum {
03693 BOOTSTRAP_STATUS_UNDEF=-1,
03694 BOOTSTRAP_STATUS_STARTING=0,
03695 BOOTSTRAP_STATUS_CONN_DIR=5,
03696 BOOTSTRAP_STATUS_HANDSHAKE=-2,
03697 BOOTSTRAP_STATUS_HANDSHAKE_DIR=10,
03698 BOOTSTRAP_STATUS_ONEHOP_CREATE=15,
03699 BOOTSTRAP_STATUS_REQUESTING_STATUS=20,
03700 BOOTSTRAP_STATUS_LOADING_STATUS=25,
03701 BOOTSTRAP_STATUS_LOADING_KEYS=40,
03702 BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS=45,
03703 BOOTSTRAP_STATUS_LOADING_DESCRIPTORS=50,
03704 BOOTSTRAP_STATUS_CONN_OR=80,
03705 BOOTSTRAP_STATUS_HANDSHAKE_OR=85,
03706 BOOTSTRAP_STATUS_CIRCUIT_CREATE=90,
03707 BOOTSTRAP_STATUS_DONE=100
03708 } bootstrap_status_t;
03709
03710 void control_event_bootstrap(bootstrap_status_t status, int progress);
03711 void control_event_bootstrap_problem(const char *warn, int reason);
03712
03713 void control_event_clients_seen(const char *controller_str);
03714
03715 #ifdef CONTROL_PRIVATE
03716
03717 size_t write_escaped_data(const char *data, size_t len, char **out);
03718 size_t read_escaped_data(const char *data, size_t len, char **out);
03719 #endif
03720
03721
03722
03723 void cpu_init(void);
03724 void cpuworkers_rotate(void);
03725 int connection_cpu_finished_flushing(connection_t *conn);
03726 int connection_cpu_reached_eof(connection_t *conn);
03727 int connection_cpu_process_inbuf(connection_t *conn);
03728 int assign_onionskin_to_cpuworker(connection_t *cpuworker,
03729 or_circuit_t *circ,
03730 char *onionskin);
03731
03732
03733
03734 int directories_have_accepted_server_descriptor(void);
03735 char *authority_type_to_string(authority_type_t auth);
03736 void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
03737 authority_type_t type, const char *payload,
03738 size_t payload_len, size_t extrainfo_len);
03739 void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
03740 const char *resource,
03741 int pds_flags);
03742 void directory_get_from_all_authorities(uint8_t dir_purpose,
03743 uint8_t router_purpose,
03744 const char *resource);
03745 void directory_initiate_command_routerstatus(routerstatus_t *status,
03746 uint8_t dir_purpose,
03747 uint8_t router_purpose,
03748 int anonymized_connection,
03749 const char *resource,
03750 const char *payload,
03751 size_t payload_len,
03752 time_t if_modified_since);
03753 void directory_initiate_command_routerstatus_rend(routerstatus_t *status,
03754 uint8_t dir_purpose,
03755 uint8_t router_purpose,
03756 int anonymized_connection,
03757 const char *resource,
03758 const char *payload,
03759 size_t payload_len,
03760 time_t if_modified_since,
03761 const rend_data_t *rend_query);
03762
03763 int parse_http_response(const char *headers, int *code, time_t *date,
03764 compress_method_t *compression, char **response);
03765
03766 int connection_dir_is_encrypted(dir_connection_t *conn);
03767 int connection_dir_reached_eof(dir_connection_t *conn);
03768 int connection_dir_process_inbuf(dir_connection_t *conn);
03769 int connection_dir_finished_flushing(dir_connection_t *conn);
03770 int connection_dir_finished_connecting(dir_connection_t *conn);
03771 void connection_dir_request_failed(dir_connection_t *conn);
03772 void directory_initiate_command(const char *address, const tor_addr_t *addr,
03773 uint16_t or_port, uint16_t dir_port,
03774 int supports_conditional_consensus,
03775 int supports_begindir, const char *digest,
03776 uint8_t dir_purpose, uint8_t router_purpose,
03777 int anonymized_connection,
03778 const char *resource,
03779 const char *payload, size_t payload_len,
03780 time_t if_modified_since);
03781
03782 #define DSR_HEX (1<<0)
03783 #define DSR_BASE64 (1<<1)
03784 #define DSR_DIGEST256 (1<<2)
03785 #define DSR_SORT_UNIQ (1<<3)
03786 int dir_split_resource_into_fingerprints(const char *resource,
03787 smartlist_t *fp_out, int *compressed_out,
03788 int flags);
03790 typedef struct {
03791 char first[DIGEST_LEN];
03792 char second[DIGEST_LEN];
03793 } fp_pair_t;
03794 int dir_split_resource_into_fingerprint_pairs(const char *res,
03795 smartlist_t *pairs_out);
03796 char *directory_dump_request_log(void);
03797 void note_request(const char *key, size_t bytes);
03798 int router_supports_extrainfo(const char *identity_digest, int is_authority);
03799
03800 time_t download_status_increment_failure(download_status_t *dls,
03801 int status_code, const char *item,
03802 int server, time_t now);
03805 #define download_status_failed(dls, sc) \
03806 download_status_increment_failure((dls), (sc), NULL, \
03807 get_options()->DirPort, time(NULL))
03808
03809 void download_status_reset(download_status_t *dls);
03810 static int download_status_is_ready(download_status_t *dls, time_t now,
03811 int max_failures);
03814 static INLINE int
03815 download_status_is_ready(download_status_t *dls, time_t now,
03816 int max_failures)
03817 {
03818 return (dls->n_download_failures <= max_failures
03819 && dls->next_attempt_at <= now);
03820 }
03821
03822 static void download_status_mark_impossible(download_status_t *dl);
03824 static INLINE void
03825 download_status_mark_impossible(download_status_t *dl)
03826 {
03827 dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD;
03828 }
03829
03830
03832 #define MAX_EXITPOLICY_SUMMARY_LEN (1000)
03833
03835 #define MAX_V_LINE_LEN 128
03836
03838 #define MAX_FLAG_LINE_LEN 96
03839
03841 #define MAX_WEIGHT_LINE_LEN (12+10+10+10+1)
03842
03843 #define MAX_POLICY_LINE_LEN (3+MAX_EXITPOLICY_SUMMARY_LEN)
03844
03845 #define RS_ENTRY_LEN \
03846 ( \
03847 MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \
03848 5*2 + 10 + \
03849 \
03850 MAX_FLAG_LINE_LEN + \
03851 \
03852 MAX_WEIGHT_LINE_LEN + \
03853 \
03854 MAX_POLICY_LINE_LEN + \
03855 \
03856 MAX_V_LINE_LEN \
03857 )
03858 #define UNNAMED_ROUTER_NICKNAME "Unnamed"
03859
03860 int connection_dirserv_flushed_some(dir_connection_t *conn);
03861
03862 int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk);
03863 int dirserv_load_fingerprint_file(void);
03864 void dirserv_free_fingerprint_list(void);
03865 const char *dirserv_get_nickname_by_digest(const char *digest);
03866 enum was_router_added_t dirserv_add_multiple_descriptors(
03867 const char *desc, uint8_t purpose,
03868 const char *source,
03869 const char **msg);
03870 enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri,
03871 const char **msg,
03872 const char *source);
03873 void dirserv_free_descriptors(void);
03874 void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
03875 int list_server_status_v1(smartlist_t *routers, char **router_status_out,
03876 int for_controller);
03877 int dirserv_dump_directory_to_string(char **dir_out,
03878 crypto_pk_env_t *private_key);
03879
03880 int directory_fetches_from_authorities(or_options_t *options);
03881 int directory_fetches_dir_info_early(or_options_t *options);
03882 int directory_fetches_dir_info_later(or_options_t *options);
03883 int directory_caches_v2_dir_info(or_options_t *options);
03884 #define directory_caches_v1_dir_info(o) directory_caches_v2_dir_info(o)
03885 int directory_caches_dir_info(or_options_t *options);
03886 int directory_permits_begindir_requests(or_options_t *options);
03887 int directory_permits_controller_requests(or_options_t *options);
03888 int directory_too_idle_to_fetch_descriptors(or_options_t *options, time_t now);
03889
03890 void directory_set_dirty(void);
03891 cached_dir_t *dirserv_get_directory(void);
03892 cached_dir_t *dirserv_get_runningrouters(void);
03893 cached_dir_t *dirserv_get_consensus(const char *flavor_name);
03894 void dirserv_set_cached_directory(const char *directory, time_t when,
03895 int is_running_routers);
03896 void dirserv_set_cached_networkstatus_v2(const char *directory,
03897 const char *identity,
03898 time_t published);
03899 void dirserv_set_cached_consensus_networkstatus(const char *consensus,
03900 const char *flavor_name,
03901 const digests_t *digests,
03902 time_t published);
03903 void dirserv_clear_old_networkstatuses(time_t cutoff);
03904 void dirserv_clear_old_v1_info(time_t now);
03905 void dirserv_get_networkstatus_v2(smartlist_t *result, const char *key);
03906 void dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result,
03907 const char *key);
03908 int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
03909 const char **msg,
03910 int for_unencrypted_conn,
03911 int is_extrainfo);
03912 int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
03913 const char **msg);
03914 void dirserv_orconn_tls_done(const char *address,
03915 uint16_t or_port,
03916 const char *digest_rcvd,
03917 int as_advertised);
03918 void dirserv_single_reachability_test(time_t now, routerinfo_t *router);
03919 void dirserv_test_reachability(time_t now);
03920 int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg,
03921 int complain);
03922 int dirserv_would_reject_router(routerstatus_t *rs);
03923 int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff);
03924 int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src);
03925 int dirserv_have_any_microdesc(const smartlist_t *fps);
03926 size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs,
03927 int compressed);
03928 size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed);
03929
03930 typedef enum {
03931 NS_V2, NS_V3_CONSENSUS, NS_V3_VOTE, NS_CONTROL_PORT,
03932 NS_V3_CONSENSUS_MICRODESC
03933 } routerstatus_format_type_t;
03934 int routerstatus_format_entry(char *buf, size_t buf_len,
03935 routerstatus_t *rs, const char *platform,
03936 routerstatus_format_type_t format);
03937 void dirserv_free_all(void);
03938 void cached_dir_decref(cached_dir_t *d);
03939 cached_dir_t *new_cached_dir(char *s, time_t published);
03940
03941 #ifdef DIRSERV_PRIVATE
03942 typedef struct measured_bw_line_t {
03943 char node_id[DIGEST_LEN];
03944 char node_hex[MAX_HEX_NICKNAME_LEN+1];
03945 long int bw;
03946 } measured_bw_line_t;
03947
03948 int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
03949
03950 int measured_bw_line_apply(measured_bw_line_t *parsed_line,
03951 smartlist_t *routerstatuses);
03952 #endif
03953
03954 int dirserv_read_measured_bandwidths(const char *from_file,
03955 smartlist_t *routerstatuses);
03956
03957
03958
03960 #define MIN_VOTE_SECONDS 20
03961
03962 #define MIN_DIST_SECONDS 20
03963
03964 #define MIN_VOTE_INTERVAL 300
03965
03967 #define BW_WEIGHT_SCALE 10000
03968
03969 void dirvote_free_all(void);
03970
03971
03972 char *networkstatus_compute_consensus(smartlist_t *votes,
03973 int total_authorities,
03974 crypto_pk_env_t *identity_key,
03975 crypto_pk_env_t *signing_key,
03976 const char *legacy_identity_key_digest,
03977 crypto_pk_env_t *legacy_signing_key,
03978 consensus_flavor_t flavor);
03979 int networkstatus_add_detached_signatures(networkstatus_t *target,
03980 ns_detached_signatures_t *sigs,
03981 const char **msg_out);
03982 char *networkstatus_get_detached_signatures(smartlist_t *consensuses);
03983 void ns_detached_signatures_free(ns_detached_signatures_t *s);
03984
03985
03986 authority_cert_t *authority_cert_dup(authority_cert_t *cert);
03987
03989 typedef struct vote_timing_t {
03990 int vote_interval;
03991 int n_intervals_valid;
03992 int vote_delay;
03993 int dist_delay;
03994 } vote_timing_t;
03995
03996 void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out);
03997 time_t dirvote_get_start_of_next_interval(time_t now, int interval);
03998 void dirvote_recalculate_timing(or_options_t *options, time_t now);
03999 void dirvote_act(or_options_t *options, time_t now);
04000
04001
04002 struct pending_vote_t * dirvote_add_vote(const char *vote_body,
04003 const char **msg_out,
04004 int *status_out);
04005 int dirvote_add_signatures(const char *detached_signatures_body,
04006 const char *source,
04007 const char **msg_out);
04008
04009
04010 const char *dirvote_get_pending_consensus(consensus_flavor_t flav);
04011 const char *dirvote_get_pending_detached_signatures(void);
04012 #define DGV_BY_ID 1
04013 #define DGV_INCLUDE_PENDING 2
04014 #define DGV_INCLUDE_PREVIOUS 4
04015 const cached_dir_t *dirvote_get_vote(const char *fp, int flags);
04016 void set_routerstatus_from_routerinfo(routerstatus_t *rs,
04017 routerinfo_t *ri, time_t now,
04018 int naming, int exits_can_be_guards,
04019 int listbadexits, int listbaddirs);
04020 void router_clear_status_flags(routerinfo_t *ri);
04021 networkstatus_t *
04022 dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
04023 authority_cert_t *cert);
04024
04025 microdesc_t *dirvote_create_microdescriptor(const routerinfo_t *ri);
04026 ssize_t dirvote_format_microdesc_vote_line(char *out, size_t out_len,
04027 const microdesc_t *md);
04028 int vote_routerstatus_find_microdesc_hash(char *digest256_out,
04029 const vote_routerstatus_t *vrs,
04030 int method,
04031 digest_algorithm_t alg);
04032 document_signature_t *voter_get_sig_by_algorithm(
04033 const networkstatus_voter_info_t *voter,
04034 digest_algorithm_t alg);
04035
04036 #ifdef DIRVOTE_PRIVATE
04037 char *format_networkstatus_vote(crypto_pk_env_t *private_key,
04038 networkstatus_t *v3_ns);
04039 char *dirvote_compute_params(smartlist_t *votes);
04040 #endif
04041
04042
04043
04044 int dns_init(void);
04045 int has_dns_init_failed(void);
04046 void dns_free_all(void);
04047 uint32_t dns_clip_ttl(uint32_t ttl);
04048 int dns_reset(void);
04049 void connection_dns_remove(edge_connection_t *conn);
04050 void assert_connection_edge_not_dns_pending(edge_connection_t *conn);
04051 void assert_all_pending_dns_resolves_ok(void);
04052 void dns_cancel_pending_resolve(const char *question);
04053 int dns_resolve(edge_connection_t *exitconn);
04054 void dns_launch_correctness_checks(void);
04055 int dns_seems_to_be_broken(void);
04056 void dns_reset_correctness_checks(void);
04057 void dump_dns_mem_usage(int severity);
04058
04059
04060
04061 void dnsserv_configure_listener(connection_t *conn);
04062 void dnsserv_close_listener(connection_t *conn);
04063 void dnsserv_resolved(edge_connection_t *conn,
04064 int answer_type,
04065 size_t answer_len,
04066 const char *answer,
04067 int ttl);
04068 void dnsserv_reject_request(edge_connection_t *conn);
04069 int dnsserv_launch_request(const char *name, int is_reverse);
04070
04071
04072
04075 #define DIR_RECORD_USAGE_GRANULARITY 8
04076
04077 #define DIR_ENTRY_RECORD_USAGE_RETAIN_IPS (24*60*60)
04078
04080 #define DIR_RECORD_USAGE_MIN_OBSERVATION_TIME (12*60*60)
04081
04082 #ifdef GEOIP_PRIVATE
04083 int geoip_parse_entry(const char *line);
04084 #endif
04085 int should_record_bridge_info(or_options_t *options);
04086 int geoip_load_file(const char *filename, or_options_t *options);
04087 int geoip_get_country_by_ip(uint32_t ipaddr);
04088 int geoip_get_n_countries(void);
04089 const char *geoip_get_country_name(country_t num);
04090 int geoip_is_loaded(void);
04091 country_t geoip_get_country(const char *countrycode);
04096 typedef enum {
04098 GEOIP_CLIENT_CONNECT = 0,
04100 GEOIP_CLIENT_NETWORKSTATUS = 1,
04102 GEOIP_CLIENT_NETWORKSTATUS_V2 = 2,
04103 } geoip_client_action_t;
04104 void geoip_note_client_seen(geoip_client_action_t action,
04105 uint32_t addr, time_t now);
04106 void geoip_remove_old_clients(time_t cutoff);
04109 typedef enum {
04111 GEOIP_SUCCESS = 0,
04114 GEOIP_REJECT_NOT_ENOUGH_SIGS = 1,
04116 GEOIP_REJECT_UNAVAILABLE = 2,
04118 GEOIP_REJECT_NOT_FOUND = 3,
04120 GEOIP_REJECT_NOT_MODIFIED = 4,
04122 GEOIP_REJECT_BUSY = 5,
04123 } geoip_ns_response_t;
04124 #define GEOIP_NS_RESPONSE_NUM 6
04125 void geoip_note_ns_response(geoip_client_action_t action,
04126 geoip_ns_response_t response);
04127 time_t geoip_get_history_start(void);
04128 char *geoip_get_client_history_dirreq(time_t now,
04129 geoip_client_action_t action);
04130 char *geoip_get_client_history_bridge(time_t now,
04131 geoip_client_action_t action);
04132 char *geoip_get_request_history(time_t now, geoip_client_action_t action);
04133 int getinfo_helper_geoip(control_connection_t *control_conn,
04134 const char *question, char **answer);
04135 void geoip_free_all(void);
04136
04139 typedef enum {
04140 DIRREQ_DIRECT = 0,
04141 DIRREQ_TUNNELED = 1,
04142 } dirreq_type_t;
04143
04146 typedef enum {
04150 DIRREQ_IS_FOR_NETWORK_STATUS = 0,
04154 DIRREQ_FLUSHING_DIR_CONN_FINISHED = 1,
04156 DIRREQ_END_CELL_SENT = 2,
04159 DIRREQ_CIRC_QUEUE_FLUSHED = 3,
04163 DIRREQ_OR_CONN_BUFFER_FLUSHED = 4
04164 } dirreq_state_t;
04165
04166 void geoip_start_dirreq(uint64_t dirreq_id, size_t response_size,
04167 geoip_client_action_t action, dirreq_type_t type);
04168 void geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type,
04169 dirreq_state_t new_state);
04170
04171 void geoip_dirreq_stats_init(time_t now);
04172 void geoip_dirreq_stats_write(time_t now);
04173 void geoip_entry_stats_init(time_t now);
04174 void geoip_entry_stats_write(time_t now);
04175 void geoip_bridge_stats_init(time_t now);
04176 time_t geoip_bridge_stats_write(time_t now);
04177 const char *geoip_get_bridge_stats_extrainfo(time_t);
04178 const char *geoip_get_bridge_stats_controller(time_t);
04179
04180
04181
04182 int accounting_parse_options(or_options_t *options, int validate_only);
04183 int accounting_is_enabled(or_options_t *options);
04184 void configure_accounting(time_t now);
04185 void accounting_run_housekeeping(time_t now);
04186 void accounting_add_bytes(size_t n_read, size_t n_written, int seconds);
04187 int accounting_record_bandwidth_usage(time_t now, or_state_t *state);
04188 void hibernate_begin_shutdown(void);
04189 int we_are_hibernating(void);
04190 void consider_hibernation(time_t now);
04191 int getinfo_helper_accounting(control_connection_t *conn,
04192 const char *question, char **answer);
04193 void accounting_set_bandwidth_usage_from_state(or_state_t *state);
04194
04195
04196
04197 extern int has_completed_circuit;
04198
04199 int connection_add(connection_t *conn);
04200 int connection_remove(connection_t *conn);
04201 void connection_unregister_events(connection_t *conn);
04202 int connection_in_array(connection_t *conn);
04203 void add_connection_to_closeable_list(connection_t *conn);
04204 int connection_is_on_closeable_list(connection_t *conn);
04205
04206 smartlist_t *get_connection_array(void);
04207
04208 typedef enum watchable_events {
04209 READ_EVENT=0x02,
04210 WRITE_EVENT=0x04
04211 } watchable_events_t;
04212 void connection_watch_events(connection_t *conn, watchable_events_t events);
04213 int connection_is_reading(connection_t *conn);
04214 void connection_stop_reading(connection_t *conn);
04215 void connection_start_reading(connection_t *conn);
04216
04217 int connection_is_writing(connection_t *conn);
04218 void connection_stop_writing(connection_t *conn);
04219 void connection_start_writing(connection_t *conn);
04220
04221 void connection_stop_reading_from_linked_conn(connection_t *conn);
04222
04223 void directory_all_unreachable(time_t now);
04224 void directory_info_has_arrived(time_t now, int from_cache);
04225
04226 void ip_address_changed(int at_interface);
04227 void dns_servers_relaunch_checks(void);
04228
04229 void control_signal_act(int the_signal);
04230 void handle_signals(int is_parent);
04231
04232 int try_locking(or_options_t *options, int err_if_locked);
04233 int have_lockfile(void);
04234 void release_lockfile(void);
04235
04236 void tor_cleanup(void);
04237 void tor_free_all(int postfork);
04238
04239 int tor_main(int argc, char *argv[]);
04240
04241 #ifdef MAIN_PRIVATE
04242 int do_main_loop(void);
04243 int do_list_fingerprint(void);
04244 void do_hash_password(void);
04245 int tor_init(int argc, char **argv);
04246 #endif
04247
04248
04249
04250 typedef struct microdesc_cache_t microdesc_cache_t;
04251
04252 microdesc_cache_t *get_microdesc_cache(void);
04253
04254 smartlist_t *microdescs_add_to_cache(microdesc_cache_t *cache,
04255 const char *s, const char *eos, saved_location_t where,
04256 int no_save);
04257 smartlist_t *microdescs_add_list_to_cache(microdesc_cache_t *cache,
04258 smartlist_t *descriptors, saved_location_t where,
04259 int no_save);
04260
04261 int microdesc_cache_rebuild(microdesc_cache_t *cache);
04262 int microdesc_cache_reload(microdesc_cache_t *cache);
04263 void microdesc_cache_clear(microdesc_cache_t *cache);
04264
04265 microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache,
04266 const char *d);
04267
04268 size_t microdesc_average_size(microdesc_cache_t *cache);
04269
04270 void microdesc_free(microdesc_t *md);
04271 void microdesc_free_all(void);
04272
04273
04274
04277 #define MAX_NETWORKSTATUS_AGE (10*24*60*60)
04278
04280 typedef enum {
04281 NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
04282 } v2_networkstatus_source_t;
04283
04286 typedef enum version_status_t {
04287 VS_RECOMMENDED=0,
04288 VS_OLD=1,
04289 VS_NEW=2,
04290 VS_NEW_IN_SERIES=3,
04293 VS_UNRECOMMENDED=4,
04294 VS_EMPTY=5,
04295 VS_UNKNOWN,
04296 } version_status_t;
04297
04298 void networkstatus_reset_warnings(void);
04299 void networkstatus_reset_download_failures(void);
04300 int router_reload_v2_networkstatus(void);
04301 int router_reload_consensus_networkstatus(void);
04302 void routerstatus_free(routerstatus_t *rs);
04303 void networkstatus_v2_free(networkstatus_v2_t *ns);
04304 void networkstatus_vote_free(networkstatus_t *ns);
04305 networkstatus_voter_info_t *networkstatus_get_voter_by_id(
04306 networkstatus_t *vote,
04307 const char *identity);
04308 int networkstatus_check_consensus_signature(networkstatus_t *consensus,
04309 int warn);
04310 int networkstatus_check_document_signature(const networkstatus_t *consensus,
04311 document_signature_t *sig,
04312 const authority_cert_t *cert);
04313 char *networkstatus_get_cache_filename(const char *identity_digest);
04314 int router_set_networkstatus_v2(const char *s, time_t arrived_at,
04315 v2_networkstatus_source_t source,
04316 smartlist_t *requested_fingerprints);
04317 void networkstatus_v2_list_clean(time_t now);
04318 int compare_digest_to_routerstatus_entry(const void *_key,
04319 const void **_member);
04320 routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns,
04321 const char *digest);
04322 routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns,
04323 const char *digest);
04324 int networkstatus_vote_find_entry_idx(networkstatus_t *ns,
04325 const char *digest, int *found_out);
04326 const smartlist_t *networkstatus_get_v2_list(void);
04327 download_status_t *router_get_dl_status_by_descriptor_digest(const char *d);
04328 routerstatus_t *router_get_consensus_status_by_id(const char *digest);
04329 routerstatus_t *router_get_consensus_status_by_descriptor_digest(
04330 const char *digest);
04331 routerstatus_t *router_get_consensus_status_by_nickname(const char *nickname,
04332 int warn_if_unnamed);
04333 const char *networkstatus_get_router_digest_by_nickname(const char *nickname);
04334 int networkstatus_nickname_is_unnamed(const char *nickname);
04335 void networkstatus_consensus_download_failed(int status_code);
04336 void update_consensus_networkstatus_fetch_time(time_t now);
04337 int should_delay_dir_fetches(or_options_t *options);
04338 void update_networkstatus_downloads(time_t now);
04339 void update_certificate_downloads(time_t now);
04340 int consensus_is_waiting_for_certs(void);
04341 networkstatus_v2_t *networkstatus_v2_get_by_digest(const char *digest);
04342 networkstatus_t *networkstatus_get_latest_consensus(void);
04343 networkstatus_t *networkstatus_get_live_consensus(time_t now);
04344 networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now);
04345 #define NSSET_FROM_CACHE 1
04346 #define NSSET_WAS_WAITING_FOR_CERTS 2
04347 #define NSSET_DONT_DOWNLOAD_CERTS 4
04348 #define NSSET_ACCEPT_OBSOLETE 8
04349 #define NSSET_REQUIRE_FLAVOR 16
04350 int networkstatus_set_current_consensus(const char *consensus,
04351 const char *flavor,
04352 unsigned flags);
04353 void networkstatus_note_certs_arrived(void);
04354 void routers_update_all_from_networkstatus(time_t now, int dir_version);
04355 void routerstatus_list_update_from_consensus_networkstatus(time_t now);
04356 void routers_update_status_from_consensus_networkstatus(smartlist_t *routers,
04357 int reset_failures);
04358 void signed_descs_update_status_from_consensus_networkstatus(
04359 smartlist_t *descs);
04360
04361 char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
04362 char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
04363 void networkstatus_dump_bridge_status_to_file(time_t now);
04364 int32_t get_net_param_from_list(smartlist_t *net_params, const char *name,
04365 int default_val);
04366 int32_t networkstatus_get_param(networkstatus_t *ns, const char *param_name,
04367 int32_t default_val);
04368 int getinfo_helper_networkstatus(control_connection_t *conn,
04369 const char *question, char **answer);
04370 int32_t networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight,
04371 int32_t default_val);
04372 const char *networkstatus_get_flavor_name(consensus_flavor_t flav);
04373 int networkstatus_parse_flavor_name(const char *flavname);
04374 void document_signature_free(document_signature_t *sig);
04375 document_signature_t *document_signature_dup(const document_signature_t *sig);
04376 void networkstatus_free_all(void);
04377
04378
04379 #ifdef MS_WINDOWS
04380 #define NT_SERVICE
04381 #endif
04382
04383 #ifdef NT_SERVICE
04384 int nt_service_parse_options(int argc, char **argv, int *should_exit);
04385 int nt_service_is_stopping(void);
04386 void nt_service_set_state(DWORD state);
04387 #else
04388 #define nt_service_is_stopping() (0)
04389 #endif
04390
04391
04392
04393 int onion_pending_add(or_circuit_t *circ, char *onionskin);
04394 or_circuit_t *onion_next_task(char **onionskin_out);
04395 void onion_pending_remove(or_circuit_t *circ);
04396
04397 int onion_skin_create(crypto_pk_env_t *router_key,
04398 crypto_dh_env_t **handshake_state_out,
04399 char *onion_skin_out);
04400
04401 int onion_skin_server_handshake(const char *onion_skin,
04402 crypto_pk_env_t *private_key,
04403 crypto_pk_env_t *prev_private_key,
04404 char *handshake_reply_out,
04405 char *key_out,
04406 size_t key_out_len);
04407
04408 int onion_skin_client_handshake(crypto_dh_env_t *handshake_state,
04409 const char *handshake_reply,
04410 char *key_out,
04411 size_t key_out_len);
04412
04413 int fast_server_handshake(const char *key_in,
04414 char *handshake_reply_out,
04415 char *key_out,
04416 size_t key_out_len);
04417
04418 int fast_client_handshake(const char *handshake_state,
04419 const char *handshake_reply_out,
04420 char *key_out,
04421 size_t key_out_len);
04422
04423 void clear_pending_onions(void);
04424
04425
04426
04427
04428
04429
04430 #define POLICY_BUF_LEN 52
04431
04433 typedef enum {
04435 ADDR_POLICY_ACCEPTED=0,
04437 ADDR_POLICY_REJECTED=-1,
04440 ADDR_POLICY_PROBABLY_ACCEPTED=1,
04443 ADDR_POLICY_PROBABLY_REJECTED=2
04444 } addr_policy_result_t;
04445
04446 int firewall_is_fascist_or(void);
04447 int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port);
04448 int fascist_firewall_allows_or(routerinfo_t *ri);
04449 int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port);
04450 int dir_policy_permits_address(const tor_addr_t *addr);
04451 int socks_policy_permits_address(const tor_addr_t *addr);
04452 int authdir_policy_permits_address(uint32_t addr, uint16_t port);
04453 int authdir_policy_valid_address(uint32_t addr, uint16_t port);
04454 int authdir_policy_baddir_address(uint32_t addr, uint16_t port);
04455 int authdir_policy_badexit_address(uint32_t addr, uint16_t port);
04456
04457 int validate_addr_policies(or_options_t *options, char **msg);
04458 void policy_expand_private(smartlist_t **policy);
04459 int policies_parse_from_options(or_options_t *options);
04460
04461 addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent);
04462 int cmp_addr_policies(smartlist_t *a, smartlist_t *b);
04463 addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr,
04464 uint16_t port, const smartlist_t *policy);
04465 addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr,
04466 uint16_t port, const smartlist_t *policy);
04467 int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
04468 int rejectprivate, const char *local_address,
04469 int add_default_policy);
04470 void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter);
04471 int exit_policy_is_general_exit(smartlist_t *policy);
04472 int policy_is_reject_star(const smartlist_t *policy);
04473 int getinfo_helper_policies(control_connection_t *conn,
04474 const char *question, char **answer);
04475 int policy_write_item(char *buf, size_t buflen, addr_policy_t *item,
04476 int format_for_desc);
04477
04478 void addr_policy_list_free(smartlist_t *p);
04479 void addr_policy_free(addr_policy_t *p);
04480 void policies_free_all(void);
04481
04482 char *policy_summarize(smartlist_t *policy);
04483
04484
04485
04486 const char *stream_end_reason_to_control_string(int reason);
04487 const char *stream_end_reason_to_string(int reason);
04488 socks5_reply_status_t stream_end_reason_to_socks5_response(int reason);
04489 uint8_t errno_to_stream_end_reason(int e);
04490
04491 const char *orconn_end_reason_to_control_string(int r);
04492 int tls_error_to_orconn_end_reason(int e);
04493 int errno_to_orconn_end_reason(int e);
04494
04495 const char *circuit_end_reason_to_control_string(int reason);
04496 const char *socks4_response_code_to_string(uint8_t code);
04497 const char *socks5_response_code_to_string(uint8_t code);
04498
04499
04500
04501 extern uint64_t stats_n_relay_cells_relayed;
04502 extern uint64_t stats_n_relay_cells_delivered;
04503
04504 int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
04505 cell_direction_t cell_direction);
04506
04507 void relay_header_pack(char *dest, const relay_header_t *src);
04508 void relay_header_unpack(relay_header_t *dest, const char *src);
04509 int relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ,
04510 uint8_t relay_command, const char *payload,
04511 size_t payload_len, crypt_path_t *cpath_layer);
04512 int connection_edge_send_command(edge_connection_t *fromconn,
04513 uint8_t relay_command, const char *payload,
04514 size_t payload_len);
04515 int connection_edge_package_raw_inbuf(edge_connection_t *conn,
04516 int package_partial);
04517 void connection_edge_consider_sending_sendme(edge_connection_t *conn);
04518
04519 extern uint64_t stats_n_data_cells_packaged;
04520 extern uint64_t stats_n_data_bytes_packaged;
04521 extern uint64_t stats_n_data_cells_received;
04522 extern uint64_t stats_n_data_bytes_received;
04523
04524 void init_cell_pool(void);
04525 void free_cell_pool(void);
04526 void clean_cell_pool(void);
04527 void dump_cell_pool_usage(int severity);
04528
04529 void cell_queue_clear(cell_queue_t *queue);
04530 void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell);
04531 void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell);
04532
04533 void append_cell_to_circuit_queue(circuit_t *circ, or_connection_t *orconn,
04534 cell_t *cell, cell_direction_t direction);
04535 void connection_or_unlink_all_active_circs(or_connection_t *conn);
04536 int connection_or_flush_from_first_active_circuit(or_connection_t *conn,
04537 int max, time_t now);
04538 void assert_active_circuits_ok(or_connection_t *orconn);
04539 void make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn);
04540 void make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn);
04541
04542 int append_address_to_payload(char *payload_out, const tor_addr_t *addr);
04543 const char *decode_address_from_payload(tor_addr_t *addr_out,
04544 const char *payload,
04545 int payload_len);
04546 unsigned cell_ewma_get_tick(void);
04547 void cell_ewma_set_scale_factor(or_options_t *options,
04548 networkstatus_t *consensus);
04549
04550
04551
04552 void rep_hist_init(void);
04553 void rep_hist_note_connect_failed(const char* nickname, time_t when);
04554 void rep_hist_note_connect_succeeded(const char* nickname, time_t when);
04555 void rep_hist_note_disconnect(const char* nickname, time_t when);
04556 void rep_hist_note_connection_died(const char* nickname, time_t when);
04557 void rep_hist_note_extend_succeeded(const char *from_name,
04558 const char *to_name);
04559 void rep_hist_note_extend_failed(const char *from_name, const char *to_name);
04560 void rep_hist_dump_stats(time_t now, int severity);
04561 void rep_hist_note_bytes_read(size_t num_bytes, time_t when);
04562 void rep_hist_note_bytes_written(size_t num_bytes, time_t when);
04563 void rep_hist_note_exit_bytes_read(uint16_t port, size_t num_bytes);
04564 void rep_hist_note_exit_bytes_written(uint16_t port, size_t num_bytes);
04565 void rep_hist_note_exit_stream_opened(uint16_t port);
04566 void rep_hist_exit_stats_init(time_t now);
04567 void rep_hist_exit_stats_write(time_t now);
04568 int rep_hist_bandwidth_assess(void);
04569 char *rep_hist_get_bandwidth_lines(int for_extrainfo);
04570 void rep_hist_update_state(or_state_t *state);
04571 int rep_hist_load_state(or_state_t *state, char **err);
04572 void rep_history_clean(time_t before);
04573
04574 void rep_hist_note_router_reachable(const char *id, time_t when);
04575 void rep_hist_note_router_unreachable(const char *id, time_t when);
04576 int rep_hist_record_mtbf_data(time_t now, int missing_means_down);
04577 int rep_hist_load_mtbf_data(time_t now);
04578
04579 time_t rep_hist_downrate_old_runs(time_t now);
04580 double rep_hist_get_stability(const char *id, time_t when);
04581 double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when);
04582 long rep_hist_get_weighted_time_known(const char *id, time_t when);
04583 int rep_hist_have_measured_enough_stability(void);
04584 const char *rep_hist_get_router_stability_doc(time_t now);
04585
04586 void rep_hist_note_used_port(time_t now, uint16_t port);
04587 smartlist_t *rep_hist_get_predicted_ports(time_t now);
04588 void rep_hist_note_used_resolve(time_t now);
04589 void rep_hist_note_used_internal(time_t now, int need_uptime,
04590 int need_capacity);
04591 int rep_hist_get_predicted_internal(time_t now, int *need_uptime,
04592 int *need_capacity);
04593
04594 int any_predicted_circuits(time_t now);
04595 int rep_hist_circbuilding_dormant(time_t now);
04596
04599 typedef enum {
04600 SIGN_DIR, SIGN_RTR,
04601 VERIFY_DIR, VERIFY_RTR,
04602 ENC_ONIONSKIN, DEC_ONIONSKIN,
04603 TLS_HANDSHAKE_C, TLS_HANDSHAKE_S,
04604 REND_CLIENT, REND_MID, REND_SERVER,
04605 } pk_op_t;
04606 void note_crypto_pk_op(pk_op_t operation);
04607 void dump_pk_ops(int severity);
04608
04609 void rep_hist_free_all(void);
04610
04611
04612 void hs_usage_note_publish_total(const char *service_id, time_t now);
04613 void hs_usage_note_publish_novel(const char *service_id, time_t now);
04614 void hs_usage_note_fetch_total(const char *service_id, time_t now);
04615 void hs_usage_note_fetch_successful(const char *service_id, time_t now);
04616 void hs_usage_write_statistics_to_file(time_t now);
04617 void hs_usage_free_all(void);
04618
04619 void rep_hist_buffer_stats_init(time_t now);
04620 void rep_hist_buffer_stats_add_circ(circuit_t *circ,
04621 time_t end_of_interval);
04622 void rep_hist_buffer_stats_write(time_t now);
04623
04624
04625
04626 void rend_client_introcirc_has_opened(origin_circuit_t *circ);
04627 void rend_client_rendcirc_has_opened(origin_circuit_t *circ);
04628 int rend_client_introduction_acked(origin_circuit_t *circ, const char *request,
04629 size_t request_len);
04630 void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query);
04631 int rend_client_remove_intro_point(extend_info_t *failed_intro,
04632 const rend_data_t *rend_query);
04633 int rend_client_rendezvous_acked(origin_circuit_t *circ, const char *request,
04634 size_t request_len);
04635 int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request,
04636 size_t request_len);
04637 void rend_client_desc_trynow(const char *query);
04638
04639 extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query);
04640
04641 int rend_client_send_introduction(origin_circuit_t *introcirc,
04642 origin_circuit_t *rendcirc);
04643 int rend_parse_service_authorization(or_options_t *options,
04644 int validate_only);
04645 rend_service_authorization_t *rend_client_lookup_service_authorization(
04646 const char *onion_address);
04647 void rend_service_authorization_free_all(void);
04648 rend_data_t *rend_data_dup(const rend_data_t *request);
04649
04650
04651
04653 typedef struct rend_authorized_client_t {
04654 char *client_name;
04655 char descriptor_cookie[REND_DESC_COOKIE_LEN];
04656 crypto_pk_env_t *client_key;
04657 } rend_authorized_client_t;
04658
04660 typedef struct rend_encoded_v2_service_descriptor_t {
04661 char desc_id[DIGEST_LEN];
04662 char *desc_str;
04663 } rend_encoded_v2_service_descriptor_t;
04664
04666 typedef struct rend_intro_point_t {
04667 extend_info_t *extend_info;
04668 crypto_pk_env_t *intro_key;
04670 } rend_intro_point_t;
04671
04673 typedef struct rend_service_descriptor_t {
04674 crypto_pk_env_t *pk;
04675 int version;
04676 time_t timestamp;
04677 uint16_t protocols;
04681 smartlist_t *intro_nodes;
04683 int all_uploads_performed;
04688 smartlist_t *successful_uploads;
04689 } rend_service_descriptor_t;
04690
04692 static INLINE void
04693 rend_data_free(rend_data_t *data)
04694 {
04695 tor_free(data);
04696 }
04697
04698 int rend_cmp_service_ids(const char *one, const char *two);
04699
04700 void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint,
04701 int command, size_t length, const char *payload);
04702
04703 void rend_service_descriptor_free(rend_service_descriptor_t *desc);
04704 rend_service_descriptor_t *rend_parse_service_descriptor(const char *str,
04705 size_t len);
04706 int rend_get_service_id(crypto_pk_env_t *pk, char *out);
04707 void rend_encoded_v2_service_descriptor_free(
04708 rend_encoded_v2_service_descriptor_t *desc);
04709 void rend_intro_point_free(rend_intro_point_t *intro);
04710
04712 typedef struct rend_cache_entry_t {
04713 size_t len;
04714 time_t received;
04715 char *desc;
04716 rend_service_descriptor_t *parsed;
04717 } rend_cache_entry_t;
04718
04719 void rend_cache_init(void);
04720 void rend_cache_clean(void);
04721 void rend_cache_clean_v2_descs_as_dir(void);
04722 void rend_cache_free_all(void);
04723 int rend_valid_service_id(const char *query);
04724 int rend_cache_lookup_desc(const char *query, int version, const char **desc,
04725 size_t *desc_len);
04726 int rend_cache_lookup_entry(const char *query, int version,
04727 rend_cache_entry_t **entry_out);
04728 int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc);
04729 int rend_cache_store(const char *desc, size_t desc_len, int published);
04730 int rend_cache_store_v2_desc_as_client(const char *desc,
04731 const rend_data_t *rend_query);
04732 int rend_cache_store_v2_desc_as_dir(const char *desc);
04733 int rend_cache_size(void);
04734 int rend_encode_v2_descriptors(smartlist_t *descs_out,
04735 rend_service_descriptor_t *desc, time_t now,
04736 uint8_t period, rend_auth_type_t auth_type,
04737 crypto_pk_env_t *client_key,
04738 smartlist_t *client_cookies);
04739 int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id,
04740 const char *descriptor_cookie,
04741 time_t now, uint8_t replica);
04742 int rend_id_is_in_interval(const char *a, const char *b, const char *c);
04743 void rend_get_descriptor_id_bytes(char *descriptor_id_out,
04744 const char *service_id,
04745 const char *secret_id_part);
04746
04747
04748
04749 int num_rend_services(void);
04750 int rend_config_services(or_options_t *options, int validate_only);
04751 int rend_service_load_keys(void);
04752 void rend_services_init(void);
04753 void rend_services_introduce(void);
04754 void rend_consider_services_upload(time_t now);
04755 void rend_hsdir_routers_changed(void);
04756 void rend_consider_descriptor_republication(void);
04757
04758 void rend_service_intro_has_opened(origin_circuit_t *circuit);
04759 int rend_service_intro_established(origin_circuit_t *circuit,
04760 const char *request,
04761 size_t request_len);
04762 void rend_service_rendezvous_has_opened(origin_circuit_t *circuit);
04763 int rend_service_introduce(origin_circuit_t *circuit, const char *request,
04764 size_t request_len);
04765 void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc);
04766 int rend_service_set_connection_addr_port(edge_connection_t *conn,
04767 origin_circuit_t *circ);
04768 void rend_service_dump_stats(int severity);
04769 void rend_service_free_all(void);
04770
04771
04772 int rend_mid_establish_intro(or_circuit_t *circ, const char *request,
04773 size_t request_len);
04774 int rend_mid_introduce(or_circuit_t *circ, const char *request,
04775 size_t request_len);
04776 int rend_mid_establish_rendezvous(or_circuit_t *circ, const char *request,
04777 size_t request_len);
04778 int rend_mid_rendezvous(or_circuit_t *circ, const char *request,
04779 size_t request_len);
04780
04781
04782
04783 crypto_pk_env_t *get_onion_key(void);
04784 time_t get_onion_key_set_at(void);
04785 void set_identity_key(crypto_pk_env_t *k);
04786 crypto_pk_env_t *get_identity_key(void);
04787 int identity_key_is_set(void);
04788 authority_cert_t *get_my_v3_authority_cert(void);
04789 crypto_pk_env_t *get_my_v3_authority_signing_key(void);
04790 authority_cert_t *get_my_v3_legacy_cert(void);
04791 crypto_pk_env_t *get_my_v3_legacy_signing_key(void);
04792 void dup_onion_keys(crypto_pk_env_t **key, crypto_pk_env_t **last);
04793 void rotate_onion_key(void);
04794 crypto_pk_env_t *init_key_from_file(const char *fname, int generate,
04795 int severity);
04796 void v3_authority_check_key_expiry(void);
04797
04798 int init_keys(void);
04799
04800 int check_whether_orport_reachable(void);
04801 int check_whether_dirport_reachable(void);
04802 void consider_testing_reachability(int test_or, int test_dir);
04803 void router_orport_found_reachable(void);
04804 void router_dirport_found_reachable(void);
04805 void router_perform_bandwidth_test(int num_circs, time_t now);
04806
04807 int authdir_mode(or_options_t *options);
04808 int authdir_mode_v1(or_options_t *options);
04809 int authdir_mode_v2(or_options_t *options);
04810 int authdir_mode_v3(or_options_t *options);
04811 int authdir_mode_any_main(or_options_t *options);
04812 int authdir_mode_any_nonhidserv(or_options_t *options);
04813 int authdir_mode_handles_descs(or_options_t *options, int purpose);
04814 int authdir_mode_publishes_statuses(or_options_t *options);
04815 int authdir_mode_tests_reachability(or_options_t *options);
04816 int authdir_mode_bridge(or_options_t *options);
04817
04818 int server_mode(or_options_t *options);
04819 int advertised_server_mode(void);
04820 int proxy_mode(or_options_t *options);
04821 void consider_publishable_server(int force);
04822
04823 void router_upload_dir_desc_to_dirservers(int force);
04824 void mark_my_descriptor_dirty_if_older_than(time_t when);
04825 void mark_my_descriptor_dirty(void);
04826 void check_descriptor_bandwidth_changed(time_t now);
04827 void check_descriptor_ipaddress_changed(time_t now);
04828 void router_new_address_suggestion(const char *suggestion,
04829 const dir_connection_t *d_conn);
04830 int router_compare_to_my_exit_policy(edge_connection_t *conn);
04831 routerinfo_t *router_get_my_routerinfo(void);
04832 extrainfo_t *router_get_my_extrainfo(void);
04833 const char *router_get_my_descriptor(void);
04834 int router_digest_is_me(const char *digest);
04835 int router_extrainfo_digest_is_me(const char *digest);
04836 int router_is_me(routerinfo_t *router);
04837 int router_fingerprint_is_me(const char *fp);
04838 int router_pick_published_address(or_options_t *options, uint32_t *addr);
04839 int router_rebuild_descriptor(int force);
04840 int router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router,
04841 crypto_pk_env_t *ident_key);
04842 int extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo,
04843 crypto_pk_env_t *ident_key);
04844 int is_legal_nickname(const char *s);
04845 int is_legal_nickname_or_hexdigest(const char *s);
04846 int is_legal_hexdigest(const char *s);
04847 void router_get_verbose_nickname(char *buf, const routerinfo_t *router);
04848 void routerstatus_get_verbose_nickname(char *buf,
04849 const routerstatus_t *router);
04850 void router_reset_warnings(void);
04851 void router_reset_reachability(void);
04852 void router_free_all(void);
04853
04854 const char *router_purpose_to_string(uint8_t p);
04855 uint8_t router_purpose_from_string(const char *s);
04856
04857 #ifdef ROUTER_PRIVATE
04858
04859 void get_platform_str(char *platform, size_t len);
04860 #endif
04861
04862
04863
04865 typedef struct trusted_dir_server_t {
04866 char *description;
04867 char *nickname;
04868 char *address;
04869 uint32_t addr;
04870 uint16_t dir_port;
04871 uint16_t or_port;
04872 char digest[DIGEST_LEN];
04873 char v3_identity_digest[DIGEST_LEN];
04876 unsigned int is_running:1;
04880 unsigned int has_accepted_serverdesc:1;
04881
04883 authority_type_t type;
04884
04885 download_status_t v2_ns_dl_status;
04887 time_t addr_current_at;
04890 routerstatus_t fake_status;
04895 } trusted_dir_server_t;
04896
04897 #define ROUTER_REQUIRED_MIN_BANDWIDTH (20*1024)
04898
04899 #define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX
04900
04901 int get_n_authorities(authority_type_t type);
04902 int trusted_dirs_reload_certs(void);
04903 int trusted_dirs_load_certs_from_string(const char *contents, int from_store,
04904 int flush);
04905 void trusted_dirs_flush_certs_to_disk(void);
04906 authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest);
04907 authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest);
04908 authority_cert_t *authority_cert_get_by_digests(const char *id_digest,
04909 const char *sk_digest);
04910 void authority_cert_get_all(smartlist_t *certs_out);
04911 void authority_cert_dl_failed(const char *id_digest, int status);
04912 void authority_certs_fetch_missing(networkstatus_t *status, time_t now);
04913 int router_reload_router_list(void);
04914 smartlist_t *router_get_trusted_dir_servers(void);
04915
04916
04920 #define PDS_ALLOW_SELF (1<<0)
04921
04924 #define PDS_RETRY_IF_NO_SERVERS (1<<1)
04925
04930 #define PDS_IGNORE_FASCISTFIREWALL (1<<2)
04931
04943 #define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3)
04944 #define _PDS_PREFER_TUNNELED_DIR_CONNS (1<<16)
04945 routerstatus_t *router_pick_directory_server(authority_type_t type, int flags);
04946 trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d);
04947 trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d);
04948 routerstatus_t *router_pick_trusteddirserver(authority_type_t type, int flags);
04949 int router_get_my_share_of_directory_requests(double *v2_share_out,
04950 double *v3_share_out);
04951 void router_reset_status_download_failures(void);
04952 void routerlist_add_family(smartlist_t *sl, routerinfo_t *router);
04953 int routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2);
04954 void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list,
04955 int must_be_running);
04956 int router_nickname_is_in_list(routerinfo_t *router, const char *list);
04957 routerinfo_t *routerlist_find_my_routerinfo(void);
04958 routerinfo_t *router_find_exact_exit_enclave(const char *address,
04959 uint16_t port);
04960 int router_is_unreliable(routerinfo_t *router, int need_uptime,
04961 int need_capacity, int need_guard);
04962 uint32_t router_get_advertised_bandwidth(routerinfo_t *router);
04963 uint32_t router_get_advertised_bandwidth_capped(routerinfo_t *router);
04964
04967 typedef enum bandwidth_weight_rule_t {
04968 NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_MID, WEIGHT_FOR_GUARD,
04969 WEIGHT_FOR_DIR
04970 } bandwidth_weight_rule_t;
04971 routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl,
04972 bandwidth_weight_rule_t rule);
04973 routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl,
04974 bandwidth_weight_rule_t rule);
04975
04976
04977 const char *bandwidth_weight_rule_to_string(enum bandwidth_weight_rule_t rule);
04978
04981 typedef enum {
04982 CRN_NEED_UPTIME = 1<<0,
04983 CRN_NEED_CAPACITY = 1<<1,
04984 CRN_NEED_GUARD = 1<<2,
04985 CRN_ALLOW_INVALID = 1<<3,
04986
04987 CRN_WEIGHT_AS_EXIT = 1<<5
04988 } router_crn_flags_t;
04989
04990 routerinfo_t *router_choose_random_node(smartlist_t *excludedsmartlist,
04991 struct routerset_t *excludedset,
04992 router_crn_flags_t flags);
04993
04994 routerinfo_t *router_get_by_nickname(const char *nickname,
04995 int warn_if_unnamed);
04996 int router_digest_version_as_new_as(const char *digest, const char *cutoff);
04997 int router_digest_is_trusted_dir_type(const char *digest,
04998 authority_type_t type);
04999 #define router_digest_is_trusted_dir(d) \
05000 router_digest_is_trusted_dir_type((d), NO_AUTHORITY)
05001
05002 int router_addr_is_trusted_dir(uint32_t addr);
05003 int hexdigest_to_digest(const char *hexdigest, char *digest);
05004 routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
05005 routerinfo_t *router_get_by_digest(const char *digest);
05006 signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
05007 signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest);
05008 signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
05009 const char *signed_descriptor_get_body(signed_descriptor_t *desc);
05010 const char *signed_descriptor_get_annotations(signed_descriptor_t *desc);
05011 routerlist_t *router_get_routerlist(void);
05012 void routerinfo_free(routerinfo_t *router);
05013 void extrainfo_free(extrainfo_t *extrainfo);
05014 void routerlist_free(routerlist_t *rl);
05015 void dump_routerlist_mem_usage(int severity);
05016 void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old,
05017 time_t now);
05018 void routerlist_free_all(void);
05019 void routerlist_reset_warnings(void);
05020 void router_set_status(const char *digest, int up);
05021
05023 typedef enum was_router_added_t {
05024 ROUTER_ADDED_SUCCESSFULLY = 1,
05025 ROUTER_ADDED_NOTIFY_GENERATOR = 0,
05026 ROUTER_BAD_EI = -1,
05027 ROUTER_WAS_NOT_NEW = -2,
05028 ROUTER_NOT_IN_CONSENSUS = -3,
05029 ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4,
05030 ROUTER_AUTHDIR_REJECTS = -5,
05031 } was_router_added_t;
05032
05033 static int WRA_WAS_ADDED(was_router_added_t s);
05034 static int WRA_WAS_OUTDATED(was_router_added_t s);
05035 static int WRA_WAS_REJECTED(was_router_added_t s);
05039 static INLINE int
05040 WRA_WAS_ADDED(was_router_added_t s) {
05041 return s == ROUTER_ADDED_SUCCESSFULLY || s == ROUTER_ADDED_NOTIFY_GENERATOR;
05042 }
05048 static INLINE int WRA_WAS_OUTDATED(was_router_added_t s)
05049 {
05050 return (s == ROUTER_WAS_NOT_NEW ||
05051 s == ROUTER_NOT_IN_CONSENSUS ||
05052 s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS);
05053 }
05055 static INLINE int WRA_WAS_REJECTED(was_router_added_t s)
05056 {
05057 return (s == ROUTER_AUTHDIR_REJECTS);
05058 }
05059 was_router_added_t router_add_to_routerlist(routerinfo_t *router,
05060 const char **msg,
05061 int from_cache,
05062 int from_fetch);
05063 was_router_added_t router_add_extrainfo_to_routerlist(
05064 extrainfo_t *ei, const char **msg,
05065 int from_cache, int from_fetch);
05066 void routerlist_remove_old_routers(void);
05067 int router_load_single_router(const char *s, uint8_t purpose, int cache,
05068 const char **msg);
05069 int router_load_routers_from_string(const char *s, const char *eos,
05070 saved_location_t saved_location,
05071 smartlist_t *requested_fingerprints,
05072 int descriptor_digests,
05073 const char *prepend_annotations);
05074 void router_load_extrainfo_from_string(const char *s, const char *eos,
05075 saved_location_t saved_location,
05076 smartlist_t *requested_fingerprints,
05077 int descriptor_digests);
05078 void routerlist_retry_directory_downloads(time_t now);
05079 int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port,
05080 int need_uptime);
05081 int router_exit_policy_rejects_all(routerinfo_t *router);
05082 trusted_dir_server_t *add_trusted_dir_server(const char *nickname,
05083 const char *address,
05084 uint16_t dir_port, uint16_t or_port,
05085 const char *digest, const char *v3_auth_digest,
05086 authority_type_t type);
05087 void authority_cert_free(authority_cert_t *cert);
05088 void clear_trusted_dir_servers(void);
05089 int any_trusted_dir_is_v1_authority(void);
05090 void update_consensus_router_descriptor_downloads(time_t now, int is_vote,
05091 networkstatus_t *consensus);
05092 void update_router_descriptor_downloads(time_t now);
05093 void update_extrainfo_downloads(time_t now);
05094 int router_have_minimum_dir_info(void);
05095 void router_dir_info_changed(void);
05096 const char *get_dir_info_status_string(void);
05097 int count_loading_descriptors_progress(void);
05098 void router_reset_descriptor_download_failures(void);
05099 int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2);
05100 int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei,
05101 signed_descriptor_t *sd,
05102 const char **msg);
05103 void routerlist_assert_ok(routerlist_t *rl);
05104 const char *esc_router_info(routerinfo_t *router);
05105 void routers_sort_by_identity(smartlist_t *routers);
05106
05107 routerset_t *routerset_new(void);
05108 int routerset_parse(routerset_t *target, const char *s,
05109 const char *description);
05110 void routerset_union(routerset_t *target, const routerset_t *source);
05111 int routerset_is_list(const routerset_t *set);
05112 int routerset_needs_geoip(const routerset_t *set);
05113 int routerset_contains_router(const routerset_t *set, routerinfo_t *ri);
05114 int routerset_contains_routerstatus(const routerset_t *set,
05115 routerstatus_t *rs);
05116 int routerset_contains_extendinfo(const routerset_t *set,
05117 const extend_info_t *ei);
05118 void routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset,
05119 int running_only);
05120 void routersets_get_disjunction(smartlist_t *target, const smartlist_t *source,
05121 const routerset_t *include,
05122 const routerset_t *exclude, int running_only);
05123 void routerset_subtract_routers(smartlist_t *out,
05124 const routerset_t *routerset);
05125 char *routerset_to_string(const routerset_t *routerset);
05126 void routerset_refresh_countries(routerset_t *target);
05127 int routerset_equal(const routerset_t *old, const routerset_t *new);
05128 void routerset_free(routerset_t *routerset);
05129 void routerinfo_set_country(routerinfo_t *ri);
05130 void routerlist_refresh_countries(void);
05131 void refresh_all_country_info(void);
05132
05133 int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs,
05134 const char *id);
05135 int hid_serv_acting_as_directory(void);
05136 int hid_serv_responsible_for_desc_id(const char *id);
05137
05138
05139
05140 #define MAX_STATUS_TAG_LEN 32
05141
05146 typedef struct tor_version_t {
05147 int major;
05148 int minor;
05149 int micro;
05152 enum { VER_PRE=0, VER_RC=1, VER_RELEASE=2, } status;
05153 int patchlevel;
05154 char status_tag[MAX_STATUS_TAG_LEN];
05155 int svn_revision;
05156
05157 int git_tag_len;
05158 char git_tag[DIGEST_LEN];
05159 } tor_version_t;
05160
05161 int router_get_router_hash(const char *s, size_t s_len, char *digest);
05162 int router_get_dir_hash(const char *s, char *digest);
05163 int router_get_runningrouters_hash(const char *s, char *digest);
05164 int router_get_networkstatus_v2_hash(const char *s, char *digest);
05165 int router_get_networkstatus_v3_hash(const char *s, char *digest,
05166 digest_algorithm_t algorithm);
05167 int router_get_networkstatus_v3_hashes(const char *s, digests_t *digests);
05168 int router_get_extrainfo_hash(const char *s, char *digest);
05169 int router_append_dirobj_signature(char *buf, size_t buf_len,
05170 const char *digest,
05171 size_t digest_len,
05172 crypto_pk_env_t *private_key);
05173 int router_parse_list_from_string(const char **s, const char *eos,
05174 smartlist_t *dest,
05175 saved_location_t saved_location,
05176 int is_extrainfo,
05177 int allow_annotations,
05178 const char *prepend_annotations);
05179 int router_parse_routerlist_from_directory(const char *s,
05180 routerlist_t **dest,
05181 crypto_pk_env_t *pkey,
05182 int check_version,
05183 int write_to_cache);
05184 int router_parse_runningrouters(const char *str);
05185 int router_parse_directory(const char *str);
05186 routerinfo_t *router_parse_entry_from_string(const char *s, const char *end,
05187 int cache_copy,
05188 int allow_annotations,
05189 const char *prepend_annotations);
05190 extrainfo_t *extrainfo_parse_entry_from_string(const char *s, const char *end,
05191 int cache_copy, struct digest_ri_map_t *routermap);
05192 addr_policy_t *router_parse_addr_policy_item_from_string(const char *s,
05193 int assume_action);
05194 version_status_t tor_version_is_obsolete(const char *myversion,
05195 const char *versionlist);
05196 int tor_version_parse(const char *s, tor_version_t *out);
05197 int tor_version_as_new_as(const char *platform, const char *cutoff);
05198 int tor_version_compare(tor_version_t *a, tor_version_t *b);
05199 void sort_version_list(smartlist_t *lst, int remove_duplicates);
05200 void assert_addr_policy_ok(smartlist_t *t);
05201 void dump_distinct_digest_count(int severity);
05202
05203 int compare_routerstatus_entries(const void **_a, const void **_b);
05204 networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s);
05205 int networkstatus_verify_bw_weights(networkstatus_t *ns);
05206 networkstatus_t *networkstatus_parse_vote_from_string(const char *s,
05207 const char **eos_out,
05208 networkstatus_type_t ns_type);
05209 ns_detached_signatures_t *networkstatus_parse_detached_signatures(
05210 const char *s, const char *eos);
05211
05212 smartlist_t *microdescs_parse_from_string(const char *s, const char *eos,
05213 int allow_annotations,
05214 int copy_body);
05215
05216 authority_cert_t *authority_cert_parse_from_string(const char *s,
05217 const char **end_of_string);
05218 int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
05219 char *desc_id_out,
05220 char **intro_points_encrypted_out,
05221 size_t *intro_points_encrypted_size_out,
05222 size_t *encoded_size_out,
05223 const char **next_out, const char *desc);
05224 int rend_decrypt_introduction_points(char **ipos_decrypted,
05225 size_t *ipos_decrypted_size,
05226 const char *descriptor_cookie,
05227 const char *ipos_encrypted,
05228 size_t ipos_encrypted_size);
05229 int rend_parse_introduction_points(rend_service_descriptor_t *parsed,
05230 const char *intro_points_encoded,
05231 size_t intro_points_encoded_size);
05232 int rend_parse_client_keys(strmap_t *parsed_clients, const char *str);
05233
05234 void tor_gettimeofday_cache_clear(void);
05235
05236 #endif
05237