or.h 22.1 KB
Newer Older
1
2
/* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */
/* See LICENSE for licensing information */
Roger Dingledine's avatar
Roger Dingledine committed
3
4
5
6
7
/* $Id$ */

#ifndef __OR_H
#define __OR_H

Nick Mathewson's avatar
Nick Mathewson committed
8
9
#include "orconfig.h"

10
#define SEQUENTIAL_ACI
11

Roger Dingledine's avatar
Roger Dingledine committed
12
13
#include <stdio.h>
#include <stdlib.h>
Roger Dingledine's avatar
Roger Dingledine committed
14
#include <limits.h>
15
#ifdef HAVE_UNISTD_H
Roger Dingledine's avatar
Roger Dingledine committed
16
#include <unistd.h>
17
18
#endif
#ifdef HAVE_STRING_H
Roger Dingledine's avatar
Roger Dingledine committed
19
#include <string.h>
20
21
#endif
#ifdef HAVE_SIGNAL_H
Roger Dingledine's avatar
Roger Dingledine committed
22
#include <signal.h>
23
24
#endif
#ifdef HAVE_NETDB_H
Roger Dingledine's avatar
Roger Dingledine committed
25
#include <netdb.h>
26
27
#endif
#ifdef HAVE_CTYPE_H
Roger Dingledine's avatar
Roger Dingledine committed
28
#include <ctype.h>
29
#endif
30
#include "../common/torint.h"
Nick Mathewson's avatar
Nick Mathewson committed
31
#ifdef HAVE_SYS_POLL_H
Roger Dingledine's avatar
Roger Dingledine committed
32
#include <sys/poll.h>
Nick Mathewson's avatar
Nick Mathewson committed
33
34
35
36
37
#elif HAVE_POLL_H
#include <poll.h>
#else
#include "../common/fakepoll.h"
#endif
38
#ifdef HAVE_SYS_TYPES_H
Roger Dingledine's avatar
Roger Dingledine committed
39
#include <sys/types.h> /* Must be included before sys/stat.h for Ultrix */
40
#endif
Roger Dingledine's avatar
Roger Dingledine committed
41
42
43
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
44
#ifdef HAVE_SYS_FCNTL_H
Roger Dingledine's avatar
Roger Dingledine committed
45
#include <sys/fcntl.h>
46
47
48
49
50
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
Roger Dingledine's avatar
Roger Dingledine committed
51
#include <sys/ioctl.h>
52
53
#endif
#ifdef HAVE_SYS_SOCKET_H
Roger Dingledine's avatar
Roger Dingledine committed
54
#include <sys/socket.h>
55
56
#endif
#ifdef HAVE_SYS_TIME_H
Roger Dingledine's avatar
Roger Dingledine committed
57
#include <sys/time.h>
58
59
#endif
#ifdef HAVE_SYS_STAT_H
60
#include <sys/stat.h>
61
62
#endif
#ifdef HAVE_NETINET_IN_H
Roger Dingledine's avatar
Roger Dingledine committed
63
#include <netinet/in.h>
64
65
#endif
#ifdef HAVE_ARPA_INET_H
Roger Dingledine's avatar
Roger Dingledine committed
66
#include <arpa/inet.h>
67
68
#endif
#ifdef HAVE_ERRNO_H
Roger Dingledine's avatar
Roger Dingledine committed
69
#include <errno.h>
70
71
#endif
#ifdef HAVE_ASSERT_H
Roger Dingledine's avatar
Roger Dingledine committed
72
#include <assert.h>
73
74
#endif
#ifdef HAVE_TIME_H
75
#include <time.h>
76
77
78
79
80
81
82
83
84
85
86
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#if _MSC_VER > 1300
#include <winsock2.h>
#include <ws2tcpip.h>
#elif defined(_MSC_VER)
#include <winsock.h>
#endif

87
#ifdef MS_WINDOWS
88
89
90
#include <io.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
91
#define snprintf _snprintf
92
93
#endif

94
#include "../common/crypto.h"
95
#include "../common/tortls.h"
Roger Dingledine's avatar
Roger Dingledine committed
96
#include "../common/log.h"
97
#include "../common/util.h"
Roger Dingledine's avatar
Roger Dingledine committed
98

Roger Dingledine's avatar
Roger Dingledine committed
99
#define RECOMMENDED_SOFTWARE_VERSIONS "0.0.2pre8,0.0.2pre9"
100

Roger Dingledine's avatar
   
Roger Dingledine committed
101
#define MAXCONNECTIONS 1000 /* upper bound on max connections.
102
                              can be lowered by config file */
Roger Dingledine's avatar
Roger Dingledine committed
103

104
#define MAX_BUF_SIZE (640*1024)
105
#define DEFAULT_BANDWIDTH_OP (1024 * 1000)
Roger Dingledine's avatar
Roger Dingledine committed
106
107
108

#define ACI_TYPE_LOWER 0
#define ACI_TYPE_HIGHER 1
109
110
#define ACI_TYPE_BOTH 2

111
#define _CONN_TYPE_MIN 3
Roger Dingledine's avatar
Roger Dingledine committed
112
113
#define CONN_TYPE_OR_LISTENER 3
#define CONN_TYPE_OR 4
114
115
116
#define CONN_TYPE_EXIT 5
#define CONN_TYPE_AP_LISTENER 6
#define CONN_TYPE_AP 7
117
118
#define CONN_TYPE_DIR_LISTENER 8
#define CONN_TYPE_DIR 9
119
#define CONN_TYPE_DNSWORKER 10
Roger Dingledine's avatar
Roger Dingledine committed
120
#define CONN_TYPE_CPUWORKER 11
121
#define _CONN_TYPE_MAX 3
Roger Dingledine's avatar
Roger Dingledine committed
122
123
124

#define LISTENER_STATE_READY 0

125
126
#define DNSWORKER_STATE_IDLE 0
#define DNSWORKER_STATE_BUSY 1
127

128
#define _CPUWORKER_STATE_MIN 0
Roger Dingledine's avatar
Roger Dingledine committed
129
130
131
#define CPUWORKER_STATE_IDLE 0
#define CPUWORKER_STATE_BUSY_ONION 1
#define CPUWORKER_STATE_BUSY_HANDSHAKE 2
132
#define _CPUWORKER_STATE_MAX 2
Roger Dingledine's avatar
Roger Dingledine committed
133
134
135

#define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION

136
#define _OR_CONN_STATE_MIN 0
137
138
139
#define OR_CONN_STATE_CONNECTING 0 /* waiting for connect() to finish */
#define OR_CONN_STATE_HANDSHAKING 1 /* SSL is handshaking, not done yet */
#define OR_CONN_STATE_OPEN 2 /* ready to send/receive cells. */
140
#define _OR_CONN_STATE_MAX 2
141

142
#define _EXIT_CONN_STATE_MIN 0
143
#define EXIT_CONN_STATE_RESOLVING 0 /* waiting for response from dns farm */
144
#define EXIT_CONN_STATE_CONNECTING 1 /* waiting for connect() to finish */
145
#define EXIT_CONN_STATE_OPEN 2
146
#define _EXIT_CONN_STATE_MAX 2
Roger Dingledine's avatar
Roger Dingledine committed
147
#if 0
148
149
#define EXIT_CONN_STATE_CLOSE 3 /* flushing the buffer, then will close */
#define EXIT_CONN_STATE_CLOSE_WAIT 4 /* have sent a destroy, awaiting a confirmation */
Roger Dingledine's avatar
Roger Dingledine committed
150
151
#endif

152
#define _AP_CONN_STATE_MIN 3
153
154
155
#define AP_CONN_STATE_SOCKS_WAIT 3
#define AP_CONN_STATE_OR_WAIT 4
#define AP_CONN_STATE_OPEN 5
156
#define _AP_CONN_STATE_MAX 5
157

158
#define _DIR_CONN_STATE_MIN 0
159
160
161
162
163
164
#define DIR_CONN_STATE_CONNECTING_FETCH 0
#define DIR_CONN_STATE_CONNECTING_UPLOAD 1
#define DIR_CONN_STATE_CLIENT_SENDING_FETCH 2
#define DIR_CONN_STATE_CLIENT_SENDING_UPLOAD 3
#define DIR_CONN_STATE_CLIENT_READING_FETCH 4
#define DIR_CONN_STATE_CLIENT_READING_UPLOAD 5
165
166
167
#define DIR_CONN_STATE_SERVER_COMMAND_WAIT 6
#define DIR_CONN_STATE_SERVER_WRITING 7
#define _DIR_CONN_STATE_MAX 7
168

169
#define CIRCUIT_STATE_BUILDING 0 /* I'm the OP, still haven't done all my handshakes */
Roger Dingledine's avatar
Roger Dingledine committed
170
#define CIRCUIT_STATE_ONIONSKIN_PENDING 1 /* waiting to process the onionskin */
171
#define CIRCUIT_STATE_OR_WAIT 2 /* I'm the OP, my firsthop is still connecting */
Roger Dingledine's avatar
Roger Dingledine committed
172
#define CIRCUIT_STATE_OPEN 3 /* onionskin(s) processed, ready to send/receive cells */
Roger Dingledine's avatar
Roger Dingledine committed
173

174
175
176
177
178
#define RELAY_COMMAND_BEGIN 1
#define RELAY_COMMAND_DATA 2
#define RELAY_COMMAND_END 3
#define RELAY_COMMAND_CONNECTED 4
#define RELAY_COMMAND_SENDME 5
179
180
#define RELAY_COMMAND_EXTEND 6
#define RELAY_COMMAND_EXTENDED 7
181
182
#define RELAY_COMMAND_TRUNCATE 8
#define RELAY_COMMAND_TRUNCATED 9
183

184
#define RELAY_HEADER_SIZE 8
185

186
/* default cipher function */
Roger Dingledine's avatar
Roger Dingledine committed
187
#define DEFAULT_CIPHER CRYPTO_CIPHER_AES_CTR
Nick Mathewson's avatar
src/or    
Nick Mathewson committed
188
189
190
191
/* Used to en/decrypt onion skins */
#define ONION_CIPHER      DEFAULT_CIPHER
/* Used to en/decrypt RELAY cells */
#define CIRCUIT_CIPHER    DEFAULT_CIPHER
192

193
194
#define CELL_DIRECTION_IN 1
#define CELL_DIRECTION_OUT 2
195
196
#define EDGE_EXIT CONN_TYPE_EXIT
#define EDGE_AP CONN_TYPE_AP
197
#define CELL_DIRECTION(x) ((x) == EDGE_EXIT ? CELL_DIRECTION_IN : CELL_DIRECTION_OUT)
198
199
200
201

#define CIRCWINDOW_START 1000
#define CIRCWINDOW_INCREMENT 100

202
203
#define STREAMWINDOW_START 500
#define STREAMWINDOW_INCREMENT 50
204

Roger Dingledine's avatar
Roger Dingledine committed
205
206
207
/* cell commands */
#define CELL_PADDING 0
#define CELL_CREATE 1
208
209
210
#define CELL_CREATED 2
#define CELL_RELAY 3
#define CELL_DESTROY 4
Roger Dingledine's avatar
Roger Dingledine committed
211

212
213
#define CELL_PAYLOAD_SIZE 248
#define CELL_NETWORK_SIZE 256
Roger Dingledine's avatar
Roger Dingledine committed
214

215
216
217
/* legal characters in a filename */
#define CONFIG_LEGAL_FILENAME_CHARACTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_/"

218
219
220
221
/* structure of a socks client operation */
typedef struct {
   unsigned char version;     /* socks version number */
   unsigned char command;     /* command code */
222
223
224
225
   uint16_t destport; /* destination port, network order */
   uint32_t destip;   /* destination address, host order */
   /* userid follows, terminated by a \0 */
   /* dest host follows, terminated by a \0 */
226
227
} socks4_t;

228
229
#define SOCKS4_NETWORK_LEN 8

Roger Dingledine's avatar
Roger Dingledine committed
230
231
typedef uint16_t aci_t;

Roger Dingledine's avatar
Roger Dingledine committed
232
/* cell definition */
233
typedef struct { 
Roger Dingledine's avatar
Roger Dingledine committed
234
235
  aci_t aci; /* Anonymous Connection Identifier */
  unsigned char command;
236
  unsigned char length; /* of payload if relay cell */
Roger Dingledine's avatar
Roger Dingledine committed
237
  uint32_t seq; /* sequence number */
238

239
  unsigned char payload[CELL_PAYLOAD_SIZE];
Roger Dingledine's avatar
Roger Dingledine committed
240
} cell_t;
241
242
#define CELL_RELAY_COMMAND(c)         (*(uint8_t*)((c).payload))
#define SET_CELL_RELAY_COMMAND(c,cmd) (*(uint8_t*)((c).payload) = (cmd))
243
244
245
246
#define STREAM_ID_SIZE 7
#define SET_CELL_STREAM_ID(c,id)      memcpy((c).payload+1,(id),STREAM_ID_SIZE)

#define ZERO_STREAM "\0\0\0\0\0\0\0\0"
Roger Dingledine's avatar
Roger Dingledine committed
247

248
struct connection_t { 
Roger Dingledine's avatar
Roger Dingledine committed
249

Roger Dingledine's avatar
Roger Dingledine committed
250
  uint8_t type;
251
252
253
254
  uint8_t state;
  uint8_t wants_to_read; /* should we start reading again once
                          * the bandwidth throttler allows it?
                          */
Roger Dingledine's avatar
Roger Dingledine committed
255
256
257
  uint8_t wants_to_write; /* should we start writing again once
                           * the bandwidth throttler allows reads?
                           */
Roger Dingledine's avatar
Roger Dingledine committed
258
  int s; /* our socket */
259
260
261
262
  int poll_index; /* index of this conn into the poll_array */
  int marked_for_close; /* should we close this conn on the next
                         * iteration of the main loop?
                         */
Roger Dingledine's avatar
Roger Dingledine committed
263
264

  char *inbuf;
265
266
267
268
  int inbuflen; /* how many bytes are alloc'ed for inbuf? */
  int inbuf_datalen; /* how many bytes of data are on inbuf? */
  int inbuf_reached_eof; /* did read() return 0 on this conn? */
  long timestamp_lastread; /* when was the last time poll() said we could read? */
Roger Dingledine's avatar
Roger Dingledine committed
269
270

  char *outbuf;
271
272
273
  int outbuflen; /* how many bytes are allocated for the outbuf? */
  int outbuf_flushlen; /* how much data should we try to flush from the outbuf? */
  int outbuf_datalen; /* how much data is there total on the outbuf? */
274
  long timestamp_lastwritten; /* when was the last time poll() said we could write? */
275

276
  long timestamp_created; /* when was this connection_t created? */
Roger Dingledine's avatar
Roger Dingledine committed
277

278
  uint32_t bandwidth; /* connection bandwidth. Set to -1 for non-OR conns. */
279
  int receiver_bucket; /* when this hits 0, stop receiving. Every second we
280
                        * add 'bandwidth' to this, capping it at 10*bandwidth.
281
			* Set to -1 for non-OR conns.
282
                        */
283
284
285
286
287
288
289
290
291
292

  uint32_t addr; /* these two uniquely identify a router. Both in host order. */
  uint16_t port; /* if non-zero, they identify the guy on the other end
                  * of the connection. */
  char *address; /* FQDN (or IP) of the guy on the other end.
                  * strdup into this, because free_connection frees it
                  */
  crypto_pk_env_t *pkey; /* public RSA key for the other side */

/* Used only by OR connections: */
293
  tor_tls *tls;
294
#ifdef SEQUENTIAL_ACI
295
296
  uint16_t next_aci; /* Which ACI do we try to use next on this connection? 
                      * This is always in the range 0..1<<15-1.*/
297
#endif
Roger Dingledine's avatar
Roger Dingledine committed
298

299
/* Used only by edge connections: */
300
  char stream_id[STREAM_ID_SIZE];
301
  struct connection_t *next_stream; /* points to the next stream at this edge, if any */
302
  struct crypt_path_t *cpath_layer; /* a pointer to which node in the circ this conn exits at */
303
304
  int package_window; /* how many more relay cells can i send into the circuit? */
  int deliver_window; /* how many more relay cells can end at me? */
305

306
307
  int done_sending; /* for half-open connections; not used currently */
  int done_receiving;
308
309
310
};

typedef struct connection_t connection_t;
Roger Dingledine's avatar
Roger Dingledine committed
311

Roger Dingledine's avatar
Roger Dingledine committed
312
313
314
315
316
317
318
319
320
321
322
323
#define EXIT_POLICY_ACCEPT 1
#define EXIT_POLICY_REJECT 2

struct exit_policy_t {
  char policy_type;
  char *string;
  char *address;
  char *port;

  struct exit_policy_t *next;
};

Roger Dingledine's avatar
Roger Dingledine committed
324
/* config stuff we know about the other ORs in the network */
325
typedef struct {
Roger Dingledine's avatar
Roger Dingledine committed
326
  char *address;
327
  char *nickname;
Roger Dingledine's avatar
Roger Dingledine committed
328
 
329
  uint32_t addr; /* all host order */
330
331
  uint16_t or_port;
  uint16_t ap_port;
332
  uint16_t dir_port;
Roger Dingledine's avatar
Roger Dingledine committed
333
 
334
  crypto_pk_env_t *pkey; /* public RSA key */
335
  crypto_pk_env_t *signing_pkey; /* May be null */
Roger Dingledine's avatar
Roger Dingledine committed
336
337
 
  /* link info */
338
  uint32_t bandwidth;
Roger Dingledine's avatar
Roger Dingledine committed
339
  struct exit_policy_t *exit_policy;
Roger Dingledine's avatar
Roger Dingledine committed
340
341
} routerinfo_t;

342
#define MAX_ROUTERS_IN_DIR 1024
343
344
345
typedef struct {
  routerinfo_t **routers;
  int n_routers;
346
  char *software_versions;
347
348
} directory_t;

349
struct crypt_path_t { 
350

351
352
353
  /* crypto environments */
  crypto_cipher_env_t *f_crypto;
  crypto_cipher_env_t *b_crypto;
354

355
356
357
358
359
  crypto_dh_env_t *handshake_state;

  uint32_t addr;
  uint16_t port;

360
  uint8_t state;
361
#define CPATH_STATE_CLOSED 0
362
#define CPATH_STATE_AWAITING_KEYS 1
363
#define CPATH_STATE_OPEN 2
364
365
366
  struct crypt_path_t *next;
  struct crypt_path_t *prev; /* doubly linked list */

367
368
  int package_window;
  int deliver_window;
369
};
370

371
372
#define DH_KEY_LEN CRYPTO_DH_SIZE
#define DH_ONIONSKIN_LEN DH_KEY_LEN+16
373

374
typedef struct crypt_path_t crypt_path_t;
375

376
/* struct for a path (circuit) through the network */
Roger Dingledine's avatar
Roger Dingledine committed
377
struct circuit_t {
Roger Dingledine's avatar
Roger Dingledine committed
378
379
380
  uint32_t n_addr;
  uint16_t n_port;
  connection_t *p_conn;
381
382
383
  connection_t *n_conn; /* for the OR conn, if there is one */
  connection_t *p_streams;
  connection_t *n_streams;
384
385
  int package_window;
  int deliver_window;
Roger Dingledine's avatar
Roger Dingledine committed
386

Roger Dingledine's avatar
Roger Dingledine committed
387
  aci_t p_aci; /* circuit identifiers */
Roger Dingledine's avatar
Roger Dingledine committed
388
389
  aci_t n_aci;

390
  crypto_cipher_env_t *p_crypto; /* used only for intermediate hops */
391
  crypto_cipher_env_t *n_crypto;
Roger Dingledine's avatar
Roger Dingledine committed
392

393
  crypt_path_t *cpath;
394

395
  char onionskin[DH_ONIONSKIN_LEN]; /* for storage while onionskin pending */
396
  long timestamp_created;
397
  uint8_t dirty; /* whether this circuit has been used yet */
Roger Dingledine's avatar
Roger Dingledine committed
398

399
  uint8_t state;
Roger Dingledine's avatar
Roger Dingledine committed
400
401

  void *next;
Roger Dingledine's avatar
Roger Dingledine committed
402
403
404
};

typedef struct circuit_t circuit_t;
Roger Dingledine's avatar
Roger Dingledine committed
405

406
typedef struct {
407
408
   char *LogLevel;
   char *RouterFile;
409
   char *SigningPrivateKeyFile;
410
   char *PrivateKeyFile;
Roger Dingledine's avatar
Roger Dingledine committed
411
412
   char *CertFile;
   char *Nickname;
413
   double CoinWeight;
414
   int Daemon;
415
416
   int ORPort;
   int APPort;
417
   int DirPort;
418
   int MaxConn;
419
   int OnionRouter;
420
   int TrafficShaping;
421
   int LinkPadding;
422
   int IgnoreVersion;
423
424
   int DirRebuildPeriod;
   int DirFetchPeriod;
425
   int KeepalivePeriod;
426
   int MaxOnionsPending;
427
   int NewCircuitPeriod;
428
   int TotalBandwidth;
429
   int NumCpus;
430
   int Role;
431
   int loglevel;
432
} or_options_t;
Roger Dingledine's avatar
Roger Dingledine committed
433
434
435
436
437

    /* all the function prototypes go here */

/********************************* buffers.c ***************************/

438
int buf_new(char **buf, int *buflen, int *buf_datalen);
439
void buf_free(char *buf);
Roger Dingledine's avatar
Roger Dingledine committed
440

441
int read_to_buf(int s, int at_most, char **buf, int *buflen, int *buf_datalen, int *reached_eof);
442
int read_to_buf_tls(tor_tls *tls, int at_most, char **buf, int *buflen, int *buf_datalen);
Roger Dingledine's avatar
Roger Dingledine committed
443

444
int flush_buf(int s, char **buf, int *buflen, int *buf_flushlen, int *buf_datalen);
445
int flush_buf_tls(tor_tls *tls, char **buf, int *buflen, int *buf_flushlen, int *buf_datalen);
Roger Dingledine's avatar
Roger Dingledine committed
446

Roger Dingledine's avatar
Roger Dingledine committed
447
448
int write_to_buf(char *string, int string_len, char **buf, int *buflen, int *buf_datalen);
int fetch_from_buf(char *string, int string_len, char **buf, int *buflen, int *buf_datalen);
449
450
451
int fetch_from_buf_http(char *buf, int *buf_datalen,
                        char *headers_out, int max_headerlen,
                        char *body_out, int max_bodylen);
452
453
454
int fetch_from_buf_socks(char *buf, int *buf_datalen,
                         char *addr_out, int max_addrlen,
                         uint16_t *port_out);
Roger Dingledine's avatar
Roger Dingledine committed
455
int find_on_inbuf(char *string, int string_len, char *buf, int buf_datalen);
Roger Dingledine's avatar
Roger Dingledine committed
456
457
458
459
460
461

/********************************* circuit.c ***************************/

void circuit_add(circuit_t *circ);
void circuit_remove(circuit_t *circ);
circuit_t *circuit_new(aci_t p_aci, connection_t *p_conn);
Roger Dingledine's avatar
Roger Dingledine committed
462
void circuit_free(circuit_t *circ);
Roger Dingledine's avatar
Roger Dingledine committed
463

Roger Dingledine's avatar
Roger Dingledine committed
464
circuit_t *circuit_enumerate_by_naddr_nport(circuit_t *start, uint32_t naddr, uint16_t nport);
Roger Dingledine's avatar
Roger Dingledine committed
465
466
circuit_t *circuit_get_by_aci_conn(aci_t aci, connection_t *conn);
circuit_t *circuit_get_by_conn(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
467
circuit_t *circuit_get_newest_open(void);
Roger Dingledine's avatar
Roger Dingledine committed
468

469
470
471
int circuit_deliver_relay_cell(cell_t *cell, circuit_t *circ,
                               int cell_direction, crypt_path_t *layer_hint);
int relay_crypt(circuit_t *circ, char *in, int inlen, char cell_direction,
472
                crypt_path_t **layer_hint, char *recognized, connection_t **conn);
473
int relay_check_recognized(circuit_t *circ, int cell_direction, char *stream, connection_t **conn);
Roger Dingledine's avatar
Roger Dingledine committed
474

475
476
477
void circuit_resume_edge_reading(circuit_t *circ, int edge_type, crypt_path_t *layer_hint);
int circuit_consider_stop_edge_reading(circuit_t *circ, int edge_type, crypt_path_t *layer_hint);
int circuit_consider_sending_sendme(circuit_t *circ, int edge_type, crypt_path_t *layer_hint);
478

Roger Dingledine's avatar
Roger Dingledine committed
479
480
481
void circuit_close(circuit_t *circ);
void circuit_about_to_close_connection(connection_t *conn);

482
483
void circuit_dump_by_conn(connection_t *conn);

Roger Dingledine's avatar
Roger Dingledine committed
484
void circuit_expire_unused_circuits(void);
485
void circuit_launch_new(int failure_status);
486
int circuit_establish_circuit(void);
487
void circuit_n_conn_open(connection_t *or_conn);
488
489
490
int circuit_send_next_onion_skin(circuit_t *circ);
int circuit_extend(cell_t *cell, circuit_t *circ);
int circuit_finish_handshake(circuit_t *circ, char *reply);
491
int circuit_truncated(circuit_t *circ, crypt_path_t *layer);
492

493
494
495
496
void assert_cpath_ok(crypt_path_t *c);
void assert_cpath_layer_ok(crypt_path_t *c);
void assert_circuit_ok(circuit_t *c);

Roger Dingledine's avatar
Roger Dingledine committed
497
498
499
500
501
502
/********************************* command.c ***************************/

void command_process_cell(cell_t *cell, connection_t *conn);

/********************************* config.c ***************************/

503
int getconfig(int argc, char **argv, or_options_t *options);
504

Roger Dingledine's avatar
Roger Dingledine committed
505
506
507
508
509
/********************************* connection.c ***************************/

connection_t *connection_new(int type);
void connection_free(connection_t *conn);

510
int connection_create_listener(struct sockaddr_in *bindaddr, int type);
511
512
int connection_handle_listener_read(connection_t *conn, int new_type);

513
int connection_tls_start_handshake(connection_t *conn, int receiving);
Roger Dingledine's avatar
Roger Dingledine committed
514

515
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
516
int retry_all_connections(uint16_t or_listenport, uint16_t ap_listenport, uint16_t dir_listenport);
Roger Dingledine's avatar
Roger Dingledine committed
517

518
int connection_handle_read(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
519
520
521
int connection_read_to_buf(connection_t *conn);

int connection_fetch_from_buf(char *string, int len, connection_t *conn);
522
int connection_find_on_inbuf(char *string, int len, connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
523

524
int connection_wants_to_flush(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
525
int connection_outbuf_too_full(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
526
int connection_flush_buf(connection_t *conn);
527
int connection_handle_write(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
528
int connection_write_to_buf(char *string, int len, connection_t *conn);
529
530
531

int connection_receiver_bucket_should_increase(connection_t *conn);

532
#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
533
int connection_is_listener(connection_t *conn);
534
535
int connection_state_is_open(connection_t *conn);

Roger Dingledine's avatar
Roger Dingledine committed
536
537
538
539
540
int connection_send_destroy(aci_t aci, connection_t *conn);

int connection_process_inbuf(connection_t *conn);
int connection_finished_flushing(connection_t *conn);

541
542
void assert_connection_ok(connection_t *conn, time_t now);

543
544
545
/********************************* connection_edge.c ***************************/

int connection_edge_process_inbuf(connection_t *conn);
546
int connection_edge_send_command(connection_t *fromconn, circuit_t *circ, int relay_command);
Roger Dingledine's avatar
Roger Dingledine committed
547
548
int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_t *conn,
                                       int edge_type, crypt_path_t *layer_hint);
549
550
int connection_edge_finished_flushing(connection_t *conn);

551
552
int connection_package_raw_inbuf(connection_t *conn);
int connection_consider_sending_sendme(connection_t *conn, int edge_type);
553

554
int connection_exit_connect(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
555

556
/********************************* connection_or.c ***************************/
Roger Dingledine's avatar
Roger Dingledine committed
557

558
559
int connection_or_process_inbuf(connection_t *conn);
int connection_or_finished_flushing(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
560

561
connection_t *connection_or_connect(routerinfo_t *router);
562

563
564
565
int connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn);
int connection_process_cell_from_inbuf(connection_t *conn);

Roger Dingledine's avatar
Roger Dingledine committed
566
567
568
569
570
571
572
573
574
/********************************* cpuworker.c *****************************/

void cpu_init(void);
int connection_cpu_finished_flushing(connection_t *conn);
int connection_cpu_process_inbuf(connection_t *conn);
int cpuworker_main(void *data);
int assign_to_cpuworker(connection_t *cpuworker, unsigned char question_type,
                        void *task);

575
576
/********************************* directory.c ***************************/

577
void directory_initiate_command(routerinfo_t *router, int command);
578
void directory_set_dirty(void);
579
580
581
int connection_dir_process_inbuf(connection_t *conn);
int connection_dir_finished_flushing(connection_t *conn);

582
583
/********************************* dns.c ***************************/

584
void dns_init(void);
585
586
int connection_dns_finished_flushing(connection_t *conn);
int connection_dns_process_inbuf(connection_t *conn);
587
void dns_cancel_pending_resolve(char *question, connection_t *onlyconn);
588
int dns_resolve(connection_t *exitconn);
589

Roger Dingledine's avatar
Roger Dingledine committed
590
591
/********************************* main.c ***************************/

592
593
594
595
void set_privatekey(crypto_pk_env_t *k);
crypto_pk_env_t *get_privatekey(void);
void set_signing_privatekey(crypto_pk_env_t *k);
crypto_pk_env_t *get_signing_privatekey(void);
Roger Dingledine's avatar
Roger Dingledine committed
596
597
598
599
int connection_add(connection_t *conn);
int connection_remove(connection_t *conn);
void connection_set_poll_socket(connection_t *conn);

600
601
connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port);
connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port);
Roger Dingledine's avatar
Roger Dingledine committed
602
603

connection_t *connection_get_by_type(int type);
604
connection_t *connection_get_by_type_state(int type, int state);
605
connection_t *connection_get_by_type_state_lastwritten(int type, int state);
Roger Dingledine's avatar
Roger Dingledine committed
606
607

void connection_watch_events(connection_t *conn, short events);
Roger Dingledine's avatar
Roger Dingledine committed
608
int connection_is_reading(connection_t *conn);
609
610
void connection_stop_reading(connection_t *conn);
void connection_start_reading(connection_t *conn);
611
612
void connection_stop_writing(connection_t *conn);
void connection_start_writing(connection_t *conn);
Roger Dingledine's avatar
Roger Dingledine committed
613

614
615
616
617
618
619
int dump_signed_directory_to_string(char *s, int maxlen, 
                                    crypto_pk_env_t *private_key);
/* Exported for debugging */
int dump_signed_directory_to_string_impl(char *s, int maxlen, 
                                         directory_t *dir, 
                                         crypto_pk_env_t *private_key); 
620
char *router_get_my_descriptor(void);
621

Roger Dingledine's avatar
Roger Dingledine committed
622
623
624
625
626
627
628
int main(int argc, char *argv[]);

/********************************* onion.c ***************************/

int decide_aci_type(uint32_t local_addr, uint16_t local_port,
                    uint32_t remote_addr, uint16_t remote_port);

629
int onion_pending_add(circuit_t *circ);
Roger Dingledine's avatar
Roger Dingledine committed
630
circuit_t *onion_next_task(void);
631
void onion_pending_remove(circuit_t *circ);
Roger Dingledine's avatar
Roger Dingledine committed
632

633
int onionskin_answer(circuit_t *circ, unsigned char *payload, unsigned char *keys);
Roger Dingledine's avatar
Roger Dingledine committed
634

635
crypt_path_t *onion_generate_cpath(routerinfo_t **firsthop);
636

637
638
int onion_skin_create(crypto_pk_env_t *router_key,
                      crypto_dh_env_t **handshake_state_out,
639
                      char *onion_skin_out); /* Must be DH_ONIONSKIN_LEN bytes long */
640

641
int onion_skin_server_handshake(char *onion_skin, /* DH_ONIONSKIN_LEN bytes long */
642
                                crypto_pk_env_t *private_key,
643
                                char *handshake_reply_out, /* DH_KEY_LEN bytes long */
644
645
646
647
                                char *key_out,
                                int key_out_len);

int onion_skin_client_handshake(crypto_dh_env_t *handshake_state,
648
                             char *handshake_reply,/* Must be DH_KEY_LEN bytes long*/
649
650
651
                             char *key_out,
                             int key_out_len);

Roger Dingledine's avatar
Roger Dingledine committed
652
653
/********************************* routers.c ***************************/

654
655
int learn_my_address(struct sockaddr_in *me);
void router_retry_connections(void);
656
657
routerinfo_t *router_pick_directory_server(void);
routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port);
658
routerinfo_t *router_get_by_pk(crypto_pk_env_t *pk);
659
void router_get_directory(directory_t **pdirectory);
660
int router_is_me(uint32_t addr, uint16_t port);
661
void router_forget_router(uint32_t addr, uint16_t port);
662
int router_get_list_from_file(char *routerfile);
663

664
/* Reads a list of known routers, unsigned. */
665
int router_get_list_from_string(char *s);
666
/* Exported for debugging */
667
int router_get_list_from_string_impl(char *s, directory_t **dest);
668
/* Reads a signed directory. */
669
int router_get_dir_from_string(char *s, crypto_pk_env_t *pkey);
670
/* Exported or debugging */
671
672
int router_get_dir_from_string_impl(char *s, directory_t **dest,
                                    crypto_pk_env_t *pkey);
673
routerinfo_t *router_get_entry_from_string(char **s);
674
int router_compare_to_exit_policy(connection_t *conn);
675
void routerinfo_free(routerinfo_t *router);
676

Roger Dingledine's avatar
Roger Dingledine committed
677
#endif
678
679
680
681
682
683
684
685

/*
  Local Variables:
  mode:c
  indent-tabs-mode:nil
  c-basic-offset:2
  End:
*/