2006-02-09 06:46:49 +01:00
|
|
|
|
/* Copyright (c) 2001 Matej Pfajfar.
|
|
|
|
|
* Copyright (c) 2001-2004, Roger Dingledine.
|
2007-12-12 22:09:01 +01:00
|
|
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
2015-01-02 20:27:39 +01:00
|
|
|
|
* Copyright (c) 2007-2015, The Tor Project, Inc. */
|
Implemented link padding and receiver token buckets
Each socket reads at most 'bandwidth' bytes per second sustained, but
can handle bursts of up to 10*bandwidth bytes.
Cells are now sent out at evenly-spaced intervals, with padding sent
out otherwise. Set Linkpadding=0 in the rc file to send cells as soon
as they're available (and to never send padding cells).
Added license/copyrights statements at the top of most files.
router->min and router->max have been merged into a single 'bandwidth'
value. We should make the routerinfo_t reflect this (want to do that,
Mat?)
As the bandwidth increases, and we want to stop sleeping more and more
frequently to send a single cell, cpu usage goes up. At 128kB/s we're
pretty much calling poll with a timeout of 1ms or even 0ms. The current
code takes a timeout of 0-9ms and makes it 10ms. prepare_for_poll()
handles everything that should have happened in the past, so as long as
our buffers don't get too full in that 10ms, we're ok.
Speaking of too full, if you run three servers at 100kB/s with -l debug,
it spends too much time printing debugging messages to be able to keep
up with the cells. The outbuf ultimately fills up and it kills that
connection. If you run with -l err, it works fine up through 500kB/s and
probably beyond. Down the road we'll want to teach it to recognize when
an outbuf is getting full, and back off.
svn:r50
2002-07-16 03:12:15 +02:00
|
|
|
|
/* See LICENSE for licensing information */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/**
|
|
|
|
|
* \file or.h
|
|
|
|
|
* \brief Master header file for Tor-specific functionality.
|
2005-06-11 07:31:17 +02:00
|
|
|
|
**/
|
2004-05-10 08:52:01 +02:00
|
|
|
|
|
2012-10-12 18:13:10 +02:00
|
|
|
|
#ifndef TOR_OR_H
|
|
|
|
|
#define TOR_OR_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2002-09-03 20:44:24 +02:00
|
|
|
|
#include "orconfig.h"
|
2008-12-11 22:11:26 +01:00
|
|
|
|
|
2014-09-18 16:23:14 +02:00
|
|
|
|
#if defined(__clang_analyzer__) || defined(__COVERITY__)
|
2008-12-11 22:11:26 +01:00
|
|
|
|
/* If we're building for a static analysis, turn on all the off-by-default
|
|
|
|
|
* features. */
|
|
|
|
|
#ifndef INSTRUMENT_DOWNLOADS
|
|
|
|
|
#define INSTRUMENT_DOWNLOADS 1
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#ifdef HAVE_UNISTD_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <unistd.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_SIGNAL_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <signal.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_NETDB_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <netdb.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
2004-06-01 19:03:01 +02:00
|
|
|
|
#ifdef HAVE_SYS_PARAM_H
|
|
|
|
|
#include <sys/param.h> /* FreeBSD needs this to know what version it is */
|
|
|
|
|
#endif
|
2007-08-08 07:50:31 +02:00
|
|
|
|
#include "torint.h"
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#ifdef HAVE_SYS_FCNTL_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <sys/fcntl.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_FCNTL_H
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_SYS_IOCTL_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <sys/ioctl.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
2007-06-05 22:54:49 +02:00
|
|
|
|
#ifdef HAVE_SYS_UN_H
|
|
|
|
|
#include <sys/un.h>
|
|
|
|
|
#endif
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#ifdef HAVE_SYS_STAT_H
|
2002-09-24 12:43:57 +02:00
|
|
|
|
#include <sys/stat.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
2010-08-22 13:58:23 +02:00
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
|
|
|
#include <netinet/in.h>
|
|
|
|
|
#endif
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#ifdef HAVE_ARPA_INET_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <arpa/inet.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_ERRNO_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <errno.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_ASSERT_H
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#include <assert.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef HAVE_TIME_H
|
2002-08-22 09:30:03 +02:00
|
|
|
|
#include <time.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#endif
|
2004-10-21 01:30:38 +02:00
|
|
|
|
|
2012-01-31 16:59:42 +01:00
|
|
|
|
#ifdef _WIN32
|
2015-06-29 19:47:44 +02:00
|
|
|
|
#include <winsock2.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#include <io.h>
|
2003-10-04 03:37:01 +02:00
|
|
|
|
#include <process.h>
|
2004-03-09 23:01:17 +01:00
|
|
|
|
#include <direct.h>
|
2003-08-12 05:08:41 +02:00
|
|
|
|
#include <windows.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2009-07-31 17:39:31 +02:00
|
|
|
|
#ifdef USE_BUFFEREVENTS
|
|
|
|
|
#include <event2/bufferevent.h>
|
|
|
|
|
#include <event2/buffer.h>
|
2009-08-04 18:29:30 +02:00
|
|
|
|
#include <event2/util.h>
|
2009-07-31 17:39:31 +02:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "crypto.h"
|
2015-07-31 17:21:34 +02:00
|
|
|
|
#include "crypto_format.h"
|
2007-08-08 07:50:31 +02:00
|
|
|
|
#include "tortls.h"
|
2015-02-27 15:24:21 +01:00
|
|
|
|
#include "torlog.h"
|
2007-08-08 07:50:31 +02:00
|
|
|
|
#include "container.h"
|
|
|
|
|
#include "torgzip.h"
|
2008-07-25 16:43:24 +02:00
|
|
|
|
#include "address.h"
|
2009-06-04 07:05:23 +02:00
|
|
|
|
#include "compat_libevent.h"
|
2009-08-24 18:51:33 +02:00
|
|
|
|
#include "ht.h"
|
2012-07-11 04:18:47 +02:00
|
|
|
|
#include "replaycache.h"
|
2012-12-04 21:58:18 +01:00
|
|
|
|
#include "crypto_curve25519.h"
|
2014-09-30 22:00:17 +02:00
|
|
|
|
#include "crypto_ed25519.h"
|
2013-03-22 19:25:34 +01:00
|
|
|
|
#include "tor_queue.h"
|
2015-07-31 17:21:34 +02:00
|
|
|
|
#include "util_format.h"
|
2007-08-19 04:56:16 +02:00
|
|
|
|
|
2011-04-15 05:04:39 +02:00
|
|
|
|
/* These signals are defined to help handle_control_signal work.
|
2005-06-28 01:35:04 +02:00
|
|
|
|
*/
|
|
|
|
|
#ifndef SIGHUP
|
|
|
|
|
#define SIGHUP 1
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef SIGINT
|
|
|
|
|
#define SIGINT 2
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef SIGUSR1
|
|
|
|
|
#define SIGUSR1 10
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef SIGUSR2
|
|
|
|
|
#define SIGUSR2 12
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef SIGTERM
|
|
|
|
|
#define SIGTERM 15
|
|
|
|
|
#endif
|
2006-03-09 01:18:16 +01:00
|
|
|
|
/* Controller signals start at a high number so we don't
|
|
|
|
|
* conflict with system-defined signals. */
|
|
|
|
|
#define SIGNEWNYM 129
|
2006-10-25 23:46:21 +02:00
|
|
|
|
#define SIGCLEARDNSCACHE 130
|
2014-11-02 18:14:58 +01:00
|
|
|
|
#define SIGHEARTBEAT 131
|
2005-06-28 01:35:04 +02:00
|
|
|
|
|
2005-02-22 05:26:45 +01:00
|
|
|
|
#if (SIZEOF_CELL_T != 0)
|
|
|
|
|
/* On Irix, stdlib.h defines a cell_t type, so we need to make sure
|
|
|
|
|
* that our stuff always calls cell_t something different. */
|
|
|
|
|
#define cell_t tor_cell_t
|
|
|
|
|
#endif
|
|
|
|
|
|
2011-11-24 01:58:15 +01:00
|
|
|
|
#ifdef ENABLE_TOR2WEB_MODE
|
|
|
|
|
#define NON_ANONYMOUS_MODE_ENABLED 1
|
|
|
|
|
#endif
|
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Length of longest allowable configured nickname. */
|
2004-04-05 02:47:48 +02:00
|
|
|
|
#define MAX_NICKNAME_LEN 19
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Length of a router identity encoded as a hexadecimal digest, plus
|
|
|
|
|
* possible dollar sign. */
|
2004-11-01 22:46:27 +01:00
|
|
|
|
#define MAX_HEX_NICKNAME_LEN (HEX_DIGEST_LEN+1)
|
2007-02-24 08:50:38 +01:00
|
|
|
|
/** Maximum length of verbose router identifier: dollar sign, hex ID digest,
|
|
|
|
|
* equal sign or tilde, nickname. */
|
2006-10-03 20:58:40 +02:00
|
|
|
|
#define MAX_VERBOSE_NICKNAME_LEN (1+HEX_DIGEST_LEN+1+MAX_NICKNAME_LEN)
|
|
|
|
|
|
2005-04-08 00:13:17 +02:00
|
|
|
|
/** Maximum size, in bytes, for resized buffers. */
|
2007-02-16 21:00:50 +01:00
|
|
|
|
#define MAX_BUF_SIZE ((1<<24)-1) /* 16MB-1 */
|
2007-02-24 08:50:38 +01:00
|
|
|
|
/** Maximum size, in bytes, for any directory object that we've downloaded. */
|
2007-02-16 21:00:50 +01:00
|
|
|
|
#define MAX_DIR_DL_SIZE MAX_BUF_SIZE
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** For HTTP parsing: Maximum number of bytes we'll accept in the headers
|
2007-02-24 08:50:38 +01:00
|
|
|
|
* of an HTTP request or response. */
|
2005-02-24 11:56:55 +01:00
|
|
|
|
#define MAX_HEADERS_SIZE 50000
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Maximum size, in bytes, for any directory object that we're accepting
|
|
|
|
|
* as an upload. */
|
2009-03-31 06:03:37 +02:00
|
|
|
|
#define MAX_DIR_UL_SIZE MAX_BUF_SIZE
|
2005-02-24 11:56:55 +01:00
|
|
|
|
|
2007-12-02 07:11:53 +01:00
|
|
|
|
/** Maximum size, in bytes, of a single router descriptor uploaded to us
|
|
|
|
|
* as a directory authority. Caches and clients fetch whatever descriptors
|
|
|
|
|
* the authorities tell them to fetch, and don't care about size. */
|
|
|
|
|
#define MAX_DESCRIPTOR_UPLOAD_SIZE 20000
|
|
|
|
|
|
|
|
|
|
/** Maximum size of a single extrainfo document, as above. */
|
|
|
|
|
#define MAX_EXTRAINFO_UPLOAD_SIZE 50000
|
|
|
|
|
|
2006-06-03 23:41:14 +02:00
|
|
|
|
/** How long do we keep DNS cache entries before purging them (regardless of
|
|
|
|
|
* their TTL)? */
|
2005-06-08 21:45:17 +02:00
|
|
|
|
#define MAX_DNS_ENTRY_AGE (30*60)
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** How long do we cache/tell clients to cache DNS records when no TTL is
|
|
|
|
|
* known? */
|
2006-06-03 23:41:14 +02:00
|
|
|
|
#define DEFAULT_DNS_TTL (30*60)
|
|
|
|
|
/** How long can a TTL be before we stop believing it? */
|
|
|
|
|
#define MAX_DNS_TTL (3*60*60)
|
2007-08-27 17:33:58 +02:00
|
|
|
|
/** How small can a TTL be before we stop believing it? Provides rudimentary
|
|
|
|
|
* pinning. */
|
2010-06-02 07:10:22 +02:00
|
|
|
|
#define MIN_DNS_TTL 60
|
2003-12-14 08:40:47 +01:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** How often do we rotate onion keys? */
|
2006-03-12 23:48:18 +01:00
|
|
|
|
#define MIN_ONION_KEY_LIFETIME (7*24*60*60)
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** How often do we rotate TLS contexts? */
|
2011-09-14 00:24:45 +02:00
|
|
|
|
#define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60)
|
2004-04-25 00:17:50 +02:00
|
|
|
|
|
2005-11-26 10:27:36 +01:00
|
|
|
|
/** How old do we allow a router to get before removing it
|
|
|
|
|
* from the router list? In seconds. */
|
2006-03-08 07:29:52 +01:00
|
|
|
|
#define ROUTER_MAX_AGE (60*60*48)
|
|
|
|
|
/** How old can a router get before we (as a server) will no longer
|
|
|
|
|
* consider it live? In seconds. */
|
2012-03-30 21:38:16 +02:00
|
|
|
|
#define ROUTER_MAX_AGE_TO_PUBLISH (60*60*24)
|
2006-10-20 01:04:56 +02:00
|
|
|
|
/** How old do we let a saved descriptor get before force-removing it? */
|
|
|
|
|
#define OLD_ROUTER_DESC_MAX_AGE (60*60*24*5)
|
2004-05-20 07:10:30 +02:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Possible rules for generating circuit IDs on an OR connection. */
|
2004-11-10 21:14:37 +01:00
|
|
|
|
typedef enum {
|
2007-02-16 21:00:50 +01:00
|
|
|
|
CIRC_ID_TYPE_LOWER=0, /**< Pick from 0..1<<15-1. */
|
2007-02-24 08:50:38 +01:00
|
|
|
|
CIRC_ID_TYPE_HIGHER=1, /**< Pick from 1<<15..1<<16-1. */
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** The other side of a connection is an OP: never create circuits to it,
|
|
|
|
|
* and let it use any circuit ID it wants. */
|
2007-02-12 22:39:33 +01:00
|
|
|
|
CIRC_ID_TYPE_NEITHER=2
|
2004-11-10 21:14:37 +01:00
|
|
|
|
} circ_id_type_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define circ_id_type_bitfield_t ENUM_BF(circ_id_type_t)
|
Integrated onion proxy into or/
The 'or' process can now be told (by the global_role variable) what
roles this server should play -- connect to all ORs, listen for ORs,
listen for OPs, listen for APs, or any combination.
* everything in /src/op/ is now obsolete.
* connection_ap.c now handles all interactions with application proxies
* "port" is now or_port, op_port, ap_port. But routers are still always
referenced (say, in conn_get_by_addr_port()) by addr / or_port. We
should make routers.c actually read these new ports (currently I've
kludged it so op_port = or_port+10, ap_port=or_port+20)
* circuits currently know if they're at the beginning of the path because
circ->cpath is set. They use this instead for crypts (both ways),
if it's set.
* I still obey the "send a 0 back to the AP when you're ready" protocol,
but I think we should phase it out. I can simply not read from the AP
socket until I'm ready.
I need to do a lot of cleanup work here, but the code appears to work, so
now's a good time for a checkin.
svn:r22
2002-07-02 11:36:58 +02:00
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CONN_TYPE_MIN_ 3
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Type for sockets listening for OR connections. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#define CONN_TYPE_OR_LISTENER 3
|
2005-06-11 08:07:22 +02:00
|
|
|
|
/** A bidirectional TLS connection transmitting a sequence of cells.
|
|
|
|
|
* May be from an OR to an OR, or from an OP to an OR. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#define CONN_TYPE_OR 4
|
2005-06-11 08:07:22 +02:00
|
|
|
|
/** A TCP connection from an onion router to a stream's destination. */
|
2002-06-30 09:37:49 +02:00
|
|
|
|
#define CONN_TYPE_EXIT 5
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Type for sockets listening for SOCKS connections. */
|
2002-06-30 09:37:49 +02:00
|
|
|
|
#define CONN_TYPE_AP_LISTENER 6
|
2005-06-11 08:07:22 +02:00
|
|
|
|
/** A SOCKS proxy connection from the user application to the onion
|
|
|
|
|
* proxy. */
|
2002-06-30 09:37:49 +02:00
|
|
|
|
#define CONN_TYPE_AP 7
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Type for sockets listening for HTTP connections to the directory server. */
|
2002-09-26 14:09:10 +02:00
|
|
|
|
#define CONN_TYPE_DIR_LISTENER 8
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Type for HTTP connections to the directory server. */
|
2002-09-26 14:09:10 +02:00
|
|
|
|
#define CONN_TYPE_DIR 9
|
2013-10-02 18:32:09 +02:00
|
|
|
|
/* Type 10 is unused. */
|
2006-03-18 10:29:05 +01:00
|
|
|
|
/** Type for listening for connections from user interface process. */
|
2007-03-05 03:40:58 +01:00
|
|
|
|
#define CONN_TYPE_CONTROL_LISTENER 11
|
2006-03-18 10:29:05 +01:00
|
|
|
|
/** Type for connections from user interface process. */
|
2007-03-05 03:40:58 +01:00
|
|
|
|
#define CONN_TYPE_CONTROL 12
|
2006-11-14 01:06:31 +01:00
|
|
|
|
/** Type for sockets listening for transparent connections redirected by pf or
|
|
|
|
|
* netfilter. */
|
2007-03-05 03:40:58 +01:00
|
|
|
|
#define CONN_TYPE_AP_TRANS_LISTENER 13
|
2006-11-14 01:06:31 +01:00
|
|
|
|
/** Type for sockets listening for transparent connections redirected by
|
|
|
|
|
* natd. */
|
2007-03-05 03:40:58 +01:00
|
|
|
|
#define CONN_TYPE_AP_NATD_LISTENER 14
|
2007-05-24 22:31:30 +02:00
|
|
|
|
/** Type for sockets listening for DNS requests. */
|
|
|
|
|
#define CONN_TYPE_AP_DNS_LISTENER 15
|
2012-03-16 14:40:44 +01:00
|
|
|
|
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** Type for connections from the Extended ORPort. */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
#define CONN_TYPE_EXT_OR 16
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** Type for sockets listening for Extended ORPort connections. */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
#define CONN_TYPE_EXT_OR_LISTENER 17
|
|
|
|
|
|
|
|
|
|
#define CONN_TYPE_MAX_ 17
|
|
|
|
|
/* !!!! If _CONN_TYPE_MAX is ever over 31, we must grow the type field in
|
2007-08-14 22:19:51 +02:00
|
|
|
|
* connection_t. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2009-06-19 01:59:18 +02:00
|
|
|
|
/* Proxy client types */
|
|
|
|
|
#define PROXY_NONE 0
|
|
|
|
|
#define PROXY_CONNECT 1
|
|
|
|
|
#define PROXY_SOCKS4 2
|
|
|
|
|
#define PROXY_SOCKS5 3
|
2014-10-26 04:43:55 +01:00
|
|
|
|
/* !!!! If there is ever a PROXY_* type over 3, we must grow the proxy_type
|
2011-07-03 06:13:41 +02:00
|
|
|
|
* field in or_connection_t */
|
2012-12-17 14:01:31 +01:00
|
|
|
|
|
|
|
|
|
/* Pluggable transport proxy type. Don't use this in or_connection_t,
|
|
|
|
|
* instead use the actual underlying proxy type (see above). */
|
2011-06-14 03:27:07 +02:00
|
|
|
|
#define PROXY_PLUGGABLE 4
|
2009-06-19 01:59:18 +02:00
|
|
|
|
|
|
|
|
|
/* Proxy client handshake states */
|
2011-06-21 18:49:04 +02:00
|
|
|
|
/* We use a proxy but we haven't even connected to it yet. */
|
2011-06-14 02:51:59 +02:00
|
|
|
|
#define PROXY_INFANT 1
|
|
|
|
|
/* We use an HTTP proxy and we've sent the CONNECT command. */
|
|
|
|
|
#define PROXY_HTTPS_WANT_CONNECT_OK 2
|
|
|
|
|
/* We use a SOCKS4 proxy and we've sent the CONNECT command. */
|
|
|
|
|
#define PROXY_SOCKS4_WANT_CONNECT_OK 3
|
|
|
|
|
/* We use a SOCKS5 proxy and we try to negotiate without
|
|
|
|
|
any authentication . */
|
|
|
|
|
#define PROXY_SOCKS5_WANT_AUTH_METHOD_NONE 4
|
|
|
|
|
/* We use a SOCKS5 proxy and we try to negotiate with
|
|
|
|
|
Username/Password authentication . */
|
|
|
|
|
#define PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929 5
|
|
|
|
|
/* We use a SOCKS5 proxy and we just sent our credentials. */
|
|
|
|
|
#define PROXY_SOCKS5_WANT_AUTH_RFC1929_OK 6
|
|
|
|
|
/* We use a SOCKS5 proxy and we just sent our CONNECT command. */
|
|
|
|
|
#define PROXY_SOCKS5_WANT_CONNECT_OK 7
|
|
|
|
|
/* We use a proxy and we CONNECTed successfully!. */
|
|
|
|
|
#define PROXY_CONNECTED 8
|
2009-06-19 01:59:18 +02:00
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** True iff <b>x</b> is an edge connection. */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
#define CONN_IS_EDGE(x) \
|
|
|
|
|
((x)->type == CONN_TYPE_EXIT || (x)->type == CONN_TYPE_AP)
|
2004-11-21 08:43:12 +01:00
|
|
|
|
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for any listener connection. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#define LISTENER_STATE_READY 0
|
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define OR_CONN_STATE_MIN_ 1
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for a connection to an OR: waiting for connect() to finish. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define OR_CONN_STATE_CONNECTING 1
|
2009-06-19 01:59:18 +02:00
|
|
|
|
/** State for a connection to an OR: waiting for proxy handshake to complete */
|
|
|
|
|
#define OR_CONN_STATE_PROXY_HANDSHAKING 2
|
2011-09-13 16:03:09 +02:00
|
|
|
|
/** State for an OR connection client: SSL is handshaking, not done
|
2008-02-08 22:13:15 +01:00
|
|
|
|
* yet. */
|
2009-06-19 01:59:18 +02:00
|
|
|
|
#define OR_CONN_STATE_TLS_HANDSHAKING 3
|
2008-02-08 22:13:15 +01:00
|
|
|
|
/** State for a connection to an OR: We're doing a second SSL handshake for
|
2011-09-13 16:03:09 +02:00
|
|
|
|
* renegotiation purposes. (V2 handshake only.) */
|
2009-06-19 01:59:18 +02:00
|
|
|
|
#define OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING 4
|
2008-02-08 22:13:15 +01:00
|
|
|
|
/** State for a connection at an OR: We're waiting for the client to
|
2011-09-13 16:03:09 +02:00
|
|
|
|
* renegotiate (to indicate a v2 handshake) or send a versions cell (to
|
|
|
|
|
* indicate a v3 handshake) */
|
2009-06-19 01:59:18 +02:00
|
|
|
|
#define OR_CONN_STATE_TLS_SERVER_RENEGOTIATING 5
|
2011-09-13 16:03:09 +02:00
|
|
|
|
/** State for an OR connection: We're done with our SSL handshake, we've done
|
|
|
|
|
* renegotiation, but we haven't yet negotiated link protocol versions and
|
|
|
|
|
* sent a netinfo cell. */
|
|
|
|
|
#define OR_CONN_STATE_OR_HANDSHAKING_V2 6
|
|
|
|
|
/** State for an OR connection: We're done with our SSL handshake, but we
|
|
|
|
|
* haven't yet negotiated link protocol versions, done a V3 handshake, and
|
|
|
|
|
* sent a netinfo cell. */
|
|
|
|
|
#define OR_CONN_STATE_OR_HANDSHAKING_V3 7
|
2011-10-11 04:24:33 +02:00
|
|
|
|
/** State for an OR connection: Ready to send/receive cells. */
|
2011-09-13 16:03:09 +02:00
|
|
|
|
#define OR_CONN_STATE_OPEN 8
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define OR_CONN_STATE_MAX_ 8
|
2003-09-27 09:33:07 +02:00
|
|
|
|
|
2012-12-05 17:38:42 +01:00
|
|
|
|
/** States of the Extended ORPort protocol. Be careful before changing
|
|
|
|
|
* the numbers: they matter. */
|
2012-03-24 06:05:48 +01:00
|
|
|
|
#define EXT_OR_CONN_STATE_MIN_ 1
|
2012-12-05 17:38:42 +01:00
|
|
|
|
/** Extended ORPort authentication is waiting for the authentication
|
|
|
|
|
* type selected by the client. */
|
|
|
|
|
#define EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE 1
|
|
|
|
|
/** Extended ORPort authentication is waiting for the client nonce. */
|
|
|
|
|
#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE 2
|
|
|
|
|
/** Extended ORPort authentication is waiting for the client hash. */
|
|
|
|
|
#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH 3
|
|
|
|
|
#define EXT_OR_CONN_STATE_AUTH_MAX 3
|
|
|
|
|
/** Authentication finished and the Extended ORPort is now accepting
|
|
|
|
|
* traffic. */
|
|
|
|
|
#define EXT_OR_CONN_STATE_OPEN 4
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** Extended ORPort is flushing its last messages and preparing to
|
|
|
|
|
* start accepting OR connections. */
|
2012-12-05 17:38:42 +01:00
|
|
|
|
#define EXT_OR_CONN_STATE_FLUSHING 5
|
|
|
|
|
#define EXT_OR_CONN_STATE_MAX_ 5
|
2012-03-16 14:40:44 +01:00
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define EXIT_CONN_STATE_MIN_ 1
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** State for an exit connection: waiting for response from DNS farm. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define EXIT_CONN_STATE_RESOLVING 1
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for an exit connection: waiting for connect() to finish. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define EXIT_CONN_STATE_CONNECTING 2
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for an exit connection: open and ready to transmit data. */
|
2003-09-27 09:33:07 +02:00
|
|
|
|
#define EXIT_CONN_STATE_OPEN 3
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for an exit connection: waiting to be removed. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define EXIT_CONN_STATE_RESOLVEFAILED 4
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define EXIT_CONN_STATE_MAX_ 4
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2007-02-24 08:50:38 +01:00
|
|
|
|
/* The AP state values must be disjoint from the EXIT state values. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define AP_CONN_STATE_MIN_ 5
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for a SOCKS connection: waiting for SOCKS request. */
|
2004-03-02 08:24:11 +01:00
|
|
|
|
#define AP_CONN_STATE_SOCKS_WAIT 5
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** State for a SOCKS connection: got a y.onion URL; waiting to receive
|
2006-03-18 10:29:05 +01:00
|
|
|
|
* rendezvous descriptor. */
|
2004-04-05 02:47:48 +02:00
|
|
|
|
#define AP_CONN_STATE_RENDDESC_WAIT 6
|
2005-03-12 05:22:01 +01:00
|
|
|
|
/** The controller will attach this connection to a circuit; it isn't our
|
|
|
|
|
* job to do so. */
|
|
|
|
|
#define AP_CONN_STATE_CONTROLLER_WAIT 7
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for a SOCKS connection: waiting for a completed circuit. */
|
2005-03-12 05:22:01 +01:00
|
|
|
|
#define AP_CONN_STATE_CIRCUIT_WAIT 8
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for a SOCKS connection: sent BEGIN, waiting for CONNECTED. */
|
2005-03-12 05:22:01 +01:00
|
|
|
|
#define AP_CONN_STATE_CONNECT_WAIT 9
|
2007-01-15 10:09:03 +01:00
|
|
|
|
/** State for a SOCKS connection: sent RESOLVE, waiting for RESOLVED. */
|
2005-03-12 05:22:01 +01:00
|
|
|
|
#define AP_CONN_STATE_RESOLVE_WAIT 10
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for a SOCKS connection: ready to send and receive. */
|
2005-03-12 05:22:01 +01:00
|
|
|
|
#define AP_CONN_STATE_OPEN 11
|
2006-11-14 01:06:31 +01:00
|
|
|
|
/** State for a transparent natd connection: waiting for original
|
|
|
|
|
* destination. */
|
|
|
|
|
#define AP_CONN_STATE_NATD_WAIT 12
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define AP_CONN_STATE_MAX_ 12
|
2004-04-01 23:32:01 +02:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** True iff the AP_CONN_STATE_* value <b>s</b> means that the corresponding
|
|
|
|
|
* edge connection is not attached to any circuit. */
|
2007-01-15 10:09:03 +01:00
|
|
|
|
#define AP_CONN_STATE_IS_UNATTACHED(s) \
|
|
|
|
|
((s) <= AP_CONN_STATE_CIRCUIT_WAIT || (s) == AP_CONN_STATE_NATD_WAIT)
|
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define DIR_CONN_STATE_MIN_ 1
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for connection to directory server: waiting for connect(). */
|
2004-03-31 00:57:49 +02:00
|
|
|
|
#define DIR_CONN_STATE_CONNECTING 1
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for connection to directory server: sending HTTP request. */
|
2004-03-31 00:57:49 +02:00
|
|
|
|
#define DIR_CONN_STATE_CLIENT_SENDING 2
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for connection to directory server: reading HTTP response. */
|
2004-03-31 00:57:49 +02:00
|
|
|
|
#define DIR_CONN_STATE_CLIENT_READING 3
|
2005-09-12 09:36:26 +02:00
|
|
|
|
/** State for connection to directory server: happy and finished. */
|
|
|
|
|
#define DIR_CONN_STATE_CLIENT_FINISHED 4
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for connection at directory server: waiting for HTTP request. */
|
2005-09-12 09:36:26 +02:00
|
|
|
|
#define DIR_CONN_STATE_SERVER_COMMAND_WAIT 5
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** State for connection at directory server: sending HTTP response. */
|
2005-09-12 09:36:26 +02:00
|
|
|
|
#define DIR_CONN_STATE_SERVER_WRITING 6
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define DIR_CONN_STATE_MAX_ 6
|
2004-03-31 00:57:49 +02:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** True iff the purpose of <b>conn</b> means that it's a server-side
|
|
|
|
|
* directory connection. */
|
2006-08-28 20:51:36 +02:00
|
|
|
|
#define DIR_CONN_IS_SERVER(conn) ((conn)->purpose == DIR_PURPOSE_SERVER)
|
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CONTROL_CONN_STATE_MIN_ 1
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** State for a control connection: Authenticated and accepting v1 commands. */
|
2007-03-04 22:08:28 +01:00
|
|
|
|
#define CONTROL_CONN_STATE_OPEN 1
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** State for a control connection: Waiting for authentication; speaking
|
|
|
|
|
* protocol v1. */
|
2007-03-04 22:08:28 +01:00
|
|
|
|
#define CONTROL_CONN_STATE_NEEDAUTH 2
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CONTROL_CONN_STATE_MAX_ 2
|
2004-11-03 02:32:26 +01:00
|
|
|
|
|
2014-02-12 14:36:08 +01:00
|
|
|
|
#define DIR_PURPOSE_MIN_ 4
|
|
|
|
|
/** A connection to a directory server: set after a v2 rendezvous
|
2004-05-10 08:52:01 +02:00
|
|
|
|
* descriptor is downloaded. */
|
2014-02-12 14:36:08 +01:00
|
|
|
|
#define DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 4
|
2005-11-19 11:12:10 +01:00
|
|
|
|
/** A connection to a directory server: download one or more server
|
2005-09-07 22:03:02 +02:00
|
|
|
|
* descriptors. */
|
|
|
|
|
#define DIR_PURPOSE_FETCH_SERVERDESC 6
|
2007-05-18 23:19:19 +02:00
|
|
|
|
/** A connection to a directory server: download one or more extra-info
|
|
|
|
|
* documents. */
|
|
|
|
|
#define DIR_PURPOSE_FETCH_EXTRAINFO 7
|
2005-11-19 11:12:10 +01:00
|
|
|
|
/** A connection to a directory server: upload a server descriptor. */
|
2007-05-18 23:19:19 +02:00
|
|
|
|
#define DIR_PURPOSE_UPLOAD_DIR 8
|
2007-07-26 00:56:44 +02:00
|
|
|
|
/** A connection to a directory server: upload a v3 networkstatus vote. */
|
|
|
|
|
#define DIR_PURPOSE_UPLOAD_VOTE 10
|
2007-07-29 04:55:21 +02:00
|
|
|
|
/** A connection to a directory server: upload a v3 consensus signature */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_UPLOAD_SIGNATURES 11
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** A connection to a directory server: download one or more v3 networkstatus
|
|
|
|
|
* votes. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_FETCH_STATUS_VOTE 12
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** A connection to a directory server: download a v3 detached signatures
|
|
|
|
|
* object for a consensus. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_FETCH_DETACHED_SIGNATURES 13
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** A connection to a directory server: download a v3 networkstatus
|
2008-12-17 16:04:43 +01:00
|
|
|
|
* consensus. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_FETCH_CONSENSUS 14
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** A connection to a directory server: download one or more directory
|
|
|
|
|
* authority certificates. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_FETCH_CERTIFICATE 15
|
2007-07-26 00:56:44 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Purpose for connection at a directory server. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
#define DIR_PURPOSE_SERVER 16
|
2007-10-29 20:10:42 +01:00
|
|
|
|
/** A connection to a hidden service directory server: upload a v2 rendezvous
|
|
|
|
|
* descriptor. */
|
|
|
|
|
#define DIR_PURPOSE_UPLOAD_RENDDESC_V2 17
|
|
|
|
|
/** A connection to a hidden service directory server: download a v2 rendezvous
|
|
|
|
|
* descriptor. */
|
|
|
|
|
#define DIR_PURPOSE_FETCH_RENDDESC_V2 18
|
2010-05-11 23:20:33 +02:00
|
|
|
|
/** A connection to a directory server: download a microdescriptor. */
|
|
|
|
|
#define DIR_PURPOSE_FETCH_MICRODESC 19
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define DIR_PURPOSE_MAX_ 19
|
2002-09-26 14:09:10 +02:00
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** True iff <b>p</b> is a purpose corresponding to uploading data to a
|
|
|
|
|
* directory server. */
|
2008-05-27 23:02:36 +02:00
|
|
|
|
#define DIR_PURPOSE_IS_UPLOAD(p) \
|
|
|
|
|
((p)==DIR_PURPOSE_UPLOAD_DIR || \
|
|
|
|
|
(p)==DIR_PURPOSE_UPLOAD_VOTE || \
|
|
|
|
|
(p)==DIR_PURPOSE_UPLOAD_SIGNATURES)
|
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define EXIT_PURPOSE_MIN_ 1
|
2006-09-25 07:59:13 +02:00
|
|
|
|
/** This exit stream wants to do an ordinary connect. */
|
2004-06-17 20:13:09 +02:00
|
|
|
|
#define EXIT_PURPOSE_CONNECT 1
|
2006-09-25 07:59:13 +02:00
|
|
|
|
/** This exit stream wants to do a resolve (either normal or reverse). */
|
2004-06-17 20:13:09 +02:00
|
|
|
|
#define EXIT_PURPOSE_RESOLVE 2
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define EXIT_PURPOSE_MAX_ 2
|
2004-06-17 20:13:09 +02:00
|
|
|
|
|
2009-01-06 22:28:48 +01:00
|
|
|
|
/* !!!! If any connection purpose is ever over 31, we must grow the type
|
2007-08-14 22:19:51 +02:00
|
|
|
|
* field in connection_t. */
|
|
|
|
|
|
2005-11-17 02:17:53 +01:00
|
|
|
|
/** Circuit state: I'm the origin, still haven't done all my handshakes. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_STATE_BUILDING 0
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Circuit state: Waiting to process the onionskin. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_STATE_ONIONSKIN_PENDING 1
|
2012-08-08 15:02:47 +02:00
|
|
|
|
/** Circuit state: I'd like to deliver a create, but my n_chan is still
|
2005-12-14 21:40:40 +01:00
|
|
|
|
* connecting. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
#define CIRCUIT_STATE_CHAN_WAIT 2
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Circuit state: onionskin(s) processed, ready to send/receive cells. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_STATE_OPEN 3
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_MIN_ 1
|
2004-04-05 02:47:48 +02:00
|
|
|
|
|
2004-03-30 00:14:19 +02:00
|
|
|
|
/* these circuits were initiated elsewhere */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_OR_MIN_ 1
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** OR-side circuit purpose: normal circuit, at OR. */
|
|
|
|
|
#define CIRCUIT_PURPOSE_OR 1
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** OR-side circuit purpose: At OR, from Bob, waiting for intro from Alices. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_INTRO_POINT 2
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** OR-side circuit purpose: At OR, from Alice, waiting for Bob. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_REND_POINT_WAITING 3
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** OR-side circuit purpose: At OR, both circuits have this purpose. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_REND_ESTABLISHED 4
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_OR_MAX_ 4
|
2004-04-05 02:47:48 +02:00
|
|
|
|
|
2004-03-30 21:52:42 +02:00
|
|
|
|
/* these circuits originate at this node */
|
2004-04-05 02:47:48 +02:00
|
|
|
|
|
|
|
|
|
/* here's how circ client-side purposes work:
|
|
|
|
|
* normal circuits are C_GENERAL.
|
|
|
|
|
* circuits that are c_introducing are either on their way to
|
2004-04-13 07:20:52 +02:00
|
|
|
|
* becoming open, or they are open and waiting for a
|
|
|
|
|
* suitable rendcirc before they send the intro.
|
|
|
|
|
* circuits that are c_introduce_ack_wait have sent the intro,
|
|
|
|
|
* but haven't gotten a response yet.
|
2004-04-05 02:47:48 +02:00
|
|
|
|
* circuits that are c_establish_rend are either on their way
|
|
|
|
|
* to becoming open, or they are open and have sent the
|
|
|
|
|
* establish_rendezvous cell but haven't received an ack.
|
2004-04-14 00:56:24 +02:00
|
|
|
|
* circuits that are c_rend_ready are open and have received a
|
|
|
|
|
* rend ack, but haven't heard from bob yet. if they have a
|
2004-04-05 02:47:48 +02:00
|
|
|
|
* buildstate->pending_final_cpath then they're expecting a
|
|
|
|
|
* cell from bob, else they're not.
|
2004-04-14 00:56:24 +02:00
|
|
|
|
* circuits that are c_rend_ready_intro_acked are open, and
|
|
|
|
|
* some intro circ has sent its intro and received an ack.
|
2004-04-05 02:47:48 +02:00
|
|
|
|
* circuits that are c_rend_joined are open, have heard from
|
|
|
|
|
* bob, and are talking to him.
|
|
|
|
|
*/
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Client-side circuit purpose: Normal circuit, with cpath. */
|
|
|
|
|
#define CIRCUIT_PURPOSE_C_GENERAL 5
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Client-side circuit purpose: at Alice, connecting to intro point. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_INTRODUCING 6
|
2005-12-14 21:40:40 +01:00
|
|
|
|
/** Client-side circuit purpose: at Alice, sent INTRODUCE1 to intro point,
|
|
|
|
|
* waiting for ACK/NAK. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Client-side circuit purpose: at Alice, introduced and acked, closing. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_INTRODUCE_ACKED 8
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Client-side circuit purpose: at Alice, waiting for ack. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_ESTABLISH_REND 9
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Client-side circuit purpose: at Alice, waiting for Bob. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_REND_READY 10
|
|
|
|
|
/** Client-side circuit purpose: at Alice, waiting for Bob, INTRODUCE
|
|
|
|
|
* has been acknowledged. */
|
|
|
|
|
#define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Client-side circuit purpose: at Alice, rendezvous established. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_REND_JOINED 12
|
2010-06-08 10:01:47 +02:00
|
|
|
|
/** This circuit is used for build time measurement only */
|
|
|
|
|
#define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT 13
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_C_MAX_ 13
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Hidden-service-side circuit purpose: at Bob, waiting for introductions. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 14
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Hidden-service-side circuit purpose: at Bob, successfully established
|
2004-05-10 12:27:54 +02:00
|
|
|
|
* intro. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_S_INTRO 15
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Hidden-service-side circuit purpose: at Bob, connecting to rend point. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_S_CONNECT_REND 16
|
2004-05-10 12:27:54 +02:00
|
|
|
|
/** Hidden-service-side circuit purpose: at Bob, rendezvous established. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_S_REND_JOINED 17
|
2005-02-27 10:47:01 +01:00
|
|
|
|
/** A testing circuit; not meant to be used for actual traffic. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_TESTING 18
|
2006-02-23 07:51:09 +01:00
|
|
|
|
/** A controller made this circuit and Tor should not use it. */
|
2010-06-08 10:01:47 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_CONTROLLER 19
|
2012-12-12 20:53:18 +01:00
|
|
|
|
/** This circuit is used for path bias probing only */
|
|
|
|
|
#define CIRCUIT_PURPOSE_PATH_BIAS_TESTING 20
|
|
|
|
|
#define CIRCUIT_PURPOSE_MAX_ 20
|
2007-10-12 09:57:29 +02:00
|
|
|
|
/** A catch-all for unrecognized purposes. Currently we don't expect
|
|
|
|
|
* to make or see any circuits with this purpose. */
|
|
|
|
|
#define CIRCUIT_PURPOSE_UNKNOWN 255
|
2004-03-30 00:14:19 +02:00
|
|
|
|
|
2005-11-17 02:17:53 +01:00
|
|
|
|
/** True iff the circuit purpose <b>p</b> is for a circuit that
|
|
|
|
|
* originated at this node. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>CIRCUIT_PURPOSE_OR_MAX_)
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** True iff the circuit purpose <b>p</b> is for a circuit that originated
|
|
|
|
|
* here to serve as a client. (Hidden services don't count here.) */
|
2009-05-23 05:33:44 +02:00
|
|
|
|
#define CIRCUIT_PURPOSE_IS_CLIENT(p) \
|
2012-10-12 18:22:13 +02:00
|
|
|
|
((p)> CIRCUIT_PURPOSE_OR_MAX_ && \
|
|
|
|
|
(p)<=CIRCUIT_PURPOSE_C_MAX_)
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** True iff the circuit_t <b>c</b> is actually an origin_circuit_t. */
|
2004-04-08 04:24:06 +02:00
|
|
|
|
#define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose))
|
2009-07-28 03:01:24 +02:00
|
|
|
|
/** True iff the circuit purpose <b>p</b> is for an established rendezvous
|
|
|
|
|
* circuit. */
|
|
|
|
|
#define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \
|
|
|
|
|
((p) == CIRCUIT_PURPOSE_C_REND_JOINED || \
|
|
|
|
|
(p) == CIRCUIT_PURPOSE_S_REND_JOINED)
|
2013-06-14 05:32:31 +02:00
|
|
|
|
/** True iff the circuit_t c is actually an or_circuit_t */
|
|
|
|
|
#define CIRCUIT_IS_ORCIRC(c) (((circuit_t *)(c))->magic == OR_CIRCUIT_MAGIC)
|
2004-04-08 04:24:06 +02:00
|
|
|
|
|
2006-12-10 09:04:50 +01:00
|
|
|
|
/** How many circuits do we want simultaneously in-progress to handle
|
|
|
|
|
* a given stream? */
|
|
|
|
|
#define MIN_CIRCUITS_HANDLING_STREAM 2
|
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/* These RELAY_COMMAND constants define values for relay cell commands, and
|
|
|
|
|
* must match those defined in tor-spec.txt. */
|
2003-05-01 08:42:29 +02:00
|
|
|
|
#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
|
2003-05-06 01:24:46 +02:00
|
|
|
|
#define RELAY_COMMAND_EXTEND 6
|
|
|
|
|
#define RELAY_COMMAND_EXTENDED 7
|
2003-06-12 12:16:33 +02:00
|
|
|
|
#define RELAY_COMMAND_TRUNCATE 8
|
|
|
|
|
#define RELAY_COMMAND_TRUNCATED 9
|
2003-11-17 01:57:56 +01:00
|
|
|
|
#define RELAY_COMMAND_DROP 10
|
2004-03-08 00:50:15 +01:00
|
|
|
|
#define RELAY_COMMAND_RESOLVE 11
|
|
|
|
|
#define RELAY_COMMAND_RESOLVED 12
|
2006-09-29 05:50:11 +02:00
|
|
|
|
#define RELAY_COMMAND_BEGIN_DIR 13
|
2012-12-05 22:47:22 +01:00
|
|
|
|
#define RELAY_COMMAND_EXTEND2 14
|
|
|
|
|
#define RELAY_COMMAND_EXTENDED2 15
|
major overhaul: dns slave subsystem, topics
on startup, it forks off a master dns handler, which forks off dns
slaves (like the apache model). slaves as spawned as load increases,
and then reused. excess slaves are not ever killed, currently.
implemented topics. each topic has a receive window in each direction
at each edge of the circuit, and sends sendme's at the data level, as
per before. each circuit also has receive windows in each direction at
each hop; an edge sends a circuit-level sendme as soon as enough data
cells have arrived (regardless of whether the data cells were flushed
to the exit conns). removed the 'connected' cell type, since it's now
a topic command within data cells.
at the edge of the circuit, there can be multiple connections associated
with a single circuit. you find them via the linked list conn->next_topic.
currently each new ap connection starts its own circuit, so we ought
to see comparable performance to what we had before. but that's only
because i haven't written the code to reattach to old circuits. please
try to break it as-is, and then i'll make it reuse the same circuit and
we'll try to break that.
svn:r152
2003-01-26 10:02:24 +01:00
|
|
|
|
|
2004-04-01 03:11:28 +02:00
|
|
|
|
#define RELAY_COMMAND_ESTABLISH_INTRO 32
|
|
|
|
|
#define RELAY_COMMAND_ESTABLISH_RENDEZVOUS 33
|
|
|
|
|
#define RELAY_COMMAND_INTRODUCE1 34
|
|
|
|
|
#define RELAY_COMMAND_INTRODUCE2 35
|
2004-04-13 02:38:16 +02:00
|
|
|
|
#define RELAY_COMMAND_RENDEZVOUS1 36
|
|
|
|
|
#define RELAY_COMMAND_RENDEZVOUS2 37
|
|
|
|
|
#define RELAY_COMMAND_INTRO_ESTABLISHED 38
|
|
|
|
|
#define RELAY_COMMAND_RENDEZVOUS_ESTABLISHED 39
|
|
|
|
|
#define RELAY_COMMAND_INTRODUCE_ACK 40
|
2004-04-01 03:11:28 +02:00
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/* Reasons why an OR connection is closed. */
|
2008-06-11 03:14:23 +02:00
|
|
|
|
#define END_OR_CONN_REASON_DONE 1
|
|
|
|
|
#define END_OR_CONN_REASON_REFUSED 2 /* connection refused */
|
|
|
|
|
#define END_OR_CONN_REASON_OR_IDENTITY 3
|
|
|
|
|
#define END_OR_CONN_REASON_CONNRESET 4 /* connection reset by peer */
|
|
|
|
|
#define END_OR_CONN_REASON_TIMEOUT 5
|
|
|
|
|
#define END_OR_CONN_REASON_NO_ROUTE 6 /* no route to host/net */
|
|
|
|
|
#define END_OR_CONN_REASON_IO_ERROR 7 /* read/write error */
|
|
|
|
|
#define END_OR_CONN_REASON_RESOURCE_LIMIT 8 /* sockets, buffers, etc */
|
2014-04-07 19:44:22 +02:00
|
|
|
|
#define END_OR_CONN_REASON_PT_MISSING 9 /* PT failed or not available */
|
|
|
|
|
#define END_OR_CONN_REASON_MISC 10
|
2007-01-15 22:13:37 +01:00
|
|
|
|
|
2006-11-17 04:34:58 +01:00
|
|
|
|
/* Reasons why we (or a remote OR) might close a stream. See tor-spec.txt for
|
2008-12-17 15:59:28 +01:00
|
|
|
|
* documentation of these. The values must match. */
|
2003-10-22 09:55:44 +02:00
|
|
|
|
#define END_STREAM_REASON_MISC 1
|
|
|
|
|
#define END_STREAM_REASON_RESOLVEFAILED 2
|
2005-03-01 23:16:15 +01:00
|
|
|
|
#define END_STREAM_REASON_CONNECTREFUSED 3
|
2003-10-22 09:55:44 +02:00
|
|
|
|
#define END_STREAM_REASON_EXITPOLICY 4
|
|
|
|
|
#define END_STREAM_REASON_DESTROY 5
|
|
|
|
|
#define END_STREAM_REASON_DONE 6
|
2004-02-29 00:56:50 +01:00
|
|
|
|
#define END_STREAM_REASON_TIMEOUT 7
|
2010-08-03 16:46:28 +02:00
|
|
|
|
#define END_STREAM_REASON_NOROUTE 8
|
2005-03-01 23:16:15 +01:00
|
|
|
|
#define END_STREAM_REASON_HIBERNATING 9
|
|
|
|
|
#define END_STREAM_REASON_INTERNAL 10
|
|
|
|
|
#define END_STREAM_REASON_RESOURCELIMIT 11
|
|
|
|
|
#define END_STREAM_REASON_CONNRESET 12
|
2005-03-01 23:42:31 +01:00
|
|
|
|
#define END_STREAM_REASON_TORPROTOCOL 13
|
2006-09-29 05:50:11 +02:00
|
|
|
|
#define END_STREAM_REASON_NOTDIRECTORY 14
|
2008-01-20 06:54:15 +01:00
|
|
|
|
#define END_STREAM_REASON_ENTRYPOLICY 15
|
2003-10-22 09:55:44 +02:00
|
|
|
|
|
2005-03-27 08:37:56 +02:00
|
|
|
|
/* These high-numbered end reasons are not part of the official spec,
|
|
|
|
|
* and are not intended to be put in relay end cells. They are here
|
|
|
|
|
* to be more informative when sending back socks replies to the
|
|
|
|
|
* application. */
|
2007-02-07 07:54:27 +01:00
|
|
|
|
/* XXXX 256 is no longer used; feel free to reuse it. */
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** We were unable to attach the connection to any circuit at all. */
|
|
|
|
|
/* XXXX the ways we use this one don't make a lot of sense. */
|
2005-03-27 08:37:56 +02:00
|
|
|
|
#define END_STREAM_REASON_CANT_ATTACH 257
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** We can't connect to any directories at all, so we killed our streams
|
|
|
|
|
* before they can time out. */
|
2005-03-27 08:37:56 +02:00
|
|
|
|
#define END_STREAM_REASON_NET_UNREACHABLE 258
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** This is a SOCKS connection, and the client used (or misused) the SOCKS
|
|
|
|
|
* protocol in a way we couldn't handle. */
|
2006-10-20 19:54:43 +02:00
|
|
|
|
#define END_STREAM_REASON_SOCKSPROTOCOL 259
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** This is a transparent proxy connection, but we can't extract the original
|
|
|
|
|
* target address:port. */
|
2006-11-14 01:06:31 +01:00
|
|
|
|
#define END_STREAM_REASON_CANT_FETCH_ORIG_DEST 260
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** This is a connection on the NATD port, and the destination IP:Port was
|
2007-02-24 08:50:38 +01:00
|
|
|
|
* either ill-formed or out-of-range. */
|
2006-11-14 01:06:31 +01:00
|
|
|
|
#define END_STREAM_REASON_INVALID_NATD_DEST 261
|
2011-01-26 02:39:44 +01:00
|
|
|
|
/** The target address is in a private network (like 127.0.0.1 or 10.0.0.1);
|
|
|
|
|
* you don't want to do that over a randomly chosen exit */
|
|
|
|
|
#define END_STREAM_REASON_PRIVATE_ADDR 262
|
2006-10-20 19:54:43 +02:00
|
|
|
|
|
2007-02-07 07:54:22 +01:00
|
|
|
|
/** Bitwise-and this value with endreason to mask out all flags. */
|
|
|
|
|
#define END_STREAM_REASON_MASK 511
|
|
|
|
|
|
2007-01-15 10:09:03 +01:00
|
|
|
|
/** Bitwise-or this with the argument to control_event_stream_status
|
|
|
|
|
* to indicate that the reason came from an END cell. */
|
2007-02-07 07:54:22 +01:00
|
|
|
|
#define END_STREAM_REASON_FLAG_REMOTE 512
|
|
|
|
|
/** Bitwise-or this with the argument to control_event_stream_status
|
|
|
|
|
* to indicate that we already sent a CLOSED stream event. */
|
|
|
|
|
#define END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED 1024
|
2007-02-07 07:54:27 +01:00
|
|
|
|
/** Bitwise-or this with endreason to indicate that we already sent
|
|
|
|
|
* a socks reply, and no further reply needs to be sent from
|
|
|
|
|
* connection_mark_unattached_ap(). */
|
|
|
|
|
#define END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED 2048
|
2005-03-27 08:37:56 +02:00
|
|
|
|
|
2007-02-23 21:13:02 +01:00
|
|
|
|
/** Reason for remapping an AP connection's address: we have a cached
|
|
|
|
|
* answer. */
|
|
|
|
|
#define REMAP_STREAM_SOURCE_CACHE 1
|
|
|
|
|
/** Reason for remapping an AP connection's address: the exit node told us an
|
|
|
|
|
* answer. */
|
|
|
|
|
#define REMAP_STREAM_SOURCE_EXIT 2
|
|
|
|
|
|
2007-02-24 08:50:38 +01:00
|
|
|
|
/* 'type' values to use in RESOLVED cells. Specified in tor-spec.txt. */
|
2005-03-02 20:26:46 +01:00
|
|
|
|
#define RESOLVED_TYPE_HOSTNAME 0
|
2004-06-17 20:13:09 +02:00
|
|
|
|
#define RESOLVED_TYPE_IPV4 4
|
|
|
|
|
#define RESOLVED_TYPE_IPV6 6
|
|
|
|
|
#define RESOLVED_TYPE_ERROR_TRANSIENT 0xF0
|
|
|
|
|
#define RESOLVED_TYPE_ERROR 0xF1
|
|
|
|
|
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE
|
|
|
|
|
* call; they only go to the controller for tracking */
|
2014-11-10 20:38:53 +01:00
|
|
|
|
|
|
|
|
|
/* Closing introduction point that were opened in parallel. */
|
|
|
|
|
#define END_CIRC_REASON_IP_NOW_REDUNDANT -4
|
|
|
|
|
|
2010-07-24 18:19:20 +02:00
|
|
|
|
/** Our post-timeout circuit time measurement period expired.
|
|
|
|
|
* We must give up now */
|
|
|
|
|
#define END_CIRC_REASON_MEASUREMENT_EXPIRED -3
|
|
|
|
|
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** We couldn't build a path for this circuit. */
|
2006-10-17 17:20:00 +02:00
|
|
|
|
#define END_CIRC_REASON_NOPATH -2
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** Catch-all "other" reason for closing origin circuits. */
|
2006-10-17 17:20:00 +02:00
|
|
|
|
#define END_CIRC_AT_ORIGIN -1
|
2006-10-20 01:04:49 +02:00
|
|
|
|
|
2006-11-17 04:34:58 +01:00
|
|
|
|
/* Reasons why we (or a remote OR) might close a circuit. See tor-spec.txt for
|
|
|
|
|
* documentation of these. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define END_CIRC_REASON_MIN_ 0
|
2006-01-05 22:23:03 +01:00
|
|
|
|
#define END_CIRC_REASON_NONE 0
|
|
|
|
|
#define END_CIRC_REASON_TORPROTOCOL 1
|
|
|
|
|
#define END_CIRC_REASON_INTERNAL 2
|
|
|
|
|
#define END_CIRC_REASON_REQUESTED 3
|
|
|
|
|
#define END_CIRC_REASON_HIBERNATING 4
|
|
|
|
|
#define END_CIRC_REASON_RESOURCELIMIT 5
|
|
|
|
|
#define END_CIRC_REASON_CONNECTFAILED 6
|
|
|
|
|
#define END_CIRC_REASON_OR_IDENTITY 7
|
2012-08-08 15:02:47 +02:00
|
|
|
|
#define END_CIRC_REASON_CHANNEL_CLOSED 8
|
2006-10-17 17:20:00 +02:00
|
|
|
|
#define END_CIRC_REASON_FINISHED 9
|
|
|
|
|
#define END_CIRC_REASON_TIMEOUT 10
|
|
|
|
|
#define END_CIRC_REASON_DESTROYED 11
|
|
|
|
|
#define END_CIRC_REASON_NOSUCHSERVICE 12
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define END_CIRC_REASON_MAX_ 12
|
2006-01-05 22:23:03 +01:00
|
|
|
|
|
2007-07-11 05:28:12 +02:00
|
|
|
|
/** Bitwise-OR this with the argument to circuit_mark_for_close() or
|
|
|
|
|
* control_event_circuit_status() to indicate that the reason was
|
|
|
|
|
* passed through from a destroy or truncate cell. */
|
2006-10-20 01:04:49 +02:00
|
|
|
|
#define END_CIRC_REASON_FLAG_REMOTE 512
|
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Length of 'y' portion of 'y.onion' URL. */
|
2007-11-29 16:25:04 +01:00
|
|
|
|
#define REND_SERVICE_ID_LEN_BASE32 16
|
|
|
|
|
|
2008-08-12 18:12:26 +02:00
|
|
|
|
/** Length of 'y.onion' including '.onion' URL. */
|
|
|
|
|
#define REND_SERVICE_ADDRESS_LEN (16+1+5)
|
|
|
|
|
|
2007-11-29 16:25:04 +01:00
|
|
|
|
/** Length of a binary-encoded rendezvous service ID. */
|
|
|
|
|
#define REND_SERVICE_ID_LEN 10
|
2004-04-01 23:32:01 +02:00
|
|
|
|
|
2007-10-28 20:48:14 +01:00
|
|
|
|
/** Time period for which a v2 descriptor will be valid. */
|
|
|
|
|
#define REND_TIME_PERIOD_V2_DESC_VALIDITY (24*60*60)
|
|
|
|
|
|
|
|
|
|
/** Time period within which two sets of v2 descriptors will be uploaded in
|
|
|
|
|
* parallel. */
|
|
|
|
|
#define REND_TIME_PERIOD_OVERLAPPING_V2_DESCS (60*60)
|
|
|
|
|
|
|
|
|
|
/** Number of non-consecutive replicas (i.e. distributed somewhere
|
|
|
|
|
* in the ring) for a descriptor. */
|
|
|
|
|
#define REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS 2
|
|
|
|
|
|
|
|
|
|
/** Number of consecutive replicas for a descriptor. */
|
|
|
|
|
#define REND_NUMBER_OF_CONSECUTIVE_REPLICAS 3
|
|
|
|
|
|
|
|
|
|
/** Length of v2 descriptor ID (32 base32 chars = 160 bits). */
|
2007-10-31 21:48:06 +01:00
|
|
|
|
#define REND_DESC_ID_V2_LEN_BASE32 32
|
2007-10-28 20:48:14 +01:00
|
|
|
|
|
2007-10-29 20:10:42 +01:00
|
|
|
|
/** Length of the base32-encoded secret ID part of versioned hidden service
|
|
|
|
|
* descriptors. */
|
|
|
|
|
#define REND_SECRET_ID_PART_LEN_BASE32 32
|
|
|
|
|
|
|
|
|
|
/** Length of the base32-encoded hash of an introduction point's
|
|
|
|
|
* identity key. */
|
|
|
|
|
#define REND_INTRO_POINT_ID_LEN_BASE32 32
|
|
|
|
|
|
2008-08-08 16:36:11 +02:00
|
|
|
|
/** Length of the descriptor cookie that is used for client authorization
|
|
|
|
|
* to hidden services. */
|
|
|
|
|
#define REND_DESC_COOKIE_LEN 16
|
|
|
|
|
|
|
|
|
|
/** Length of the base64-encoded descriptor cookie that is used for
|
|
|
|
|
* exchanging client authorization between hidden service and client. */
|
|
|
|
|
#define REND_DESC_COOKIE_LEN_BASE64 22
|
|
|
|
|
|
2008-08-19 17:41:28 +02:00
|
|
|
|
/** Length of client identifier in encrypted introduction points for hidden
|
|
|
|
|
* service authorization type 'basic'. */
|
|
|
|
|
#define REND_BASIC_AUTH_CLIENT_ID_LEN 4
|
|
|
|
|
|
|
|
|
|
/** Multiple of the number of clients to which the real number of clients
|
|
|
|
|
* is padded with fake clients for hidden service authorization type
|
|
|
|
|
* 'basic'. */
|
|
|
|
|
#define REND_BASIC_AUTH_CLIENT_MULTIPLE 16
|
|
|
|
|
|
|
|
|
|
/** Length of client entry consisting of client identifier and encrypted
|
|
|
|
|
* session key for hidden service authorization type 'basic'. */
|
|
|
|
|
#define REND_BASIC_AUTH_CLIENT_ENTRY_LEN (REND_BASIC_AUTH_CLIENT_ID_LEN \
|
|
|
|
|
+ CIPHER_KEY_LEN)
|
|
|
|
|
|
|
|
|
|
/** Maximum size of v2 hidden service descriptors. */
|
|
|
|
|
#define REND_DESC_MAX_SIZE (20 * 1024)
|
|
|
|
|
|
2008-08-08 16:36:11 +02:00
|
|
|
|
/** Legal characters for use in authorized client names for a hidden
|
|
|
|
|
* service. */
|
|
|
|
|
#define REND_LEGAL_CLIENTNAME_CHARACTERS \
|
|
|
|
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-_"
|
|
|
|
|
|
2008-08-09 17:13:28 +02:00
|
|
|
|
/** Maximum length of authorized client names for a hidden service. */
|
|
|
|
|
#define REND_CLIENTNAME_MAX_LEN 16
|
|
|
|
|
|
2008-09-24 16:44:29 +02:00
|
|
|
|
/** Length of the rendezvous cookie that is used to connect circuits at the
|
|
|
|
|
* rendezvous point. */
|
|
|
|
|
#define REND_COOKIE_LEN DIGEST_LEN
|
|
|
|
|
|
|
|
|
|
/** Client authorization type that a hidden service performs. */
|
|
|
|
|
typedef enum rend_auth_type_t {
|
|
|
|
|
REND_NO_AUTH = 0,
|
|
|
|
|
REND_BASIC_AUTH = 1,
|
|
|
|
|
REND_STEALTH_AUTH = 2,
|
|
|
|
|
} rend_auth_type_t;
|
|
|
|
|
|
|
|
|
|
/** Client-side configuration of authorization for a hidden service. */
|
|
|
|
|
typedef struct rend_service_authorization_t {
|
|
|
|
|
char descriptor_cookie[REND_DESC_COOKIE_LEN];
|
|
|
|
|
char onion_address[REND_SERVICE_ADDRESS_LEN+1];
|
|
|
|
|
rend_auth_type_t auth_type;
|
|
|
|
|
} rend_service_authorization_t;
|
|
|
|
|
|
|
|
|
|
/** Client- and server-side data that is used for hidden service connection
|
|
|
|
|
* establishment. Not all fields contain data depending on where this struct
|
|
|
|
|
* is used. */
|
|
|
|
|
typedef struct rend_data_t {
|
|
|
|
|
/** Onion address (without the .onion part) that a client requests. */
|
|
|
|
|
char onion_address[REND_SERVICE_ID_LEN_BASE32+1];
|
|
|
|
|
|
2015-04-28 17:01:58 +02:00
|
|
|
|
/** Descriptor ID for each replicas computed from the onion address. If
|
|
|
|
|
* the onion address is empty, this array MUST be empty. We keep them so
|
|
|
|
|
* we know when to purge our entry in the last hsdir request table. */
|
|
|
|
|
char descriptor_id[REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS][DIGEST_LEN];
|
|
|
|
|
|
2008-09-24 16:44:29 +02:00
|
|
|
|
/** (Optional) descriptor cookie that is used by a client. */
|
|
|
|
|
char descriptor_cookie[REND_DESC_COOKIE_LEN];
|
|
|
|
|
|
|
|
|
|
/** Authorization type for accessing a service used by a client. */
|
|
|
|
|
rend_auth_type_t auth_type;
|
|
|
|
|
|
2015-03-10 21:46:56 +01:00
|
|
|
|
/** Descriptor ID for a client request. The control port command HSFETCH
|
2015-04-28 17:01:58 +02:00
|
|
|
|
* uses this. It's set if the descriptor query should only use this
|
|
|
|
|
* descriptor ID. */
|
|
|
|
|
char desc_id_fetch[DIGEST_LEN];
|
2015-03-10 21:46:56 +01:00
|
|
|
|
|
2008-09-24 16:44:29 +02:00
|
|
|
|
/** Hash of the hidden service's PK used by a service. */
|
|
|
|
|
char rend_pk_digest[DIGEST_LEN];
|
|
|
|
|
|
|
|
|
|
/** Rendezvous cookie used by both, client and service. */
|
|
|
|
|
char rend_cookie[REND_COOKIE_LEN];
|
2015-04-30 18:28:11 +02:00
|
|
|
|
|
|
|
|
|
/** List of HSDir fingerprints on which this request has been sent to.
|
|
|
|
|
* This contains binary identity digest of the directory. */
|
|
|
|
|
smartlist_t *hsdirs_fp;
|
2015-05-20 19:33:59 +02:00
|
|
|
|
|
|
|
|
|
/** Number of streams associated with this rendezvous circuit. */
|
|
|
|
|
int nr_streams;
|
2008-09-24 16:44:29 +02:00
|
|
|
|
} rend_data_t;
|
|
|
|
|
|
2011-10-30 10:13:46 +01:00
|
|
|
|
/** Time interval for tracking replays of DH public keys received in
|
|
|
|
|
* INTRODUCE2 cells. Used only to avoid launching multiple
|
|
|
|
|
* simultaneous attempts to connect to the same rendezvous point. */
|
2011-10-30 12:41:16 +01:00
|
|
|
|
#define REND_REPLAY_TIME_INTERVAL (5 * 60)
|
2008-09-24 16:44:29 +02:00
|
|
|
|
|
2008-12-17 18:20:19 +01:00
|
|
|
|
/** Used to indicate which way a cell is going on a circuit. */
|
|
|
|
|
typedef enum {
|
|
|
|
|
CELL_DIRECTION_IN=1, /**< The cell is moving towards the origin. */
|
|
|
|
|
CELL_DIRECTION_OUT=2, /**< The cell is moving away from the origin. */
|
|
|
|
|
} cell_direction_t;
|
major overhaul: dns slave subsystem, topics
on startup, it forks off a master dns handler, which forks off dns
slaves (like the apache model). slaves as spawned as load increases,
and then reused. excess slaves are not ever killed, currently.
implemented topics. each topic has a receive window in each direction
at each edge of the circuit, and sends sendme's at the data level, as
per before. each circuit also has receive windows in each direction at
each hop; an edge sends a circuit-level sendme as soon as enough data
cells have arrived (regardless of whether the data cells were flushed
to the exit conns). removed the 'connected' cell type, since it's now
a topic command within data cells.
at the edge of the circuit, there can be multiple connections associated
with a single circuit. you find them via the linked list conn->next_topic.
currently each new ap connection starts its own circuit, so we ought
to see comparable performance to what we had before. but that's only
because i haven't written the code to reattach to old circuits. please
try to break it as-is, and then i'll make it reuse the same circuit and
we'll try to break that.
svn:r152
2003-01-26 10:02:24 +01:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Initial value for both sides of a circuit transmission window when the
|
|
|
|
|
* circuit is initialized. Measured in cells. */
|
major overhaul: dns slave subsystem, topics
on startup, it forks off a master dns handler, which forks off dns
slaves (like the apache model). slaves as spawned as load increases,
and then reused. excess slaves are not ever killed, currently.
implemented topics. each topic has a receive window in each direction
at each edge of the circuit, and sends sendme's at the data level, as
per before. each circuit also has receive windows in each direction at
each hop; an edge sends a circuit-level sendme as soon as enough data
cells have arrived (regardless of whether the data cells were flushed
to the exit conns). removed the 'connected' cell type, since it's now
a topic command within data cells.
at the edge of the circuit, there can be multiple connections associated
with a single circuit. you find them via the linked list conn->next_topic.
currently each new ap connection starts its own circuit, so we ought
to see comparable performance to what we had before. but that's only
because i haven't written the code to reattach to old circuits. please
try to break it as-is, and then i'll make it reuse the same circuit and
we'll try to break that.
svn:r152
2003-01-26 10:02:24 +01:00
|
|
|
|
#define CIRCWINDOW_START 1000
|
2011-01-15 19:39:27 +01:00
|
|
|
|
#define CIRCWINDOW_START_MIN 100
|
|
|
|
|
#define CIRCWINDOW_START_MAX 1000
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Amount to increment a circuit window when we get a circuit SENDME. */
|
major overhaul: dns slave subsystem, topics
on startup, it forks off a master dns handler, which forks off dns
slaves (like the apache model). slaves as spawned as load increases,
and then reused. excess slaves are not ever killed, currently.
implemented topics. each topic has a receive window in each direction
at each edge of the circuit, and sends sendme's at the data level, as
per before. each circuit also has receive windows in each direction at
each hop; an edge sends a circuit-level sendme as soon as enough data
cells have arrived (regardless of whether the data cells were flushed
to the exit conns). removed the 'connected' cell type, since it's now
a topic command within data cells.
at the edge of the circuit, there can be multiple connections associated
with a single circuit. you find them via the linked list conn->next_topic.
currently each new ap connection starts its own circuit, so we ought
to see comparable performance to what we had before. but that's only
because i haven't written the code to reattach to old circuits. please
try to break it as-is, and then i'll make it reuse the same circuit and
we'll try to break that.
svn:r152
2003-01-26 10:02:24 +01:00
|
|
|
|
#define CIRCWINDOW_INCREMENT 100
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Initial value on both sides of a stream transmission window when the
|
|
|
|
|
* stream is initialized. Measured in cells. */
|
2003-05-01 08:42:29 +02:00
|
|
|
|
#define STREAMWINDOW_START 500
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Amount to increment a stream window when we get a stream SENDME. */
|
2003-05-01 08:42:29 +02:00
|
|
|
|
#define STREAMWINDOW_INCREMENT 50
|
2002-07-18 08:37:58 +02:00
|
|
|
|
|
2013-06-14 05:32:31 +02:00
|
|
|
|
/** Maximum number of queued cells on a circuit for which we are the
|
|
|
|
|
* midpoint before we give up and kill it. This must be >= circwindow
|
2013-06-14 07:40:35 +02:00
|
|
|
|
* to avoid killing innocent circuits, and >= circwindow*2 to give
|
|
|
|
|
* leaky-pipe a chance of working someday. The ORCIRC_MAX_MIDDLE_KILL_THRESH
|
2013-06-14 05:32:31 +02:00
|
|
|
|
* ratio controls the margin of error between emitting a warning and
|
|
|
|
|
* killing the circuit.
|
|
|
|
|
*/
|
2013-06-14 07:40:35 +02:00
|
|
|
|
#define ORCIRC_MAX_MIDDLE_CELLS (CIRCWINDOW_START_MAX*2)
|
2013-06-14 05:32:31 +02:00
|
|
|
|
/** Ratio of hard (circuit kill) to soft (warning) thresholds for the
|
|
|
|
|
* ORCIRC_MAX_MIDDLE_CELLS tests.
|
|
|
|
|
*/
|
|
|
|
|
#define ORCIRC_MAX_MIDDLE_KILL_THRESH (1.1f)
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/* Cell commands. These values are defined in tor-spec.txt. */
|
2002-07-19 20:48:28 +02:00
|
|
|
|
#define CELL_PADDING 0
|
|
|
|
|
#define CELL_CREATE 1
|
2003-05-06 01:24:46 +02:00
|
|
|
|
#define CELL_CREATED 2
|
|
|
|
|
#define CELL_RELAY 3
|
|
|
|
|
#define CELL_DESTROY 4
|
2005-05-03 00:35:18 +02:00
|
|
|
|
#define CELL_CREATE_FAST 5
|
|
|
|
|
#define CELL_CREATED_FAST 6
|
2007-10-30 19:31:30 +01:00
|
|
|
|
#define CELL_VERSIONS 7
|
|
|
|
|
#define CELL_NETINFO 8
|
2008-01-13 01:20:47 +01:00
|
|
|
|
#define CELL_RELAY_EARLY 9
|
2012-12-05 22:47:22 +01:00
|
|
|
|
#define CELL_CREATE2 10
|
|
|
|
|
#define CELL_CREATED2 11
|
2002-07-19 20:48:28 +02:00
|
|
|
|
|
2011-09-13 16:03:09 +02:00
|
|
|
|
#define CELL_VPADDING 128
|
2011-10-31 09:33:38 +01:00
|
|
|
|
#define CELL_CERTS 129
|
2011-09-13 16:03:09 +02:00
|
|
|
|
#define CELL_AUTH_CHALLENGE 130
|
|
|
|
|
#define CELL_AUTHENTICATE 131
|
2011-10-27 02:19:29 +02:00
|
|
|
|
#define CELL_AUTHORIZE 132
|
2013-05-24 12:29:42 +02:00
|
|
|
|
#define CELL_COMMAND_MAX_ 132
|
2007-11-05 22:46:35 +01:00
|
|
|
|
|
2005-12-08 22:12:47 +01:00
|
|
|
|
/** How long to test reachability before complaining to the user. */
|
2006-03-12 23:48:18 +01:00
|
|
|
|
#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT (20*60)
|
2005-12-08 22:12:47 +01:00
|
|
|
|
|
2007-02-06 03:49:07 +01:00
|
|
|
|
/** Legal characters in a nickname. */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
#define LEGAL_NICKNAME_CHARACTERS \
|
|
|
|
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
2002-11-23 07:49:01 +01:00
|
|
|
|
|
2008-06-11 01:00:11 +02:00
|
|
|
|
/** Name to use in client TLS certificates if no nickname is given. Once
|
|
|
|
|
* Tor 0.1.2.x is obsolete, we can remove this. */
|
2004-11-09 19:22:17 +01:00
|
|
|
|
#define DEFAULT_CLIENT_NICKNAME "client"
|
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** Name chosen by routers that don't configure nicknames */
|
|
|
|
|
#define UNNAMED_ROUTER_NICKNAME "Unnamed"
|
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Number of bytes in a SOCKS4 header. */
|
2003-09-21 08:15:43 +02:00
|
|
|
|
#define SOCKS4_NETWORK_LEN 8
|
|
|
|
|
|
2003-12-16 10:48:17 +01:00
|
|
|
|
/*
|
|
|
|
|
* Relay payload:
|
|
|
|
|
* Relay command [1 byte]
|
2003-12-19 06:09:51 +01:00
|
|
|
|
* Recognized [2 bytes]
|
|
|
|
|
* Stream ID [2 bytes]
|
2003-12-16 10:48:17 +01:00
|
|
|
|
* Partial SHA-1 [4 bytes]
|
|
|
|
|
* Length [2 bytes]
|
2003-12-19 06:09:51 +01:00
|
|
|
|
* Relay payload [498 bytes]
|
2003-12-16 10:48:17 +01:00
|
|
|
|
*/
|
2003-04-16 19:44:33 +02:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Number of bytes in a cell, minus cell header. */
|
2003-12-16 10:48:17 +01:00
|
|
|
|
#define CELL_PAYLOAD_SIZE 509
|
2012-11-07 01:56:47 +01:00
|
|
|
|
/** Number of bytes in a cell transmitted over the network, in the longest
|
|
|
|
|
* form */
|
|
|
|
|
#define CELL_MAX_NETWORK_SIZE 514
|
2003-12-16 10:48:17 +01:00
|
|
|
|
|
2012-11-07 01:56:47 +01:00
|
|
|
|
/** Maximum length of a header on a variable-length cell. */
|
|
|
|
|
#define VAR_CELL_MAX_HEADER_SIZE 7
|
2007-11-05 22:46:35 +01:00
|
|
|
|
|
2013-02-09 06:56:53 +01:00
|
|
|
|
static int get_cell_network_size(int wide_circ_ids);
|
|
|
|
|
static INLINE int get_cell_network_size(int wide_circ_ids)
|
|
|
|
|
{
|
|
|
|
|
return wide_circ_ids ? CELL_MAX_NETWORK_SIZE : CELL_MAX_NETWORK_SIZE - 2;
|
|
|
|
|
}
|
|
|
|
|
static int get_var_cell_header_size(int wide_circ_ids);
|
|
|
|
|
static INLINE int get_var_cell_header_size(int wide_circ_ids)
|
|
|
|
|
{
|
|
|
|
|
return wide_circ_ids ? VAR_CELL_MAX_HEADER_SIZE :
|
|
|
|
|
VAR_CELL_MAX_HEADER_SIZE - 2;
|
|
|
|
|
}
|
|
|
|
|
static int get_circ_id_size(int wide_circ_ids);
|
|
|
|
|
static INLINE int get_circ_id_size(int wide_circ_ids)
|
|
|
|
|
{
|
|
|
|
|
return wide_circ_ids ? 4 : 2;
|
|
|
|
|
}
|
2007-11-05 22:46:35 +01:00
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Number of bytes in a relay cell's header (not including general cell
|
|
|
|
|
* header). */
|
2003-12-19 06:09:51 +01:00
|
|
|
|
#define RELAY_HEADER_SIZE (1+2+2+4+2)
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/** Largest number of bytes that can fit in a relay cell payload. */
|
2003-12-19 06:09:51 +01:00
|
|
|
|
#define RELAY_PAYLOAD_SIZE (CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE)
|
|
|
|
|
|
2008-07-23 17:58:30 +02:00
|
|
|
|
/** Identifies a circuit on an or_connection */
|
2012-11-07 01:56:47 +01:00
|
|
|
|
typedef uint32_t circid_t;
|
2008-07-23 17:58:30 +02:00
|
|
|
|
/** Identifies a stream on a circuit */
|
|
|
|
|
typedef uint16_t streamid_t;
|
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/* channel_t typedef; struct channel_s is in channel.h */
|
|
|
|
|
|
|
|
|
|
typedef struct channel_s channel_t;
|
|
|
|
|
|
2012-10-09 09:51:33 +02:00
|
|
|
|
/* channel_listener_t typedef; struct channel_listener_s is in channel.h */
|
|
|
|
|
|
|
|
|
|
typedef struct channel_listener_s channel_listener_t;
|
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/* channel states for channel_t */
|
|
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
|
/*
|
|
|
|
|
* Closed state - channel is inactive
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_STATE_OPENING
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_CLOSED = 0,
|
|
|
|
|
/*
|
|
|
|
|
* Opening state - channel is trying to connect
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_CLOSED
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_STATE_ERROR
|
|
|
|
|
* - CHANNEL_STATE_OPEN
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_OPENING,
|
|
|
|
|
/*
|
|
|
|
|
* Open state - channel is active and ready for use
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_MAINT
|
|
|
|
|
* - CHANNEL_STATE_OPENING
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_STATE_ERROR
|
|
|
|
|
* - CHANNEL_STATE_MAINT
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_OPEN,
|
|
|
|
|
/*
|
|
|
|
|
* Maintenance state - channel is temporarily offline for subclass specific
|
|
|
|
|
* maintenance activities such as TLS renegotiation.
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_OPEN
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_STATE_ERROR
|
|
|
|
|
* - CHANNEL_STATE_OPEN
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_MAINT,
|
|
|
|
|
/*
|
|
|
|
|
* Closing state - channel is shutting down
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_MAINT
|
|
|
|
|
* - CHANNEL_STATE_OPEN
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_STATE_CLOSED,
|
|
|
|
|
* - CHANNEL_STATE_ERROR
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_CLOSING,
|
|
|
|
|
/*
|
|
|
|
|
* Error state - channel has experienced a permanent error
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_STATE_MAINT
|
|
|
|
|
* - CHANNEL_STATE_OPENING
|
|
|
|
|
* - CHANNEL_STATE_OPEN
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - None
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_ERROR,
|
|
|
|
|
/*
|
|
|
|
|
* Placeholder for maximum state value
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_STATE_LAST
|
|
|
|
|
} channel_state_t;
|
|
|
|
|
|
2012-10-09 09:51:33 +02:00
|
|
|
|
/* channel listener states for channel_listener_t */
|
|
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
|
/*
|
|
|
|
|
* Closed state - channel listener is inactive
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_CLOSING
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_LISTENING
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_LISTENER_STATE_CLOSED = 0,
|
|
|
|
|
/*
|
|
|
|
|
* Listening state - channel listener is listening for incoming
|
|
|
|
|
* connections
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_CLOSED
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_ERROR
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_LISTENER_STATE_LISTENING,
|
|
|
|
|
/*
|
|
|
|
|
* Closing state - channel listener is shutting down
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_LISTENING
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_CLOSED,
|
|
|
|
|
* - CHANNEL_LISTENER_STATE_ERROR
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_LISTENER_STATE_CLOSING,
|
|
|
|
|
/*
|
|
|
|
|
* Error state - channel listener has experienced a permanent error
|
|
|
|
|
*
|
|
|
|
|
* Permitted transitions from:
|
|
|
|
|
* - CHANNEL_STATE_CLOSING
|
|
|
|
|
* - CHANNEL_STATE_LISTENING
|
|
|
|
|
* Permitted transitions to:
|
|
|
|
|
* - None
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_LISTENER_STATE_ERROR,
|
|
|
|
|
/*
|
|
|
|
|
* Placeholder for maximum state value
|
|
|
|
|
*/
|
|
|
|
|
CHANNEL_LISTENER_STATE_LAST
|
|
|
|
|
} channel_listener_state_t;
|
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/* TLS channel stuff */
|
|
|
|
|
|
|
|
|
|
typedef struct channel_tls_s channel_tls_t;
|
|
|
|
|
|
2012-09-21 23:45:32 +02:00
|
|
|
|
/* circuitmux_t typedef; struct circuitmux_s is in circuitmux.h */
|
|
|
|
|
|
|
|
|
|
typedef struct circuitmux_s circuitmux_t;
|
|
|
|
|
|
2005-11-17 02:17:53 +01:00
|
|
|
|
/** Parsed onion routing cell. All communication between nodes
|
|
|
|
|
* is via cells. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
typedef struct cell_t {
|
2008-07-23 17:58:30 +02:00
|
|
|
|
circid_t circ_id; /**< Circuit which received the cell. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
uint8_t command; /**< Type of the cell: one of CELL_PADDING, CELL_CREATE,
|
|
|
|
|
* CELL_DESTROY, etc */
|
2010-12-14 01:34:01 +01:00
|
|
|
|
uint8_t payload[CELL_PAYLOAD_SIZE]; /**< Cell body. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
} cell_t;
|
|
|
|
|
|
|
|
|
|
/** Parsed variable-length onion routing cell. */
|
|
|
|
|
typedef struct var_cell_t {
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Type of the cell: CELL_VERSIONS, etc. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
uint8_t command;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Circuit thich received the cell */
|
2008-07-23 17:58:30 +02:00
|
|
|
|
circid_t circ_id;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Number of bytes actually stored in <b>payload</b> */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
uint16_t payload_len;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Payload of this cell */
|
2011-01-06 21:59:05 +01:00
|
|
|
|
uint8_t payload[FLEXIBLE_ARRAY_MEMBER];
|
2007-11-05 22:46:35 +01:00
|
|
|
|
} var_cell_t;
|
2007-03-26 16:07:59 +02:00
|
|
|
|
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** A parsed Extended ORPort message. */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
typedef struct ext_or_cmd_t {
|
2012-03-24 06:05:48 +01:00
|
|
|
|
uint16_t cmd; /** Command type */
|
|
|
|
|
uint16_t len; /** Body length */
|
|
|
|
|
char body[FLEXIBLE_ARRAY_MEMBER]; /** Message body */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
} ext_or_cmd_t;
|
|
|
|
|
|
2007-04-10 01:15:46 +02:00
|
|
|
|
/** A cell as packed for writing to the network. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
typedef struct packed_cell_t {
|
2013-03-22 19:25:34 +01:00
|
|
|
|
/** Next cell queued on this circuit. */
|
|
|
|
|
TOR_SIMPLEQ_ENTRY(packed_cell_t) next;
|
2012-11-07 01:56:47 +01:00
|
|
|
|
char body[CELL_MAX_NETWORK_SIZE]; /**< Cell as packed for network. */
|
2013-11-07 18:15:30 +01:00
|
|
|
|
uint32_t inserted_time; /**< Time (in milliseconds since epoch, with high
|
|
|
|
|
* bits truncated) when this cell was inserted. */
|
2007-11-05 22:46:35 +01:00
|
|
|
|
} packed_cell_t;
|
2007-04-10 01:15:46 +02:00
|
|
|
|
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** A queue of cells on a circuit, waiting to be added to the
|
|
|
|
|
* or_connection_t's outbuf. */
|
2007-03-26 16:07:59 +02:00
|
|
|
|
typedef struct cell_queue_t {
|
2013-03-22 19:25:34 +01:00
|
|
|
|
/** Linked list of packed_cell_t*/
|
|
|
|
|
TOR_SIMPLEQ_HEAD(cell_simpleq, packed_cell_t) head;
|
2007-04-25 08:05:46 +02:00
|
|
|
|
int n; /**< The number of cells in the queue. */
|
2007-03-26 16:07:59 +02:00
|
|
|
|
} cell_queue_t;
|
2003-12-16 10:48:17 +01:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Beginning of a RELAY cell payload. */
|
2003-12-19 06:09:51 +01:00
|
|
|
|
typedef struct {
|
2004-05-10 08:52:01 +02:00
|
|
|
|
uint8_t command; /**< The end-to-end relay command. */
|
|
|
|
|
uint16_t recognized; /**< Used to tell whether cell is for us. */
|
2008-07-23 17:58:30 +02:00
|
|
|
|
streamid_t stream_id; /**< Which stream is this cell associated with? */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char integrity[4]; /**< Used to tell whether cell is corrupted. */
|
|
|
|
|
uint16_t length; /**< How long is the payload body? */
|
2003-12-19 06:09:51 +01:00
|
|
|
|
} relay_header_t;
|
2002-07-19 20:48:28 +02:00
|
|
|
|
|
2003-09-25 07:17:11 +02:00
|
|
|
|
typedef struct buf_t buf_t;
|
2003-11-11 03:41:31 +01:00
|
|
|
|
typedef struct socks_request_t socks_request_t;
|
2011-07-18 21:36:20 +02:00
|
|
|
|
#ifdef USE_BUFFEREVENTS
|
|
|
|
|
#define generic_buffer_t struct evbuffer
|
|
|
|
|
#else
|
|
|
|
|
#define generic_buffer_t buf_t
|
|
|
|
|
#endif
|
2003-09-25 07:17:11 +02:00
|
|
|
|
|
2015-01-03 21:58:30 +01:00
|
|
|
|
typedef struct entry_port_cfg_t {
|
|
|
|
|
/* Client port types (socks, dns, trans, natd) only: */
|
|
|
|
|
uint8_t isolation_flags; /**< Zero or more isolation flags */
|
|
|
|
|
int session_group; /**< A session group, or -1 if this port is not in a
|
|
|
|
|
* session group. */
|
|
|
|
|
|
|
|
|
|
/* Socks only: */
|
|
|
|
|
/** When both no-auth and user/pass are advertised by a SOCKS client, select
|
|
|
|
|
* no-auth. */
|
|
|
|
|
unsigned int socks_prefer_no_auth : 1;
|
2015-09-01 18:30:48 +02:00
|
|
|
|
/** When ISO_SOCKSAUTH is in use, Keep-Alive circuits indefinitely. */
|
|
|
|
|
unsigned int socks_iso_keep_alive : 1;
|
2015-01-03 21:58:30 +01:00
|
|
|
|
|
|
|
|
|
/* Client port types only: */
|
|
|
|
|
unsigned int ipv4_traffic : 1;
|
|
|
|
|
unsigned int ipv6_traffic : 1;
|
|
|
|
|
unsigned int prefer_ipv6 : 1;
|
|
|
|
|
|
|
|
|
|
/** For a socks listener: should we cache IPv4/IPv6 DNS information that
|
|
|
|
|
* exit nodes tell us?
|
|
|
|
|
*
|
|
|
|
|
* @{ */
|
|
|
|
|
unsigned int cache_ipv4_answers : 1;
|
|
|
|
|
unsigned int cache_ipv6_answers : 1;
|
|
|
|
|
/** @} */
|
|
|
|
|
/** For a socks listeners: if we find an answer in our client-side DNS cache,
|
|
|
|
|
* should we use it?
|
|
|
|
|
*
|
|
|
|
|
* @{ */
|
|
|
|
|
unsigned int use_cached_ipv4_answers : 1;
|
|
|
|
|
unsigned int use_cached_ipv6_answers : 1;
|
|
|
|
|
/** @} */
|
|
|
|
|
/** For socks listeners: When we can automap an address to IPv4 or IPv6,
|
|
|
|
|
* do we prefer IPv6? */
|
|
|
|
|
unsigned int prefer_ipv6_virtaddr : 1;
|
|
|
|
|
|
|
|
|
|
} entry_port_cfg_t;
|
|
|
|
|
|
|
|
|
|
typedef struct server_port_cfg_t {
|
|
|
|
|
/* Server port types (or, dir) only: */
|
|
|
|
|
unsigned int no_advertise : 1;
|
|
|
|
|
unsigned int no_listen : 1;
|
|
|
|
|
unsigned int all_addrs : 1;
|
|
|
|
|
unsigned int bind_ipv4_only : 1;
|
|
|
|
|
unsigned int bind_ipv6_only : 1;
|
|
|
|
|
} server_port_cfg_t;
|
|
|
|
|
|
2007-02-16 21:00:50 +01:00
|
|
|
|
/* Values for connection_t.magic: used to make sure that downcasts (casts from
|
|
|
|
|
* connection_t to foo_connection_t) are safe. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
#define BASE_CONNECTION_MAGIC 0x7C3C304Eu
|
|
|
|
|
#define OR_CONNECTION_MAGIC 0x7D31FF03u
|
|
|
|
|
#define EDGE_CONNECTION_MAGIC 0xF0374013u
|
2011-07-20 18:38:13 +02:00
|
|
|
|
#define ENTRY_CONNECTION_MAGIC 0xbb4a5703
|
2006-07-26 21:07:26 +02:00
|
|
|
|
#define DIR_CONNECTION_MAGIC 0x9988ffeeu
|
|
|
|
|
#define CONTROL_CONNECTION_MAGIC 0x8abc765du
|
2011-07-05 23:11:22 +02:00
|
|
|
|
#define LISTENER_CONNECTION_MAGIC 0x1a1ac741u
|
2005-06-11 08:07:22 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Description of a connection to another host or process, and associated
|
2005-06-11 08:07:22 +02:00
|
|
|
|
* data.
|
|
|
|
|
*
|
|
|
|
|
* A connection is named based on what it's connected to -- an "OR
|
2005-11-17 02:17:53 +01:00
|
|
|
|
* connection" has a Tor node on the other end, an "exit
|
2005-06-11 08:07:22 +02:00
|
|
|
|
* connection" has a website or other server on the other end, and an
|
|
|
|
|
* "AP connection" has an application proxy (and thus a user) on the
|
|
|
|
|
* other end.
|
|
|
|
|
*
|
|
|
|
|
* Every connection has a type and a state. Connections never change
|
|
|
|
|
* their type, but can go through many state changes in their lifetime.
|
|
|
|
|
*
|
|
|
|
|
* Every connection has two associated input and output buffers.
|
|
|
|
|
* Listeners don't use them. For non-listener connections, incoming
|
|
|
|
|
* data is appended to conn->inbuf, and outgoing data is taken from
|
|
|
|
|
* conn->outbuf. Connections differ primarily in the functions called
|
|
|
|
|
* to fill and drain these buffers.
|
|
|
|
|
*/
|
2006-07-27 07:03:57 +02:00
|
|
|
|
typedef struct connection_t {
|
|
|
|
|
uint32_t magic; /**< For memory debugging: must equal one of
|
|
|
|
|
* *_CONNECTION_MAGIC. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
uint8_t state; /**< Current state of this connection. */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
unsigned int type:5; /**< What kind of connection is this? */
|
2008-02-18 20:24:33 +01:00
|
|
|
|
unsigned int purpose:5; /**< Only used for DIR and EXIT types currently. */
|
2007-08-14 22:19:51 +02:00
|
|
|
|
|
|
|
|
|
/* The next fields are all one-bit booleans. Some are only applicable to
|
|
|
|
|
* connection subtypes, but we hold them here anyway, to save space.
|
|
|
|
|
*/
|
2008-02-18 20:24:33 +01:00
|
|
|
|
unsigned int read_blocked_on_bw:1; /**< Boolean: should we start reading
|
|
|
|
|
* again once the bandwidth throttler allows it? */
|
|
|
|
|
unsigned int write_blocked_on_bw:1; /**< Boolean: should we start writing
|
|
|
|
|
* again once the bandwidth throttler allows
|
2009-12-30 04:25:02 +01:00
|
|
|
|
* writes? */
|
2008-02-18 20:24:33 +01:00
|
|
|
|
unsigned int hold_open_until_flushed:1; /**< Despite this connection's being
|
2005-09-30 00:59:17 +02:00
|
|
|
|
* marked for close, do we flush it
|
2006-07-16 07:57:11 +02:00
|
|
|
|
* before closing it? */
|
2006-07-28 17:11:28 +02:00
|
|
|
|
unsigned int inbuf_reached_eof:1; /**< Boolean: did read() return 0 on this
|
|
|
|
|
* conn? */
|
2007-10-11 22:45:26 +02:00
|
|
|
|
/** Set to 1 when we're inside connection_flushed_some to keep us from
|
|
|
|
|
* calling connection_handle_write() recursively. */
|
|
|
|
|
unsigned int in_flushed_some:1;
|
2013-04-11 01:30:41 +02:00
|
|
|
|
/** True if connection_handle_write is currently running on this connection.
|
|
|
|
|
*/
|
|
|
|
|
unsigned int in_connection_handle_write:1;
|
2005-09-30 00:59:17 +02:00
|
|
|
|
|
2007-08-14 22:19:51 +02:00
|
|
|
|
/* For linked connections:
|
|
|
|
|
*/
|
|
|
|
|
unsigned int linked:1; /**< True if there is, or has been, a linked_conn. */
|
|
|
|
|
/** True iff we'd like to be notified about read events from the
|
|
|
|
|
* linked conn. */
|
|
|
|
|
unsigned int reading_from_linked_conn:1;
|
|
|
|
|
/** True iff we're willing to write to the linked conn. */
|
|
|
|
|
unsigned int writing_to_linked_conn:1;
|
|
|
|
|
/** True iff we're currently able to read on the linked conn, and our
|
|
|
|
|
* read_event should be made active with libevent. */
|
|
|
|
|
unsigned int active_on_link:1;
|
2007-10-12 00:19:18 +02:00
|
|
|
|
/** True iff we've called connection_close_immediate() on this linked
|
|
|
|
|
* connection. */
|
2007-10-11 22:45:26 +02:00
|
|
|
|
unsigned int linked_conn_is_closed:1;
|
2007-08-14 22:19:51 +02:00
|
|
|
|
|
2009-08-26 17:27:19 +02:00
|
|
|
|
/** CONNECT/SOCKS proxy client handshake state (for outgoing connections). */
|
|
|
|
|
unsigned int proxy_state:4;
|
|
|
|
|
|
2012-01-23 01:39:29 +01:00
|
|
|
|
/** Our socket; set to TOR_INVALID_SOCKET if this connection is closed,
|
|
|
|
|
* or has no socket. */
|
2011-05-23 06:17:48 +02:00
|
|
|
|
tor_socket_t s;
|
2006-07-27 07:03:57 +02:00
|
|
|
|
int conn_array_index; /**< Index into the global connection array. */
|
2009-07-31 17:11:45 +02:00
|
|
|
|
|
2006-07-16 07:57:11 +02:00
|
|
|
|
struct event *read_event; /**< Libevent event structure. */
|
|
|
|
|
struct event *write_event; /**< Libevent event structure. */
|
2004-05-10 12:27:54 +02:00
|
|
|
|
buf_t *inbuf; /**< Buffer holding data read over this connection. */
|
|
|
|
|
buf_t *outbuf; /**< Buffer holding data to write over this connection. */
|
2004-10-14 05:13:08 +02:00
|
|
|
|
size_t outbuf_flushlen; /**< How much data should we try to flush from the
|
|
|
|
|
* outbuf? */
|
2006-07-28 17:11:20 +02:00
|
|
|
|
time_t timestamp_lastread; /**< When was the last time libevent said we could
|
|
|
|
|
* read? */
|
2006-07-28 17:11:11 +02:00
|
|
|
|
time_t timestamp_lastwritten; /**< When was the last time libevent said we
|
2005-12-14 21:40:40 +01:00
|
|
|
|
* could write? */
|
2009-07-31 17:11:45 +02:00
|
|
|
|
|
|
|
|
|
#ifdef USE_BUFFEREVENTS
|
|
|
|
|
struct bufferevent *bufev; /**< A Libevent buffered IO structure. */
|
|
|
|
|
#endif
|
|
|
|
|
|
2004-05-10 10:56:42 +02:00
|
|
|
|
time_t timestamp_created; /**< When was this connection_t created? */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/* XXXX_IP6 make this IPv6-capable */
|
2007-06-08 23:14:58 +02:00
|
|
|
|
int socket_family; /**< Address family of this connection's socket. Usually
|
|
|
|
|
* AF_INET, but it can also be AF_UNIX, or in the future
|
|
|
|
|
* AF_INET6 */
|
2008-08-05 22:08:19 +02:00
|
|
|
|
tor_addr_t addr; /**< IP of the other side of the connection; used to
|
|
|
|
|
* identify routers, along with port. */
|
2008-11-24 03:02:48 +01:00
|
|
|
|
uint16_t port; /**< If non-zero, port on the other end
|
2003-09-05 08:04:03 +02:00
|
|
|
|
* of the connection. */
|
2005-12-14 22:03:51 +01:00
|
|
|
|
uint16_t marked_for_close; /**< Should we close this conn on the next
|
|
|
|
|
* iteration of the main loop? (If true, holds
|
|
|
|
|
* the line number where this connection was
|
2006-07-16 07:57:11 +02:00
|
|
|
|
* marked.) */
|
2005-12-14 22:03:51 +01:00
|
|
|
|
const char *marked_for_close_file; /**< For debugging: in which file were
|
|
|
|
|
* we marked for close? */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char *address; /**< FQDN (or IP) of the guy on the other end.
|
2008-08-03 07:35:42 +02:00
|
|
|
|
* strdup into this, because free_connection() frees it. */
|
2008-02-21 10:00:54 +01:00
|
|
|
|
/** Another connection that's connected to this one in lieu of a socket. */
|
2007-04-21 19:26:12 +02:00
|
|
|
|
struct connection_t *linked_conn;
|
2007-06-05 22:54:23 +02:00
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Unique identifier for this connection on this Tor instance. */
|
2008-08-15 15:55:01 +02:00
|
|
|
|
uint64_t global_identifier;
|
2013-02-06 14:15:32 +01:00
|
|
|
|
|
2013-05-24 12:01:32 +02:00
|
|
|
|
/** Bytes read since last call to control_event_conn_bandwidth_used().
|
|
|
|
|
* Only used if we're configured to emit CONN_BW events. */
|
|
|
|
|
uint32_t n_read_conn_bw;
|
2013-02-06 14:15:32 +01:00
|
|
|
|
|
2013-05-24 12:01:32 +02:00
|
|
|
|
/** Bytes written since last call to control_event_conn_bandwidth_used().
|
|
|
|
|
* Only used if we're configured to emit CONN_BW events. */
|
|
|
|
|
uint32_t n_written_conn_bw;
|
2011-07-05 23:11:22 +02:00
|
|
|
|
} connection_t;
|
|
|
|
|
|
2012-06-05 06:17:54 +02:00
|
|
|
|
/** Subtype of connection_t; used for a listener socket. */
|
2011-07-05 23:11:22 +02:00
|
|
|
|
typedef struct listener_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
connection_t base_;
|
2011-07-05 23:11:22 +02:00
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** If the connection is a CONN_TYPE_AP_DNS_LISTENER, this field points
|
2011-05-18 13:35:20 +02:00
|
|
|
|
* to the evdns_server_port it uses to listen to and answer connections. */
|
2007-05-24 22:31:30 +02:00
|
|
|
|
struct evdns_server_port *dns_server_port;
|
|
|
|
|
|
2015-01-03 21:58:30 +01:00
|
|
|
|
entry_port_cfg_t entry_cfg;
|
2012-11-25 19:18:26 +01:00
|
|
|
|
|
2011-07-05 23:11:22 +02:00
|
|
|
|
} listener_connection_t;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2011-09-13 17:38:38 +02:00
|
|
|
|
/** Minimum length of the random part of an AUTH_CHALLENGE cell. */
|
|
|
|
|
#define OR_AUTH_CHALLENGE_LEN 32
|
|
|
|
|
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/**
|
2011-10-31 09:33:38 +01:00
|
|
|
|
* @name Certificate types for CERTS cells.
|
2011-09-13 22:24:49 +02:00
|
|
|
|
*
|
|
|
|
|
* These values are defined by the protocol, and affect how an X509
|
2011-10-31 09:33:38 +01:00
|
|
|
|
* certificate in a CERTS cell is interpreted and used.
|
2011-09-13 22:24:49 +02:00
|
|
|
|
*
|
|
|
|
|
* @{ */
|
|
|
|
|
/** A certificate that authenticates a TLS link key. The subject key
|
|
|
|
|
* must match the key used in the TLS handshake; it must be signed by
|
|
|
|
|
* the identity key. */
|
|
|
|
|
#define OR_CERT_TYPE_TLS_LINK 1
|
|
|
|
|
/** A self-signed identity certificate. The subject key must be a
|
|
|
|
|
* 1024-bit RSA key. */
|
|
|
|
|
#define OR_CERT_TYPE_ID_1024 2
|
|
|
|
|
/** A certificate that authenticates a key used in an AUTHENTICATE cell
|
|
|
|
|
* in the v3 handshake. The subject key must be a 1024-bit RSA key; it
|
|
|
|
|
* must be signed by the identity key */
|
|
|
|
|
#define OR_CERT_TYPE_AUTH_1024 3
|
2015-05-28 16:47:42 +02:00
|
|
|
|
/** DOCDOC */
|
|
|
|
|
#define OR_CERT_TYPE_RSA_ED_CROSSCERT 7
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/**@}*/
|
|
|
|
|
|
|
|
|
|
/** The one currently supported type of AUTHENTICATE cell. It contains
|
|
|
|
|
* a bunch of structures signed with an RSA1024 key. The signed
|
|
|
|
|
* structures include a HMAC using negotiated TLS secrets, and a digest
|
|
|
|
|
* of all cells sent or received before the AUTHENTICATE cell (including
|
|
|
|
|
* the random server-generated AUTH_CHALLENGE cell).
|
|
|
|
|
*/
|
|
|
|
|
#define AUTHTYPE_RSA_SHA256_TLSSECRET 1
|
|
|
|
|
|
|
|
|
|
/** The length of the part of the AUTHENTICATE cell body that the client and
|
|
|
|
|
* server can generate independently (when using RSA_SHA256_TLSSECRET). It
|
|
|
|
|
* contains everything except the client's timestamp, the client's randomly
|
|
|
|
|
* generated nonce, and the signature. */
|
|
|
|
|
#define V3_AUTH_FIXED_PART_LEN (8+(32*6))
|
|
|
|
|
/** The length of the part of the AUTHENTICATE cell body that the client
|
|
|
|
|
* signs. */
|
|
|
|
|
#define V3_AUTH_BODY_LEN (V3_AUTH_FIXED_PART_LEN + 8 + 16)
|
|
|
|
|
|
2011-09-13 17:38:38 +02:00
|
|
|
|
/** Stores flags and information related to the portion of a v2/v3 Tor OR
|
2008-02-11 02:09:24 +01:00
|
|
|
|
* connection handshake that happens after the TLS handshake is finished.
|
|
|
|
|
*/
|
2007-11-05 19:15:44 +01:00
|
|
|
|
typedef struct or_handshake_state_t {
|
2008-02-11 02:09:24 +01:00
|
|
|
|
/** When was the VERSIONS cell sent on this connection? Used to get
|
|
|
|
|
* an estimate of the skew in the returning NETINFO reply. */
|
2007-11-05 19:15:44 +01:00
|
|
|
|
time_t sent_versions_at;
|
2008-02-11 02:09:24 +01:00
|
|
|
|
/** True iff we originated this connection */
|
2007-11-05 19:15:47 +01:00
|
|
|
|
unsigned int started_here : 1;
|
2008-02-11 02:09:24 +01:00
|
|
|
|
/** True iff we have received and processed a VERSIONS cell. */
|
2007-11-05 19:15:44 +01:00
|
|
|
|
unsigned int received_versions : 1;
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/** True iff we have received and processed an AUTH_CHALLENGE cell */
|
|
|
|
|
unsigned int received_auth_challenge : 1;
|
2011-10-31 09:33:38 +01:00
|
|
|
|
/** True iff we have received and processed a CERTS cell. */
|
|
|
|
|
unsigned int received_certs_cell : 1;
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/** True iff we have received and processed an AUTHENTICATE cell */
|
|
|
|
|
unsigned int received_authenticate : 1;
|
2011-09-13 17:38:38 +02:00
|
|
|
|
|
2011-09-27 19:15:36 +02:00
|
|
|
|
/* True iff we've received valid authentication to some identity. */
|
|
|
|
|
unsigned int authenticated : 1;
|
|
|
|
|
|
2013-08-20 20:52:56 +02:00
|
|
|
|
/* True iff we have sent a netinfo cell */
|
|
|
|
|
unsigned int sent_netinfo : 1;
|
|
|
|
|
|
2011-09-28 16:31:56 +02:00
|
|
|
|
/** True iff we should feed outgoing cells into digest_sent and
|
|
|
|
|
* digest_received respectively.
|
|
|
|
|
*
|
|
|
|
|
* From the server's side of the v3 handshake, we want to capture everything
|
|
|
|
|
* from the VERSIONS cell through and including the AUTH_CHALLENGE cell.
|
|
|
|
|
* From the client's, we want to capture everything from the VERSIONS cell
|
|
|
|
|
* through but *not* including the AUTHENTICATE cell.
|
|
|
|
|
*
|
|
|
|
|
* @{ */
|
|
|
|
|
unsigned int digest_sent_data : 1;
|
|
|
|
|
unsigned int digest_received_data : 1;
|
|
|
|
|
/**@}*/
|
|
|
|
|
|
2011-09-27 19:15:36 +02:00
|
|
|
|
/** Identity digest that we have received and authenticated for our peer
|
|
|
|
|
* on this connection. */
|
|
|
|
|
uint8_t authenticated_peer_id[DIGEST_LEN];
|
|
|
|
|
|
2011-09-13 17:38:38 +02:00
|
|
|
|
/** Digests of the cells that we have sent or received as part of a V3
|
|
|
|
|
* handshake. Used for making and checking AUTHENTICATE cells.
|
|
|
|
|
*
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_digest_t *digest_sent;
|
|
|
|
|
crypto_digest_t *digest_received;
|
2011-09-13 17:38:38 +02:00
|
|
|
|
/** @} */
|
|
|
|
|
|
2011-10-31 09:33:38 +01:00
|
|
|
|
/** Certificates that a connection initiator sent us in a CERTS cell; we're
|
2011-09-13 22:24:49 +02:00
|
|
|
|
* holding on to them until we get an AUTHENTICATE cell.
|
|
|
|
|
*
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
|
|
|
|
/** The cert for the key that's supposed to sign the AUTHENTICATE cell */
|
2014-09-30 14:31:08 +02:00
|
|
|
|
tor_x509_cert_t *auth_cert;
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/** A self-signed identity certificate */
|
2014-09-30 14:31:08 +02:00
|
|
|
|
tor_x509_cert_t *id_cert;
|
2011-09-13 22:24:49 +02:00
|
|
|
|
/**@}*/
|
2007-11-05 19:15:44 +01:00
|
|
|
|
} or_handshake_state_t;
|
|
|
|
|
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** Length of Extended ORPort connection identifier. */
|
|
|
|
|
#define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */
|
2013-10-29 10:13:53 +01:00
|
|
|
|
/*
|
|
|
|
|
* OR_CONN_HIGHWATER and OR_CONN_LOWWATER moved from connection_or.c so
|
|
|
|
|
* channeltls.c can see them too.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/** When adding cells to an OR connection's outbuf, keep adding until the
|
|
|
|
|
* outbuf is at least this long, or we run out of cells. */
|
|
|
|
|
#define OR_CONN_HIGHWATER (32*1024)
|
|
|
|
|
|
|
|
|
|
/** Add cells to an OR connection's outbuf whenever the outbuf's data length
|
|
|
|
|
* drops below this size. */
|
|
|
|
|
#define OR_CONN_LOWWATER (16*1024)
|
2012-03-16 14:40:44 +01:00
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Subtype of connection_t for an "OR connection" -- that is, one that speaks
|
|
|
|
|
* cells over TLS. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
typedef struct or_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
connection_t base_;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2007-02-24 02:12:53 +01:00
|
|
|
|
/** Hash of the public RSA key for the other side's identity key, or zeroes
|
|
|
|
|
* if the other side hasn't shown us a valid identity key. */
|
2007-02-12 22:39:33 +01:00
|
|
|
|
char identity_digest[DIGEST_LEN];
|
2013-08-14 16:00:56 +02:00
|
|
|
|
|
2012-03-24 06:05:48 +01:00
|
|
|
|
/** Extended ORPort connection identifier. */
|
|
|
|
|
char *ext_or_conn_id;
|
2013-08-14 16:00:56 +02:00
|
|
|
|
/** This is the ClientHash value we expect to receive from the
|
|
|
|
|
* client during the Extended ORPort authentication protocol. We
|
|
|
|
|
* compute it upon receiving the ClientNoce from the client, and we
|
|
|
|
|
* compare it with the acual ClientHash value sent by the
|
|
|
|
|
* client. */
|
2012-12-05 17:38:42 +01:00
|
|
|
|
char *ext_or_auth_correct_client_hash;
|
2013-06-27 16:50:56 +02:00
|
|
|
|
/** String carrying the name of the pluggable transport
|
|
|
|
|
* (e.g. "obfs2") that is obfuscating this connection. If no
|
|
|
|
|
* pluggable transports are used, it's NULL. */
|
2013-02-11 20:45:17 +01:00
|
|
|
|
char *ext_or_transport;
|
2012-12-05 17:38:42 +01:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char *nickname; /**< Nickname of OR on other side (if any). */
|
2003-09-05 08:04:03 +02:00
|
|
|
|
|
2007-03-20 04:21:51 +01:00
|
|
|
|
tor_tls_t *tls; /**< TLS connection state. */
|
|
|
|
|
int tls_error; /**< Last tor_tls error code. */
|
2007-07-30 00:13:44 +02:00
|
|
|
|
/** When we last used this conn for any client traffic. If not
|
|
|
|
|
* recent, we can rate limit it further. */
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/* Channel using this connection */
|
|
|
|
|
channel_tls_t *chan;
|
|
|
|
|
|
2008-08-05 22:08:19 +02:00
|
|
|
|
tor_addr_t real_addr; /**< The actual address that this connection came from
|
2008-02-12 21:20:52 +01:00
|
|
|
|
* or went to. The <b>addr</b> field is prone to
|
|
|
|
|
* getting overridden by the address from the router
|
|
|
|
|
* descriptor matching <b>identity_digest</b>. */
|
2007-10-30 19:31:30 +01:00
|
|
|
|
|
2008-02-12 21:20:52 +01:00
|
|
|
|
/** Should this connection be used for extending circuits to the server
|
|
|
|
|
* matching the <b>identity_digest</b> field? Set to true if we're pretty
|
|
|
|
|
* sure we aren't getting MITMed, either because we're connected to an
|
|
|
|
|
* address listed in a server descriptor, or because an authenticated
|
|
|
|
|
* NETINFO cell listed the address we're connected to as recognized. */
|
|
|
|
|
unsigned int is_canonical:1;
|
Add channel.c/channel.h for bug 6465
Note: this is a squashed commit; see branch bug6465_rebased_v2 of user/andrea/tor.git for full history of the following 90 commits:
Add channel.c/channel.h for bug 6465
Fix make check-spaces in new channel.c/channel.h
Make sure new channel.h is in nodist_HEADERS and Makefile.nmake is up to date too
Add channel_state_t and state utility functions
Add channel_change_state()
Better comments in channel.h
Add CHANNEL_STATE_LISTENING for channel_t
Fix wide line in channel.c
Add structures/prototypes for incoming cell handling
Implement channel_queue_cell() and channel_queue_var_cell()
Implement channel_process_cells()
Fix asserts in channel_queue_cell() and channel_queue_var_cell()
Add descriptive comments for channel_queue_cell() and channel_queue_var_cell()
Implement channel cell handler getters/setters
Queue outgoing writes when not in writeable state
Drain queues and test assertions when changing channel_t state
Add log_debug() messages for channel_t stuff
Add log_debug() messages for channel_t stuff
Add some channel_t metadata
Add time_t client_used to channel_t
Add channel_touched_by_client()
Declare a few channel_t metadata queries we'll have to implement later for use by circuitbuild.c
Add next_circ_id/circ_id_type to channel_t for use by circuitbuild.c
Count n_circuits in channel_t
Channel timestamp calls
Add create timestamp for channel.h
Declare some new metadata queries on channel_t
Add get_real_remote_descr() prototype
Move active_circuits stuff to channel_t, some other or.h and channel.h changes
Make channel_t refcounted and use global lists of active channels
Update channel_request_close() and channel_change_state() for channel_t registration mechanism
Handle closing channels sensibly
Add global_identifier for channels, channel_init() internal use function
Add timestamp_last_added_nonpadding to channel_t
Better comments in channel_init()
Correctly handle next_circ_id in channel_init()
Correctly handle next_circ_id in channel_init() and even compile this time
Appease make check-spaces
Update timestamps when writing cells to channel_t
Add channel_flush_some_cells() to call channel_flush_from_first_active_circuit()
Add registered channel lookup functions
Get rid of client_used in or_connection_t; it's in channel_t now
Get rid of circ_id_type in or_connection_t; implement channel_set_circ_id_type()
Eliminate is_bad_for_new_circs in or_connection_t; implement getter/setter for it in channel_t
Eliminate next_circ_id in or_connection_t in favor of channel_t
Handle packed cells in channel_t for relay.c
Add channel_identity_map and related functions
Handle add/remove from channel identity map on state transitions
Implement channel_is_local() and channel_mark_local()
Implement channel_is_client() and channel_mark_client()
Implement channel_is_outgoing() and channel_mark_outgoing()
Eliminate declaration for redundant channel_nonopen_was_started_here()
Add channel timestamps
Add channel timestamps, fix some make-check-spaces complaints
Remove redundant channel_was_started_here() function and initiated_remotely bit
Rename channel_get_remote_descr()/channel_get_real_remote_descr() to something clearer in channel.h
Replace channel_get_write_queue_len() with sufficient and easier to implement channel_has_queued_writes() in channel.h
Change return type of channel_is_bad_for_new_circs() to int for consistency
Implement channel_has_queued_writes()
Rename channel_touched_by_client() and client_used field for consistency with other timestamps in channel.{c,h}
Implement channel_get_actual_remote_descr() and channel_get_canonical_remote_descr() in channel.{c,h}
Implement channel_matches_extend_info() in channel.{c,h}
Implement channel_get_for_extend() and channel_is_better() in channel.{c,h}
Make channel_is_better() public in channel.{c,h}
Implement channel_matches_target_addr_for_extend() in channel.{c,h}
Implement channel_is_canonical_is_reliable() in channel.{c,h}
Demoronize get_remote_descr() method prototype - what the hell was I thinking there?
Timestamp channels in the right places in channel.c
Add missing tor_assert() in channel.c
Check if the lower layer accepted a cell in channel_write_cell() et al. of channel.c
Implement channel_flush_cells() in channel.c (w00t, it builds at last)
Call channel_timestamp_drained() at the right places in channel.c
Implement channel_run_cleanup()
Support optional channel_get_remote_addr() method and use it for GeoIP in channel_do_open_actions()
Get rid of channel refcounting; it'll be too complicated to handle it properly with all the pointers from circuits to channels, and closing from channel_run_cleanup() will work okay just like with connections
Doxygenate channel.c
Appease make check-spaces in channel.c
Fix superfluous semicolons in channel.c
Add/remove channels from identity digest map in all the right places in channel.c
The cell queues on channel_t must be empty when going to a CLOSED or ERROR state
Appease make check-spaces in channel.c
Add channel_clear/set_identity_digest() and some better logging to channel.{c,h}
Fix better logging to channel.c
Avoid SIGSEGV testing for queue emptiness in channel_flush_some_cells_from_outgoing_queue()
Remove TODO about checking cell queue in channel_free(); no need for it
Appease make check-spaces in channel.c
Add channel_free_all() and support functions
Check nullness of active_circuit_pqueue in channel_free()
Fix SMARTLIST_FOREACH_END usage in channel_process_cells()
Rearrange channel_t struct to use a union distinguishing listener from cell-bearing channels in channel.{c,h}
2012-07-31 06:49:39 +02:00
|
|
|
|
|
2011-10-23 23:27:56 +02:00
|
|
|
|
/** True iff we have decided that the other end of this connection
|
|
|
|
|
* is a client. Connections with this flag set should never be used
|
|
|
|
|
* to satisfy an EXTEND request. */
|
|
|
|
|
unsigned int is_connection_with_client:1;
|
2011-10-23 23:58:00 +02:00
|
|
|
|
/** True iff this is an outgoing connection. */
|
|
|
|
|
unsigned int is_outgoing:1;
|
2011-07-03 06:13:41 +02:00
|
|
|
|
unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */
|
2012-11-07 01:56:47 +01:00
|
|
|
|
unsigned int wide_circ_ids:1;
|
2014-03-27 20:58:43 +01:00
|
|
|
|
/** True iff this connection has had its bootstrap failure logged with
|
|
|
|
|
* control_event_bootstrap_problem. */
|
|
|
|
|
unsigned int have_noted_bootstrap_problem:1;
|
|
|
|
|
|
2013-03-11 17:34:14 +01:00
|
|
|
|
uint16_t link_proto; /**< What protocol version are we using? 0 for
|
|
|
|
|
* "none negotiated yet." */
|
2014-04-09 17:13:37 +02:00
|
|
|
|
uint16_t idle_timeout; /**< How long can this connection sit with no
|
|
|
|
|
* circuits on it before we close it? Based on
|
|
|
|
|
* IDLE_CIRCUIT_TIMEOUT_{NON,}CANONICAL and
|
|
|
|
|
* on is_canonical, randomized. */
|
2008-02-11 02:09:24 +01:00
|
|
|
|
or_handshake_state_t *handshake_state; /**< If we are setting this connection
|
|
|
|
|
* up, state information to do so. */
|
2012-12-05 03:27:07 +01:00
|
|
|
|
|
2006-07-28 17:11:20 +02:00
|
|
|
|
time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/
|
|
|
|
|
|
2009-12-30 04:25:02 +01:00
|
|
|
|
/* bandwidth* and *_bucket only used by ORs in OPEN state: */
|
2006-06-07 11:18:53 +02:00
|
|
|
|
int bandwidthrate; /**< Bytes/s added to the bucket. (OPEN ORs only.) */
|
|
|
|
|
int bandwidthburst; /**< Max bucket size for this conn. (OPEN ORs only.) */
|
2010-02-22 19:59:34 +01:00
|
|
|
|
#ifndef USE_BUFFEREVENTS
|
2006-12-13 08:08:36 +01:00
|
|
|
|
int read_bucket; /**< When this hits 0, stop receiving. Every second we
|
|
|
|
|
* add 'bandwidthrate' to this, capping it at
|
|
|
|
|
* bandwidthburst. (OPEN ORs only) */
|
2009-12-30 04:25:02 +01:00
|
|
|
|
int write_bucket; /**< When this hits 0, stop writing. Like read_bucket. */
|
2010-02-22 19:59:34 +01:00
|
|
|
|
#else
|
2012-06-05 00:50:13 +02:00
|
|
|
|
/** A rate-limiting configuration object to determine how this connection
|
|
|
|
|
* set its read- and write- limits. */
|
2010-02-22 19:59:34 +01:00
|
|
|
|
/* XXXX we could share this among all connections. */
|
|
|
|
|
struct ev_token_bucket_cfg *bucket_cfg;
|
|
|
|
|
#endif
|
2007-03-26 16:08:35 +02:00
|
|
|
|
|
2006-07-26 21:07:26 +02:00
|
|
|
|
struct or_connection_t *next_with_same_id; /**< Next connection with same
|
2007-03-20 03:55:31 +01:00
|
|
|
|
* identity digest as this one. */
|
2013-05-25 12:21:09 +02:00
|
|
|
|
/** Last emptied read token bucket in msec since midnight; only used if
|
|
|
|
|
* TB_EMPTY events are enabled. */
|
2013-02-06 14:26:11 +01:00
|
|
|
|
uint32_t read_emptied_time;
|
2013-05-25 12:21:09 +02:00
|
|
|
|
/** Last emptied write token bucket in msec since midnight; only used if
|
|
|
|
|
* TB_EMPTY events are enabled. */
|
2013-02-06 14:26:11 +01:00
|
|
|
|
uint32_t write_emptied_time;
|
2013-11-05 09:30:02 +01:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Count the number of bytes flushed out on this orconn, and the number of
|
|
|
|
|
* bytes TLS actually sent - used for overhead estimation for scheduling.
|
|
|
|
|
*/
|
|
|
|
|
uint64_t bytes_xmitted, bytes_xmitted_by_tls;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
} or_connection_t;
|
|
|
|
|
|
2011-07-20 18:38:13 +02:00
|
|
|
|
/** Subtype of connection_t for an "edge connection" -- that is, an entry (ap)
|
2006-07-27 07:03:57 +02:00
|
|
|
|
* connection, or an exit. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
typedef struct edge_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
connection_t base_;
|
2004-04-01 23:32:01 +02:00
|
|
|
|
|
2006-07-26 21:07:26 +02:00
|
|
|
|
struct edge_connection_t *next_stream; /**< Points to the next stream at this
|
2006-07-27 07:03:57 +02:00
|
|
|
|
* edge, if any */
|
|
|
|
|
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? */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
|
2006-07-26 21:07:26 +02:00
|
|
|
|
struct circuit_t *on_circuit; /**< The circuit (if any) that this edge
|
|
|
|
|
* connection is using. */
|
|
|
|
|
|
2011-07-20 18:55:42 +02:00
|
|
|
|
/** A pointer to which node in the circ this conn exits at. Set for AP
|
|
|
|
|
* connections and for hidden service exit connections. */
|
|
|
|
|
struct crypt_path_t *cpath_layer;
|
|
|
|
|
/** What rendezvous service are we querying for (if an AP) or providing (if
|
|
|
|
|
* an exit)? */
|
|
|
|
|
rend_data_t *rend_data;
|
|
|
|
|
|
2006-07-26 21:07:26 +02:00
|
|
|
|
uint32_t address_ttl; /**< TTL for address-to-addr mapping on exit
|
|
|
|
|
* connection. Exit connections only. */
|
2012-10-25 05:39:28 +02:00
|
|
|
|
uint32_t begincell_flags; /** Flags sent or received in the BEGIN cell
|
|
|
|
|
* for this connection */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2008-07-23 17:58:30 +02:00
|
|
|
|
streamid_t stream_id; /**< The stream ID used for this edge connection on its
|
|
|
|
|
* circuit */
|
2006-07-27 07:03:57 +02:00
|
|
|
|
|
2006-10-20 19:54:48 +02:00
|
|
|
|
/** The reason why this connection is closing; passed to the controller. */
|
|
|
|
|
uint16_t end_reason;
|
|
|
|
|
|
2007-02-14 17:46:55 +01:00
|
|
|
|
/** Bytes read since last call to control_event_stream_bandwidth_used() */
|
2007-02-14 17:46:49 +01:00
|
|
|
|
uint32_t n_read;
|
|
|
|
|
|
2007-02-14 17:46:55 +01:00
|
|
|
|
/** Bytes written since last call to control_event_stream_bandwidth_used() */
|
2007-02-14 17:46:49 +01:00
|
|
|
|
uint32_t n_written;
|
|
|
|
|
|
2011-07-20 18:55:42 +02:00
|
|
|
|
/** True iff this connection is for a DNS request only. */
|
|
|
|
|
unsigned int is_dns_request:1;
|
2012-11-14 21:20:28 +01:00
|
|
|
|
/** True iff this connection is for a PTR DNS request. (exit only) */
|
Revise the DNS subsystem to handle IPv6 exits.
Now, every cached_resolve_t can remember an IPv4 result *and* an IPv6
result. As a light protection against timing-based distinguishers for
IPv6 users (and against complexity!), every forward request generates
an IPv4 *and* an IPv6 request, assuming that we're an IPv6 exit. Once
we have answers or errors for both, we act accordingly.
This patch additionally makes some useful refactorings in the dns.c
code, though there is quite a bit more of useful refactoring that could
be done.
Additionally, have a new interface for the argument passed to the
evdns_callback function. Previously, it was just the original address
we were resolving. But it turns out that, on error, evdns doesn't
tell you the type of the query, so on a failure we didn't know whether
IPv4 or IPv6 queries were failing.
The new convention is to have the first byte of that argument include
the query type. I've refactored the code a bit to make that simpler.
2012-11-05 19:26:29 +01:00
|
|
|
|
unsigned int is_reverse_dns_lookup:1;
|
2011-07-20 18:55:42 +02:00
|
|
|
|
|
|
|
|
|
unsigned int edge_has_sent_end:1; /**< For debugging; only used on edge
|
|
|
|
|
* connections. Set once we've set the stream end,
|
|
|
|
|
* and check in connection_about_to_close_connection().
|
|
|
|
|
*/
|
|
|
|
|
/** True iff we've blocked reading until the circuit has fewer queued
|
|
|
|
|
* cells. */
|
|
|
|
|
unsigned int edge_blocked_on_circ:1;
|
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/** Unique ID for directory requests; this used to be in connection_t, but
|
|
|
|
|
* that's going away and being used on channels instead. We still tag
|
|
|
|
|
* edge connections with dirreq_id from circuits, so it's copied here. */
|
|
|
|
|
uint64_t dirreq_id;
|
2011-07-20 18:55:42 +02:00
|
|
|
|
} edge_connection_t;
|
|
|
|
|
|
|
|
|
|
/** Subtype of edge_connection_t for an "entry connection" -- that is, a SOCKS
|
|
|
|
|
* connection, a DNS request, a TransPort connection or a NATD connection */
|
|
|
|
|
typedef struct entry_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
edge_connection_t edge_;
|
2011-07-20 18:55:42 +02:00
|
|
|
|
|
|
|
|
|
/** Nickname of planned exit node -- used with .exit support. */
|
|
|
|
|
char *chosen_exit_name;
|
|
|
|
|
|
|
|
|
|
socks_request_t *socks_request; /**< SOCKS structure describing request (AP
|
|
|
|
|
* only.) */
|
2006-08-14 08:03:26 +02:00
|
|
|
|
|
2011-07-06 22:03:47 +02:00
|
|
|
|
/* === Isolation related, AP only. === */
|
2015-01-03 22:11:23 +01:00
|
|
|
|
entry_port_cfg_t entry_cfg;
|
2011-07-06 22:39:54 +02:00
|
|
|
|
/** AP only: The newnym epoch in which we created this connection. */
|
|
|
|
|
unsigned nym_epoch;
|
2015-01-03 22:11:23 +01:00
|
|
|
|
|
2011-07-08 21:15:59 +02:00
|
|
|
|
/** AP only: The original requested address before we rewrote it. */
|
|
|
|
|
char *original_dest_address;
|
2011-07-06 22:03:47 +02:00
|
|
|
|
/* Other fields to isolate on already exist. The ClientAddr is addr. The
|
|
|
|
|
ClientProtocol is a combination of type and socks_request->
|
2011-07-19 08:36:59 +02:00
|
|
|
|
socks_version. SocksAuth is socks_request->username/password.
|
|
|
|
|
DestAddr is in socks_request->address. */
|
2011-07-06 22:03:47 +02:00
|
|
|
|
|
2006-08-14 08:03:26 +02:00
|
|
|
|
/** Number of times we've reassigned this application connection to
|
|
|
|
|
* a new circuit. We keep track because the timeout is longer if we've
|
|
|
|
|
* already retried several times. */
|
|
|
|
|
uint8_t num_socks_retries;
|
|
|
|
|
|
2011-07-20 18:55:42 +02:00
|
|
|
|
/** For AP connections only: buffer for data that we have sent
|
|
|
|
|
* optimistically, which we might need to re-send if we have to
|
|
|
|
|
* retry this connection. */
|
|
|
|
|
generic_buffer_t *pending_optimistic_data;
|
|
|
|
|
/* For AP connections only: buffer for data that we previously sent
|
|
|
|
|
* optimistically which we are currently re-sending as we retry this
|
|
|
|
|
* connection. */
|
|
|
|
|
generic_buffer_t *sending_optimistic_data;
|
|
|
|
|
|
|
|
|
|
/** If this is a DNSPort connection, this field holds the pending DNS
|
|
|
|
|
* request that we're going to try to answer. */
|
|
|
|
|
struct evdns_server_request *dns_server_request;
|
|
|
|
|
|
2011-04-27 04:18:01 +02:00
|
|
|
|
#define NUM_CIRCUITS_LAUNCHED_THRESHOLD 10
|
|
|
|
|
/** Number of times we've launched a circuit to handle this stream. If
|
|
|
|
|
* it gets too high, that could indicate an inconsistency between our
|
|
|
|
|
* "launch a circuit to handle this stream" logic and our "attach our
|
|
|
|
|
* stream to one of the available circuits" logic. */
|
|
|
|
|
unsigned int num_circuits_launched:4;
|
|
|
|
|
|
2007-10-28 19:29:29 +01:00
|
|
|
|
/** True iff this stream must attach to a one-hop circuit (e.g. for
|
|
|
|
|
* begin_dir). */
|
2008-02-25 00:39:53 +01:00
|
|
|
|
unsigned int want_onehop:1;
|
2007-10-28 19:29:29 +01:00
|
|
|
|
/** True iff this stream should use a BEGIN_DIR relay command to establish
|
|
|
|
|
* itself rather than BEGIN (either via onehop or via a whole circuit). */
|
2008-02-25 00:39:53 +01:00
|
|
|
|
unsigned int use_begindir:1;
|
2007-10-28 09:16:19 +01:00
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** For AP connections only. If 1, and we fail to reach the chosen exit,
|
|
|
|
|
* stop requiring it. */
|
|
|
|
|
unsigned int chosen_exit_optional:1;
|
|
|
|
|
/** For AP connections only. If non-zero, this exit node was picked as
|
|
|
|
|
* a result of the TrackHostExit, and the value decrements every time
|
|
|
|
|
* we fail to complete a circuit to our chosen exit -- if it reaches
|
|
|
|
|
* zero, abandon the associated mapaddress. */
|
|
|
|
|
unsigned int chosen_exit_retries:3;
|
|
|
|
|
|
2011-01-26 02:39:44 +01:00
|
|
|
|
/** True iff this is an AP connection that came from a transparent or
|
|
|
|
|
* NATd connection */
|
|
|
|
|
unsigned int is_transparent_ap:1;
|
|
|
|
|
|
2011-07-18 21:38:05 +02:00
|
|
|
|
/** For AP connections only: Set if this connection's target exit node
|
2011-07-20 17:02:39 +02:00
|
|
|
|
* allows optimistic data (that is, data sent on this stream before
|
|
|
|
|
* the exit has sent a CONNECTED cell) and we have chosen to use it.
|
|
|
|
|
*/
|
|
|
|
|
unsigned int may_use_optimistic_data : 1;
|
2011-07-18 19:56:22 +02:00
|
|
|
|
|
2014-08-11 21:27:04 +02:00
|
|
|
|
/** Are we a socks SocksSocket listener? */
|
|
|
|
|
unsigned int is_socks_socket:1;
|
2011-07-20 18:38:13 +02:00
|
|
|
|
} entry_connection_t;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2012-12-18 20:45:12 +01:00
|
|
|
|
typedef enum {
|
|
|
|
|
DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP,
|
|
|
|
|
DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP,
|
|
|
|
|
DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS,
|
|
|
|
|
DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */
|
|
|
|
|
} dir_spool_source_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
|
2012-12-18 20:45:12 +01:00
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Subtype of connection_t for an "directory connection" -- that is, an HTTP
|
|
|
|
|
* connection to retrieve or serve directory material. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
typedef struct dir_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
connection_t base_;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2010-05-11 23:20:33 +02:00
|
|
|
|
/** Which 'resource' did we ask the directory for? This is typically the part
|
|
|
|
|
* of the URL string that defines, relative to the directory conn purpose,
|
|
|
|
|
* what thing we want. For example, in router descriptor downloads by
|
|
|
|
|
* descriptor digest, it contains "d/", then one ore more +-separated
|
|
|
|
|
* fingerprints.
|
|
|
|
|
**/
|
|
|
|
|
char *requested_resource;
|
2006-07-17 08:35:06 +02:00
|
|
|
|
unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */
|
2006-07-27 07:03:57 +02:00
|
|
|
|
|
|
|
|
|
/* Used only for server sides of some dir connections, to implement
|
|
|
|
|
* "spooling" of directory material to the outbuf. Otherwise, we'd have
|
|
|
|
|
* to append everything to the outbuf in one enormous chunk. */
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** What exactly are we spooling right now? */
|
2014-03-25 16:16:18 +01:00
|
|
|
|
dir_spool_source_bitfield_t dir_spool_src : 3;
|
2012-12-18 20:45:12 +01:00
|
|
|
|
|
2007-06-10 09:34:21 +02:00
|
|
|
|
/** If we're fetching descriptors, what router purpose shall we assign
|
|
|
|
|
* to them? */
|
|
|
|
|
uint8_t router_purpose;
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** List of fingerprints for networkstatuses or descriptors to be spooled. */
|
2006-06-18 09:38:55 +02:00
|
|
|
|
smartlist_t *fingerprint_stack;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** A cached_dir_t object that we're currently spooling out */
|
2006-06-18 09:38:55 +02:00
|
|
|
|
struct cached_dir_t *cached_dir;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** The current offset into cached_dir. */
|
2006-06-18 09:38:55 +02:00
|
|
|
|
off_t cached_dir_offset;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** The zlib object doing on-the-fly compression for spooled data. */
|
2006-06-18 09:38:55 +02:00
|
|
|
|
tor_zlib_state_t *zlib_state;
|
2005-09-08 22:18:15 +02:00
|
|
|
|
|
2007-11-29 16:25:04 +01:00
|
|
|
|
/** What rendezvous service are we querying for? */
|
2008-09-24 16:44:29 +02:00
|
|
|
|
rend_data_t *rend_data;
|
2004-11-03 02:32:26 +01:00
|
|
|
|
|
2006-07-26 21:07:26 +02:00
|
|
|
|
char identity_digest[DIGEST_LEN]; /**< Hash of the public RSA key for
|
|
|
|
|
* the directory server's signing key. */
|
2007-01-27 09:55:06 +01:00
|
|
|
|
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/** Unique ID for directory requests; this used to be in connection_t, but
|
|
|
|
|
* that's going away and being used on channels instead. The dirserver still
|
|
|
|
|
* needs this for the incoming side, so it's moved here. */
|
|
|
|
|
uint64_t dirreq_id;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
} dir_connection_t;
|
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Subtype of connection_t for an connection to a controller. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
typedef struct control_connection_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
connection_t base_;
|
2005-03-01 02:15:01 +01:00
|
|
|
|
|
2014-09-08 21:15:05 +02:00
|
|
|
|
uint64_t event_mask; /**< Bitfield: which events does this controller
|
|
|
|
|
* care about?
|
|
|
|
|
* EVENT_MAX_ is >31, so we need a 64 bit mask */
|
2006-10-03 20:58:56 +02:00
|
|
|
|
|
2007-08-16 19:31:23 +02:00
|
|
|
|
/** True if we have sent a protocolinfo reply on this connection. */
|
|
|
|
|
unsigned int have_sent_protocolinfo:1;
|
2011-05-20 01:34:40 +02:00
|
|
|
|
/** True if we have received a takeownership command on this
|
|
|
|
|
* connection. */
|
|
|
|
|
unsigned int is_owning_control_connection:1;
|
2007-08-16 19:31:23 +02:00
|
|
|
|
|
2015-04-25 10:23:15 +02:00
|
|
|
|
/** List of ephemeral onion services belonging to this connection. */
|
|
|
|
|
smartlist_t *ephemeral_onion_services;
|
|
|
|
|
|
2012-02-06 19:49:45 +01:00
|
|
|
|
/** If we have sent an AUTHCHALLENGE reply on this connection and
|
|
|
|
|
* have not received a successful AUTHENTICATE command, points to
|
|
|
|
|
* the value which the client must send to authenticate itself;
|
|
|
|
|
* otherwise, NULL. */
|
|
|
|
|
char *safecookie_client_hash;
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Amount of space allocated in incoming_cmd. */
|
2005-04-28 00:01:34 +02:00
|
|
|
|
uint32_t incoming_cmd_len;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Number of bytes currently stored in incoming_cmd. */
|
2005-04-28 00:01:34 +02:00
|
|
|
|
uint32_t incoming_cmd_cur_len;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** A control command that we're reading from the inbuf, but which has not
|
2008-12-17 23:46:00 +01:00
|
|
|
|
* yet arrived completely. */
|
2005-04-28 00:01:34 +02:00
|
|
|
|
char *incoming_cmd;
|
2006-07-26 21:07:26 +02:00
|
|
|
|
} control_connection_t;
|
major overhaul: dns slave subsystem, topics
on startup, it forks off a master dns handler, which forks off dns
slaves (like the apache model). slaves as spawned as load increases,
and then reused. excess slaves are not ever killed, currently.
implemented topics. each topic has a receive window in each direction
at each edge of the circuit, and sends sendme's at the data level, as
per before. each circuit also has receive windows in each direction at
each hop; an edge sends a circuit-level sendme as soon as enough data
cells have arrived (regardless of whether the data cells were flushed
to the exit conns). removed the 'connected' cell type, since it's now
a topic command within data cells.
at the edge of the circuit, there can be multiple connections associated
with a single circuit. you find them via the linked list conn->next_topic.
currently each new ap connection starts its own circuit, so we ought
to see comparable performance to what we had before. but that's only
because i haven't written the code to reattach to old circuits. please
try to break it as-is, and then i'll make it reuse the same circuit and
we'll try to break that.
svn:r152
2003-01-26 10:02:24 +01:00
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Cast a connection_t subtype pointer to a connection_t **/
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define TO_CONN(c) (&(((c)->base_)))
|
|
|
|
|
/** Helper macro: Given a pointer to to.base_, of type from*, return &to. */
|
|
|
|
|
#define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, base_))
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2011-07-20 18:38:13 +02:00
|
|
|
|
/** Cast a entry_connection_t subtype pointer to a edge_connection_t **/
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define ENTRY_TO_EDGE_CONN(c) (&(((c))->edge_))
|
2011-07-20 18:38:13 +02:00
|
|
|
|
/** Cast a entry_connection_t subtype pointer to a connection_t **/
|
|
|
|
|
#define ENTRY_TO_CONN(c) (TO_CONN(ENTRY_TO_EDGE_CONN(c)))
|
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Convert a connection_t* to an or_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static or_connection_t *TO_OR_CONN(connection_t *);
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Convert a connection_t* to a dir_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static dir_connection_t *TO_DIR_CONN(connection_t *);
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Convert a connection_t* to an edge_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static edge_connection_t *TO_EDGE_CONN(connection_t *);
|
2011-07-20 18:38:13 +02:00
|
|
|
|
/** Convert a connection_t* to an entry_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
|
|
|
|
static entry_connection_t *TO_ENTRY_CONN(connection_t *);
|
2011-09-08 02:26:58 +02:00
|
|
|
|
/** Convert a edge_connection_t* to an entry_connection_t*; assert if the cast
|
|
|
|
|
* is invalid. */
|
2011-07-20 18:55:42 +02:00
|
|
|
|
static entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *);
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Convert a connection_t* to an control_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static control_connection_t *TO_CONTROL_CONN(connection_t *);
|
2011-07-05 23:11:22 +02:00
|
|
|
|
/** Convert a connection_t* to an listener_connection_t*; assert if the cast is
|
|
|
|
|
* invalid. */
|
|
|
|
|
static listener_connection_t *TO_LISTENER_CONN(connection_t *);
|
2006-07-26 21:07:26 +02:00
|
|
|
|
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE or_connection_t *TO_OR_CONN(connection_t *c)
|
2006-07-26 21:07:26 +02:00
|
|
|
|
{
|
|
|
|
|
tor_assert(c->magic == OR_CONNECTION_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(or_connection_t, c);
|
2006-07-26 21:07:26 +02:00
|
|
|
|
}
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE dir_connection_t *TO_DIR_CONN(connection_t *c)
|
2006-07-26 21:07:26 +02:00
|
|
|
|
{
|
|
|
|
|
tor_assert(c->magic == DIR_CONNECTION_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(dir_connection_t, c);
|
2006-07-26 21:07:26 +02:00
|
|
|
|
}
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE edge_connection_t *TO_EDGE_CONN(connection_t *c)
|
2006-07-26 21:07:26 +02:00
|
|
|
|
{
|
2011-07-20 18:38:13 +02:00
|
|
|
|
tor_assert(c->magic == EDGE_CONNECTION_MAGIC ||
|
|
|
|
|
c->magic == ENTRY_CONNECTION_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(edge_connection_t, c);
|
2006-07-26 21:07:26 +02:00
|
|
|
|
}
|
2011-07-20 18:38:13 +02:00
|
|
|
|
static INLINE entry_connection_t *TO_ENTRY_CONN(connection_t *c)
|
|
|
|
|
{
|
|
|
|
|
tor_assert(c->magic == ENTRY_CONNECTION_MAGIC);
|
2012-10-12 18:22:13 +02:00
|
|
|
|
return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_.base_);
|
2011-07-20 18:38:13 +02:00
|
|
|
|
}
|
2011-07-20 18:55:42 +02:00
|
|
|
|
static INLINE entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *c)
|
|
|
|
|
{
|
2012-10-12 18:22:13 +02:00
|
|
|
|
tor_assert(c->base_.magic == ENTRY_CONNECTION_MAGIC);
|
|
|
|
|
return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_);
|
2011-07-20 18:55:42 +02:00
|
|
|
|
}
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE control_connection_t *TO_CONTROL_CONN(connection_t *c)
|
2006-07-26 21:07:26 +02:00
|
|
|
|
{
|
|
|
|
|
tor_assert(c->magic == CONTROL_CONNECTION_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(control_connection_t, c);
|
2006-07-26 21:07:26 +02:00
|
|
|
|
}
|
2011-07-05 23:11:22 +02:00
|
|
|
|
static INLINE listener_connection_t *TO_LISTENER_CONN(connection_t *c)
|
|
|
|
|
{
|
|
|
|
|
tor_assert(c->magic == LISTENER_CONNECTION_MAGIC);
|
|
|
|
|
return DOWNCAST(listener_connection_t, c);
|
|
|
|
|
}
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2009-07-31 17:39:31 +02:00
|
|
|
|
/* Conditional macros to help write code that works whether bufferevents are
|
|
|
|
|
disabled or not.
|
|
|
|
|
|
|
|
|
|
We can't just write:
|
|
|
|
|
if (conn->bufev) {
|
|
|
|
|
do bufferevent stuff;
|
|
|
|
|
} else {
|
|
|
|
|
do other stuff;
|
|
|
|
|
}
|
|
|
|
|
because the bufferevent stuff won't even compile unless we have a fairly
|
|
|
|
|
new version of Libevent. Instead, we say:
|
|
|
|
|
IF_HAS_BUFFEREVENT(conn, { do_bufferevent_stuff } );
|
|
|
|
|
or:
|
|
|
|
|
IF_HAS_BUFFEREVENT(conn, {
|
|
|
|
|
do bufferevent stuff;
|
|
|
|
|
}) ELSE_IF_NO_BUFFEREVENT {
|
|
|
|
|
do non-bufferevent stuff;
|
|
|
|
|
}
|
|
|
|
|
If we're compiling with bufferevent support, then the macros expand more or
|
|
|
|
|
less to:
|
|
|
|
|
if (conn->bufev) {
|
|
|
|
|
do_bufferevent_stuff;
|
|
|
|
|
} else {
|
|
|
|
|
do non-bufferevent stuff;
|
|
|
|
|
}
|
|
|
|
|
and if we aren't using bufferevents, they expand more or less to:
|
|
|
|
|
{ do non-bufferevent stuff; }
|
|
|
|
|
*/
|
2009-07-31 17:11:45 +02:00
|
|
|
|
#ifdef USE_BUFFEREVENTS
|
|
|
|
|
#define HAS_BUFFEREVENT(c) (((c)->bufev) != NULL)
|
2009-07-31 17:39:31 +02:00
|
|
|
|
#define IF_HAS_BUFFEREVENT(c, stmt) \
|
|
|
|
|
if ((c)->bufev) do { \
|
|
|
|
|
stmt ; \
|
2009-07-31 17:11:45 +02:00
|
|
|
|
} while (0)
|
2009-07-31 17:39:31 +02:00
|
|
|
|
#define ELSE_IF_NO_BUFFEREVENT ; else
|
2009-08-05 18:59:11 +02:00
|
|
|
|
#define IF_HAS_NO_BUFFEREVENT(c) \
|
|
|
|
|
if (NULL == (c)->bufev)
|
2009-07-31 17:11:45 +02:00
|
|
|
|
#else
|
|
|
|
|
#define HAS_BUFFEREVENT(c) (0)
|
|
|
|
|
#define IF_HAS_BUFFEREVENT(c, stmt) (void)0
|
2009-07-31 17:39:31 +02:00
|
|
|
|
#define ELSE_IF_NO_BUFFEREVENT ;
|
2009-08-05 18:59:11 +02:00
|
|
|
|
#define IF_HAS_NO_BUFFEREVENT(c) \
|
|
|
|
|
if (1)
|
2009-07-31 17:11:45 +02:00
|
|
|
|
#endif
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** What action type does an address policy indicate: accept or reject? */
|
2005-08-09 07:22:23 +02:00
|
|
|
|
typedef enum {
|
|
|
|
|
ADDR_POLICY_ACCEPT=1,
|
|
|
|
|
ADDR_POLICY_REJECT=2,
|
|
|
|
|
} addr_policy_action_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define addr_policy_action_bitfield_t ENUM_BF(addr_policy_action_t)
|
2003-04-07 06:38:19 +02:00
|
|
|
|
|
2008-03-17 17:51:48 +01:00
|
|
|
|
/** A reference-counted address policy rule. */
|
2004-12-04 02:14:36 +01:00
|
|
|
|
typedef struct addr_policy_t {
|
2008-01-02 05:43:44 +01:00
|
|
|
|
int refcnt; /**< Reference count */
|
2012-12-18 20:45:12 +01:00
|
|
|
|
/** What to do when the policy matches.*/
|
2014-03-25 16:16:18 +01:00
|
|
|
|
addr_policy_action_bitfield_t policy_type:2;
|
2008-01-02 05:43:44 +01:00
|
|
|
|
unsigned int is_private:1; /**< True iff this is the pseudo-address,
|
|
|
|
|
* "private". */
|
|
|
|
|
unsigned int is_canonical:1; /**< True iff this policy is the canonical
|
|
|
|
|
* copy (stored in a hash table to avoid
|
|
|
|
|
* duplication of common policies) */
|
2007-07-19 21:40:45 +02:00
|
|
|
|
maskbits_t maskbits; /**< Accept/reject all addresses <b>a</b> such that the
|
|
|
|
|
* first <b>maskbits</b> bits of <b>a</b> match
|
|
|
|
|
* <b>addr</b>. */
|
2012-10-24 21:03:29 +02:00
|
|
|
|
/** Base address to accept or reject.
|
|
|
|
|
*
|
|
|
|
|
* Note that wildcards are treated
|
|
|
|
|
* differntly depending on address family. An AF_UNSPEC address means
|
|
|
|
|
* "All addresses, IPv4 or IPv6." An AF_INET address with maskbits==0 means
|
|
|
|
|
* "All IPv4 addresses" and an AF_INET6 address with maskbits == 0 means
|
|
|
|
|
* "All IPv6 addresses".
|
|
|
|
|
**/
|
|
|
|
|
tor_addr_t addr;
|
2004-05-10 12:27:54 +02:00
|
|
|
|
uint16_t prt_min; /**< Lowest port number to accept/reject. */
|
|
|
|
|
uint16_t prt_max; /**< Highest port number to accept/reject. */
|
2004-12-04 02:14:36 +01:00
|
|
|
|
} addr_policy_t;
|
2003-04-07 06:38:19 +02:00
|
|
|
|
|
2005-09-07 18:42:53 +02:00
|
|
|
|
/** A cached_dir_t represents a cacheable directory object, along with its
|
|
|
|
|
* compressed form. */
|
|
|
|
|
typedef struct cached_dir_t {
|
2009-05-27 23:55:51 +02:00
|
|
|
|
char *dir; /**< Contents of this object, NUL-terminated. */
|
2005-09-07 18:42:53 +02:00
|
|
|
|
char *dir_z; /**< Compressed contents of this object. */
|
2009-05-27 23:55:51 +02:00
|
|
|
|
size_t dir_len; /**< Length of <b>dir</b> (not counting its NUL). */
|
2008-09-14 05:36:54 +02:00
|
|
|
|
size_t dir_z_len; /**< Length of <b>dir_z</b>. */
|
|
|
|
|
time_t published; /**< When was this object published. */
|
2009-10-13 23:06:01 +02:00
|
|
|
|
digests_t digests; /**< Digests of this object (networkstatus only) */
|
2006-06-18 09:38:55 +02:00
|
|
|
|
int refcnt; /**< Reference count for this cached_dir_t. */
|
2005-09-07 18:42:53 +02:00
|
|
|
|
} cached_dir_t;
|
|
|
|
|
|
2007-01-22 08:51:06 +01:00
|
|
|
|
/** Enum used to remember where a signed_descriptor_t is stored and how to
|
|
|
|
|
* manage the memory for signed_descriptor_body. */
|
2006-06-22 09:01:54 +02:00
|
|
|
|
typedef enum {
|
2007-01-22 08:51:06 +01:00
|
|
|
|
/** The descriptor isn't stored on disk at all: the copy in memory is
|
|
|
|
|
* canonical; the saved_offset field is meaningless. */
|
|
|
|
|
SAVED_NOWHERE=0,
|
|
|
|
|
/** The descriptor is stored in the cached_routers file: the
|
|
|
|
|
* signed_descriptor_body is meaningless; the signed_descriptor_len and
|
|
|
|
|
* saved_offset are used to index into the mmaped cache file. */
|
|
|
|
|
SAVED_IN_CACHE,
|
|
|
|
|
/** The descriptor is stored in the cached_routers.new file: the
|
|
|
|
|
* signed_descriptor_body and saved_offset fields are both set. */
|
|
|
|
|
/* FFFF (We could also mmap the file and grow the mmap as needed, or
|
|
|
|
|
* lazy-load the descriptor text by using seek and read. We don't, for
|
|
|
|
|
* now.)
|
|
|
|
|
*/
|
|
|
|
|
SAVED_IN_JOURNAL
|
2006-06-22 09:01:54 +02:00
|
|
|
|
} saved_location_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define saved_location_bitfield_t ENUM_BF(saved_location_t)
|
2006-06-22 09:01:54 +02:00
|
|
|
|
|
2008-12-17 15:59:28 +01:00
|
|
|
|
/** Enumeration: what kind of download schedule are we using for a given
|
2007-12-19 05:18:28 +01:00
|
|
|
|
* object? */
|
2007-10-24 21:53:08 +02:00
|
|
|
|
typedef enum {
|
|
|
|
|
DL_SCHED_GENERIC = 0,
|
|
|
|
|
DL_SCHED_CONSENSUS = 1,
|
2008-12-27 08:30:47 +01:00
|
|
|
|
DL_SCHED_BRIDGE = 2,
|
2007-10-24 21:53:08 +02:00
|
|
|
|
} download_schedule_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define download_schedule_bitfield_t ENUM_BF(download_schedule_t)
|
2007-10-24 21:53:08 +02:00
|
|
|
|
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** Information about our plans for retrying downloads for a downloadable
|
|
|
|
|
* object. */
|
2007-05-18 23:19:53 +02:00
|
|
|
|
typedef struct download_status_t {
|
|
|
|
|
time_t next_attempt_at; /**< When should we try downloading this descriptor
|
|
|
|
|
* again? */
|
|
|
|
|
uint8_t n_download_failures; /**< Number of failures trying to download the
|
|
|
|
|
* most recent descriptor. */
|
2014-03-25 16:16:18 +01:00
|
|
|
|
download_schedule_bitfield_t schedule : 8;
|
Treat unparseable (micro)descriptors and extrainfos as undownloadable
One pain point in evolving the Tor design and implementing has been
adding code that makes clients reject directory documents that they
previously would have accepted, if those descriptors actually exist.
When this happened, the clients would get the document, reject it,
and then decide to try downloading it again, ad infinitum. This
problem becomes particularly obnoxious with authorities, since if
some authorities accept a descriptor that others don't, the ones
that don't accept it would go crazy trying to re-fetch it over and
over. (See for example ticket #9286.)
This patch tries to solve this problem by tracking, if a descriptor
isn't parseable, what its digest was, and whether it is invalid
because of some flaw that applies to the portion containing the
digest. (This excludes RSA signature problems: RSA signatures
aren't included in the digest. This means that a directory
authority can still put another directory authority into a loop by
mentioning a descriptor, and then serving that descriptor with an
invalid RSA signatures. But that would also make the misbehaving
directory authority get DoSed by the server it's attacking, so it's
not much of an issue.)
We already have a mechanism to mark something undownloadable with
downloadstatus_mark_impossible(); we use that here for
microdescriptors, extrainfos, and router descriptors.
Unit tests to follow in another patch.
Closes ticket #11243.
2014-10-03 16:55:50 +02:00
|
|
|
|
|
2007-05-18 23:19:53 +02:00
|
|
|
|
} download_status_t;
|
|
|
|
|
|
2008-12-23 22:17:52 +01:00
|
|
|
|
/** If n_download_failures is this high, the download can never happen. */
|
|
|
|
|
#define IMPOSSIBLE_TO_DOWNLOAD 255
|
|
|
|
|
|
2007-12-02 05:39:56 +01:00
|
|
|
|
/** The max size we expect router descriptor annotations we create to
|
|
|
|
|
* be. We'll accept larger ones if we see them on disk, but we won't
|
|
|
|
|
* create any that are larger than this. */
|
|
|
|
|
#define ROUTER_ANNOTATION_BUF_LEN 256
|
|
|
|
|
|
2005-11-05 21:15:27 +01:00
|
|
|
|
/** Information need to cache an onion router's descriptor. */
|
|
|
|
|
typedef struct signed_descriptor_t {
|
2007-12-02 05:39:56 +01:00
|
|
|
|
/** Pointer to the raw server descriptor, preceded by annotations. Not
|
2007-09-26 18:19:44 +02:00
|
|
|
|
* necessarily NUL-terminated. If saved_location is SAVED_IN_CACHE, this
|
2007-12-02 05:39:56 +01:00
|
|
|
|
* pointer is null. */
|
2006-01-12 19:04:17 +01:00
|
|
|
|
char *signed_descriptor_body;
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** Length of the annotations preceding the server descriptor. */
|
2007-09-26 18:19:44 +02:00
|
|
|
|
size_t annotations_len;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** Length of the server descriptor. */
|
2005-11-05 21:15:27 +01:00
|
|
|
|
size_t signed_descriptor_len;
|
2007-12-07 22:27:58 +01:00
|
|
|
|
/** Digest of the server descriptor, computed as specified in
|
|
|
|
|
* dir-spec.txt. */
|
2005-11-05 21:15:27 +01:00
|
|
|
|
char signed_descriptor_digest[DIGEST_LEN];
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** Identity digest of the router. */
|
2005-11-05 21:15:27 +01:00
|
|
|
|
char identity_digest[DIGEST_LEN];
|
2007-12-02 05:39:56 +01:00
|
|
|
|
/** Declared publication time of the descriptor. */
|
2005-11-05 21:15:27 +01:00
|
|
|
|
time_t published_on;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** For routerdescs only: digest of the corresponding extrainfo. */
|
2007-04-16 23:37:21 +02:00
|
|
|
|
char extra_info_digest[DIGEST_LEN];
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** For routerdescs only: Status of downloading the corresponding
|
|
|
|
|
* extrainfo. */
|
2007-05-18 23:19:53 +02:00
|
|
|
|
download_status_t ei_dl_status;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** Where is the descriptor saved? */
|
2007-09-26 18:19:44 +02:00
|
|
|
|
saved_location_t saved_location;
|
2007-01-23 20:22:52 +01:00
|
|
|
|
/** If saved_location is SAVED_IN_CACHE or SAVED_IN_JOURNAL, the offset of
|
|
|
|
|
* this descriptor in the corresponding file. */
|
2006-04-29 20:42:26 +02:00
|
|
|
|
off_t saved_offset;
|
2007-11-07 18:11:23 +01:00
|
|
|
|
/** What position is this descriptor within routerlist->routers or
|
|
|
|
|
* routerlist->old_routers? -1 for none. */
|
|
|
|
|
int routerlist_index;
|
2007-10-19 04:15:47 +02:00
|
|
|
|
/** The valid-until time of the most recent consensus that listed this
|
2014-01-29 21:17:05 +01:00
|
|
|
|
* descriptor. 0 for "never listed in a consensus, so far as we know." */
|
2007-10-19 04:15:47 +02:00
|
|
|
|
time_t last_listed_as_valid_until;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/* If true, we do not ever try to save this object in the cache. */
|
2007-04-30 21:48:39 +02:00
|
|
|
|
unsigned int do_not_cache : 1;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/* If true, this item is meant to represent an extrainfo. */
|
2007-05-20 07:15:53 +02:00
|
|
|
|
unsigned int is_extrainfo : 1;
|
2007-10-21 06:41:00 +02:00
|
|
|
|
/* If true, we got an extrainfo for this item, and the digest was right,
|
|
|
|
|
* but it was incompatible. */
|
|
|
|
|
unsigned int extrainfo_is_bogus : 1;
|
2008-01-10 18:48:40 +01:00
|
|
|
|
/* If true, we are willing to transmit this item unencrypted. */
|
|
|
|
|
unsigned int send_unencrypted : 1;
|
2005-11-05 21:15:27 +01:00
|
|
|
|
} signed_descriptor_t;
|
|
|
|
|
|
2008-09-25 22:21:35 +02:00
|
|
|
|
/** A signed integer representing a country code. */
|
|
|
|
|
typedef int16_t country_t;
|
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Information about another onion router in the network. */
|
2002-12-03 23:18:23 +01:00
|
|
|
|
typedef struct {
|
2005-11-05 21:15:27 +01:00
|
|
|
|
signed_descriptor_t cache_info;
|
2015-05-28 16:42:22 +02:00
|
|
|
|
/** A SHA256-digest of the extrainfo (if any) */
|
|
|
|
|
char extra_info_digest256[DIGEST256_LEN];
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char *nickname; /**< Human-readable OR name. */
|
2003-12-17 22:09:31 +01:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
uint32_t addr; /**< IPv4 address of OR, in host order. */
|
2005-11-17 02:17:53 +01:00
|
|
|
|
uint16_t or_port; /**< Port for TLS connections. */
|
2004-05-10 12:27:54 +02:00
|
|
|
|
uint16_t dir_port; /**< Port for HTTP directory connections. */
|
2003-09-26 20:27:35 +02:00
|
|
|
|
|
2012-06-05 00:50:13 +02:00
|
|
|
|
/** A router's IPv6 address, if it has one. */
|
2011-11-08 22:51:30 +01:00
|
|
|
|
/* XXXXX187 Actually these should probably be part of a list of addresses,
|
|
|
|
|
* not just a special case. Use abstractions to access these; don't do it
|
|
|
|
|
* directly. */
|
|
|
|
|
tor_addr_t ipv6_addr;
|
|
|
|
|
uint16_t ipv6_orport;
|
|
|
|
|
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *onion_pkey; /**< Public RSA key for onions. */
|
|
|
|
|
crypto_pk_t *identity_pkey; /**< Public RSA key for signing. */
|
2012-12-04 21:58:18 +01:00
|
|
|
|
/** Public curve25519 key for onions */
|
|
|
|
|
curve25519_public_key_t *onion_curve25519_pkey;
|
2014-10-01 05:36:47 +02:00
|
|
|
|
/** Certificate for ed25519 signing key */
|
|
|
|
|
struct tor_cert_st *signing_key_cert;
|
2014-10-01 17:54:07 +02:00
|
|
|
|
/** What's the earliest expiration time on all the certs in this
|
|
|
|
|
* routerinfo? */
|
|
|
|
|
time_t cert_expiration_time;
|
2003-09-27 23:30:10 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char *platform; /**< What software/operating system is this OR using? */
|
2004-04-07 23:36:03 +02:00
|
|
|
|
|
2002-06-27 00:45:49 +02:00
|
|
|
|
/* link info */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
uint32_t bandwidthrate; /**< How many bytes does this OR add to its token
|
|
|
|
|
* bucket per second? */
|
|
|
|
|
uint32_t bandwidthburst; /**< How large is this OR's token bucket? */
|
2004-07-12 20:02:54 +02:00
|
|
|
|
/** How many bytes/s is this router known to handle? */
|
2004-08-15 10:15:12 +02:00
|
|
|
|
uint32_t bandwidthcapacity;
|
2008-01-02 05:43:44 +01:00
|
|
|
|
smartlist_t *exit_policy; /**< What streams will this OR permit
|
2012-10-25 03:59:55 +02:00
|
|
|
|
* to exit on IPv4? NULL for 'reject *:*'. */
|
|
|
|
|
/** What streams will this OR permit to exit on IPv6?
|
|
|
|
|
* NULL for 'reject *:*' */
|
|
|
|
|
struct short_policy_t *ipv6_exit_policy;
|
2004-08-17 08:06:05 +02:00
|
|
|
|
long uptime; /**< How many seconds the router claims to have been up */
|
2004-10-15 03:58:11 +02:00
|
|
|
|
smartlist_t *declared_family; /**< Nicknames of router which this router
|
|
|
|
|
* claims are its family. */
|
2005-05-02 23:22:31 +02:00
|
|
|
|
char *contact_info; /**< Declared contact info for this router. */
|
2005-09-12 08:56:42 +02:00
|
|
|
|
unsigned int is_hibernating:1; /**< Whether the router claims to be
|
|
|
|
|
* hibernating */
|
2010-09-29 05:37:45 +02:00
|
|
|
|
unsigned int caches_extra_info:1; /**< Whether the router says it caches and
|
|
|
|
|
* serves extrainfo documents. */
|
|
|
|
|
unsigned int allow_single_hop_exits:1; /**< Whether the router says
|
|
|
|
|
* it allows single hop exits. */
|
2005-08-26 22:22:32 +02:00
|
|
|
|
|
2007-10-29 20:10:47 +01:00
|
|
|
|
unsigned int wants_to_be_hs_dir:1; /**< True iff this router claims to be
|
|
|
|
|
* a hidden service directory. */
|
2008-12-29 02:47:28 +01:00
|
|
|
|
unsigned int policy_is_reject_star:1; /**< True iff the exit policy for this
|
|
|
|
|
* router rejects everything. */
|
2010-08-18 19:36:09 +02:00
|
|
|
|
/** True if, after we have added this router, we should re-launch
|
|
|
|
|
* tests for it. */
|
|
|
|
|
unsigned int needs_retest_if_added:1;
|
2005-09-12 08:56:42 +02:00
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** Tor can use this router for general positions in circuits; we got it
|
|
|
|
|
* from a directory server as usual, or we're an authority and a server
|
|
|
|
|
* uploaded it. */
|
2006-03-17 23:08:59 +01:00
|
|
|
|
#define ROUTER_PURPOSE_GENERAL 0
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** Tor should avoid using this router for circuit-building: we got it
|
|
|
|
|
* from a crontroller. If the controller wants to use it, it'll have to
|
|
|
|
|
* ask for it by identity. */
|
2006-03-17 23:08:59 +01:00
|
|
|
|
#define ROUTER_PURPOSE_CONTROLLER 1
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** Tor should use this router only for bridge positions in circuits: we got
|
|
|
|
|
* it via a directory request from the bridge itself, or a bridge
|
|
|
|
|
* authority. x*/
|
2007-08-19 17:20:11 +02:00
|
|
|
|
#define ROUTER_PURPOSE_BRIDGE 2
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Tor should not use this router; it was marked in cached-descriptors with
|
|
|
|
|
* a purpose we didn't recognize. */
|
2007-09-27 22:46:30 +02:00
|
|
|
|
#define ROUTER_PURPOSE_UNKNOWN 255
|
2007-08-19 17:20:11 +02:00
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/* In what way did we find out about this router? One of ROUTER_PURPOSE_*.
|
|
|
|
|
* Routers of different purposes are kept segregated and used for different
|
|
|
|
|
* things; see notes on ROUTER_PURPOSE_* macros above.
|
|
|
|
|
*/
|
|
|
|
|
uint8_t purpose;
|
2002-06-27 00:45:49 +02:00
|
|
|
|
} routerinfo_t;
|
|
|
|
|
|
2007-04-21 19:46:22 +02:00
|
|
|
|
/** Information needed to keep and cache a signed extra-info document. */
|
2007-04-16 06:17:58 +02:00
|
|
|
|
typedef struct extrainfo_t {
|
|
|
|
|
signed_descriptor_t cache_info;
|
2015-05-28 16:42:22 +02:00
|
|
|
|
/** SHA256 digest of this document */
|
|
|
|
|
uint8_t digest256[DIGEST256_LEN];
|
2007-04-21 19:46:22 +02:00
|
|
|
|
/** The router's nickname. */
|
2007-04-16 06:17:58 +02:00
|
|
|
|
char nickname[MAX_NICKNAME_LEN+1];
|
2015-05-28 16:42:22 +02:00
|
|
|
|
/** Certificate for ed25519 signing key */
|
|
|
|
|
struct tor_cert_st *signing_key_cert;
|
2007-04-21 19:46:22 +02:00
|
|
|
|
/** True iff we found the right key for this extra-info, verified the
|
|
|
|
|
* signature, and found it to be bad. */
|
2007-04-16 23:37:21 +02:00
|
|
|
|
unsigned int bad_sig : 1;
|
2007-04-21 19:46:22 +02:00
|
|
|
|
/** If present, we didn't have the right key to verify this extra-info,
|
|
|
|
|
* so this is a copy of the signature in the document. */
|
2007-04-16 06:17:58 +02:00
|
|
|
|
char *pending_sig;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** Length of pending_sig. */
|
2007-05-15 00:51:05 +02:00
|
|
|
|
size_t pending_sig_len;
|
2007-04-16 06:17:58 +02:00
|
|
|
|
} extrainfo_t;
|
|
|
|
|
|
2005-09-24 23:56:04 +02:00
|
|
|
|
/** Contents of a single router entry in a network status object.
|
2005-09-05 01:12:27 +02:00
|
|
|
|
*/
|
2005-09-02 22:37:31 +02:00
|
|
|
|
typedef struct routerstatus_t {
|
2005-09-05 01:12:27 +02:00
|
|
|
|
time_t published_on; /**< When was this router published? */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
char nickname[MAX_NICKNAME_LEN+1]; /**< The nickname this router says it
|
|
|
|
|
* has. */
|
|
|
|
|
char identity_digest[DIGEST_LEN]; /**< Digest of the router's identity
|
|
|
|
|
* key. */
|
2010-09-16 18:55:48 +02:00
|
|
|
|
/** Digest of the router's most recent descriptor or microdescriptor.
|
|
|
|
|
* If it's a descriptor, we only use the first DIGEST_LEN bytes. */
|
|
|
|
|
char descriptor_digest[DIGEST256_LEN];
|
2005-09-08 09:10:12 +02:00
|
|
|
|
uint32_t addr; /**< IPv4 address for this router. */
|
|
|
|
|
uint16_t or_port; /**< OR port for this router. */
|
|
|
|
|
uint16_t dir_port; /**< Directory port for this router. */
|
2012-05-09 19:29:46 +02:00
|
|
|
|
tor_addr_t ipv6_addr; /**< IPv6 address for this router. */
|
|
|
|
|
uint16_t ipv6_orport; /**<IPV6 OR port for this router. */
|
2007-06-13 21:06:23 +02:00
|
|
|
|
unsigned int is_authority:1; /**< True iff this router is an authority. */
|
2005-09-08 09:10:12 +02:00
|
|
|
|
unsigned int is_exit:1; /**< True iff this router is a good exit. */
|
|
|
|
|
unsigned int is_stable:1; /**< True iff this router stays up a long time. */
|
|
|
|
|
unsigned int is_fast:1; /**< True iff this router has good bandwidth. */
|
2010-09-30 20:58:27 +02:00
|
|
|
|
/** True iff this router is called 'running' in the consensus. We give it
|
|
|
|
|
* this funny name so that we don't accidentally use this bit as a view of
|
|
|
|
|
* whether we think the router is *currently* running. If that's what you
|
|
|
|
|
* want to know, look at is_running in node_t. */
|
|
|
|
|
unsigned int is_flagged_running:1;
|
2005-09-08 09:10:12 +02:00
|
|
|
|
unsigned int is_named:1; /**< True iff "nickname" belongs to this router. */
|
2007-10-19 20:56:24 +02:00
|
|
|
|
unsigned int is_unnamed:1; /**< True iff "nickname" belongs to another
|
|
|
|
|
* router. */
|
2007-11-16 08:29:01 +01:00
|
|
|
|
unsigned int is_valid:1; /**< True iff this router isn't invalid. */
|
2006-01-24 01:31:16 +01:00
|
|
|
|
unsigned int is_possible_guard:1; /**< True iff this router would be a good
|
|
|
|
|
* choice as an entry guard. */
|
2006-10-12 00:06:01 +02:00
|
|
|
|
unsigned int is_bad_exit:1; /**< True iff this node is a bad choice for
|
|
|
|
|
* an exit node. */
|
2008-08-14 20:01:09 +02:00
|
|
|
|
unsigned int is_hs_dir:1; /**< True iff this router is a v2-or-later hidden
|
2007-11-16 08:29:01 +01:00
|
|
|
|
* service directory. */
|
2006-12-24 05:09:48 +01:00
|
|
|
|
/** True iff we know version info for this router. (i.e., a "v" entry was
|
2007-01-03 11:30:26 +01:00
|
|
|
|
* included.) We'll replace all these with a big tor_version_t or a char[]
|
2006-12-24 05:09:48 +01:00
|
|
|
|
* if the number of traits we care about ever becomes incredibly big. */
|
|
|
|
|
unsigned int version_known:1;
|
2012-09-08 05:21:18 +02:00
|
|
|
|
|
2012-12-06 07:53:29 +01:00
|
|
|
|
/** True iff this router has a version that allows it to accept EXTEND2
|
|
|
|
|
* cells */
|
|
|
|
|
unsigned int version_supports_extend2_cells:1;
|
2006-12-24 05:09:48 +01:00
|
|
|
|
|
2008-08-15 01:00:57 +02:00
|
|
|
|
unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */
|
|
|
|
|
unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */
|
Refactor storing of measured_bw versus Unmeasured=1.
This patch moves the measured_bw field and the has_measured_bw field
into vote_routerstatus_t, since only votes have 'Measured=XX' set on
their weight line.
I also added a new bw_is_unmeasured flag to routerstatus_t to
represent the Unmeasured=1 flag on a w line. Previously, I was using
has_measured_bw for this, which was quite incorrect: has_measured_bw
means that the measured_bw field is set, and it's probably a mistake
to have it serve double duty as meaning that 'baandwidth' represents a
measured value.
While making this change,I also found a harmless but stupid bug in
dirserv_read_measured_bandwidths: It assumes that it's getting a
smartlist of routerstatus_t, when really it's getting a smartlist of
vote_routerstatus_t. C's struct layout rules mean that we could never
actually get an error because of that, but it's still quite incorrect.
I fixed that, and in the process needed to add two more sorting and
searching helpers.
Finally, I made the Unmeasured=1 flag get parsed. We don't use it for
anything yet, but someday we might.
This isn't complete yet -- the new 2286 unit test doesn't build.
2013-02-19 16:39:27 +01:00
|
|
|
|
unsigned int bw_is_unmeasured:1; /**< This is a consensus entry, with
|
|
|
|
|
* the Unmeasured flag set. */
|
2008-08-15 01:00:57 +02:00
|
|
|
|
|
2013-04-11 17:43:40 +02:00
|
|
|
|
uint32_t bandwidth_kb; /**< Bandwidth (capacity) of the router as reported in
|
2008-08-15 01:00:44 +02:00
|
|
|
|
* the vote/consensus, in kilobytes/sec. */
|
2015-01-29 15:54:47 +01:00
|
|
|
|
|
|
|
|
|
/** The consensus has guardfraction information for this router. */
|
|
|
|
|
unsigned int has_guardfraction:1;
|
|
|
|
|
/** The guardfraction value of this router. */
|
|
|
|
|
uint32_t guardfraction_percentage;
|
|
|
|
|
|
2008-08-15 01:00:44 +02:00
|
|
|
|
char *exitsummary; /**< exit policy summary -
|
|
|
|
|
* XXX weasel: this probably should not stay a string. */
|
|
|
|
|
|
2007-10-09 17:27:15 +02:00
|
|
|
|
/* ---- The fields below aren't derived from the networkstatus; they
|
|
|
|
|
* hold local information only. */
|
|
|
|
|
|
|
|
|
|
time_t last_dir_503_at; /**< When did this router last tell us that it
|
|
|
|
|
* was too busy to serve directory info? */
|
|
|
|
|
download_status_t dl_status;
|
|
|
|
|
|
|
|
|
|
} routerstatus_t;
|
2005-09-22 03:51:14 +02:00
|
|
|
|
|
2010-10-07 23:10:06 +02:00
|
|
|
|
/** A single entry in a parsed policy summary, describing a range of ports. */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
typedef struct short_policy_entry_t {
|
|
|
|
|
uint16_t min_port, max_port;
|
|
|
|
|
} short_policy_entry_t;
|
|
|
|
|
|
2010-10-07 23:10:06 +02:00
|
|
|
|
/** A short_poliy_t is the parsed version of a policy summary. */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
typedef struct short_policy_t {
|
2010-10-07 23:10:06 +02:00
|
|
|
|
/** True if the members of 'entries' are port ranges to accept; false if
|
|
|
|
|
* they are port ranges to reject */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
unsigned int is_accept : 1;
|
2010-10-07 23:10:06 +02:00
|
|
|
|
/** The actual number of values in 'entries'. */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
unsigned int n_entries : 31;
|
2011-01-13 00:38:52 +01:00
|
|
|
|
/** An array of 0 or more short_policy_entry_t values, each describing a
|
2011-01-06 21:59:05 +01:00
|
|
|
|
* range of ports that this policy accepts or rejects (depending on the
|
|
|
|
|
* value of is_accept).
|
2010-10-07 23:10:06 +02:00
|
|
|
|
*/
|
2011-01-06 21:59:05 +01:00
|
|
|
|
short_policy_entry_t entries[FLEXIBLE_ARRAY_MEMBER];
|
2010-10-02 00:12:30 +02:00
|
|
|
|
} short_policy_t;
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** A microdescriptor is the smallest amount of information needed to build a
|
|
|
|
|
* circuit through a router. They are generated by the directory authorities,
|
|
|
|
|
* using information from the uploaded routerinfo documents. They are not
|
|
|
|
|
* self-signed, but are rather authenticated by having their hash in a signed
|
|
|
|
|
* networkstatus document. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
typedef struct microdesc_t {
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** Hashtable node, used to look up the microdesc by its digest. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
HT_ENTRY(microdesc_t) node;
|
|
|
|
|
|
|
|
|
|
/* Cache information */
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** When was this microdescriptor last listed in a consensus document?
|
|
|
|
|
* Once a microdesc has been unlisted long enough, we can drop it.
|
|
|
|
|
*/
|
2009-08-24 18:51:33 +02:00
|
|
|
|
time_t last_listed;
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** Where is this microdescriptor currently stored? */
|
2014-03-25 16:16:18 +01:00
|
|
|
|
saved_location_bitfield_t saved_location : 3;
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** If true, do not attempt to cache this microdescriptor on disk. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
unsigned int no_save : 1;
|
2011-05-12 17:10:35 +02:00
|
|
|
|
/** If true, this microdesc has an entry in the microdesc_map */
|
|
|
|
|
unsigned int held_in_map : 1;
|
2011-09-28 19:29:01 +02:00
|
|
|
|
/** Reference count: how many node_ts have a reference to this microdesc? */
|
|
|
|
|
unsigned int held_by_nodes;
|
2011-05-12 17:10:35 +02:00
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** If saved_location == SAVED_IN_CACHE, this field holds the offset of the
|
|
|
|
|
* microdescriptor in the cache. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
off_t off;
|
|
|
|
|
|
|
|
|
|
/* The string containing the microdesc. */
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** A pointer to the encoded body of the microdescriptor. If the
|
|
|
|
|
* saved_location is SAVED_IN_CACHE, then the body is a pointer into an
|
|
|
|
|
* mmap'd region. Otherwise, it is a malloc'd string. The string might not
|
|
|
|
|
* be NUL-terminated; take the length from <b>bodylen</b>. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
char *body;
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** The length of the microdescriptor in <b>body</b>. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
size_t bodylen;
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** A SHA256-digest of the microdescriptor. */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
char digest[DIGEST256_LEN];
|
|
|
|
|
|
|
|
|
|
/* Fields in the microdescriptor. */
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** As routerinfo_t.onion_pkey */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *onion_pkey;
|
2012-12-04 21:58:18 +01:00
|
|
|
|
/** As routerinfo_t.onion_curve25519_pkey */
|
|
|
|
|
curve25519_public_key_t *onion_curve25519_pkey;
|
2014-10-08 17:33:59 +02:00
|
|
|
|
/** Ed25519 identity key, if included. */
|
|
|
|
|
ed25519_public_key_t *ed25519_identity_pkey;
|
2012-08-31 23:02:19 +02:00
|
|
|
|
/** As routerinfo_t.ipv6_add */
|
|
|
|
|
tor_addr_t ipv6_addr;
|
|
|
|
|
/** As routerinfo_t.ipv6_orport */
|
|
|
|
|
uint16_t ipv6_orport;
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** As routerinfo_t.family */
|
2009-08-20 17:39:22 +02:00
|
|
|
|
smartlist_t *family;
|
2012-10-25 03:59:55 +02:00
|
|
|
|
/** IPv4 exit policy summary */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
short_policy_t *exit_policy;
|
2012-10-25 03:59:55 +02:00
|
|
|
|
/** IPv6 exit policy summary */
|
|
|
|
|
short_policy_t *ipv6_exit_policy;
|
|
|
|
|
|
2009-08-24 18:51:33 +02:00
|
|
|
|
} microdesc_t;
|
2009-08-20 17:39:22 +02:00
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** A node_t represents a Tor router.
|
|
|
|
|
*
|
|
|
|
|
* Specifically, a node_t is a Tor router as we are using it: a router that
|
|
|
|
|
* we are considering for circuits, connections, and so on. A node_t is a
|
|
|
|
|
* thin wrapper around the routerstatus, routerinfo, and microdesc for a
|
|
|
|
|
* single wrapper, and provides a consistent interface for all of them.
|
|
|
|
|
*
|
|
|
|
|
* Also, a node_t has mutable state. While a routerinfo, a routerstatus,
|
|
|
|
|
* and a microdesc have[*] only the information read from a router
|
|
|
|
|
* descriptor, a consensus entry, and a microdescriptor (respectively)...
|
|
|
|
|
* a node_t has flags based on *our own current opinion* of the node.
|
|
|
|
|
*
|
|
|
|
|
* [*] Actually, there is some leftover information in each that is mutable.
|
|
|
|
|
* We should try to excise that.
|
|
|
|
|
*/
|
2010-09-28 19:29:31 +02:00
|
|
|
|
typedef struct node_t {
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/* Indexing information */
|
|
|
|
|
|
2010-09-28 19:29:31 +02:00
|
|
|
|
/** Used to look up the node_t by its identity digest. */
|
|
|
|
|
HT_ENTRY(node_t) ht_ent;
|
|
|
|
|
/** Position of the node within the list of nodes */
|
|
|
|
|
int nodelist_idx;
|
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** The identity digest of this node_t. No more than one node_t per
|
|
|
|
|
* identity may exist at a time. */
|
2010-09-28 19:29:31 +02:00
|
|
|
|
char identity[DIGEST_LEN];
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
|
2010-09-28 19:29:31 +02:00
|
|
|
|
microdesc_t *md;
|
|
|
|
|
routerinfo_t *ri;
|
|
|
|
|
routerstatus_t *rs;
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
|
|
|
|
|
/* local info: copied from routerstatus, then possibly frobbed based
|
2012-05-09 17:58:01 +02:00
|
|
|
|
* on experience. Authorities set this stuff directly. Note that
|
|
|
|
|
* these reflect knowledge of the primary (IPv4) OR port only. */
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
|
|
|
|
|
unsigned int is_running:1; /**< As far as we know, is this OR currently
|
|
|
|
|
* running? */
|
|
|
|
|
unsigned int is_valid:1; /**< Has a trusted dirserver validated this OR?
|
2012-05-09 17:58:01 +02:00
|
|
|
|
* (For Authdir: Have we validated this OR?) */
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
unsigned int is_fast:1; /** Do we think this is a fast OR? */
|
|
|
|
|
unsigned int is_stable:1; /** Do we think this is a stable OR? */
|
|
|
|
|
unsigned int is_possible_guard:1; /**< Do we think this is an OK guard? */
|
|
|
|
|
unsigned int is_exit:1; /**< Do we think this is an OK exit? */
|
|
|
|
|
unsigned int is_bad_exit:1; /**< Do we think this exit is censored, borked,
|
|
|
|
|
* or otherwise nasty? */
|
|
|
|
|
unsigned int is_hs_dir:1; /**< True iff this router is a hidden service
|
|
|
|
|
* directory according to the authorities. */
|
|
|
|
|
|
|
|
|
|
/* Local info: warning state. */
|
|
|
|
|
|
|
|
|
|
unsigned int name_lookup_warned:1; /**< Have we warned the user for referring
|
|
|
|
|
* to this (unnamed) router by nickname?
|
|
|
|
|
*/
|
|
|
|
|
|
2010-10-14 02:30:40 +02:00
|
|
|
|
/** Local info: we treat this node as if it rejects everything */
|
|
|
|
|
unsigned int rejects_all:1;
|
|
|
|
|
|
2013-02-14 17:48:47 +01:00
|
|
|
|
/** Local info: this node is in our list of guards */
|
|
|
|
|
unsigned int using_as_guard:1;
|
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/* Local info: derived. */
|
|
|
|
|
|
2012-08-23 12:23:00 +02:00
|
|
|
|
/** True if the IPv6 OR port is preferred over the IPv4 OR port. */
|
|
|
|
|
unsigned int ipv6_preferred:1;
|
|
|
|
|
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
/** According to the geoip db what country is this router in? */
|
2012-05-09 17:58:01 +02:00
|
|
|
|
/* XXXprop186 what is this suppose to mean with multiple OR ports? */
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
country_t country;
|
2012-03-27 15:00:34 +02:00
|
|
|
|
|
|
|
|
|
/* The below items are used only by authdirservers for
|
|
|
|
|
* reachability testing. */
|
|
|
|
|
|
|
|
|
|
/** When was the last time we could reach this OR? */
|
2012-05-09 17:58:01 +02:00
|
|
|
|
time_t last_reachable; /* IPv4. */
|
|
|
|
|
time_t last_reachable6; /* IPv6. */
|
|
|
|
|
|
2010-09-28 19:29:31 +02:00
|
|
|
|
} node_t;
|
|
|
|
|
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Linked list of microdesc hash lines for a single router in a directory
|
|
|
|
|
* vote.
|
|
|
|
|
*/
|
2009-08-20 17:39:22 +02:00
|
|
|
|
typedef struct vote_microdesc_hash_t {
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Next element in the list, or NULL. */
|
2009-08-20 17:39:22 +02:00
|
|
|
|
struct vote_microdesc_hash_t *next;
|
2013-04-02 17:49:30 +02:00
|
|
|
|
/** The raw contents of the microdesc hash line, from the "m" through the
|
|
|
|
|
* newline. */
|
2009-08-20 17:39:22 +02:00
|
|
|
|
char *microdesc_hash_line;
|
|
|
|
|
} vote_microdesc_hash_t;
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The claim about a single router, made in a vote. */
|
2007-06-03 05:05:10 +02:00
|
|
|
|
typedef struct vote_routerstatus_t {
|
2007-10-04 18:21:58 +02:00
|
|
|
|
routerstatus_t status; /**< Underlying 'status' object for this router.
|
|
|
|
|
* Flags are redundant. */
|
2012-09-13 17:45:05 +02:00
|
|
|
|
/** How many known-flags are allowed in a vote? This is the width of
|
|
|
|
|
* the flags field of vote_routerstatus_t */
|
|
|
|
|
#define MAX_KNOWN_FLAGS_IN_VOTE 64
|
2007-10-04 18:21:58 +02:00
|
|
|
|
uint64_t flags; /**< Bit-field for all recognized flags; index into
|
2008-02-05 22:39:29 +01:00
|
|
|
|
* networkstatus_t.known_flags. */
|
2007-10-04 18:21:58 +02:00
|
|
|
|
char *version; /**< The version that the authority says this router is
|
|
|
|
|
* running. */
|
Refactor storing of measured_bw versus Unmeasured=1.
This patch moves the measured_bw field and the has_measured_bw field
into vote_routerstatus_t, since only votes have 'Measured=XX' set on
their weight line.
I also added a new bw_is_unmeasured flag to routerstatus_t to
represent the Unmeasured=1 flag on a w line. Previously, I was using
has_measured_bw for this, which was quite incorrect: has_measured_bw
means that the measured_bw field is set, and it's probably a mistake
to have it serve double duty as meaning that 'baandwidth' represents a
measured value.
While making this change,I also found a harmless but stupid bug in
dirserv_read_measured_bandwidths: It assumes that it's getting a
smartlist of routerstatus_t, when really it's getting a smartlist of
vote_routerstatus_t. C's struct layout rules mean that we could never
actually get an error because of that, but it's still quite incorrect.
I fixed that, and in the process needed to add two more sorting and
searching helpers.
Finally, I made the Unmeasured=1 flag get parsed. We don't use it for
anything yet, but someday we might.
This isn't complete yet -- the new 2286 unit test doesn't build.
2013-02-19 16:39:27 +01:00
|
|
|
|
unsigned int has_measured_bw:1; /**< The vote had a measured bw */
|
2014-10-29 18:36:21 +01:00
|
|
|
|
unsigned int has_ed25519_listing:1; /** DOCDOC */
|
2014-11-13 16:03:55 +01:00
|
|
|
|
unsigned int ed25519_reflects_consensus:1; /** DOCDOC */
|
2013-04-11 17:43:40 +02:00
|
|
|
|
uint32_t measured_bw_kb; /**< Measured bandwidth (capacity) of the router */
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** The hash or hashes that the authority claims this microdesc has. */
|
2009-08-20 17:39:22 +02:00
|
|
|
|
vote_microdesc_hash_t *microdesc;
|
2014-10-29 18:36:21 +01:00
|
|
|
|
/** Ed25519 identity for this router, or zero if it has none. */
|
|
|
|
|
uint8_t ed25519_id[ED25519_PUBKEY_LEN];
|
2007-06-03 05:05:10 +02:00
|
|
|
|
} vote_routerstatus_t;
|
2007-05-31 21:03:44 +02:00
|
|
|
|
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** A signature of some document by an authority. */
|
|
|
|
|
typedef struct document_signature_t {
|
|
|
|
|
/** Declared SHA-1 digest of this voter's identity key */
|
|
|
|
|
char identity_digest[DIGEST_LEN];
|
|
|
|
|
/** Declared SHA-1 digest of signing key used by this voter. */
|
|
|
|
|
char signing_key_digest[DIGEST_LEN];
|
|
|
|
|
/** Algorithm used to compute the digest of the document. */
|
|
|
|
|
digest_algorithm_t alg;
|
|
|
|
|
/** Signature of the signed thing. */
|
|
|
|
|
char *signature;
|
|
|
|
|
/** Length of <b>signature</b> */
|
|
|
|
|
int signature_len;
|
|
|
|
|
unsigned int bad_signature : 1; /**< Set to true if we've tried to verify
|
|
|
|
|
* the sig, and we know it's bad. */
|
|
|
|
|
unsigned int good_signature : 1; /**< Set to true if we've verified the sig
|
|
|
|
|
* as good. */
|
|
|
|
|
} document_signature_t;
|
|
|
|
|
|
2008-02-12 21:20:52 +01:00
|
|
|
|
/** Information about a single voter in a vote or a consensus. */
|
2007-06-05 00:29:00 +02:00
|
|
|
|
typedef struct networkstatus_voter_info_t {
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** Declared SHA-1 digest of this voter's identity key */
|
|
|
|
|
char identity_digest[DIGEST_LEN];
|
2007-10-04 18:21:58 +02:00
|
|
|
|
char *nickname; /**< Nickname of this voter */
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** Digest of this voter's "legacy" identity key, if any. In vote only; for
|
|
|
|
|
* consensuses, we treat legacy keys as additional signers. */
|
|
|
|
|
char legacy_id_digest[DIGEST_LEN];
|
2007-10-04 18:21:58 +02:00
|
|
|
|
char *address; /**< Address of this voter, in string format. */
|
|
|
|
|
uint32_t addr; /**< Address of this voter, in IPv4, in host order. */
|
|
|
|
|
uint16_t dir_port; /**< Directory port of this voter */
|
|
|
|
|
uint16_t or_port; /**< OR port of this voter */
|
|
|
|
|
char *contact; /**< Contact information for this voter. */
|
|
|
|
|
char vote_digest[DIGEST_LEN]; /**< Digest of this voter's vote, as signed. */
|
|
|
|
|
|
2007-12-19 05:18:28 +01:00
|
|
|
|
/* Nothing from here on is signed. */
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** The signature of the document and the signature's status. */
|
|
|
|
|
smartlist_t *sigs;
|
2007-06-05 00:29:00 +02:00
|
|
|
|
} networkstatus_voter_info_t;
|
|
|
|
|
|
2008-07-24 11:22:27 +02:00
|
|
|
|
/** Enumerates the possible seriousness values of a networkstatus document. */
|
|
|
|
|
typedef enum {
|
|
|
|
|
NS_TYPE_VOTE,
|
|
|
|
|
NS_TYPE_CONSENSUS,
|
|
|
|
|
NS_TYPE_OPINION,
|
|
|
|
|
} networkstatus_type_t;
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** Enumerates recognized flavors of a consensus networkstatus document. All
|
|
|
|
|
* flavors of a consensus are generated from the same set of votes, but they
|
|
|
|
|
* present different types information to different versions of Tor. */
|
2009-09-16 23:01:01 +02:00
|
|
|
|
typedef enum {
|
2009-09-22 22:52:51 +02:00
|
|
|
|
FLAV_NS = 0,
|
|
|
|
|
FLAV_MICRODESC = 1,
|
2009-09-16 23:01:01 +02:00
|
|
|
|
} consensus_flavor_t;
|
|
|
|
|
|
2009-10-15 22:06:00 +02:00
|
|
|
|
/** How many different consensus flavors are there? */
|
2009-09-22 22:52:51 +02:00
|
|
|
|
#define N_CONSENSUS_FLAVORS ((int)(FLAV_MICRODESC)+1)
|
|
|
|
|
|
2008-02-05 22:39:29 +01:00
|
|
|
|
/** A common structure to hold a v3 network status vote, or a v3 network
|
2007-10-04 18:21:58 +02:00
|
|
|
|
* status consensus. */
|
2008-02-05 22:39:29 +01:00
|
|
|
|
typedef struct networkstatus_t {
|
2014-03-25 16:16:18 +01:00
|
|
|
|
networkstatus_type_t type; /**< Vote, consensus, or opinion? */
|
|
|
|
|
consensus_flavor_t flavor; /**< If a consensus, what kind? */
|
2012-05-22 15:48:10 +02:00
|
|
|
|
unsigned int has_measured_bws : 1;/**< True iff this networkstatus contains
|
|
|
|
|
* measured= bandwidth values. */
|
|
|
|
|
|
2009-05-27 23:55:51 +02:00
|
|
|
|
time_t published; /**< Vote only: Time when vote was written. */
|
2007-10-04 18:21:58 +02:00
|
|
|
|
time_t valid_after; /**< Time after which this vote or consensus applies. */
|
|
|
|
|
time_t fresh_until; /**< Time before which this is the most recent vote or
|
|
|
|
|
* consensus. */
|
|
|
|
|
time_t valid_until; /**< Time after which this vote or consensus should not
|
|
|
|
|
* be used. */
|
|
|
|
|
|
2007-10-19 20:56:24 +02:00
|
|
|
|
/** Consensus only: what method was used to produce this consensus? */
|
|
|
|
|
int consensus_method;
|
|
|
|
|
/** Vote only: what methods is this voter willing to use? */
|
|
|
|
|
smartlist_t *supported_methods;
|
|
|
|
|
|
2015-01-27 22:31:48 +01:00
|
|
|
|
/** List of 'package' lines describing hashes of downloadable packages */
|
2015-01-09 17:36:47 +01:00
|
|
|
|
smartlist_t *package_lines;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** How long does this vote/consensus claim that authorities take to
|
|
|
|
|
* distribute their votes to one another? */
|
2007-06-03 05:05:10 +02:00
|
|
|
|
int vote_seconds;
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** How long does this vote/consensus claim that authorities take to
|
2007-10-04 18:21:58 +02:00
|
|
|
|
* distribute their consensus signatures to one another? */
|
2007-06-03 05:05:10 +02:00
|
|
|
|
int dist_seconds;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Comma-separated list of recommended client software, or NULL if this
|
|
|
|
|
* voter has no opinion. */
|
2007-05-31 21:03:44 +02:00
|
|
|
|
char *client_versions;
|
|
|
|
|
char *server_versions;
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** List of flags that this vote/consensus applies to routers. If a flag is
|
|
|
|
|
* not listed here, the voter has no opinion on what its value should be. */
|
2007-06-08 20:41:09 +02:00
|
|
|
|
smartlist_t *known_flags;
|
2007-06-03 05:05:10 +02:00
|
|
|
|
|
2009-09-15 04:15:57 +02:00
|
|
|
|
/** List of key=value strings for the parameters in this vote or
|
|
|
|
|
* consensus, sorted by key. */
|
|
|
|
|
smartlist_t *net_params;
|
|
|
|
|
|
2010-01-30 00:40:40 +01:00
|
|
|
|
/** List of key=value strings for the bw weight parameters in the
|
|
|
|
|
* consensus. */
|
|
|
|
|
smartlist_t *weight_params;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** List of networkstatus_voter_info_t. For a vote, only one element
|
|
|
|
|
* is included. For a consensus, one element is included for every voter
|
|
|
|
|
* whose vote contributed to the consensus. */
|
|
|
|
|
smartlist_t *voters;
|
2007-06-03 05:05:10 +02:00
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
struct authority_cert_t *cert; /**< Vote only: the voter's certificate. */
|
2007-06-04 21:19:01 +02:00
|
|
|
|
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** Digests of this document, as signed. */
|
|
|
|
|
digests_t digests;
|
2007-06-05 00:57:23 +02:00
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** List of router statuses, sorted by identity digest. For a vote,
|
|
|
|
|
* the elements are vote_routerstatus_t; for a consensus, the elements
|
|
|
|
|
* are routerstatus_t. */
|
|
|
|
|
smartlist_t *routerstatus_list;
|
2007-10-16 01:15:24 +02:00
|
|
|
|
|
|
|
|
|
/** If present, a map from descriptor digest to elements of
|
|
|
|
|
* routerstatus_list. */
|
|
|
|
|
digestmap_t *desc_digest_map;
|
2008-02-05 22:39:29 +01:00
|
|
|
|
} networkstatus_t;
|
2007-05-31 21:03:44 +02:00
|
|
|
|
|
2009-09-16 23:01:01 +02:00
|
|
|
|
/** A set of signatures for a networkstatus consensus. Unless otherwise
|
|
|
|
|
* noted, all fields are as for networkstatus_t. */
|
2007-07-27 20:33:28 +02:00
|
|
|
|
typedef struct ns_detached_signatures_t {
|
|
|
|
|
time_t valid_after;
|
|
|
|
|
time_t fresh_until;
|
|
|
|
|
time_t valid_until;
|
2009-09-16 23:01:01 +02:00
|
|
|
|
strmap_t *digests; /**< Map from flavor name to digestset_t */
|
|
|
|
|
strmap_t *signatures; /**< Map from flavor name to list of
|
|
|
|
|
* document_signature_t */
|
2007-07-27 20:33:28 +02:00
|
|
|
|
} ns_detached_signatures_t;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Allowable types of desc_store_t. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
typedef enum store_type_t {
|
2007-10-04 18:21:58 +02:00
|
|
|
|
ROUTER_STORE = 0,
|
|
|
|
|
EXTRAINFO_STORE = 1
|
2007-08-31 17:08:37 +02:00
|
|
|
|
} store_type_t;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** A 'store' is a set of descriptors saved on disk, with accompanying
|
|
|
|
|
* journal, mmaped as needed, rebuilt as needed. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
typedef struct desc_store_t {
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Filename (within DataDir) for the store. We append .tmp to this
|
|
|
|
|
* filename for a temporary file when rebuilding the store, and .new to this
|
|
|
|
|
* filename for the journal. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
const char *fname_base;
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Human-readable description of what this store contains. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
const char *description;
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
tor_mmap_t *mmap; /**< A mmap for the main file in the store. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
store_type_t type; /**< What's stored in this store? */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
|
|
|
|
|
/** The size of the router log, in bytes. */
|
|
|
|
|
size_t journal_len;
|
|
|
|
|
/** The size of the router store, in bytes. */
|
|
|
|
|
size_t store_len;
|
|
|
|
|
/** Total bytes dropped since last rebuild: this is space currently
|
|
|
|
|
* used in the cache and the journal that could be freed by a rebuild. */
|
|
|
|
|
size_t bytes_dropped;
|
|
|
|
|
} desc_store_t;
|
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Contents of a directory of onion routers. */
|
2003-05-06 19:38:16 +02:00
|
|
|
|
typedef struct {
|
2005-10-27 02:34:39 +02:00
|
|
|
|
/** Map from server identity digest to a member of routers. */
|
2007-06-12 00:19:40 +02:00
|
|
|
|
struct digest_ri_map_t *identity_map;
|
2005-11-23 06:47:51 +01:00
|
|
|
|
/** Map from server descriptor digest to a signed_descriptor_t from
|
2005-11-05 21:15:27 +01:00
|
|
|
|
* routers or old_routers. */
|
2007-06-12 00:19:40 +02:00
|
|
|
|
struct digest_sd_map_t *desc_digest_map;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** Map from extra-info digest to an extrainfo_t. Only exists for
|
2007-04-16 23:37:21 +02:00
|
|
|
|
* routers in routers or old_routers. */
|
2007-06-12 00:19:40 +02:00
|
|
|
|
struct digest_ei_map_t *extra_info_map;
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** Map from extra-info digests to a signed_descriptor_t for a router
|
|
|
|
|
* descriptor having that extra-info digest. Only exists for
|
|
|
|
|
* routers in routers or old_routers. */
|
2007-06-12 00:19:40 +02:00
|
|
|
|
struct digest_sd_map_t *desc_by_eid_map;
|
2005-10-27 02:34:39 +02:00
|
|
|
|
/** List of routerinfo_t for all currently live routers we know. */
|
|
|
|
|
smartlist_t *routers;
|
2005-11-05 21:15:27 +01:00
|
|
|
|
/** List of signed_descriptor_t for older router descriptors we're
|
|
|
|
|
* caching. */
|
2005-10-27 02:34:39 +02:00
|
|
|
|
smartlist_t *old_routers;
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Store holding server descriptors. If present, any router whose
|
|
|
|
|
* cache_info.saved_location == SAVED_IN_CACHE is stored in this file
|
2006-10-07 18:25:28 +02:00
|
|
|
|
* starting at cache_info.saved_offset */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
desc_store_t desc_store;
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Store holding extra-info documents. */
|
2007-08-31 17:08:37 +02:00
|
|
|
|
desc_store_t extrainfo_store;
|
2003-12-05 10:51:49 +01:00
|
|
|
|
} routerlist_t;
|
2003-05-06 19:38:16 +02:00
|
|
|
|
|
2007-01-27 20:29:16 +01:00
|
|
|
|
/** Information on router used when extending a circuit. We don't need a
|
2005-06-29 23:46:55 +02:00
|
|
|
|
* full routerinfo_t to extend: we only need addr:port:keyid to build an OR
|
2007-01-27 20:29:16 +01:00
|
|
|
|
* connection, and onion_key to create the onionskin. Note that for onehop
|
|
|
|
|
* general-purpose tunnels, the onion_key is NULL. */
|
2005-06-29 23:46:55 +02:00
|
|
|
|
typedef struct extend_info_t {
|
2005-12-14 21:40:40 +01:00
|
|
|
|
char nickname[MAX_HEX_NICKNAME_LEN+1]; /**< This router's nickname for
|
|
|
|
|
* display. */
|
2005-07-14 10:43:19 +02:00
|
|
|
|
char identity_digest[DIGEST_LEN]; /**< Hash of this router's identity key. */
|
|
|
|
|
uint16_t port; /**< OR port. */
|
2008-08-05 22:08:19 +02:00
|
|
|
|
tor_addr_t addr; /**< IP address. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *onion_key; /**< Current onionskin key. */
|
2012-12-05 03:27:07 +01:00
|
|
|
|
curve25519_public_key_t curve25519_onion_key;
|
2005-06-29 23:46:55 +02:00
|
|
|
|
} extend_info_t;
|
|
|
|
|
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** Certificate for v3 directory protocol: binds long-term authority identity
|
|
|
|
|
* keys to medium-term authority signing keys. */
|
2007-05-02 23:37:55 +02:00
|
|
|
|
typedef struct authority_cert_t {
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Information relating to caching this cert on disk and looking it up. */
|
2007-05-02 23:37:55 +02:00
|
|
|
|
signed_descriptor_t cache_info;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** This authority's long-term authority identity key. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *identity_key;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** This authority's medium-term signing key. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *signing_key;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The digest of <b>signing_key</b> */
|
2007-07-26 22:49:04 +02:00
|
|
|
|
char signing_key_digest[DIGEST_LEN];
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The listed expiration time of this certificate. */
|
2007-05-02 23:37:55 +02:00
|
|
|
|
time_t expires;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** This authority's IPv4 address, in host order. */
|
2007-10-19 18:28:10 +02:00
|
|
|
|
uint32_t addr;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** This authority's directory port. */
|
2007-10-19 18:28:10 +02:00
|
|
|
|
uint16_t dir_port;
|
2007-05-02 23:37:55 +02:00
|
|
|
|
} authority_cert_t;
|
|
|
|
|
|
2010-11-08 20:35:02 +01:00
|
|
|
|
/** Bitfield enum type listing types of information that directory authorities
|
|
|
|
|
* can be authoritative about, and that directory caches may or may not cache.
|
2010-11-08 20:21:32 +01:00
|
|
|
|
*
|
|
|
|
|
* Note that the granularity here is based on authority granularity and on
|
|
|
|
|
* cache capabilities. Thus, one particular bit may correspond in practice to
|
|
|
|
|
* a few types of directory info, so long as every authority that pronounces
|
|
|
|
|
* officially about one of the types prounounces officially about all of them,
|
|
|
|
|
* and so long as every cache that caches one of them caches all of them.
|
2010-11-08 20:35:02 +01:00
|
|
|
|
*/
|
2007-05-08 11:09:26 +02:00
|
|
|
|
typedef enum {
|
2010-11-08 20:35:02 +01:00
|
|
|
|
NO_DIRINFO = 0,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Serves/signs v3 directory information: votes, consensuses, certs */
|
2010-11-08 20:35:02 +01:00
|
|
|
|
V3_DIRINFO = 1 << 2,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Serves bridge descriptors. */
|
2010-11-08 20:35:02 +01:00
|
|
|
|
BRIDGE_DIRINFO = 1 << 4,
|
|
|
|
|
/** Serves extrainfo documents. */
|
2010-11-08 20:21:32 +01:00
|
|
|
|
EXTRAINFO_DIRINFO=1 << 5,
|
|
|
|
|
/** Serves microdescriptors. */
|
|
|
|
|
MICRODESC_DIRINFO=1 << 6,
|
2010-11-08 20:27:36 +01:00
|
|
|
|
} dirinfo_type_t;
|
2007-05-08 11:09:26 +02:00
|
|
|
|
|
2012-09-10 22:33:19 +02:00
|
|
|
|
#define ALL_DIRINFO ((dirinfo_type_t)((1<<7)-1))
|
|
|
|
|
|
2005-03-23 07:21:48 +01:00
|
|
|
|
#define CRYPT_PATH_MAGIC 0x70127012u
|
|
|
|
|
|
2012-12-04 22:51:31 +01:00
|
|
|
|
struct fast_handshake_state_t;
|
2012-12-05 03:27:07 +01:00
|
|
|
|
struct ntor_handshake_state_t;
|
2013-01-15 21:40:17 +01:00
|
|
|
|
#define ONION_HANDSHAKE_TYPE_TAP 0x0000
|
2012-12-05 03:27:07 +01:00
|
|
|
|
#define ONION_HANDSHAKE_TYPE_FAST 0x0001
|
|
|
|
|
#define ONION_HANDSHAKE_TYPE_NTOR 0x0002
|
2012-12-27 00:08:01 +01:00
|
|
|
|
#define MAX_ONION_HANDSHAKE_TYPE 0x0002
|
2012-12-05 03:27:07 +01:00
|
|
|
|
typedef struct {
|
|
|
|
|
uint16_t tag;
|
|
|
|
|
union {
|
|
|
|
|
struct fast_handshake_state_t *fast;
|
|
|
|
|
crypto_dh_t *tap;
|
|
|
|
|
struct ntor_handshake_state_t *ntor;
|
|
|
|
|
} u;
|
|
|
|
|
} onion_handshake_state_t;
|
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Holds accounting information for a single step in the layered encryption
|
|
|
|
|
* performed by a circuit. Used only at the client edge of a circuit. */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
typedef struct crypt_path_t {
|
2005-03-23 07:21:48 +01:00
|
|
|
|
uint32_t magic;
|
Integrated onion proxy into or/
The 'or' process can now be told (by the global_role variable) what
roles this server should play -- connect to all ORs, listen for ORs,
listen for OPs, listen for APs, or any combination.
* everything in /src/op/ is now obsolete.
* connection_ap.c now handles all interactions with application proxies
* "port" is now or_port, op_port, ap_port. But routers are still always
referenced (say, in conn_get_by_addr_port()) by addr / or_port. We
should make routers.c actually read these new ports (currently I've
kludged it so op_port = or_port+10, ap_port=or_port+20)
* circuits currently know if they're at the beginning of the path because
circ->cpath is set. They use this instead for crypts (both ways),
if it's set.
* I still obey the "send a 0 back to the AP when you're ready" protocol,
but I think we should phase it out. I can simply not read from the AP
socket until I'm ready.
I need to do a lot of cleanup work here, but the code appears to work, so
now's a good time for a checkin.
svn:r22
2002-07-02 11:36:58 +02:00
|
|
|
|
|
2002-08-22 09:30:03 +02:00
|
|
|
|
/* crypto environments */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Encryption key and counter for cells heading towards the OR at this
|
|
|
|
|
* step. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_cipher_t *f_crypto;
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Encryption key and counter for cells heading back from the OR at this
|
|
|
|
|
* step. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_cipher_t *b_crypto;
|
2003-05-02 00:55:51 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Digest state for cells heading towards the OR at this step. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_digest_t *f_digest; /* for integrity checking */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Digest state for cells heading away from the OR at this step. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_digest_t *b_digest;
|
2003-12-16 09:21:58 +01:00
|
|
|
|
|
2012-12-05 03:27:07 +01:00
|
|
|
|
/** Current state of the handshake as performed with the OR at this
|
2004-05-10 08:52:01 +02:00
|
|
|
|
* step. */
|
2012-12-05 03:27:07 +01:00
|
|
|
|
onion_handshake_state_t handshake_state;
|
|
|
|
|
/** Diffie-hellman handshake state for performing an introduction
|
|
|
|
|
* operations */
|
|
|
|
|
crypto_dh_t *rend_dh_handshake_state;
|
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Negotiated key material shared with the OR at this step. */
|
2012-12-05 03:39:54 +01:00
|
|
|
|
char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */
|
2003-05-06 01:24:46 +02:00
|
|
|
|
|
2005-06-29 23:46:55 +02:00
|
|
|
|
/** Information to extend to the OR at this step. */
|
|
|
|
|
extend_info_t *extend_info;
|
2003-05-06 01:24:46 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Is the circuit built to this step? Must be one of:
|
|
|
|
|
* - CPATH_STATE_CLOSED (The circuit has not been extended to this step)
|
|
|
|
|
* - CPATH_STATE_AWAITING_KEYS (We have sent an EXTEND/CREATE to this step
|
|
|
|
|
* and not received an EXTENDED/CREATED)
|
|
|
|
|
* - CPATH_STATE_OPEN (The circuit has been extended to this step) */
|
2003-09-05 08:04:03 +02:00
|
|
|
|
uint8_t state;
|
2003-05-02 00:55:51 +02:00
|
|
|
|
#define CPATH_STATE_CLOSED 0
|
2003-05-06 01:24:46 +02:00
|
|
|
|
#define CPATH_STATE_AWAITING_KEYS 1
|
2003-05-02 00:55:51 +02:00
|
|
|
|
#define CPATH_STATE_OPEN 2
|
2004-05-10 08:52:01 +02:00
|
|
|
|
struct crypt_path_t *next; /**< Link to next crypt_path_t in the circuit.
|
|
|
|
|
* (The list is circular, so the last node
|
|
|
|
|
* links to the first.) */
|
|
|
|
|
struct crypt_path_t *prev; /**< Link to previous crypt_path_t in the
|
2004-05-10 12:27:54 +02:00
|
|
|
|
* circuit. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
|
2009-09-15 12:33:33 +02:00
|
|
|
|
int package_window; /**< How many cells are we allowed to originate ending
|
2004-05-10 08:52:01 +02:00
|
|
|
|
* at this step? */
|
2009-09-15 12:33:33 +02:00
|
|
|
|
int deliver_window; /**< How many cells are we willing to deliver originating
|
2004-05-10 08:52:01 +02:00
|
|
|
|
* at this step? */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
} crypt_path_t;
|
2003-05-02 00:55:51 +02:00
|
|
|
|
|
2012-01-07 07:44:20 +01:00
|
|
|
|
/** A reference-counted pointer to a crypt_path_t, used only to share
|
|
|
|
|
* the final rendezvous cpath to be used on a service-side rendezvous
|
|
|
|
|
* circuit among multiple circuits built in parallel to the same
|
|
|
|
|
* destination rendezvous point. */
|
|
|
|
|
typedef struct {
|
|
|
|
|
/** The reference count. */
|
|
|
|
|
unsigned int refcount;
|
|
|
|
|
/** The pointer. Set to NULL when the crypt_path_t is put into use
|
|
|
|
|
* on an opened rendezvous circuit. */
|
|
|
|
|
crypt_path_t *cpath;
|
|
|
|
|
} crypt_path_reference_t;
|
|
|
|
|
|
2004-05-13 09:24:49 +02:00
|
|
|
|
#define CPATH_KEY_MATERIAL_LEN (20*2+16*2)
|
|
|
|
|
|
2004-04-05 22:53:50 +02:00
|
|
|
|
#define DH_KEY_LEN DH_BYTES
|
2003-05-06 07:54:42 +02:00
|
|
|
|
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** Information used to build a circuit. */
|
2003-11-16 18:00:02 +01:00
|
|
|
|
typedef struct {
|
2004-05-10 12:31:48 +02:00
|
|
|
|
/** Intended length of the final circuit. */
|
2003-11-16 18:00:02 +01:00
|
|
|
|
int desired_path_len;
|
2005-06-29 23:46:55 +02:00
|
|
|
|
/** How to extend to the planned exit node. */
|
|
|
|
|
extend_info_t *chosen_exit;
|
2005-01-12 05:58:23 +01:00
|
|
|
|
/** Whether every node in the circ must have adequate uptime. */
|
2011-06-24 20:28:15 +02:00
|
|
|
|
unsigned int need_uptime : 1;
|
2005-01-12 05:58:23 +01:00
|
|
|
|
/** Whether every node in the circ must have adequate capacity. */
|
2011-06-24 20:28:15 +02:00
|
|
|
|
unsigned int need_capacity : 1;
|
Introduce a notion of 'internal' circs, which are chosen without regard
to the exit policy of the last hop. Intro and rendezvous circs must
be internal circs, to avoid leaking information. Resolve and connect
streams can use internal circs if they want.
New circuit pooling algorithm: make sure to have enough circs around
to satisfy any predicted ports, and also make sure to have 2 internal
circs around if we've required internal circs lately (with high uptime
if we've seen that lately).
Split NewCircuitPeriod config option into NewCircuitPeriod (30 secs),
which describes how often we retry making new circuits if current ones
are dirty, and MaxCircuitDirtiness (10 mins), which describes how long
we're willing to make use of an already-dirty circuit.
Once rendezvous circuits are established, keep using the same circuit as
long as you attach a new stream to it at least every 10 minutes. (So web
browsing doesn't require you to build new rend circs every 30 seconds.)
Cannibalize GENERAL circs to be C_REND, C_INTRO, S_INTRO, and S_REND
circ as necessary, if there are any completed ones lying around when
we try to launch one.
Re-instate the ifdef's to use version-0 style introduce cells, since
there was yet another bug in handling version-1 style. We'll try switching
over again after 0.0.9 is obsolete.
Bugfix: when choosing an exit node for a new non-internal circ, don't take
into account whether it'll be useful for any pending x.onion addresses --
it won't.
Bugfix: we weren't actually publishing the hidden service descriptor when
it became dirty. So we only published it every 20 minutes or so, which
means when you first start your Tor, the hidden service will seem broken.
svn:r3360
2005-01-17 19:13:09 +01:00
|
|
|
|
/** Whether the last hop was picked with exiting in mind. */
|
2011-06-24 20:28:15 +02:00
|
|
|
|
unsigned int is_internal : 1;
|
2011-06-24 20:28:52 +02:00
|
|
|
|
/** Did we pick this as a one-hop tunnel (not safe for other streams)?
|
|
|
|
|
* These are for encrypted dir conns that exit to this router, not
|
2006-12-13 23:42:52 +01:00
|
|
|
|
* for arbitrary exits from the circuit. */
|
2011-06-24 20:28:15 +02:00
|
|
|
|
unsigned int onehop_tunnel : 1;
|
2004-05-10 12:31:48 +02:00
|
|
|
|
/** The crypt_path_t to append after rendezvous: used for rendezvous. */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
crypt_path_t *pending_final_cpath;
|
2012-01-07 07:44:20 +01:00
|
|
|
|
/** A ref-counted reference to the crypt_path_t to append after
|
|
|
|
|
* rendezvous; used on the service side. */
|
|
|
|
|
crypt_path_reference_t *service_pending_final_cpath_ref;
|
2004-05-10 08:52:01 +02:00
|
|
|
|
/** How many times has building a circuit for this task failed? */
|
2004-04-14 23:40:50 +02:00
|
|
|
|
int failure_count;
|
2005-03-19 05:38:59 +01:00
|
|
|
|
/** At what time should we give up on this task? */
|
|
|
|
|
time_t expiry_time;
|
2003-11-16 18:00:02 +01:00
|
|
|
|
} cpath_build_state_t;
|
2003-11-14 21:45:47 +01:00
|
|
|
|
|
2013-10-02 21:11:34 +02:00
|
|
|
|
/** "magic" value for an origin_circuit_t */
|
2006-07-23 09:37:35 +02:00
|
|
|
|
#define ORIGIN_CIRCUIT_MAGIC 0x35315243u
|
2013-10-02 21:11:34 +02:00
|
|
|
|
/** "magic" value for an or_circuit_t */
|
2006-07-23 09:37:35 +02:00
|
|
|
|
#define OR_CIRCUIT_MAGIC 0x98ABC04Fu
|
2013-10-02 21:11:34 +02:00
|
|
|
|
/** "magic" value for a circuit that would have been freed by circuit_free,
|
|
|
|
|
* but which we're keeping around until a cpuworker reply arrives. See
|
|
|
|
|
* circuit_free() for more documentation. */
|
|
|
|
|
#define DEAD_CIRCUIT_MAGIC 0xdeadc14c
|
2006-07-23 09:37:35 +02:00
|
|
|
|
|
2012-12-06 05:07:49 +01:00
|
|
|
|
struct create_cell_t;
|
|
|
|
|
|
2013-05-24 12:29:42 +02:00
|
|
|
|
/** Entry in the cell stats list of a circuit; used only if CELL_STATS
|
|
|
|
|
* events are enabled. */
|
2013-02-06 14:37:38 +01:00
|
|
|
|
typedef struct testing_cell_stats_entry_t {
|
|
|
|
|
uint8_t command; /**< cell command number. */
|
|
|
|
|
/** Waiting time in centiseconds if this event is for a removed cell,
|
|
|
|
|
* or 0 if this event is for adding a cell to the queue. 22 bits can
|
|
|
|
|
* store more than 11 hours, enough to assume that a circuit with this
|
|
|
|
|
* delay would long have been closed. */
|
|
|
|
|
unsigned int waiting_time:22;
|
|
|
|
|
unsigned int removed:1; /**< 0 for added to, 1 for removed from queue. */
|
2013-05-24 12:29:42 +02:00
|
|
|
|
unsigned int exitward:1; /**< 0 for app-ward, 1 for exit-ward. */
|
2013-02-06 14:37:38 +01:00
|
|
|
|
} testing_cell_stats_entry_t;
|
|
|
|
|
|
2005-06-11 08:07:22 +02:00
|
|
|
|
/**
|
|
|
|
|
* A circuit is a path over the onion routing
|
|
|
|
|
* network. Applications can connect to one end of the circuit, and can
|
|
|
|
|
* create exit connections at the other end of the circuit. AP and exit
|
|
|
|
|
* connections have only one circuit associated with them (and thus these
|
|
|
|
|
* connection types are closed when the circuit is closed), whereas
|
|
|
|
|
* OR connections multiplex many circuits at once, and stay standing even
|
|
|
|
|
* when there are no circuits running over them.
|
|
|
|
|
*
|
2006-12-24 07:32:24 +01:00
|
|
|
|
* A circuit_t structure can fill one of two roles. First, a or_circuit_t
|
2006-07-27 07:03:57 +02:00
|
|
|
|
* links two connections together: either an edge connection and an OR
|
|
|
|
|
* connection, or two OR connections. (When joined to an OR connection, a
|
|
|
|
|
* circuit_t affects only cells sent to a particular circID on that
|
|
|
|
|
* connection. When joined to an edge connection, a circuit_t affects all
|
|
|
|
|
* data.)
|
|
|
|
|
|
|
|
|
|
* Second, an origin_circuit_t holds the cipher keys and state for sending data
|
2005-06-11 08:07:22 +02:00
|
|
|
|
* along a given circuit. At the OP, it has a sequence of ciphers, each
|
|
|
|
|
* of which is shared with a single OR along the circuit. Separate
|
|
|
|
|
* ciphers are used for data going "forward" (away from the OP) and
|
|
|
|
|
* "backward" (towards the OP). At the OR, a circuit has only two stream
|
|
|
|
|
* ciphers: one for data going forward, and one for data going backward.
|
|
|
|
|
*/
|
2006-07-23 09:37:35 +02:00
|
|
|
|
typedef struct circuit_t {
|
|
|
|
|
uint32_t magic; /**< For memory and type debugging: must equal
|
|
|
|
|
* ORIGIN_CIRCUIT_MAGIC or OR_CIRCUIT_MAGIC. */
|
2004-02-25 08:31:46 +01:00
|
|
|
|
|
2012-08-08 15:02:47 +02:00
|
|
|
|
/** The channel that is next in this circuit. */
|
|
|
|
|
channel_t *n_chan;
|
2012-09-21 23:45:32 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The circuit_id used in the next (forward) hop of this circuit;
|
|
|
|
|
* this is unique to n_chan, but this ordered pair is globally
|
|
|
|
|
* unique:
|
|
|
|
|
*
|
|
|
|
|
* (n_chan->global_identifier, n_circ_id)
|
|
|
|
|
*/
|
2008-07-23 17:58:30 +02:00
|
|
|
|
circid_t n_circ_id;
|
2008-07-30 15:04:32 +02:00
|
|
|
|
|
2012-09-21 23:46:22 +02:00
|
|
|
|
/**
|
|
|
|
|
* Circuit mux associated with n_chan to which this circuit is attached;
|
|
|
|
|
* NULL if we have no n_chan.
|
|
|
|
|
*/
|
2012-09-26 20:51:39 +02:00
|
|
|
|
circuitmux_t *n_mux;
|
2012-09-21 23:46:22 +02:00
|
|
|
|
|
|
|
|
|
/** Queue of cells waiting to be transmitted on n_chan */
|
|
|
|
|
cell_queue_t n_chan_cells;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The hop to which we want to extend this circuit. Should be NULL if
|
2012-10-01 10:58:13 +02:00
|
|
|
|
* the circuit has attached to a channel.
|
2012-09-21 23:46:22 +02:00
|
|
|
|
*/
|
2008-07-30 15:04:32 +02:00
|
|
|
|
extend_info_t *n_hop;
|
2007-03-26 16:08:18 +02:00
|
|
|
|
|
2012-08-08 15:02:47 +02:00
|
|
|
|
/** True iff we are waiting for n_chan_cells to become less full before
|
2007-03-26 16:08:35 +02:00
|
|
|
|
* allowing p_streams to add any more cells. (Origin circuit only.) */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
unsigned int streams_blocked_on_n_chan : 1;
|
|
|
|
|
/** True iff we are waiting for p_chan_cells to become less full before
|
2007-03-26 16:08:35 +02:00
|
|
|
|
* allowing n_streams to add any more cells. (OR circuit only.) */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
unsigned int streams_blocked_on_p_chan : 1;
|
2007-03-26 16:08:18 +02:00
|
|
|
|
|
2013-03-15 15:45:48 +01:00
|
|
|
|
/** True iff we have queued a delete backwards on this circuit, but not put
|
|
|
|
|
* it on the output buffer. */
|
|
|
|
|
unsigned int p_delete_pending : 1;
|
|
|
|
|
/** True iff we have queued a delete forwards on this circuit, but not put
|
|
|
|
|
* it on the output buffer. */
|
|
|
|
|
unsigned int n_delete_pending : 1;
|
|
|
|
|
|
2013-10-31 21:53:31 +01:00
|
|
|
|
/** True iff this circuit has received a DESTROY cell in either direction */
|
|
|
|
|
unsigned int received_destroy : 1;
|
|
|
|
|
|
2007-05-17 00:15:57 +02:00
|
|
|
|
uint8_t state; /**< Current status of this circuit. */
|
|
|
|
|
uint8_t purpose; /**< Why are we creating this circuit? */
|
|
|
|
|
|
2004-05-10 09:37:10 +02:00
|
|
|
|
/** How many relay data cells can we package (read from edge streams)
|
|
|
|
|
* on this circuit before we receive a circuit-level sendme cell asking
|
|
|
|
|
* for more? */
|
2003-05-20 08:41:23 +02:00
|
|
|
|
int package_window;
|
2004-05-10 09:37:10 +02:00
|
|
|
|
/** How many relay data cells will we deliver (write to edge streams)
|
|
|
|
|
* on this circuit? When deliver_window gets low, we send some
|
|
|
|
|
* circuit-level sendme cells to indicate that we're willing to accept
|
|
|
|
|
* more. */
|
2003-05-20 08:41:23 +02:00
|
|
|
|
int deliver_window;
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2013-11-16 00:38:52 +01:00
|
|
|
|
/** Temporary field used during circuits_handle_oom. */
|
|
|
|
|
uint32_t age_tmp;
|
|
|
|
|
|
2012-12-06 05:07:49 +01:00
|
|
|
|
/** For storage while n_chan is pending (state CIRCUIT_STATE_CHAN_WAIT). */
|
|
|
|
|
struct create_cell_t *n_chan_create_cell;
|
2004-07-02 11:29:01 +02:00
|
|
|
|
|
2012-10-26 02:43:10 +02:00
|
|
|
|
/** When did circuit construction actually begin (ie send the
|
|
|
|
|
* CREATE cell or begin cannibalization).
|
|
|
|
|
*
|
|
|
|
|
* Note: This timer will get reset if we decide to cannibalize
|
|
|
|
|
* a circuit. It may also get reset during certain phases of hidden
|
|
|
|
|
* service circuit use.
|
|
|
|
|
*
|
|
|
|
|
* We keep this timestamp with a higher resolution than most so that the
|
|
|
|
|
* circuit-build-time tracking code can get millisecond resolution.
|
|
|
|
|
*/
|
|
|
|
|
struct timeval timestamp_began;
|
|
|
|
|
|
|
|
|
|
/** This timestamp marks when the init_circuit_base constructor ran. */
|
2010-10-15 18:35:55 +02:00
|
|
|
|
struct timeval timestamp_created;
|
2012-10-26 02:43:10 +02:00
|
|
|
|
|
2011-03-25 22:49:44 +01:00
|
|
|
|
/** When the circuit was first used, or 0 if the circuit is clean.
|
|
|
|
|
*
|
|
|
|
|
* XXXX023 Note that some code will artifically adjust this value backward
|
|
|
|
|
* in time in order to indicate that a circuit shouldn't be used for new
|
|
|
|
|
* streams, but that it can stay alive as long as it has streams on it.
|
|
|
|
|
* That's a kludge we should fix.
|
2011-05-29 17:03:41 +02:00
|
|
|
|
*
|
|
|
|
|
* XXX023 The CBT code uses this field to record when HS-related
|
|
|
|
|
* circuits entered certain states. This usage probably won't
|
|
|
|
|
* interfere with this field's primary purpose, but we should
|
|
|
|
|
* document it more thoroughly to make sure of that.
|
2015-09-01 18:30:48 +02:00
|
|
|
|
*
|
|
|
|
|
* XXX027 The SocksPort option KeepaliveIsolateSOCKSAuth will artificially
|
|
|
|
|
* adjust this value forward each time a suitable stream is attached to an
|
|
|
|
|
* already constructed circuit, potentially keeping the circuit alive
|
|
|
|
|
* indefinitely.
|
2011-03-25 22:49:44 +01:00
|
|
|
|
*/
|
|
|
|
|
time_t timestamp_dirty;
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2005-12-14 22:03:51 +01:00
|
|
|
|
uint16_t marked_for_close; /**< Should we close this circuit at the end of
|
|
|
|
|
* the main loop? (If true, holds the line number
|
|
|
|
|
* where this circuit was marked.) */
|
|
|
|
|
const char *marked_for_close_file; /**< For debugging: in which file was this
|
|
|
|
|
* circuit marked for close? */
|
|
|
|
|
|
2012-09-21 23:46:22 +02:00
|
|
|
|
/** Unique ID for measuring tunneled network status requests. */
|
|
|
|
|
uint64_t dirreq_id;
|
|
|
|
|
|
2014-08-15 21:42:14 +02:00
|
|
|
|
/** Index in smartlist of all circuits (global_circuitlist). */
|
|
|
|
|
int global_circuitlist_idx;
|
2012-09-21 23:46:22 +02:00
|
|
|
|
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** Next circuit in the doubly-linked ring of circuits waiting to add
|
2007-04-10 18:24:50 +02:00
|
|
|
|
* cells to n_conn. NULL if we have no cells pending, or if we're not
|
|
|
|
|
* linked to an OR connection. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
struct circuit_t *next_active_on_n_chan;
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** Previous circuit in the doubly-linked ring of circuits waiting to add
|
2007-04-10 18:24:50 +02:00
|
|
|
|
* cells to n_conn. NULL if we have no cells pending, or if we're not
|
|
|
|
|
* linked to an OR connection. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
struct circuit_t *prev_active_on_n_chan;
|
2013-02-06 14:37:38 +01:00
|
|
|
|
|
|
|
|
|
/** Various statistics about cells being added to or removed from this
|
2013-05-24 12:29:42 +02:00
|
|
|
|
* circuit's queues; used only if CELL_STATS events are enabled and
|
|
|
|
|
* cleared after being sent to control port. */
|
2013-02-06 14:37:38 +01:00
|
|
|
|
smartlist_t *testing_cell_stats;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
} circuit_t;
|
|
|
|
|
|
2008-07-23 17:58:38 +02:00
|
|
|
|
/** Largest number of relay_early cells that we can send on a given
|
|
|
|
|
* circuit. */
|
|
|
|
|
#define MAX_RELAY_EARLY_CELLS_PER_CIRCUIT 8
|
|
|
|
|
|
2012-08-17 01:29:19 +02:00
|
|
|
|
/**
|
|
|
|
|
* Describes the circuit building process in simplified terms based
|
2013-01-30 22:01:10 +01:00
|
|
|
|
* on the path bias accounting state for a circuit.
|
|
|
|
|
*
|
|
|
|
|
* NOTE: These state values are enumerated in the order for which we
|
|
|
|
|
* expect circuits to transition through them. If you add states,
|
|
|
|
|
* you need to preserve this overall ordering. The various pathbias
|
|
|
|
|
* state transition and accounting functions (pathbias_mark_* and
|
|
|
|
|
* pathbias_count_*) contain ordinal comparisons to enforce proper
|
|
|
|
|
* state transitions for corrections.
|
|
|
|
|
*
|
|
|
|
|
* This state machine and the associated logic was created to prevent
|
|
|
|
|
* miscounting due to unknown cases of circuit reuse. See also tickets
|
|
|
|
|
* #6475 and #7802.
|
2012-08-17 01:29:19 +02:00
|
|
|
|
*/
|
2012-08-16 04:59:55 +02:00
|
|
|
|
typedef enum {
|
2012-08-17 01:29:19 +02:00
|
|
|
|
/** This circuit is "new". It has not yet completed a first hop
|
|
|
|
|
* or been counted by the path bias code. */
|
2012-08-16 04:59:55 +02:00
|
|
|
|
PATH_STATE_NEW_CIRC = 0,
|
2012-12-10 05:18:31 +01:00
|
|
|
|
/** This circuit has completed one/two hops, and has been counted by
|
2012-08-17 01:29:19 +02:00
|
|
|
|
* the path bias logic. */
|
2012-12-10 05:18:31 +01:00
|
|
|
|
PATH_STATE_BUILD_ATTEMPTED = 1,
|
2012-12-08 02:47:23 +01:00
|
|
|
|
/** This circuit has been completely built */
|
|
|
|
|
PATH_STATE_BUILD_SUCCEEDED = 2,
|
2013-01-19 04:37:16 +01:00
|
|
|
|
/** Did we try to attach any SOCKS streams or hidserv introductions to
|
|
|
|
|
* this circuit?
|
|
|
|
|
*
|
|
|
|
|
* Note: If we ever implement end-to-end stream timing through test
|
|
|
|
|
* stream probes (#5707), we must *not* set this for those probes
|
|
|
|
|
* (or any other automatic streams) because the adversary could
|
|
|
|
|
* just tag at a later point.
|
|
|
|
|
*/
|
|
|
|
|
PATH_STATE_USE_ATTEMPTED = 3,
|
2012-12-08 02:47:23 +01:00
|
|
|
|
/** Did any SOCKS streams or hidserv introductions actually succeed on
|
|
|
|
|
* this circuit?
|
|
|
|
|
*
|
2013-01-30 22:01:10 +01:00
|
|
|
|
* If any streams detatch/fail from this circuit, the code transitions
|
2013-01-31 02:27:38 +01:00
|
|
|
|
* the circuit back to PATH_STATE_USE_ATTEMPTED to ensure we probe. See
|
|
|
|
|
* pathbias_mark_use_rollback() for that.
|
2012-12-08 02:47:23 +01:00
|
|
|
|
*/
|
2013-01-19 04:37:16 +01:00
|
|
|
|
PATH_STATE_USE_SUCCEEDED = 4,
|
2012-12-12 02:49:12 +01:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This is a special state to indicate that we got a corrupted
|
|
|
|
|
* relay cell on a circuit and we don't intend to probe it.
|
|
|
|
|
*/
|
2013-01-19 04:37:16 +01:00
|
|
|
|
PATH_STATE_USE_FAILED = 5,
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This is a special state to indicate that we already counted
|
|
|
|
|
* the circuit. Used to guard against potential state machine
|
|
|
|
|
* violations.
|
|
|
|
|
*/
|
|
|
|
|
PATH_STATE_ALREADY_COUNTED = 6,
|
2012-08-16 04:59:55 +02:00
|
|
|
|
} path_state_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define path_state_bitfield_t ENUM_BF(path_state_t)
|
2012-08-16 04:59:55 +02:00
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** An origin_circuit_t holds data necessary to build and use a circuit.
|
|
|
|
|
*/
|
2006-07-23 09:37:35 +02:00
|
|
|
|
typedef struct origin_circuit_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
circuit_t base_;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
|
2006-07-30 06:54:13 +02:00
|
|
|
|
/** Linked list of AP streams (or EXIT streams if hidden service)
|
|
|
|
|
* associated with this circuit. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
edge_connection_t *p_streams;
|
2013-02-24 13:32:57 +01:00
|
|
|
|
|
|
|
|
|
/** Bytes read from any attached stream since last call to
|
2013-05-25 13:04:33 +02:00
|
|
|
|
* control_event_circ_bandwidth_used(). Only used if we're configured
|
|
|
|
|
* to emit CIRC_BW events. */
|
|
|
|
|
uint32_t n_read_circ_bw;
|
2013-02-24 13:32:57 +01:00
|
|
|
|
|
|
|
|
|
/** Bytes written to any attached stream since last call to
|
2013-05-25 13:04:33 +02:00
|
|
|
|
* control_event_circ_bandwidth_used(). Only used if we're configured
|
|
|
|
|
* to emit CIRC_BW events. */
|
|
|
|
|
uint32_t n_written_circ_bw;
|
2013-02-24 13:32:57 +01:00
|
|
|
|
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** Build state for this circuit. It includes the intended path
|
|
|
|
|
* length, the chosen exit router, rendezvous information, etc.
|
|
|
|
|
*/
|
|
|
|
|
cpath_build_state_t *build_state;
|
|
|
|
|
/** The doubly-linked list of crypt_path_t entries, one per hop,
|
|
|
|
|
* for this circuit. This includes ciphers for each hop,
|
|
|
|
|
* integrity-checking digests for each hop, and package/delivery
|
|
|
|
|
* windows for each hop.
|
|
|
|
|
*/
|
|
|
|
|
crypt_path_t *cpath;
|
2003-08-21 01:05:22 +02:00
|
|
|
|
|
2008-09-24 16:44:29 +02:00
|
|
|
|
/** Holds all rendezvous data on either client or service side. */
|
|
|
|
|
rend_data_t *rend_data;
|
2007-10-31 21:48:08 +01:00
|
|
|
|
|
2008-07-23 17:58:38 +02:00
|
|
|
|
/** How many more relay_early cells can we send on this circuit, according
|
|
|
|
|
* to the specification? */
|
|
|
|
|
unsigned int remaining_relay_early_cells : 4;
|
2007-10-31 21:48:06 +01:00
|
|
|
|
|
2010-09-29 20:41:27 +02:00
|
|
|
|
/** Set if this circuit is insanely old and we already informed the user */
|
2010-06-15 23:46:01 +02:00
|
|
|
|
unsigned int is_ancient : 1;
|
|
|
|
|
|
2010-09-29 20:41:27 +02:00
|
|
|
|
/** Set if this circuit has already been opened. Used to detect
|
|
|
|
|
* cannibalized circuits. */
|
|
|
|
|
unsigned int has_opened : 1;
|
|
|
|
|
|
2013-01-30 22:01:10 +01:00
|
|
|
|
/**
|
|
|
|
|
* Path bias state machine. Used to ensure integrity of our
|
|
|
|
|
* circuit building and usage accounting. See path_state_t
|
|
|
|
|
* for more details.
|
|
|
|
|
*/
|
2014-03-25 16:16:18 +01:00
|
|
|
|
path_state_bitfield_t path_state : 3;
|
2012-08-16 04:59:55 +02:00
|
|
|
|
|
2013-02-20 00:29:17 +01:00
|
|
|
|
/* If this flag is set, we should not consider attaching any more
|
|
|
|
|
* connections to this circuit. */
|
|
|
|
|
unsigned int unusable_for_new_conns : 1;
|
|
|
|
|
|
2013-01-30 22:46:25 +01:00
|
|
|
|
/**
|
|
|
|
|
* Tristate variable to guard against pathbias miscounting
|
|
|
|
|
* due to circuit purpose transitions changing the decision
|
|
|
|
|
* of pathbias_should_count(). This variable is informational
|
|
|
|
|
* only. The current results of pathbias_should_count() are
|
|
|
|
|
* the official decision for pathbias accounting.
|
|
|
|
|
*/
|
|
|
|
|
uint8_t pathbias_shouldcount;
|
|
|
|
|
#define PATHBIAS_SHOULDCOUNT_UNDECIDED 0
|
|
|
|
|
#define PATHBIAS_SHOULDCOUNT_IGNORED 1
|
|
|
|
|
#define PATHBIAS_SHOULDCOUNT_COUNTED 2
|
|
|
|
|
|
2012-12-12 20:53:18 +01:00
|
|
|
|
/** For path probing. Store the temporary probe stream ID
|
|
|
|
|
* for response comparison */
|
|
|
|
|
streamid_t pathbias_probe_id;
|
|
|
|
|
|
|
|
|
|
/** For path probing. Store the temporary probe address nonce
|
2013-01-09 03:07:34 +01:00
|
|
|
|
* (in host byte order) for response comparison. */
|
|
|
|
|
uint32_t pathbias_probe_nonce;
|
2012-12-12 20:53:18 +01:00
|
|
|
|
|
2011-12-23 14:25:17 +01:00
|
|
|
|
/** Set iff this is a hidden-service circuit which has timed out
|
|
|
|
|
* according to our current circuit-build timeout, but which has
|
|
|
|
|
* been kept around because it might still succeed in connecting to
|
|
|
|
|
* its destination, and which is not a fully-connected rendezvous
|
2012-01-04 18:37:49 +01:00
|
|
|
|
* circuit.
|
|
|
|
|
*
|
|
|
|
|
* (We clear this flag for client-side rendezvous circuits when they
|
|
|
|
|
* are 'joined' to the other side's rendezvous circuit, so that
|
|
|
|
|
* connection_ap_handshake_attach_circuit can put client streams on
|
|
|
|
|
* the circuit. We also clear this flag for service-side rendezvous
|
|
|
|
|
* circuits when they are 'joined' to a client's rend circ, but only
|
|
|
|
|
* for symmetry with the client case. Client-side introduction
|
|
|
|
|
* circuits are closed when we get a joined rend circ, and
|
|
|
|
|
* service-side introduction circuits never have this flag set.) */
|
2011-12-23 14:25:17 +01:00
|
|
|
|
unsigned int hs_circ_has_timed_out : 1;
|
|
|
|
|
|
2012-10-26 02:43:10 +02:00
|
|
|
|
/** Set iff this circuit has been given a relaxed timeout because
|
|
|
|
|
* no circuits have opened. Used to prevent spamming logs. */
|
|
|
|
|
unsigned int relaxed_timeout : 1;
|
|
|
|
|
|
2011-12-24 13:47:30 +01:00
|
|
|
|
/** Set iff this is a service-side rendezvous circuit for which a
|
2012-01-04 18:37:49 +01:00
|
|
|
|
* new connection attempt has been launched. We consider launching
|
|
|
|
|
* a new service-side rend circ to a client when the previous one
|
|
|
|
|
* fails; now that we don't necessarily close a service-side rend
|
|
|
|
|
* circ when we launch a new one to the same client, this flag keeps
|
|
|
|
|
* us from launching two retries for the same failed rend circ. */
|
2011-12-24 13:47:30 +01:00
|
|
|
|
unsigned int hs_service_side_rend_circ_has_been_relaunched : 1;
|
|
|
|
|
|
2008-12-30 12:43:50 +01:00
|
|
|
|
/** What commands were sent over this circuit that decremented the
|
|
|
|
|
* RELAY_EARLY counter? This is for debugging task 878. */
|
|
|
|
|
uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT];
|
|
|
|
|
|
|
|
|
|
/** How many RELAY_EARLY cells have been sent over this circuit? This is
|
|
|
|
|
* for debugging task 878, too. */
|
|
|
|
|
int relay_early_cells_sent;
|
|
|
|
|
|
2006-07-26 21:07:23 +02:00
|
|
|
|
/** The next stream_id that will be tried when we're attempting to
|
|
|
|
|
* construct a new AP stream originating at this circuit. */
|
2008-07-23 17:58:30 +02:00
|
|
|
|
streamid_t next_stream_id;
|
2006-07-26 21:07:23 +02:00
|
|
|
|
|
2008-07-23 17:58:38 +02:00
|
|
|
|
/* The intro key replaces the hidden service's public key if purpose is
|
|
|
|
|
* S_ESTABLISH_INTRO or S_INTRO, provided that no unversioned rendezvous
|
|
|
|
|
* descriptor is used. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *intro_key;
|
2008-07-23 17:58:38 +02:00
|
|
|
|
|
2006-07-28 17:11:11 +02:00
|
|
|
|
/** Quasi-global identifier for this circuit; used for control.c */
|
|
|
|
|
/* XXXX NM This can get re-used after 2**32 circuits. */
|
|
|
|
|
uint32_t global_identifier;
|
|
|
|
|
|
Launch sufficient circuits to satisfy pending isolated streams
Our old "do we need to launch a circuit for stream S" logic was,
more or less, that if we had a pending circuit that could handle S,
we didn't need to launch a new one.
But now that we have streams isolated from one another, we need
something stronger here: It's possible that some pending C can
handle either S1 or S2, but not both.
This patch reuses the existing isolation logic for a simple
solution: when we decide during circuit launching that some pending
C would satisfy stream S1, we "hypothetically" mark C as though S1
had been connected to it. Now if S2 is incompatible with S1, it
won't be something that can attach to C, and so we'll launch a new
stream.
When the circuit becomes OPEN for the first time (with no streams
attached to it), we reset the circuit's isolation status. I'm not
too sure about this part: I wanted some way to be sure that, if all
streams that would have used a circuit die before the circuit is
done, the circuit can still get used. But I worry that this
approach could also lead to us launching too many circuits. Careful
thought needed here.
2011-07-07 16:40:23 +02:00
|
|
|
|
/** True if we have associated one stream to this circuit, thereby setting
|
|
|
|
|
* the isolation paramaters for this circuit. Note that this doesn't
|
|
|
|
|
* necessarily mean that we've <em>attached</em> any streams to the circuit:
|
|
|
|
|
* we may only have marked up this circuit during the launch process.
|
|
|
|
|
*/
|
2011-07-06 22:03:47 +02:00
|
|
|
|
unsigned int isolation_values_set : 1;
|
Launch sufficient circuits to satisfy pending isolated streams
Our old "do we need to launch a circuit for stream S" logic was,
more or less, that if we had a pending circuit that could handle S,
we didn't need to launch a new one.
But now that we have streams isolated from one another, we need
something stronger here: It's possible that some pending C can
handle either S1 or S2, but not both.
This patch reuses the existing isolation logic for a simple
solution: when we decide during circuit launching that some pending
C would satisfy stream S1, we "hypothetically" mark C as though S1
had been connected to it. Now if S2 is incompatible with S1, it
won't be something that can attach to C, and so we'll launch a new
stream.
When the circuit becomes OPEN for the first time (with no streams
attached to it), we reset the circuit's isolation status. I'm not
too sure about this part: I wanted some way to be sure that, if all
streams that would have used a circuit die before the circuit is
done, the circuit can still get used. But I worry that this
approach could also lead to us launching too many circuits. Careful
thought needed here.
2011-07-07 16:40:23 +02:00
|
|
|
|
/** True iff any stream has <em>ever</em> been attached to this circuit.
|
|
|
|
|
*
|
|
|
|
|
* In a better world we could use timestamp_dirty for this, but
|
|
|
|
|
* timestamp_dirty is far too overloaded at the moment.
|
|
|
|
|
*/
|
|
|
|
|
unsigned int isolation_any_streams_attached : 1;
|
|
|
|
|
|
2011-07-06 22:03:47 +02:00
|
|
|
|
/** A bitfield of ISO_* flags for every isolation field such that this
|
|
|
|
|
* circuit has had streams with more than one value for that field
|
|
|
|
|
* attached to it. */
|
|
|
|
|
uint8_t isolation_flags_mixed;
|
|
|
|
|
|
|
|
|
|
/** @name Isolation parameters
|
|
|
|
|
*
|
Launch sufficient circuits to satisfy pending isolated streams
Our old "do we need to launch a circuit for stream S" logic was,
more or less, that if we had a pending circuit that could handle S,
we didn't need to launch a new one.
But now that we have streams isolated from one another, we need
something stronger here: It's possible that some pending C can
handle either S1 or S2, but not both.
This patch reuses the existing isolation logic for a simple
solution: when we decide during circuit launching that some pending
C would satisfy stream S1, we "hypothetically" mark C as though S1
had been connected to it. Now if S2 is incompatible with S1, it
won't be something that can attach to C, and so we'll launch a new
stream.
When the circuit becomes OPEN for the first time (with no streams
attached to it), we reset the circuit's isolation status. I'm not
too sure about this part: I wanted some way to be sure that, if all
streams that would have used a circuit die before the circuit is
done, the circuit can still get used. But I worry that this
approach could also lead to us launching too many circuits. Careful
thought needed here.
2011-07-07 16:40:23 +02:00
|
|
|
|
* If any streams have been associated with this circ (isolation_values_set
|
|
|
|
|
* == 1), and all streams associated with the circuit have had the same
|
|
|
|
|
* value for some field ((isolation_flags_mixed & ISO_FOO) == 0), then these
|
2011-07-06 22:03:47 +02:00
|
|
|
|
* elements hold the value for that field.
|
|
|
|
|
*
|
Launch sufficient circuits to satisfy pending isolated streams
Our old "do we need to launch a circuit for stream S" logic was,
more or less, that if we had a pending circuit that could handle S,
we didn't need to launch a new one.
But now that we have streams isolated from one another, we need
something stronger here: It's possible that some pending C can
handle either S1 or S2, but not both.
This patch reuses the existing isolation logic for a simple
solution: when we decide during circuit launching that some pending
C would satisfy stream S1, we "hypothetically" mark C as though S1
had been connected to it. Now if S2 is incompatible with S1, it
won't be something that can attach to C, and so we'll launch a new
stream.
When the circuit becomes OPEN for the first time (with no streams
attached to it), we reset the circuit's isolation status. I'm not
too sure about this part: I wanted some way to be sure that, if all
streams that would have used a circuit die before the circuit is
done, the circuit can still get used. But I worry that this
approach could also lead to us launching too many circuits. Careful
thought needed here.
2011-07-07 16:40:23 +02:00
|
|
|
|
* Note again that "associated" is not the same as "attached": we
|
|
|
|
|
* preliminarily associate streams with a circuit while the circuit is being
|
|
|
|
|
* launched, so that we can tell whether we need to launch more circuits.
|
|
|
|
|
*
|
2011-07-06 22:03:47 +02:00
|
|
|
|
* @{
|
|
|
|
|
*/
|
|
|
|
|
uint8_t client_proto_type;
|
|
|
|
|
uint8_t client_proto_socksver;
|
|
|
|
|
uint16_t dest_port;
|
|
|
|
|
tor_addr_t client_addr;
|
|
|
|
|
char *dest_address;
|
|
|
|
|
int session_group;
|
2011-07-06 22:39:54 +02:00
|
|
|
|
unsigned nym_epoch;
|
2011-08-06 00:56:30 +02:00
|
|
|
|
size_t socks_username_len;
|
2011-08-04 18:03:31 +02:00
|
|
|
|
uint8_t socks_password_len;
|
|
|
|
|
/* Note that the next two values are NOT NUL-terminated; see
|
|
|
|
|
socks_username_len and socks_password_len for their lengths. */
|
2011-07-19 08:36:59 +02:00
|
|
|
|
char *socks_username;
|
|
|
|
|
char *socks_password;
|
2011-08-06 22:42:32 +02:00
|
|
|
|
/** Global identifier for the first stream attached here; used by
|
|
|
|
|
* ISO_STREAM. */
|
|
|
|
|
uint64_t associated_isolated_stream_global_id;
|
2011-07-06 22:03:47 +02:00
|
|
|
|
/**@}*/
|
2013-03-12 04:37:47 +01:00
|
|
|
|
/** A list of addr_policy_t for this circuit in particular. Used by
|
|
|
|
|
* adjust_exit_policy_from_exitpolicy_failure.
|
|
|
|
|
*/
|
|
|
|
|
smartlist_t *prepend_policy;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
} origin_circuit_t;
|
|
|
|
|
|
2012-12-27 04:08:12 +01:00
|
|
|
|
struct onion_queue_t;
|
|
|
|
|
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** An or_circuit_t holds information needed to implement a circuit at an
|
|
|
|
|
* OR. */
|
2006-07-23 09:37:35 +02:00
|
|
|
|
typedef struct or_circuit_t {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
circuit_t base_;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** Next circuit in the doubly-linked ring of circuits waiting to add
|
2012-08-08 15:02:47 +02:00
|
|
|
|
* cells to p_chan. NULL if we have no cells pending, or if we're not
|
2007-04-10 18:24:50 +02:00
|
|
|
|
* linked to an OR connection. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
struct circuit_t *next_active_on_p_chan;
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** Previous circuit in the doubly-linked ring of circuits waiting to add
|
2012-08-08 15:02:47 +02:00
|
|
|
|
* cells to p_chan. NULL if we have no cells pending, or if we're not
|
2007-04-10 18:24:50 +02:00
|
|
|
|
* linked to an OR connection. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
struct circuit_t *prev_active_on_p_chan;
|
2012-12-27 04:08:12 +01:00
|
|
|
|
/** Pointer to an entry on the onion queue, if this circuit is waiting for a
|
|
|
|
|
* chance to give an onionskin to a cpuworker. Used only in onion.c */
|
|
|
|
|
struct onion_queue_t *onionqueue_entry;
|
2013-10-02 18:32:09 +02:00
|
|
|
|
/** Pointer to a workqueue entry, if this circuit has given an onionskin to
|
2015-02-09 16:11:45 +01:00
|
|
|
|
* a cpuworker and is waiting for a response. Used to decide whether it is
|
|
|
|
|
* safe to free a circuit or if it is still in use by a cpuworker. */
|
2013-10-02 18:32:09 +02:00
|
|
|
|
struct workqueue_entry_s *workqueue_entry;
|
2007-03-26 16:07:59 +02:00
|
|
|
|
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** The circuit_id used in the previous (backward) hop of this circuit. */
|
|
|
|
|
circid_t p_circ_id;
|
2007-03-26 16:08:35 +02:00
|
|
|
|
/** Queue of cells waiting to be transmitted on p_conn. */
|
2012-08-08 15:02:47 +02:00
|
|
|
|
cell_queue_t p_chan_cells;
|
|
|
|
|
/** The channel that is previous in this circuit. */
|
|
|
|
|
channel_t *p_chan;
|
2012-09-26 20:51:39 +02:00
|
|
|
|
/**
|
|
|
|
|
* Circuit mux associated with p_chan to which this circuit is attached;
|
|
|
|
|
* NULL if we have no p_chan.
|
|
|
|
|
*/
|
|
|
|
|
circuitmux_t *p_mux;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** Linked list of Exit streams associated with this circuit. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
edge_connection_t *n_streams;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** Linked list of Exit streams associated with this circuit that are
|
|
|
|
|
* still being resolved. */
|
2006-07-26 21:07:26 +02:00
|
|
|
|
edge_connection_t *resolving_streams;
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The cipher used by intermediate hops for cells heading toward the
|
2006-07-23 09:37:35 +02:00
|
|
|
|
* OP. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_cipher_t *p_crypto;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** The cipher used by intermediate hops for cells heading away from
|
|
|
|
|
* the OP. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_cipher_t *n_crypto;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
|
|
|
|
|
/** The integrity-checking digest used by intermediate hops, for
|
|
|
|
|
* cells packaged here and heading towards the OP.
|
|
|
|
|
*/
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_digest_t *p_digest;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
/** The integrity-checking digest used by intermediate hops, for
|
|
|
|
|
* cells packaged at the OP and arriving here.
|
|
|
|
|
*/
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_digest_t *n_digest;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
|
|
|
|
|
/** Points to spliced circuit if purpose is REND_ESTABLISHED, and circuit
|
|
|
|
|
* is not marked for close. */
|
|
|
|
|
struct or_circuit_t *rend_splice;
|
|
|
|
|
|
2013-09-27 17:54:36 +02:00
|
|
|
|
struct or_circuit_rendinfo_s *rendinfo;
|
2006-07-26 21:05:41 +02:00
|
|
|
|
|
2012-12-05 03:39:54 +01:00
|
|
|
|
/** Stores KH for the handshake. */
|
|
|
|
|
char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */
|
2006-10-01 22:50:11 +02:00
|
|
|
|
|
2008-07-23 17:58:38 +02:00
|
|
|
|
/** How many more relay_early cells can we send on this circuit, according
|
|
|
|
|
* to the specification? */
|
|
|
|
|
unsigned int remaining_relay_early_cells : 4;
|
|
|
|
|
|
2015-04-01 15:33:09 +02:00
|
|
|
|
/* We have already received an INTRODUCE1 cell on this circuit. */
|
|
|
|
|
unsigned int already_received_introduce1 : 1;
|
|
|
|
|
|
2006-10-01 22:50:11 +02:00
|
|
|
|
/** True iff this circuit was made with a CREATE_FAST cell. */
|
|
|
|
|
unsigned int is_first_hop : 1;
|
2009-07-05 19:53:25 +02:00
|
|
|
|
|
2014-12-02 13:20:35 +01:00
|
|
|
|
/** If set, this circuit carries HS traffic. Consider it in any HS
|
|
|
|
|
* statistics. */
|
|
|
|
|
unsigned int circuit_carries_hs_traffic_stats : 1;
|
|
|
|
|
|
2009-07-05 19:53:25 +02:00
|
|
|
|
/** Number of cells that were removed from circuit queue; reset every
|
|
|
|
|
* time when writing buffer stats to disk. */
|
|
|
|
|
uint32_t processed_cells;
|
|
|
|
|
|
|
|
|
|
/** Total time in milliseconds that cells spent in both app-ward and
|
|
|
|
|
* exit-ward queues of this circuit; reset every time when writing
|
|
|
|
|
* buffer stats to disk. */
|
|
|
|
|
uint64_t total_cell_waiting_time;
|
2013-06-14 05:32:31 +02:00
|
|
|
|
|
|
|
|
|
/** Maximum cell queue size for a middle relay; this is stored per circuit
|
|
|
|
|
* so append_cell_to_circuit_queue() can adjust it if it changes. If set
|
|
|
|
|
* to zero, it is initialized to the default value.
|
|
|
|
|
*/
|
|
|
|
|
uint32_t max_middle_cells;
|
2006-07-23 09:37:35 +02:00
|
|
|
|
} or_circuit_t;
|
|
|
|
|
|
2013-09-27 17:54:36 +02:00
|
|
|
|
typedef struct or_circuit_rendinfo_s {
|
|
|
|
|
|
|
|
|
|
#if REND_COOKIE_LEN != DIGEST_LEN
|
|
|
|
|
#error "The REND_TOKEN_LEN macro assumes REND_COOKIE_LEN == DIGEST_LEN"
|
|
|
|
|
#endif
|
|
|
|
|
#define REND_TOKEN_LEN DIGEST_LEN
|
|
|
|
|
|
|
|
|
|
/** A hash of location-hidden service's PK if purpose is INTRO_POINT, or a
|
|
|
|
|
* rendezvous cookie if purpose is REND_POINT_WAITING. Filled with zeroes
|
|
|
|
|
* otherwise.
|
|
|
|
|
*/
|
|
|
|
|
char rend_token[REND_TOKEN_LEN];
|
|
|
|
|
|
|
|
|
|
/** True if this is a rendezvous point circuit; false if this is an
|
|
|
|
|
* introduction point. */
|
|
|
|
|
unsigned is_rend_circ;
|
|
|
|
|
|
|
|
|
|
} or_circuit_rendinfo_t;
|
|
|
|
|
|
2011-06-19 10:28:40 +02:00
|
|
|
|
/** Convert a circuit subtype to a circuit_t. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
#define TO_CIRCUIT(x) (&((x)->base_))
|
2006-07-27 07:03:57 +02:00
|
|
|
|
|
2011-06-19 10:28:40 +02:00
|
|
|
|
/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert
|
2006-07-27 07:03:57 +02:00
|
|
|
|
* if the cast is impossible. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static or_circuit_t *TO_OR_CIRCUIT(circuit_t *);
|
2014-04-29 03:02:59 +02:00
|
|
|
|
static const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *);
|
2006-07-27 07:03:57 +02:00
|
|
|
|
/** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t.
|
2011-06-19 10:28:40 +02:00
|
|
|
|
* Assert if the cast is impossible. */
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *);
|
2014-04-29 03:02:59 +02:00
|
|
|
|
static const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *);
|
2006-07-27 07:03:57 +02:00
|
|
|
|
|
2014-10-26 19:56:15 +01:00
|
|
|
|
/** Return 1 iff <b>node</b> has Exit flag and no BadExit flag.
|
|
|
|
|
* Otherwise, return 0.
|
|
|
|
|
*/
|
|
|
|
|
static INLINE int node_is_good_exit(const node_t *node)
|
|
|
|
|
{
|
|
|
|
|
return node->is_exit && ! node->is_bad_exit;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE or_circuit_t *TO_OR_CIRCUIT(circuit_t *x)
|
2006-07-23 09:37:35 +02:00
|
|
|
|
{
|
|
|
|
|
tor_assert(x->magic == OR_CIRCUIT_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(or_circuit_t, x);
|
2006-07-23 09:37:35 +02:00
|
|
|
|
}
|
2014-04-29 03:02:59 +02:00
|
|
|
|
static INLINE const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *x)
|
|
|
|
|
{
|
|
|
|
|
tor_assert(x->magic == OR_CIRCUIT_MAGIC);
|
|
|
|
|
return DOWNCAST(or_circuit_t, x);
|
|
|
|
|
}
|
2006-09-08 18:12:15 +02:00
|
|
|
|
static INLINE origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x)
|
2006-07-23 09:37:35 +02:00
|
|
|
|
{
|
|
|
|
|
tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC);
|
2006-08-05 19:52:51 +02:00
|
|
|
|
return DOWNCAST(origin_circuit_t, x);
|
2006-07-23 09:37:35 +02:00
|
|
|
|
}
|
2014-04-29 03:02:59 +02:00
|
|
|
|
static INLINE const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(
|
|
|
|
|
const circuit_t *x)
|
|
|
|
|
{
|
|
|
|
|
tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC);
|
|
|
|
|
return DOWNCAST(origin_circuit_t, x);
|
|
|
|
|
}
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2008-12-17 18:20:26 +01:00
|
|
|
|
/** Bitfield type: things that we're willing to use invalid routers for. */
|
|
|
|
|
typedef enum invalid_router_usage_t {
|
|
|
|
|
ALLOW_INVALID_ENTRY =1,
|
|
|
|
|
ALLOW_INVALID_EXIT =2,
|
|
|
|
|
ALLOW_INVALID_MIDDLE =4,
|
|
|
|
|
ALLOW_INVALID_RENDEZVOUS =8,
|
|
|
|
|
ALLOW_INVALID_INTRODUCTION=16,
|
|
|
|
|
} invalid_router_usage_t;
|
2004-08-17 07:13:58 +02:00
|
|
|
|
|
2007-07-16 18:23:34 +02:00
|
|
|
|
/* limits for TCP send and recv buffer size used for constrained sockets */
|
2007-07-16 18:23:36 +02:00
|
|
|
|
#define MIN_CONSTRAINED_TCP_BUFFER 2048
|
|
|
|
|
#define MAX_CONSTRAINED_TCP_BUFFER 262144 /* 256k */
|
2007-07-16 18:23:34 +02:00
|
|
|
|
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
/** @name Isolation flags
|
|
|
|
|
|
|
|
|
|
Ways to isolate client streams
|
|
|
|
|
|
|
|
|
|
@{
|
|
|
|
|
*/
|
|
|
|
|
/** Isolate based on destination port */
|
|
|
|
|
#define ISO_DESTPORT (1u<<0)
|
|
|
|
|
/** Isolate based on destination address */
|
|
|
|
|
#define ISO_DESTADDR (1u<<1)
|
|
|
|
|
/** Isolate based on SOCKS authentication */
|
|
|
|
|
#define ISO_SOCKSAUTH (1u<<2)
|
|
|
|
|
/** Isolate based on client protocol choice */
|
|
|
|
|
#define ISO_CLIENTPROTO (1u<<3)
|
|
|
|
|
/** Isolate based on client address */
|
|
|
|
|
#define ISO_CLIENTADDR (1u<<4)
|
|
|
|
|
/** Isolate based on session group (always on). */
|
|
|
|
|
#define ISO_SESSIONGRP (1u<<5)
|
2011-07-06 22:39:54 +02:00
|
|
|
|
/** Isolate based on newnym epoch (always on). */
|
|
|
|
|
#define ISO_NYM_EPOCH (1u<<6)
|
2011-07-08 21:54:30 +02:00
|
|
|
|
/** Isolate all streams (Internal only). */
|
|
|
|
|
#define ISO_STREAM (1u<<7)
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
/**@}*/
|
|
|
|
|
|
|
|
|
|
/** Default isolation level for ports. */
|
2011-07-06 22:39:54 +02:00
|
|
|
|
#define ISO_DEFAULT (ISO_CLIENTADDR|ISO_SOCKSAUTH|ISO_SESSIONGRP|ISO_NYM_EPOCH)
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
|
2011-07-08 21:54:30 +02:00
|
|
|
|
/** Indicates that we haven't yet set a session group on a port_cfg_t. */
|
|
|
|
|
#define SESSION_GROUP_UNSET -1
|
|
|
|
|
/** Session group reserved for directory connections */
|
|
|
|
|
#define SESSION_GROUP_DIRCONN -2
|
2011-07-08 22:00:19 +02:00
|
|
|
|
/** Session group reserved for resolve requests launched by a controller */
|
|
|
|
|
#define SESSION_GROUP_CONTROL_RESOLVE -3
|
2011-07-08 21:54:30 +02:00
|
|
|
|
/** First automatically allocated session group number */
|
2011-07-08 22:00:19 +02:00
|
|
|
|
#define SESSION_GROUP_FIRST_AUTO -4
|
2011-07-08 21:54:30 +02:00
|
|
|
|
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
/** Configuration for a single port that we're listening on. */
|
|
|
|
|
typedef struct port_cfg_t {
|
2011-07-06 22:03:47 +02:00
|
|
|
|
tor_addr_t addr; /**< The actual IP to listen on, if !is_unix_addr. */
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
int port; /**< The configured port, or CFG_AUTO_PORT to tell Tor to pick its
|
|
|
|
|
* own port. */
|
|
|
|
|
uint8_t type; /**< One of CONN_TYPE_*_LISTENER */
|
|
|
|
|
unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */
|
|
|
|
|
|
2015-03-11 18:26:14 +01:00
|
|
|
|
unsigned is_group_writable : 1;
|
|
|
|
|
unsigned is_world_writable : 1;
|
|
|
|
|
|
2015-01-03 18:44:10 +01:00
|
|
|
|
entry_port_cfg_t entry_cfg;
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
|
2015-01-03 18:44:10 +01:00
|
|
|
|
server_port_cfg_t server_cfg;
|
2012-11-25 19:18:26 +01:00
|
|
|
|
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
/* Unix sockets only: */
|
|
|
|
|
/** Path for an AF_UNIX address */
|
|
|
|
|
char unix_addr[FLEXIBLE_ARRAY_MEMBER];
|
|
|
|
|
} port_cfg_t;
|
|
|
|
|
|
2011-11-28 00:11:50 +01:00
|
|
|
|
/** Ordinary configuration line. */
|
|
|
|
|
#define CONFIG_LINE_NORMAL 0
|
|
|
|
|
/** Appends to previous configuration for the same option, even if we
|
|
|
|
|
* would ordinary replace it. */
|
|
|
|
|
#define CONFIG_LINE_APPEND 1
|
2011-11-28 03:32:51 +01:00
|
|
|
|
/* Removes all previous configuration for an option. */
|
|
|
|
|
#define CONFIG_LINE_CLEAR 2
|
2011-11-28 00:11:50 +01:00
|
|
|
|
|
2005-10-06 06:33:40 +02:00
|
|
|
|
/** A linked list of lines in a config file. */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
typedef struct config_line_t {
|
|
|
|
|
char *key;
|
|
|
|
|
char *value;
|
|
|
|
|
struct config_line_t *next;
|
2011-11-28 00:11:50 +01:00
|
|
|
|
/** What special treatment (if any) does this line require? */
|
2011-11-28 03:32:51 +01:00
|
|
|
|
unsigned int command:2;
|
2011-11-28 00:11:50 +01:00
|
|
|
|
/** If true, subsequent assignments to this linelist should replace
|
|
|
|
|
* it, not extend it. Set only on the first item in a linelist in an
|
|
|
|
|
* or_options_t. */
|
|
|
|
|
unsigned int fragile:1;
|
2005-07-22 23:12:10 +02:00
|
|
|
|
} config_line_t;
|
|
|
|
|
|
2008-09-25 22:21:35 +02:00
|
|
|
|
typedef struct routerset_t routerset_t;
|
|
|
|
|
|
2011-05-02 21:05:10 +02:00
|
|
|
|
/** A magic value for the (Socks|OR|...)Port options below, telling Tor
|
|
|
|
|
* to pick its own port. */
|
|
|
|
|
#define CFG_AUTO_PORT 0xc4005e
|
|
|
|
|
|
2005-11-18 03:47:09 +01:00
|
|
|
|
/** Configuration options for a Tor process. */
|
2002-12-03 23:18:23 +01:00
|
|
|
|
typedef struct {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
uint32_t magic_;
|
2005-07-22 22:37:42 +02:00
|
|
|
|
|
2004-10-30 21:18:37 +02:00
|
|
|
|
/** What should the tor process actually do? */
|
|
|
|
|
enum {
|
2004-11-03 20:49:03 +01:00
|
|
|
|
CMD_RUN_TOR=0, CMD_LIST_FINGERPRINT, CMD_HASH_PASSWORD,
|
2015-03-01 16:40:02 +01:00
|
|
|
|
CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS, CMD_DUMP_CONFIG,
|
|
|
|
|
CMD_KEYGEN
|
2004-10-30 21:18:37 +02:00
|
|
|
|
} command;
|
2013-08-25 18:03:57 +02:00
|
|
|
|
char *command_arg; /**< Argument for command-line option. */
|
2004-11-03 20:49:03 +01:00
|
|
|
|
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *Logs; /**< New-style list of configuration lines
|
2005-11-18 03:47:09 +01:00
|
|
|
|
* for logs */
|
2010-08-27 08:13:54 +02:00
|
|
|
|
int LogTimeGranularity; /**< Log resolution in milliseconds. */
|
2004-05-19 22:07:08 +02:00
|
|
|
|
|
2011-01-25 21:53:15 +01:00
|
|
|
|
int LogMessageDomains; /**< Boolean: Should we log the domain(s) in which
|
|
|
|
|
* each log message occurs? */
|
2014-03-23 17:24:26 +01:00
|
|
|
|
int TruncateLogFile; /**< Boolean: Should we truncate the log file
|
|
|
|
|
before we start writing? */
|
2011-01-25 21:53:15 +01:00
|
|
|
|
|
2004-05-10 12:27:54 +02:00
|
|
|
|
char *DebugLogFile; /**< Where to send verbose log messages. */
|
|
|
|
|
char *DataDirectory; /**< OR only: where to store long-term data. */
|
|
|
|
|
char *Nickname; /**< OR only: nickname of this onion router. */
|
|
|
|
|
char *Address; /**< OR only: configured address for this onion router. */
|
|
|
|
|
char *PidFile; /**< Where to store PID of Tor process. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
|
2008-09-25 22:21:35 +02:00
|
|
|
|
routerset_t *ExitNodes; /**< Structure containing nicknames, digests,
|
|
|
|
|
* country codes and IP address patterns of ORs to
|
|
|
|
|
* consider as exits. */
|
|
|
|
|
routerset_t *EntryNodes;/**< Structure containing nicknames, digests,
|
|
|
|
|
* country codes and IP address patterns of ORs to
|
|
|
|
|
* consider as entry points. */
|
2009-09-18 04:45:54 +02:00
|
|
|
|
int StrictNodes; /**< Boolean: When none of our EntryNodes or ExitNodes
|
|
|
|
|
* are up, or we need to access a node in ExcludeNodes,
|
|
|
|
|
* do we just fail instead? */
|
2008-09-25 22:21:35 +02:00
|
|
|
|
routerset_t *ExcludeNodes;/**< Structure containing nicknames, digests,
|
|
|
|
|
* country codes and IP address patterns of ORs
|
2009-09-18 04:45:54 +02:00
|
|
|
|
* not to use in circuits. But see StrictNodes
|
|
|
|
|
* above. */
|
2008-09-25 22:21:35 +02:00
|
|
|
|
routerset_t *ExcludeExitNodes;/**< Structure containing nicknames, digests,
|
|
|
|
|
* country codes and IP address patterns of
|
|
|
|
|
* ORs not to consider as exits. */
|
2008-07-18 20:36:32 +02:00
|
|
|
|
|
|
|
|
|
/** Union of ExcludeNodes and ExcludeExitNodes */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
routerset_t *ExcludeExitNodesUnion_;
|
2004-05-10 08:52:01 +02:00
|
|
|
|
|
2009-09-18 04:45:54 +02:00
|
|
|
|
int DisableAllSwap; /**< Boolean: Attempt to call mlockall() on our
|
2009-12-21 09:48:40 +01:00
|
|
|
|
* process for all current and future memory. */
|
2009-09-18 04:45:54 +02:00
|
|
|
|
|
2007-05-08 11:09:26 +02:00
|
|
|
|
/** List of "entry", "middle", "exit", "introduction", "rendezvous". */
|
|
|
|
|
smartlist_t *AllowInvalidNodes;
|
2008-12-17 18:20:26 +01:00
|
|
|
|
/** Bitmask; derived from AllowInvalidNodes. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
invalid_router_usage_t AllowInvalid_;
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *ExitPolicy; /**< Lists of exit policy components. */
|
2006-02-01 04:53:52 +01:00
|
|
|
|
int ExitPolicyRejectPrivate; /**< Should we not exit to local addresses? */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *SocksPolicy; /**< Lists of socks policy components */
|
|
|
|
|
config_line_t *DirPolicy; /**< Lists of dir policy components */
|
2004-08-16 13:43:18 +02:00
|
|
|
|
/** Addresses to bind for listening for SOCKS connections. */
|
2005-10-17 05:17:29 +02:00
|
|
|
|
config_line_t *SocksListenAddress;
|
2009-05-27 23:55:51 +02:00
|
|
|
|
/** Addresses to bind for listening for transparent pf/netfilter
|
2006-11-14 01:06:31 +01:00
|
|
|
|
* connections. */
|
2006-08-10 11:01:37 +02:00
|
|
|
|
config_line_t *TransListenAddress;
|
2006-11-14 01:06:31 +01:00
|
|
|
|
/** Addresses to bind for listening for transparent natd connections */
|
2010-10-30 06:08:47 +02:00
|
|
|
|
config_line_t *NATDListenAddress;
|
2007-05-24 22:31:30 +02:00
|
|
|
|
/** Addresses to bind for listening for SOCKS connections. */
|
|
|
|
|
config_line_t *DNSListenAddress;
|
2004-08-16 13:43:18 +02:00
|
|
|
|
/** Addresses to bind for listening for OR connections. */
|
2005-10-17 05:17:29 +02:00
|
|
|
|
config_line_t *ORListenAddress;
|
2004-08-16 13:43:18 +02:00
|
|
|
|
/** Addresses to bind for listening for directory connections. */
|
2005-10-17 05:17:29 +02:00
|
|
|
|
config_line_t *DirListenAddress;
|
2006-02-13 07:25:16 +01:00
|
|
|
|
/** Addresses to bind for listening for control connections. */
|
|
|
|
|
config_line_t *ControlListenAddress;
|
2004-08-16 13:43:18 +02:00
|
|
|
|
/** Local address to bind outbound sockets */
|
2012-09-20 17:09:25 +02:00
|
|
|
|
config_line_t *OutboundBindAddress;
|
|
|
|
|
/** IPv4 address derived from OutboundBindAddress. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
tor_addr_t OutboundBindAddressIPv4_;
|
2012-09-20 17:09:25 +02:00
|
|
|
|
/** IPv6 address derived from OutboundBindAddress. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
tor_addr_t OutboundBindAddressIPv6_;
|
2005-01-06 22:03:27 +01:00
|
|
|
|
/** Directory server only: which versions of
|
|
|
|
|
* Tor should we tell users to run? */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *RecommendedVersions;
|
2005-08-25 22:33:17 +02:00
|
|
|
|
config_line_t *RecommendedClientVersions;
|
|
|
|
|
config_line_t *RecommendedServerVersions;
|
2015-01-09 17:36:47 +01:00
|
|
|
|
config_line_t *RecommendedPackages;
|
2012-08-27 17:16:44 +02:00
|
|
|
|
/** Whether dirservers allow router descriptors with private IPs. */
|
2005-01-06 22:03:27 +01:00
|
|
|
|
int DirAllowPrivateAddresses;
|
2012-08-27 17:16:44 +02:00
|
|
|
|
/** Whether routers accept EXTEND cells to routers with private IPs. */
|
|
|
|
|
int ExtendAllowPrivateAddresses;
|
2004-05-10 08:52:01 +02:00
|
|
|
|
char *User; /**< Name of user to run Tor as. */
|
|
|
|
|
char *Group; /**< Name of group to run Tor as. */
|
2012-08-09 21:48:43 +02:00
|
|
|
|
config_line_t *ORPort_lines; /**< Ports to listen on for OR connections. */
|
2012-03-16 14:40:44 +01:00
|
|
|
|
/** Ports to listen on for extended OR connections. */
|
|
|
|
|
config_line_t *ExtORPort_lines;
|
2012-08-09 22:02:57 +02:00
|
|
|
|
/** Ports to listen on for SOCKS connections. */
|
|
|
|
|
config_line_t *SocksPort_lines;
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
/** Ports to listen on for transparent pf/netfilter connections. */
|
2012-08-09 21:48:43 +02:00
|
|
|
|
config_line_t *TransPort_lines;
|
2014-02-03 19:56:19 +01:00
|
|
|
|
const char *TransProxyType; /**< What kind of transparent proxy
|
|
|
|
|
* implementation are we using? */
|
|
|
|
|
/** Parsed value of TransProxyType. */
|
2014-02-10 11:23:51 +01:00
|
|
|
|
enum {
|
|
|
|
|
TPT_DEFAULT,
|
|
|
|
|
TPT_PF_DIVERT,
|
|
|
|
|
TPT_IPFW,
|
|
|
|
|
TPT_TPROXY,
|
|
|
|
|
} TransProxyType_parsed;
|
2012-08-09 21:48:43 +02:00
|
|
|
|
config_line_t *NATDPort_lines; /**< Ports to listen on for transparent natd
|
Parse prop171 options; refactor listener/port option code
Proposal 171 gives us a new syntax for parsing client port options.
You can now have as many FooPort options as you want (for Foo in
Socks, Trans, DNS, NATD), and they can have address:port arguments,
and you can specify the level of isolation on those ports.
Additionally, this patch refactors the client port parsing logic to
use a new type, port_cfg_t. Previously, ports to be bound were
half-parsed in config.c, and later re-parsed in connection.c when
we're about to bind them. Now, parsing a port means converting it
into a port_cfg_t, and binding it uses only a port_cfg_t, without
needing to parse the user-provided strings at all.
We should do a related refactoring on other port types. For
control ports, that'll be easy enough. For ORPort and DirPort,
we'll want to do this when we solve proposal 118 (letting servers
bind to and advertise multiple ports).
This implements tickets 3514 and 3515.
2011-06-30 20:01:02 +02:00
|
|
|
|
* connections. */
|
2012-08-09 22:02:57 +02:00
|
|
|
|
config_line_t *ControlPort_lines; /**< Ports to listen on for control
|
2011-11-30 18:09:53 +01:00
|
|
|
|
* connections. */
|
2007-06-05 22:54:53 +02:00
|
|
|
|
config_line_t *ControlSocket; /**< List of Unix Domain Sockets to listen on
|
|
|
|
|
* for control connections. */
|
2012-08-09 21:48:43 +02:00
|
|
|
|
|
2011-04-23 02:57:53 +02:00
|
|
|
|
int ControlSocketsGroupWritable; /**< Boolean: Are control sockets g+rw? */
|
2014-08-11 21:27:04 +02:00
|
|
|
|
int SocksSocketsGroupWritable; /**< Boolean: Are SOCKS sockets g+rw? */
|
2012-08-09 22:02:57 +02:00
|
|
|
|
/** Ports to listen on for directory connections. */
|
|
|
|
|
config_line_t *DirPort_lines;
|
|
|
|
|
config_line_t *DNSPort_lines; /**< Ports to listen on for DNS requests. */
|
2012-08-09 21:48:43 +02:00
|
|
|
|
|
2014-04-03 18:06:44 +02:00
|
|
|
|
/* MaxMemInQueues value as input by the user. We clean this up to be
|
|
|
|
|
* MaxMemInQueues. */
|
|
|
|
|
uint64_t MaxMemInQueues_raw;
|
|
|
|
|
uint64_t MaxMemInQueues;/**< If we have more memory than this allocated
|
2013-11-20 18:08:14 +01:00
|
|
|
|
* for queues and buffers, run the OOM handler */
|
2014-11-17 17:43:50 +01:00
|
|
|
|
/** Above this value, consider ourselves low on RAM. */
|
|
|
|
|
uint64_t MaxMemInQueues_low_threshold;
|
2013-06-16 15:55:44 +02:00
|
|
|
|
|
2012-08-09 21:48:43 +02:00
|
|
|
|
/** @name port booleans
|
|
|
|
|
*
|
|
|
|
|
* Derived booleans: True iff there is a non-listener port on an AF_INET or
|
|
|
|
|
* AF_INET6 address of the given type configured in one of the _lines
|
|
|
|
|
* options above.
|
|
|
|
|
*
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
|
|
|
|
unsigned int ORPort_set : 1;
|
|
|
|
|
unsigned int SocksPort_set : 1;
|
|
|
|
|
unsigned int TransPort_set : 1;
|
|
|
|
|
unsigned int NATDPort_set : 1;
|
|
|
|
|
unsigned int ControlPort_set : 1;
|
|
|
|
|
unsigned int DirPort_set : 1;
|
|
|
|
|
unsigned int DNSPort_set : 1;
|
2013-06-01 17:38:06 +02:00
|
|
|
|
unsigned int ExtORPort_set : 1;
|
2012-08-09 21:48:43 +02:00
|
|
|
|
/**@}*/
|
|
|
|
|
|
2005-08-26 09:41:19 +02:00
|
|
|
|
int AssumeReachable; /**< Whether to publish our descriptor regardless. */
|
2004-06-21 06:37:27 +02:00
|
|
|
|
int AuthoritativeDir; /**< Boolean: is this an authoritative directory? */
|
2007-05-22 19:58:25 +02:00
|
|
|
|
int V3AuthoritativeDir; /**< Boolean: is this an authoritative directory
|
|
|
|
|
* for version 3 directories? */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
int VersioningAuthoritativeDir; /**< Boolean: is this an authoritative
|
|
|
|
|
* directory that's willing to recommend
|
|
|
|
|
* versions? */
|
2007-05-04 10:04:27 +02:00
|
|
|
|
int BridgeAuthoritativeDir; /**< Boolean: is this an authoritative directory
|
|
|
|
|
* that aggregates bridge descriptors? */
|
2007-05-08 13:28:05 +02:00
|
|
|
|
|
2007-12-22 11:54:21 +01:00
|
|
|
|
/** If set on a bridge authority, it will answer requests on its dirport
|
2012-04-01 04:51:28 +02:00
|
|
|
|
* for bridge statuses -- but only if the requests use this password. */
|
2007-12-22 11:54:21 +01:00
|
|
|
|
char *BridgePassword;
|
2012-04-01 04:51:28 +02:00
|
|
|
|
/** If BridgePassword is set, this is a SHA256 digest of the basic http
|
2012-04-01 21:59:38 +02:00
|
|
|
|
* authenticator for it. Used so we can do a time-independent comparison. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
char *BridgePassword_AuthDigest_;
|
2007-12-22 11:54:21 +01:00
|
|
|
|
|
2011-06-17 22:45:53 +02:00
|
|
|
|
int UseBridges; /**< Boolean: should we start all circuits with a bridge? */
|
2007-05-08 13:28:05 +02:00
|
|
|
|
config_line_t *Bridges; /**< List of bootstrap bridge addresses. */
|
|
|
|
|
|
2011-06-12 16:41:32 +02:00
|
|
|
|
config_line_t *ClientTransportPlugin; /**< List of client
|
|
|
|
|
transport plugins. */
|
2011-06-11 17:08:31 +02:00
|
|
|
|
|
2011-07-13 18:58:11 +02:00
|
|
|
|
config_line_t *ServerTransportPlugin; /**< List of client
|
|
|
|
|
transport plugins. */
|
|
|
|
|
|
2012-10-30 03:17:13 +01:00
|
|
|
|
/** List of TCP/IP addresses that transports should listen at. */
|
|
|
|
|
config_line_t *ServerTransportListenAddr;
|
|
|
|
|
|
2013-06-12 14:28:31 +02:00
|
|
|
|
/** List of options that must be passed to pluggable transports. */
|
|
|
|
|
config_line_t *ServerTransportOptions;
|
|
|
|
|
|
2007-12-04 19:35:03 +01:00
|
|
|
|
int BridgeRelay; /**< Boolean: are we acting as a bridge relay? We make
|
|
|
|
|
* this explicit so we can change how we behave in the
|
|
|
|
|
* future. */
|
|
|
|
|
|
2007-06-10 09:34:21 +02:00
|
|
|
|
/** Boolean: if we know the bridge's digest, should we get new
|
|
|
|
|
* descriptors from the bridge authorities or from the bridge itself? */
|
|
|
|
|
int UpdateBridgesFromAuthority;
|
|
|
|
|
|
2006-09-07 02:30:29 +02:00
|
|
|
|
int AvoidDiskWrites; /**< Boolean: should we never cache things to disk?
|
|
|
|
|
* Not used yet. */
|
2004-07-13 09:42:20 +02:00
|
|
|
|
int ClientOnly; /**< Boolean: should we never evolve into a server role? */
|
2007-05-08 11:09:26 +02:00
|
|
|
|
/** To what authority types do we publish our descriptor? Choices are
|
2008-01-19 21:00:53 +01:00
|
|
|
|
* "v1", "v2", "v3", "bridge", or "". */
|
2007-05-09 06:15:46 +02:00
|
|
|
|
smartlist_t *PublishServerDescriptor;
|
2010-11-08 20:21:32 +01:00
|
|
|
|
/** A bitfield of authority types, derived from PublishServerDescriptor. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
dirinfo_type_t PublishServerDescriptor_;
|
2007-05-08 11:09:26 +02:00
|
|
|
|
/** Boolean: do we publish hidden service descriptors to the HS auths? */
|
|
|
|
|
int PublishHidServDescriptors;
|
2006-02-19 23:02:02 +01:00
|
|
|
|
int FetchServerDescriptors; /**< Do we fetch server descriptors as normal? */
|
2011-04-28 16:05:32 +02:00
|
|
|
|
int FetchHidServDescriptors; /**< and hidden service descriptors? */
|
2007-10-29 20:10:47 +01:00
|
|
|
|
|
2007-11-29 16:25:04 +01:00
|
|
|
|
int MinUptimeHidServDirectoryV2; /**< As directory authority, accept hidden
|
|
|
|
|
* service directories after what time? */
|
2011-05-10 11:06:07 +02:00
|
|
|
|
|
2006-04-08 23:48:14 +02:00
|
|
|
|
int FetchUselessDescriptors; /**< Do we fetch non-running descriptors too? */
|
2006-02-19 23:02:02 +01:00
|
|
|
|
int AllDirActionsPrivate; /**< Should every directory action be sent
|
|
|
|
|
* through a Tor circuit? */
|
|
|
|
|
|
2011-06-01 16:03:01 +02:00
|
|
|
|
/** Run in 'tor2web mode'? (I.e. only make client connections to hidden
|
|
|
|
|
* services, and use a single hop for all hidden-service-related
|
|
|
|
|
* circuits.) */
|
|
|
|
|
int Tor2webMode;
|
|
|
|
|
|
2014-09-15 14:26:42 +02:00
|
|
|
|
/** A routerset that should be used when picking RPs for HS circuits. */
|
|
|
|
|
routerset_t *Tor2webRendezvousPoints;
|
|
|
|
|
|
2011-12-24 09:46:37 +01:00
|
|
|
|
/** Close hidden service client circuits immediately when they reach
|
|
|
|
|
* the normal circuit-build timeout, even if they have already sent
|
|
|
|
|
* an INTRODUCE1 cell on its way to the service. */
|
|
|
|
|
int CloseHSClientCircuitsImmediatelyOnTimeout;
|
|
|
|
|
|
2011-12-24 13:55:20 +01:00
|
|
|
|
/** Close hidden-service-side rendezvous circuits immediately when
|
|
|
|
|
* they reach the normal circuit-build timeout. */
|
|
|
|
|
int CloseHSServiceRendCircuitsImmediatelyOnTimeout;
|
|
|
|
|
|
2006-02-09 03:59:26 +01:00
|
|
|
|
int ConnLimit; /**< Demanded minimum number of simultaneous connections. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
int ConnLimit_; /**< Maximum allowed number of simultaneous connections. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
int RunAsDaemon; /**< If true, run in the background. (Unix only) */
|
2004-08-16 22:47:00 +02:00
|
|
|
|
int FascistFirewall; /**< Whether to prefer ORs reachable on open ports. */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
smartlist_t *FirewallPorts; /**< Which ports our firewall allows
|
|
|
|
|
* (strings). */
|
2006-02-19 09:31:47 +01:00
|
|
|
|
config_line_t *ReachableAddresses; /**< IP:ports our firewall allows. */
|
|
|
|
|
config_line_t *ReachableORAddresses; /**< IP:ports for OR conns. */
|
|
|
|
|
config_line_t *ReachableDirAddresses; /**< IP:ports for Dir conns. */
|
2005-08-08 23:58:48 +02:00
|
|
|
|
|
2007-07-16 18:23:34 +02:00
|
|
|
|
int ConstrainedSockets; /**< Shrink xmit and recv socket buffers. */
|
2007-07-16 18:23:36 +02:00
|
|
|
|
uint64_t ConstrainedSockSize; /**< Size of constrained buffers. */
|
2007-07-16 18:23:34 +02:00
|
|
|
|
|
2010-09-21 07:03:29 +02:00
|
|
|
|
/** Whether we should drop exit streams from Tors that we don't know are
|
2010-11-08 19:34:40 +01:00
|
|
|
|
* relays. One of "0" (never refuse), "1" (always refuse), or "-1" (do
|
2010-09-27 23:07:22 +02:00
|
|
|
|
* what the consensus says, defaulting to 'refuse' if the consensus says
|
|
|
|
|
* nothing). */
|
2010-11-08 19:34:40 +01:00
|
|
|
|
int RefuseUnknownExits;
|
2010-03-11 04:43:23 +01:00
|
|
|
|
|
2005-12-14 21:40:40 +01:00
|
|
|
|
/** Application ports that require all nodes in circ to have sufficient
|
|
|
|
|
* uptime. */
|
2005-01-12 05:58:23 +01:00
|
|
|
|
smartlist_t *LongLivedPorts;
|
2008-01-20 06:54:15 +01:00
|
|
|
|
/** Application ports that are likely to be unencrypted and
|
|
|
|
|
* unauthenticated; we reject requests for them to prevent the
|
|
|
|
|
* user from screwing up and leaking plaintext secrets to an
|
|
|
|
|
* observer somewhere on the Internet. */
|
|
|
|
|
smartlist_t *RejectPlaintextPorts;
|
|
|
|
|
/** Related to RejectPlaintextPorts above, except this config option
|
|
|
|
|
* controls whether we warn (in the log and via a controller status
|
|
|
|
|
* event) every time a risky connection is attempted. */
|
|
|
|
|
smartlist_t *WarnPlaintextPorts;
|
2005-02-22 01:53:08 +01:00
|
|
|
|
/** Should we try to reuse the same exit node for a given host */
|
|
|
|
|
smartlist_t *TrackHostExits;
|
2005-12-14 21:40:40 +01:00
|
|
|
|
int TrackHostExitsExpire; /**< Number of seconds until we expire an
|
|
|
|
|
* addressmap */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *AddressMap; /**< List of address map directives. */
|
2007-05-29 19:31:13 +02:00
|
|
|
|
int AutomapHostsOnResolve; /**< If true, when we get a resolve request for a
|
|
|
|
|
* hostname ending with one of the suffixes in
|
|
|
|
|
* <b>AutomapHostsSuffixes</b>, map it to a
|
|
|
|
|
* virtual address. */
|
2015-01-04 23:28:54 +01:00
|
|
|
|
/** List of suffixes for <b>AutomapHostsOnResolve</b>. The special value
|
|
|
|
|
* "." means "match everything." */
|
|
|
|
|
smartlist_t *AutomapHostsSuffixes;
|
2004-11-15 10:05:54 +01:00
|
|
|
|
int RendPostPeriod; /**< How often do we post each rendezvous service
|
|
|
|
|
* descriptor? Remember to publish them independently. */
|
2004-05-10 08:52:01 +02:00
|
|
|
|
int KeepalivePeriod; /**< How often do we send padding cells to keep
|
|
|
|
|
* connections alive? */
|
2006-03-22 00:27:43 +01:00
|
|
|
|
int SocksTimeout; /**< How long do we let a socks connection wait
|
|
|
|
|
* unattached before we fail it? */
|
2010-05-08 20:54:29 +02:00
|
|
|
|
int LearnCircuitBuildTimeout; /**< If non-zero, we attempt to learn a value
|
|
|
|
|
* for CircuitBuildTimeout based on timeout
|
|
|
|
|
* history */
|
|
|
|
|
int CircuitBuildTimeout; /**< Cull non-open circuits that were born at
|
|
|
|
|
* least this many seconds ago. Used until
|
|
|
|
|
* adaptive algorithm learns a new value. */
|
2006-03-22 01:52:37 +01:00
|
|
|
|
int CircuitIdleTimeout; /**< Cull open clean circuits that were born
|
|
|
|
|
* at least this many seconds ago. */
|
2009-11-22 05:36:36 +01:00
|
|
|
|
int CircuitStreamTimeout; /**< If non-zero, detach streams from circuits
|
|
|
|
|
* and try a new circuit if the stream has been
|
|
|
|
|
* waiting for this many seconds. If zero, use
|
|
|
|
|
* our default internal timeout schedule. */
|
2012-12-27 00:08:01 +01:00
|
|
|
|
int MaxOnionQueueDelay; /**<DOCDOC*/
|
2004-05-10 08:52:01 +02:00
|
|
|
|
int NewCircuitPeriod; /**< How long do we use a circuit before building
|
|
|
|
|
* a new one? */
|
Introduce a notion of 'internal' circs, which are chosen without regard
to the exit policy of the last hop. Intro and rendezvous circs must
be internal circs, to avoid leaking information. Resolve and connect
streams can use internal circs if they want.
New circuit pooling algorithm: make sure to have enough circs around
to satisfy any predicted ports, and also make sure to have 2 internal
circs around if we've required internal circs lately (with high uptime
if we've seen that lately).
Split NewCircuitPeriod config option into NewCircuitPeriod (30 secs),
which describes how often we retry making new circuits if current ones
are dirty, and MaxCircuitDirtiness (10 mins), which describes how long
we're willing to make use of an already-dirty circuit.
Once rendezvous circuits are established, keep using the same circuit as
long as you attach a new stream to it at least every 10 minutes. (So web
browsing doesn't require you to build new rend circs every 30 seconds.)
Cannibalize GENERAL circs to be C_REND, C_INTRO, S_INTRO, and S_REND
circ as necessary, if there are any completed ones lying around when
we try to launch one.
Re-instate the ifdef's to use version-0 style introduce cells, since
there was yet another bug in handling version-1 style. We'll try switching
over again after 0.0.9 is obsolete.
Bugfix: when choosing an exit node for a new non-internal circ, don't take
into account whether it'll be useful for any pending x.onion addresses --
it won't.
Bugfix: we weren't actually publishing the hidden service descriptor when
it became dirty. So we only published it every 20 minutes or so, which
means when you first start your Tor, the hidden service will seem broken.
svn:r3360
2005-01-17 19:13:09 +01:00
|
|
|
|
int MaxCircuitDirtiness; /**< Never use circs that were first used more than
|
|
|
|
|
this interval ago. */
|
2014-03-05 20:35:07 +01:00
|
|
|
|
int PredictedPortsRelevanceTime; /** How long after we've requested a
|
2014-03-05 20:27:07 +01:00
|
|
|
|
* connection for a given port, do we want
|
|
|
|
|
* to continue to pick exits that support
|
|
|
|
|
* that port? */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing
|
|
|
|
|
* to use in a second? */
|
|
|
|
|
uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing
|
|
|
|
|
* to use in a second? */
|
2005-03-22 20:01:46 +01:00
|
|
|
|
uint64_t MaxAdvertisedBandwidth; /**< How much bandwidth are we willing to
|
|
|
|
|
* tell people we have? */
|
2007-03-20 03:55:31 +01:00
|
|
|
|
uint64_t RelayBandwidthRate; /**< How much bandwidth, on average, are we
|
|
|
|
|
* willing to use for all relayed conns? */
|
|
|
|
|
uint64_t RelayBandwidthBurst; /**< How much bandwidth, at maximum, will we
|
|
|
|
|
* use in a second for all relayed conns? */
|
2009-12-30 05:13:03 +01:00
|
|
|
|
uint64_t PerConnBWRate; /**< Long-term bw on a single TLS conn, if set. */
|
|
|
|
|
uint64_t PerConnBWBurst; /**< Allowed burst on a single TLS conn, if set. */
|
2010-10-29 19:41:24 +02:00
|
|
|
|
int NumCPUs; /**< How many CPUs should we try to use? */
|
2010-10-30 00:03:31 +02:00
|
|
|
|
//int RunTesting; /**< If true, create testing circuits to measure how well the
|
|
|
|
|
// * other ORs are running. */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *RendConfigLines; /**< List of configuration lines
|
2004-05-10 08:52:01 +02:00
|
|
|
|
* for rendezvous services. */
|
2008-08-12 18:12:26 +02:00
|
|
|
|
config_line_t *HidServAuth; /**< List of configuration lines for client-side
|
|
|
|
|
* authorizations for hidden services */
|
2008-01-19 21:00:53 +01:00
|
|
|
|
char *ContactInfo; /**< Contact info to be published in the directory. */
|
2010-12-01 02:32:42 +01:00
|
|
|
|
|
2010-12-01 02:24:03 +01:00
|
|
|
|
int HeartbeatPeriod; /**< Log heartbeat messages after this many seconds
|
|
|
|
|
* have passed. */
|
2004-10-08 07:53:59 +02:00
|
|
|
|
|
2010-10-29 19:41:24 +02:00
|
|
|
|
char *HTTPProxy; /**< hostname[:port] to use as http proxy, if any. */
|
|
|
|
|
tor_addr_t HTTPProxyAddr; /**< Parsed IPv4 addr for http proxy, if any. */
|
|
|
|
|
uint16_t HTTPProxyPort; /**< Parsed port for http proxy, if any. */
|
|
|
|
|
char *HTTPProxyAuthenticator; /**< username:password string, if any. */
|
2004-10-08 07:53:59 +02:00
|
|
|
|
|
2010-10-29 19:41:24 +02:00
|
|
|
|
char *HTTPSProxy; /**< hostname[:port] to use as https proxy, if any. */
|
|
|
|
|
tor_addr_t HTTPSProxyAddr; /**< Parsed addr for https proxy, if any. */
|
|
|
|
|
uint16_t HTTPSProxyPort; /**< Parsed port for https proxy, if any. */
|
|
|
|
|
char *HTTPSProxyAuthenticator; /**< username:password string, if any. */
|
2005-02-24 11:56:55 +01:00
|
|
|
|
|
2009-08-26 17:34:45 +02:00
|
|
|
|
char *Socks4Proxy; /**< hostname:port to use as a SOCKS4 proxy, if any. */
|
|
|
|
|
tor_addr_t Socks4ProxyAddr; /**< Derived from Socks4Proxy. */
|
|
|
|
|
uint16_t Socks4ProxyPort; /**< Derived from Socks4Proxy. */
|
|
|
|
|
|
|
|
|
|
char *Socks5Proxy; /**< hostname:port to use as a SOCKS5 proxy, if any. */
|
|
|
|
|
tor_addr_t Socks5ProxyAddr; /**< Derived from Sock5Proxy. */
|
|
|
|
|
uint16_t Socks5ProxyPort; /**< Derived from Socks5Proxy. */
|
|
|
|
|
char *Socks5ProxyUsername; /**< Username for SOCKS5 authentication, if any */
|
|
|
|
|
char *Socks5ProxyPassword; /**< Password for SOCKS5 authentication, if any */
|
2009-06-19 01:59:18 +02:00
|
|
|
|
|
2007-12-12 05:38:54 +01:00
|
|
|
|
/** List of configuration lines for replacement directory authorities.
|
|
|
|
|
* If you just want to replace one class of authority at a time,
|
|
|
|
|
* use the "Alternate*Authority" options below instead. */
|
2012-09-10 21:54:16 +02:00
|
|
|
|
config_line_t *DirAuthorities;
|
2007-12-12 05:38:54 +01:00
|
|
|
|
|
2012-09-11 00:13:28 +02:00
|
|
|
|
/** List of fallback directory servers */
|
|
|
|
|
config_line_t *FallbackDir;
|
|
|
|
|
|
2012-09-12 19:56:36 +02:00
|
|
|
|
/** Weight to apply to all directory authority rates if considering them
|
|
|
|
|
* along with fallbackdirs */
|
|
|
|
|
double DirAuthorityFallbackRate;
|
2007-12-12 05:38:54 +01:00
|
|
|
|
|
|
|
|
|
/** If set, use these main (currently v3) directory authorities and
|
|
|
|
|
* not the default ones. */
|
|
|
|
|
config_line_t *AlternateDirAuthority;
|
|
|
|
|
|
|
|
|
|
/** If set, use these bridge authorities and not the default one. */
|
|
|
|
|
config_line_t *AlternateBridgeAuthority;
|
|
|
|
|
|
2004-10-15 03:58:11 +02:00
|
|
|
|
char *MyFamily; /**< Declared family for this OR. */
|
2005-07-22 23:12:10 +02:00
|
|
|
|
config_line_t *NodeFamilies; /**< List of config lines for
|
2010-10-01 00:25:25 +02:00
|
|
|
|
* node families */
|
|
|
|
|
smartlist_t *NodeFamilySets; /**< List of parsed NodeFamilies values. */
|
2006-10-23 05:48:52 +02:00
|
|
|
|
config_line_t *AuthDirBadExit; /**< Address policy for descriptors to
|
2007-12-10 17:49:54 +01:00
|
|
|
|
* mark as bad exits. */
|
2005-09-15 16:39:05 +02:00
|
|
|
|
config_line_t *AuthDirReject; /**< Address policy for descriptors to
|
|
|
|
|
* reject. */
|
|
|
|
|
config_line_t *AuthDirInvalid; /**< Address policy for descriptors to
|
|
|
|
|
* never mark as valid. */
|
2012-01-13 18:28:32 +01:00
|
|
|
|
/** @name AuthDir...CC
|
|
|
|
|
*
|
2014-09-05 01:37:25 +02:00
|
|
|
|
* Lists of country codes to mark as BadExit, or Invalid, or to
|
2012-01-13 18:28:32 +01:00
|
|
|
|
* reject entirely.
|
|
|
|
|
*
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
2012-01-17 03:20:46 +01:00
|
|
|
|
smartlist_t *AuthDirBadExitCCs;
|
|
|
|
|
smartlist_t *AuthDirInvalidCCs;
|
|
|
|
|
smartlist_t *AuthDirRejectCCs;
|
2012-01-13 18:28:32 +01:00
|
|
|
|
/**@}*/
|
|
|
|
|
|
2006-10-23 05:48:52 +02:00
|
|
|
|
int AuthDirListBadExits; /**< True iff we should list bad exits,
|
|
|
|
|
* and vote for all other exits as good. */
|
2008-01-10 17:08:47 +01:00
|
|
|
|
int AuthDirMaxServersPerAddr; /**< Do not permit more than this
|
|
|
|
|
* number of servers per IP address. */
|
|
|
|
|
int AuthDirMaxServersPerAuthAddr; /**< Do not permit more than this
|
|
|
|
|
* number of servers per IP address shared
|
|
|
|
|
* with an authority. */
|
2012-09-06 00:17:41 +02:00
|
|
|
|
int AuthDirHasIPv6Connectivity; /**< Boolean: are we on IPv6? */
|
2008-01-10 17:08:47 +01:00
|
|
|
|
|
2011-11-17 02:55:33 +01:00
|
|
|
|
/** If non-zero, always vote the Fast flag for any relay advertising
|
|
|
|
|
* this amount of capacity or more. */
|
|
|
|
|
uint64_t AuthDirFastGuarantee;
|
|
|
|
|
|
|
|
|
|
/** If non-zero, this advertised capacity or more is always sufficient
|
|
|
|
|
* to satisfy the bandwidth requirement for the Guard flag. */
|
|
|
|
|
uint64_t AuthDirGuardBWGuarantee;
|
|
|
|
|
|
2005-05-20 10:51:45 +02:00
|
|
|
|
char *AccountingStart; /**< How long is the accounting interval, and when
|
2004-11-22 22:56:51 +01:00
|
|
|
|
* does it start? */
|
2004-11-20 01:37:00 +01:00
|
|
|
|
uint64_t AccountingMax; /**< How many bytes do we allow per accounting
|
|
|
|
|
* interval before hibernation? 0 for "never
|
|
|
|
|
* hibernate." */
|
2014-09-23 14:46:35 +02:00
|
|
|
|
/** How do we determine when our AccountingMax has been reached?
|
|
|
|
|
* "max" for when in or out reaches AccountingMax
|
|
|
|
|
* "sum for when in plus out reaches AccountingMax */
|
|
|
|
|
char *AccountingRule_option;
|
|
|
|
|
enum { ACCT_MAX, ACCT_SUM } AccountingRule;
|
2004-11-20 01:37:00 +01:00
|
|
|
|
|
2007-12-09 05:59:27 +01:00
|
|
|
|
/** Base64-encoded hash of accepted passwords for the control system. */
|
|
|
|
|
config_line_t *HashedControlPassword;
|
2008-02-17 19:45:07 +01:00
|
|
|
|
/** As HashedControlPassword, but not saved. */
|
|
|
|
|
config_line_t *HashedControlSessionPassword;
|
2007-12-09 05:59:27 +01:00
|
|
|
|
|
2004-11-12 17:39:03 +01:00
|
|
|
|
int CookieAuthentication; /**< Boolean: do we enable cookie-based auth for
|
|
|
|
|
* the control system? */
|
2012-12-05 17:38:42 +01:00
|
|
|
|
char *CookieAuthFile; /**< Filesystem location of a ControlPort
|
|
|
|
|
* authentication cookie. */
|
|
|
|
|
char *ExtORPortCookieAuthFile; /**< Filesystem location of Extended
|
|
|
|
|
* ORPort authentication cookie. */
|
2007-08-16 19:46:01 +02:00
|
|
|
|
int CookieAuthFileGroupReadable; /**< Boolean: Is the CookieAuthFile g+r? */
|
2014-08-15 14:30:44 +02:00
|
|
|
|
int ExtORPortCookieAuthFileGroupReadable; /**< Boolean: Is the
|
|
|
|
|
* ExtORPortCookieAuthFile g+r? */
|
2005-03-27 08:25:33 +02:00
|
|
|
|
int LeaveStreamsUnattached; /**< Boolean: Does Tor attach new streams to
|
|
|
|
|
* circuits itself (0), or does it expect a controller
|
|
|
|
|
* to cope? (1) */
|
2007-04-30 11:18:48 +02:00
|
|
|
|
int DisablePredictedCircuits; /**< Boolean: does Tor preemptively
|
|
|
|
|
* make circuits in the background (0),
|
|
|
|
|
* or not (1)? */
|
2011-05-15 17:23:04 +02:00
|
|
|
|
|
|
|
|
|
/** Process specifier for a controller that ‘owns’ this Tor
|
|
|
|
|
* instance. Tor will terminate if its owning controller does. */
|
|
|
|
|
char *OwningControllerProcess;
|
|
|
|
|
|
2005-03-12 21:13:38 +01:00
|
|
|
|
int ShutdownWaitLength; /**< When we get a SIGINT and we're a server, how
|
|
|
|
|
* long do we wait before exiting? */
|
2009-09-28 15:08:32 +02:00
|
|
|
|
char *SafeLogging; /**< Contains "relay", "1", "0" (meaning no scrubbing). */
|
2009-12-12 07:12:47 +01:00
|
|
|
|
|
|
|
|
|
/* Derived from SafeLogging */
|
|
|
|
|
enum {
|
|
|
|
|
SAFELOG_SCRUB_ALL, SAFELOG_SCRUB_RELAY, SAFELOG_SCRUB_NONE
|
2012-10-12 18:22:13 +02:00
|
|
|
|
} SafeLogging_;
|
2009-12-12 07:12:47 +01:00
|
|
|
|
|
2013-07-14 08:49:34 +02:00
|
|
|
|
int Sandbox; /**< Boolean: should sandboxing be enabled? */
|
2006-03-19 02:44:53 +01:00
|
|
|
|
int SafeSocks; /**< Boolean: should we outright refuse application
|
|
|
|
|
* connections that use socks4 or socks5-with-local-dns? */
|
2005-12-14 21:40:40 +01:00
|
|
|
|
#define LOG_PROTOCOL_WARN (get_options()->ProtocolWarnings ? \
|
|
|
|
|
LOG_WARN : LOG_INFO)
|
2005-10-17 02:35:53 +02:00
|
|
|
|
int ProtocolWarnings; /**< Boolean: when other parties screw up the Tor
|
|
|
|
|
* protocol, is it a warn or an info in our logs? */
|
2005-11-17 00:37:35 +01:00
|
|
|
|
int TestSocks; /**< Boolean: when we get a socks connection, do we loudly
|
|
|
|
|
* log whether it was DNS-leaking or not? */
|
2005-06-20 20:56:35 +02:00
|
|
|
|
int HardwareAccel; /**< Boolean: Should we enable OpenSSL hardware
|
|
|
|
|
* acceleration where available? */
|
2011-09-22 21:07:01 +02:00
|
|
|
|
/** Token Bucket Refill resolution in milliseconds. */
|
2011-09-08 02:21:53 +02:00
|
|
|
|
int TokenBucketRefillInterval;
|
2009-05-24 01:42:44 +02:00
|
|
|
|
char *AccelName; /**< Optional hardware acceleration engine name. */
|
|
|
|
|
char *AccelDir; /**< Optional hardware acceleration engine search dir. */
|
2006-01-10 23:42:44 +01:00
|
|
|
|
int UseEntryGuards; /**< Boolean: Do we try to enter from a smallish number
|
|
|
|
|
* of fixed nodes? */
|
|
|
|
|
int NumEntryGuards; /**< How many entry guards do we try to establish? */
|
2012-12-11 19:05:35 +01:00
|
|
|
|
int UseEntryGuardsAsDirGuards; /** Boolean: Do we try to get directory info
|
|
|
|
|
* from a smallish number of fixed nodes? */
|
2015-01-29 15:57:00 +01:00
|
|
|
|
|
|
|
|
|
/** If 1, we use any guardfraction information we see in the
|
|
|
|
|
* consensus. If 0, we don't. If -1, let the consensus parameter
|
|
|
|
|
* decide. */
|
|
|
|
|
int UseGuardFraction;
|
|
|
|
|
|
2013-07-30 18:05:39 +02:00
|
|
|
|
int NumDirectoryGuards; /**< How many dir guards do we try to establish?
|
|
|
|
|
* If 0, use value from NumEntryGuards. */
|
2005-07-25 12:29:21 +02:00
|
|
|
|
int RephistTrackTime; /**< How many seconds do we keep rephist info? */
|
2005-12-07 23:09:02 +01:00
|
|
|
|
int FastFirstHopPK; /**< If Tor believes it is safe, should we save a third
|
|
|
|
|
* of our PK time by sending CREATE_FAST cells? */
|
2007-12-21 07:08:00 +01:00
|
|
|
|
/** Should we always fetch our dir info on the mirror schedule (which
|
|
|
|
|
* means directly from the authorities) no matter our other config? */
|
|
|
|
|
int FetchDirInfoEarly;
|
2005-08-08 23:58:48 +02:00
|
|
|
|
|
2009-07-12 03:43:33 +02:00
|
|
|
|
/** Should we fetch our dir info at the start of the consensus period? */
|
|
|
|
|
int FetchDirInfoExtraEarly;
|
|
|
|
|
|
2012-11-23 23:31:53 +01:00
|
|
|
|
char *VirtualAddrNetworkIPv4; /**< Address and mask to hand out for virtual
|
|
|
|
|
* MAPADDRESS requests for IPv4 addresses */
|
|
|
|
|
char *VirtualAddrNetworkIPv6; /**< Address and mask to hand out for virtual
|
|
|
|
|
* MAPADDRESS requests for IPv6 addresses */
|
2006-09-21 23:48:16 +02:00
|
|
|
|
int ServerDNSSearchDomains; /**< Boolean: If set, we don't force exit
|
|
|
|
|
* addresses to be FQDNs, but rather search for them in
|
|
|
|
|
* the local domains. */
|
2006-09-21 23:48:22 +02:00
|
|
|
|
int ServerDNSDetectHijacking; /**< Boolean: If true, check for DNS failure
|
2006-09-25 07:59:13 +02:00
|
|
|
|
* hijacking. */
|
2008-10-29 20:20:02 +01:00
|
|
|
|
int ServerDNSRandomizeCase; /**< Boolean: Use the 0x20-hack to prevent
|
|
|
|
|
* DNS poisoning attacks. */
|
2006-09-21 23:48:16 +02:00
|
|
|
|
char *ServerDNSResolvConfFile; /**< If provided, we configure our internal
|
|
|
|
|
* resolver from the file here rather than from
|
2006-09-25 07:59:13 +02:00
|
|
|
|
* /etc/resolv.conf (Unix) or the registry (Windows). */
|
2008-12-07 02:21:19 +01:00
|
|
|
|
char *DirPortFrontPage; /**< This is a full path to a file with an html
|
|
|
|
|
disclaimer. This allows a server administrator to show
|
|
|
|
|
that they're running Tor and anyone visiting their server
|
|
|
|
|
will know this without any specialized knowledge. */
|
2011-05-30 17:06:51 +02:00
|
|
|
|
int DisableDebuggerAttachment; /**< Currently Linux only specific attempt to
|
|
|
|
|
disable ptrace; needs BSD testing. */
|
2008-02-06 13:46:17 +01:00
|
|
|
|
/** Boolean: if set, we start even if our resolv.conf file is missing
|
|
|
|
|
* or broken. */
|
2008-12-17 23:58:14 +01:00
|
|
|
|
int ServerDNSAllowBrokenConfig;
|
2011-04-05 21:01:19 +02:00
|
|
|
|
/** Boolean: if set, then even connections to private addresses will get
|
|
|
|
|
* rate-limited. */
|
|
|
|
|
int CountPrivateBandwidth;
|
2006-12-28 22:29:11 +01:00
|
|
|
|
smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely
|
2009-05-27 23:55:51 +02:00
|
|
|
|
* should be resolvable. Used for
|
2006-12-28 22:29:11 +01:00
|
|
|
|
* testing our DNS server. */
|
2006-12-13 01:28:56 +01:00
|
|
|
|
int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the
|
2006-09-26 00:12:54 +02:00
|
|
|
|
* same network zone in the same circuit. */
|
2010-06-16 20:47:06 +02:00
|
|
|
|
int PortForwarding; /**< If true, use NAT-PMP or UPnP to automatically
|
|
|
|
|
* forward the DirPort and ORPort on the NAT device */
|
|
|
|
|
char *PortForwardingHelper; /** < Filename or full path of the port
|
|
|
|
|
forwarding helper executable */
|
2006-12-20 10:25:58 +01:00
|
|
|
|
int AllowNonRFC953Hostnames; /**< If true, we allow connections to hostnames
|
|
|
|
|
* with weird characters. */
|
2007-08-13 20:09:38 +02:00
|
|
|
|
/** If true, we try resolving hostnames with weird characters. */
|
2007-01-11 17:02:39 +01:00
|
|
|
|
int ServerDNSAllowNonRFC953Hostnames;
|
2007-05-01 22:13:49 +02:00
|
|
|
|
|
2007-05-18 23:19:19 +02:00
|
|
|
|
/** If true, we try to download extra-info documents (and we serve them,
|
|
|
|
|
* if we are a cache). For authorities, this is always true. */
|
|
|
|
|
int DownloadExtraInfo;
|
|
|
|
|
|
2008-09-26 20:58:45 +02:00
|
|
|
|
/** If true, and we are acting as a relay, allow exit circuits even when
|
|
|
|
|
* we are the first hop of a circuit. */
|
|
|
|
|
int AllowSingleHopExits;
|
|
|
|
|
/** If true, don't allow relays with AllowSingleHopExits=1 to be used in
|
|
|
|
|
* circuits that we build. */
|
|
|
|
|
int ExcludeSingleHopRelays;
|
|
|
|
|
/** If true, and the controller tells us to use a one-hop circuit, and the
|
|
|
|
|
* exit allows it, we use it. */
|
|
|
|
|
int AllowSingleHopCircuits;
|
|
|
|
|
|
2009-08-08 01:26:41 +02:00
|
|
|
|
/** If true, we convert "www.google.com.foo.exit" addresses on the
|
|
|
|
|
* socks/trans/natd ports into "www.google.com" addresses that
|
|
|
|
|
* exit from the node "foo". Disabled by default since attacking
|
|
|
|
|
* websites and exit relays can use it to manipulate your path
|
|
|
|
|
* selection. */
|
|
|
|
|
int AllowDotExit;
|
|
|
|
|
|
2010-06-03 12:52:34 +02:00
|
|
|
|
/** If true, we will warn if a user gives us only an IP address
|
|
|
|
|
* instead of a hostname. */
|
|
|
|
|
int WarnUnsafeSocks;
|
|
|
|
|
|
2014-09-11 05:01:18 +02:00
|
|
|
|
/** If true, we're configured to collect statistics on clients
|
2009-07-15 16:32:40 +02:00
|
|
|
|
* requesting network statuses from us as directory. */
|
2014-09-11 05:01:18 +02:00
|
|
|
|
int DirReqStatistics_option;
|
|
|
|
|
/** Internal variable to remember whether we're actually acting on
|
|
|
|
|
* DirReqStatistics_option -- yes if it's set and we're a server, else no. */
|
2009-07-15 16:32:40 +02:00
|
|
|
|
int DirReqStatistics;
|
|
|
|
|
|
2009-06-24 19:51:45 +02:00
|
|
|
|
/** If true, the user wants us to collect statistics on port usage. */
|
|
|
|
|
int ExitPortStatistics;
|
|
|
|
|
|
2010-08-02 15:06:14 +02:00
|
|
|
|
/** If true, the user wants us to collect connection statistics. */
|
2010-08-15 14:58:35 +02:00
|
|
|
|
int ConnDirectionStatistics;
|
2010-08-02 15:06:14 +02:00
|
|
|
|
|
2009-07-05 19:53:25 +02:00
|
|
|
|
/** If true, the user wants us to collect cell statistics. */
|
|
|
|
|
int CellStatistics;
|
|
|
|
|
|
2009-07-05 20:48:16 +02:00
|
|
|
|
/** If true, the user wants us to collect statistics as entry node. */
|
|
|
|
|
int EntryStatistics;
|
|
|
|
|
|
2014-12-02 13:20:35 +01:00
|
|
|
|
/** If true, the user wants us to collect statistics as hidden service
|
|
|
|
|
* directory, introduction point, or rendezvous point. */
|
|
|
|
|
int HiddenServiceStatistics;
|
|
|
|
|
|
2009-08-14 15:30:24 +02:00
|
|
|
|
/** If true, include statistics file contents in extra-info documents. */
|
|
|
|
|
int ExtraInfoStatistics;
|
|
|
|
|
|
2007-08-27 17:33:58 +02:00
|
|
|
|
/** If true, do not believe anybody who tells us that a domain resolves
|
|
|
|
|
* to an internal address, or that an internal address has a PTR mapping.
|
|
|
|
|
* Helps avoid some cross-site attacks. */
|
|
|
|
|
int ClientDNSRejectInternalAddresses;
|
|
|
|
|
|
2011-01-26 17:35:24 +01:00
|
|
|
|
/** If true, do not accept any requests to connect to internal addresses
|
|
|
|
|
* over randomly chosen exits. */
|
|
|
|
|
int ClientRejectInternalAddresses;
|
|
|
|
|
|
2012-08-27 15:03:34 +02:00
|
|
|
|
/** If true, clients may connect over IPv6. XXX we don't really
|
|
|
|
|
enforce this -- clients _may_ set up outgoing IPv6 connections
|
|
|
|
|
even when this option is not set. */
|
|
|
|
|
int ClientUseIPv6;
|
|
|
|
|
/** If true, prefer an IPv6 OR port over an IPv4 one. */
|
|
|
|
|
int ClientPreferIPv6ORPort;
|
|
|
|
|
|
2007-08-14 22:19:40 +02:00
|
|
|
|
/** The length of time that we think a consensus should be fresh. */
|
2007-08-13 20:09:38 +02:00
|
|
|
|
int V3AuthVotingInterval;
|
2008-01-19 21:00:53 +01:00
|
|
|
|
/** The length of time we think it will take to distribute votes. */
|
2007-08-14 04:23:57 +02:00
|
|
|
|
int V3AuthVoteDelay;
|
2008-01-19 21:00:53 +01:00
|
|
|
|
/** The length of time we think it will take to distribute signatures. */
|
2007-08-14 04:23:57 +02:00
|
|
|
|
int V3AuthDistDelay;
|
2007-08-14 22:19:40 +02:00
|
|
|
|
/** The number of intervals we think a consensus should be valid. */
|
2007-08-14 04:23:57 +02:00
|
|
|
|
int V3AuthNIntervalsValid;
|
2007-10-29 00:44:53 +01:00
|
|
|
|
|
2008-05-12 04:14:01 +02:00
|
|
|
|
/** Should advertise and sign consensuses with a legacy key, for key
|
|
|
|
|
* migration purposes? */
|
|
|
|
|
int V3AuthUseLegacyKey;
|
|
|
|
|
|
2009-07-31 06:33:53 +02:00
|
|
|
|
/** Location of bandwidth measurement file */
|
|
|
|
|
char *V3BandwidthsFile;
|
|
|
|
|
|
2015-01-29 15:54:47 +01:00
|
|
|
|
/** Location of guardfraction file */
|
|
|
|
|
char *GuardfractionFile;
|
|
|
|
|
|
2009-09-15 10:40:08 +02:00
|
|
|
|
/** Authority only: key=value pairs that we add to our networkstatus
|
|
|
|
|
* consensus vote on the 'params' line. */
|
|
|
|
|
char *ConsensusParams;
|
|
|
|
|
|
2013-03-18 19:15:21 +01:00
|
|
|
|
/** Authority only: minimum number of measured bandwidths we must see
|
|
|
|
|
* before we only beliee measured bandwidths to assign flags. */
|
|
|
|
|
int MinMeasuredBWsForAuthToIgnoreAdvertised;
|
|
|
|
|
|
2008-06-14 18:11:37 +02:00
|
|
|
|
/** The length of time that we think an initial consensus should be fresh.
|
|
|
|
|
* Only altered on testing networks. */
|
2008-06-20 19:03:13 +02:00
|
|
|
|
int TestingV3AuthInitialVotingInterval;
|
2008-06-14 18:01:29 +02:00
|
|
|
|
|
2008-06-14 18:11:37 +02:00
|
|
|
|
/** The length of time we think it will take to distribute initial votes.
|
|
|
|
|
* Only altered on testing networks. */
|
2008-06-20 19:03:13 +02:00
|
|
|
|
int TestingV3AuthInitialVoteDelay;
|
2008-06-14 18:01:29 +02:00
|
|
|
|
|
|
|
|
|
/** The length of time we think it will take to distribute initial
|
2008-06-14 18:11:37 +02:00
|
|
|
|
* signatures. Only altered on testing networks.*/
|
2008-06-20 19:03:13 +02:00
|
|
|
|
int TestingV3AuthInitialDistDelay;
|
2008-06-14 18:01:29 +02:00
|
|
|
|
|
2013-06-05 15:48:57 +02:00
|
|
|
|
/** Offset in seconds added to the starting time for consensus
|
|
|
|
|
voting. Only altered on testing networks. */
|
|
|
|
|
int TestingV3AuthVotingStartOffset;
|
|
|
|
|
|
2008-06-14 18:11:37 +02:00
|
|
|
|
/** If an authority has been around for less than this amount of time, it
|
|
|
|
|
* does not believe its reachability information is accurate. Only
|
|
|
|
|
* altered on testing networks. */
|
2008-06-20 19:03:13 +02:00
|
|
|
|
int TestingAuthDirTimeToLearnReachability;
|
2008-06-14 18:01:29 +02:00
|
|
|
|
|
|
|
|
|
/** Clients don't download any descriptor this recent, since it will
|
2008-06-14 18:11:37 +02:00
|
|
|
|
* probably not have propagated to enough caches. Only altered on testing
|
|
|
|
|
* networks. */
|
2008-06-20 19:03:13 +02:00
|
|
|
|
int TestingEstimatedDescriptorPropagationTime;
|
2008-06-14 18:01:29 +02:00
|
|
|
|
|
2013-05-16 12:08:48 +02:00
|
|
|
|
/** Schedule for when servers should download things in general. Only
|
|
|
|
|
* altered on testing networks. */
|
|
|
|
|
smartlist_t *TestingServerDownloadSchedule;
|
|
|
|
|
|
|
|
|
|
/** Schedule for when clients should download things in general. Only
|
|
|
|
|
* altered on testing networks. */
|
|
|
|
|
smartlist_t *TestingClientDownloadSchedule;
|
|
|
|
|
|
|
|
|
|
/** Schedule for when servers should download consensuses. Only altered
|
|
|
|
|
* on testing networks. */
|
|
|
|
|
smartlist_t *TestingServerConsensusDownloadSchedule;
|
|
|
|
|
|
|
|
|
|
/** Schedule for when clients should download consensuses. Only altered
|
|
|
|
|
* on testing networks. */
|
|
|
|
|
smartlist_t *TestingClientConsensusDownloadSchedule;
|
|
|
|
|
|
|
|
|
|
/** Schedule for when clients should download bridge descriptors. Only
|
|
|
|
|
* altered on testing networks. */
|
|
|
|
|
smartlist_t *TestingBridgeDownloadSchedule;
|
|
|
|
|
|
|
|
|
|
/** When directory clients have only a few descriptors to request, they
|
|
|
|
|
* batch them until they have more, or until this amount of time has
|
|
|
|
|
* passed. Only altered on testing networks. */
|
|
|
|
|
int TestingClientMaxIntervalWithoutRequest;
|
|
|
|
|
|
|
|
|
|
/** How long do we let a directory connection stall before expiring
|
|
|
|
|
* it? Only altered on testing networks. */
|
|
|
|
|
int TestingDirConnectionMaxStall;
|
|
|
|
|
|
|
|
|
|
/** How many times will we try to fetch a consensus before we give
|
|
|
|
|
* up? Only altered on testing networks. */
|
|
|
|
|
int TestingConsensusMaxDownloadTries;
|
|
|
|
|
|
|
|
|
|
/** How many times will we try to download a router's descriptor before
|
|
|
|
|
* giving up? Only altered on testing networks. */
|
|
|
|
|
int TestingDescriptorMaxDownloadTries;
|
|
|
|
|
|
|
|
|
|
/** How many times will we try to download a microdescriptor before
|
|
|
|
|
* giving up? Only altered on testing networks. */
|
|
|
|
|
int TestingMicrodescMaxDownloadTries;
|
|
|
|
|
|
|
|
|
|
/** How many times will we try to fetch a certificate before giving
|
|
|
|
|
* up? Only altered on testing networks. */
|
|
|
|
|
int TestingCertMaxDownloadTries;
|
|
|
|
|
|
2008-06-14 18:01:29 +02:00
|
|
|
|
/** If true, we take part in a testing network. Change the defaults of a
|
|
|
|
|
* couple of other configuration options and allow to change the values
|
|
|
|
|
* of certain configuration options. */
|
|
|
|
|
int TestingTorNetwork;
|
|
|
|
|
|
2013-03-20 19:16:41 +01:00
|
|
|
|
/** Minimum value for the Exit flag threshold on testing networks. */
|
|
|
|
|
uint64_t TestingMinExitFlagThreshold;
|
|
|
|
|
|
2013-03-20 18:34:57 +01:00
|
|
|
|
/** Minimum value for the Fast flag threshold on testing networks. */
|
|
|
|
|
uint64_t TestingMinFastFlagThreshold;
|
|
|
|
|
|
2014-10-01 09:44:21 +02:00
|
|
|
|
/** Relays in a testing network which should be voted Exit
|
|
|
|
|
* regardless of exit policy. */
|
|
|
|
|
routerset_t *TestingDirAuthVoteExit;
|
New TestingDirAuthVote{Exit,Guard,HSDir}IsStrict flags
"option to prevent guard,exit,hsdir flag assignment"
"A node will never receive the corresponding flag unless
that node is specified in the
TestingDirAuthVote{Exit,Guard,HSDir} list, regardless of
its uptime, bandwidth, exit policy, or DirPort".
Patch modified by "teor": VoteOnHidServDirectoriesV2
is now obsolete, so TestingDirAuthVoteHSDir always
votes on HSDirs.
Closes ticket 14882. Patch by "robgjansen".
Commit message and changes file by "teor"
with quotes from "robgjansen".
2015-05-06 15:40:23 +02:00
|
|
|
|
int TestingDirAuthVoteExitIsStrict;
|
2014-10-01 09:44:21 +02:00
|
|
|
|
|
2013-10-07 09:28:44 +02:00
|
|
|
|
/** Relays in a testing network which should be voted Guard
|
|
|
|
|
* regardless of uptime and bandwidth. */
|
|
|
|
|
routerset_t *TestingDirAuthVoteGuard;
|
New TestingDirAuthVote{Exit,Guard,HSDir}IsStrict flags
"option to prevent guard,exit,hsdir flag assignment"
"A node will never receive the corresponding flag unless
that node is specified in the
TestingDirAuthVote{Exit,Guard,HSDir} list, regardless of
its uptime, bandwidth, exit policy, or DirPort".
Patch modified by "teor": VoteOnHidServDirectoriesV2
is now obsolete, so TestingDirAuthVoteHSDir always
votes on HSDirs.
Closes ticket 14882. Patch by "robgjansen".
Commit message and changes file by "teor"
with quotes from "robgjansen".
2015-05-06 15:40:23 +02:00
|
|
|
|
int TestingDirAuthVoteGuardIsStrict;
|
2013-10-07 09:28:44 +02:00
|
|
|
|
|
2015-01-10 11:43:31 +01:00
|
|
|
|
/** Relays in a testing network which should be voted HSDir
|
2015-05-06 15:37:38 +02:00
|
|
|
|
* regardless of uptime and DirPort.
|
2015-01-10 11:43:31 +01:00
|
|
|
|
* Respects VoteOnHidServDirectoriesV2. */
|
|
|
|
|
routerset_t *TestingDirAuthVoteHSDir;
|
New TestingDirAuthVote{Exit,Guard,HSDir}IsStrict flags
"option to prevent guard,exit,hsdir flag assignment"
"A node will never receive the corresponding flag unless
that node is specified in the
TestingDirAuthVote{Exit,Guard,HSDir} list, regardless of
its uptime, bandwidth, exit policy, or DirPort".
Patch modified by "teor": VoteOnHidServDirectoriesV2
is now obsolete, so TestingDirAuthVoteHSDir always
votes on HSDirs.
Closes ticket 14882. Patch by "robgjansen".
Commit message and changes file by "teor"
with quotes from "robgjansen".
2015-05-06 15:40:23 +02:00
|
|
|
|
int TestingDirAuthVoteHSDirIsStrict;
|
2015-01-10 11:43:31 +01:00
|
|
|
|
|
2013-05-24 12:01:32 +02:00
|
|
|
|
/** Enable CONN_BW events. Only altered on testing networks. */
|
|
|
|
|
int TestingEnableConnBwEvent;
|
|
|
|
|
|
2013-05-24 12:29:42 +02:00
|
|
|
|
/** Enable CELL_STATS events. Only altered on testing networks. */
|
|
|
|
|
int TestingEnableCellStatsEvent;
|
|
|
|
|
|
2013-05-25 12:21:09 +02:00
|
|
|
|
/** Enable TB_EMPTY events. Only altered on testing networks. */
|
|
|
|
|
int TestingEnableTbEmptyEvent;
|
|
|
|
|
|
2008-02-12 21:20:52 +01:00
|
|
|
|
/** If true, and we have GeoIP data, and we're a bridge, keep a per-country
|
|
|
|
|
* count of how many client addresses have contacted us so that we can help
|
|
|
|
|
* the bridge authority guess which countries have blocked access to us. */
|
2007-12-17 23:44:11 +01:00
|
|
|
|
int BridgeRecordUsageByCountry;
|
2008-12-23 18:56:31 +01:00
|
|
|
|
|
2012-10-19 23:23:04 +02:00
|
|
|
|
/** Optionally, IPv4 and IPv6 GeoIP data. */
|
2007-12-18 22:27:08 +01:00
|
|
|
|
char *GeoIPFile;
|
2012-03-01 02:04:45 +01:00
|
|
|
|
char *GeoIPv6File;
|
2007-12-17 23:44:11 +01:00
|
|
|
|
|
2013-01-18 00:07:36 +01:00
|
|
|
|
/** Autobool: if auto, then any attempt to Exclude{Exit,}Nodes a particular
|
|
|
|
|
* country code will exclude all nodes in ?? and A1. If true, all nodes in
|
|
|
|
|
* ?? and A1 are excluded. Has no effect if we don't know any GeoIP data. */
|
|
|
|
|
int GeoIPExcludeUnknown;
|
|
|
|
|
|
2008-12-10 23:17:02 +01:00
|
|
|
|
/** If true, SIGHUP should reload the torrc. Sometimes controllers want
|
|
|
|
|
* to make this false. */
|
|
|
|
|
int ReloadTorrcOnSIGHUP;
|
|
|
|
|
|
2009-12-15 19:53:53 +01:00
|
|
|
|
/* The main parameter for picking circuits within a connection.
|
|
|
|
|
*
|
|
|
|
|
* If this value is positive, when picking a cell to relay on a connection,
|
|
|
|
|
* we always relay from the circuit whose weighted cell count is lowest.
|
|
|
|
|
* Cells are weighted exponentially such that if one cell is sent
|
|
|
|
|
* 'CircuitPriorityHalflife' seconds before another, it counts for half as
|
|
|
|
|
* much.
|
|
|
|
|
*
|
|
|
|
|
* If this value is zero, we're disabling the cell-EWMA algorithm.
|
|
|
|
|
*
|
|
|
|
|
* If this value is negative, we're using the default approach
|
|
|
|
|
* according to either Tor or a parameter set in the consensus.
|
|
|
|
|
*/
|
|
|
|
|
double CircuitPriorityHalflife;
|
2009-12-10 17:12:42 +01:00
|
|
|
|
|
2010-09-28 20:01:45 +02:00
|
|
|
|
/** If true, do not enable IOCP on windows with bufferevents, even if
|
|
|
|
|
* we think we could. */
|
|
|
|
|
int DisableIOCP;
|
2012-09-10 16:09:19 +02:00
|
|
|
|
/** For testing only: will go away eventually. */
|
|
|
|
|
int UseFilteringSSLBufferevents;
|
2010-09-28 20:01:45 +02:00
|
|
|
|
|
2011-02-26 09:06:09 +01:00
|
|
|
|
/** Set to true if the TestingTorNetwork configuration option is set.
|
|
|
|
|
* This is used so that options_validate() has a chance to realize that
|
|
|
|
|
* the defaults have changed. */
|
2012-10-12 18:22:13 +02:00
|
|
|
|
int UsingTestNetworkDefaults_;
|
2011-02-26 09:06:09 +01:00
|
|
|
|
|
2010-11-08 20:21:32 +01:00
|
|
|
|
/** If 1, we try to use microdescriptors to build circuits. If 0, we don't.
|
|
|
|
|
* If -1, Tor decides. */
|
|
|
|
|
int UseMicrodescriptors;
|
|
|
|
|
|
2011-05-09 18:13:37 +02:00
|
|
|
|
/** File where we should write the ControlPort. */
|
|
|
|
|
char *ControlPortWriteToFile;
|
2011-05-13 01:17:48 +02:00
|
|
|
|
/** Should that file be group-readable? */
|
|
|
|
|
int ControlPortFileGroupReadable;
|
2011-05-09 18:13:37 +02:00
|
|
|
|
|
2011-07-07 20:54:54 +02:00
|
|
|
|
#define MAX_MAX_CLIENT_CIRCUITS_PENDING 1024
|
|
|
|
|
/** Maximum number of non-open general-purpose origin circuits to allow at
|
|
|
|
|
* once. */
|
|
|
|
|
int MaxClientCircuitsPending;
|
|
|
|
|
|
2011-07-20 16:38:00 +02:00
|
|
|
|
/** If 1, we always send optimistic data when it's supported. If 0, we
|
|
|
|
|
* never use it. If -1, we do what the consensus says. */
|
|
|
|
|
int OptimisticData;
|
|
|
|
|
|
2011-11-18 23:43:03 +01:00
|
|
|
|
/** If 1, and we are using IOCP, we set the kernel socket SNDBUF and RCVBUF
|
|
|
|
|
* to 0 to try to save kernel memory and avoid the dread "Out of buffers"
|
|
|
|
|
* issue. */
|
|
|
|
|
int UserspaceIOCPBuffers;
|
|
|
|
|
|
2011-11-28 21:44:10 +01:00
|
|
|
|
/** If 1, we accept and launch no external network connections, except on
|
|
|
|
|
* control ports. */
|
|
|
|
|
int DisableNetwork;
|
|
|
|
|
|
2012-05-04 05:15:34 +02:00
|
|
|
|
/**
|
|
|
|
|
* Parameters for path-bias detection.
|
|
|
|
|
* @{
|
2013-05-20 21:46:00 +02:00
|
|
|
|
* These options override the default behavior of Tor's (**currently
|
|
|
|
|
* experimental**) path bias detection algorithm. To try to find broken or
|
|
|
|
|
* misbehaving guard nodes, Tor looks for nodes where more than a certain
|
|
|
|
|
* fraction of circuits through that guard fail to get built.
|
|
|
|
|
*
|
|
|
|
|
* The PathBiasCircThreshold option controls how many circuits we need to
|
|
|
|
|
* build through a guard before we make these checks. The
|
|
|
|
|
* PathBiasNoticeRate, PathBiasWarnRate and PathBiasExtremeRate options
|
|
|
|
|
* control what fraction of circuits must succeed through a guard so we
|
|
|
|
|
* won't write log messages. If less than PathBiasExtremeRate circuits
|
|
|
|
|
* succeed *and* PathBiasDropGuards is set to 1, we disable use of that
|
|
|
|
|
* guard.
|
|
|
|
|
*
|
|
|
|
|
* When we have seen more than PathBiasScaleThreshold circuits through a
|
|
|
|
|
* guard, we scale our observations by 0.5 (governed by the consensus) so
|
|
|
|
|
* that new observations don't get swamped by old ones.
|
|
|
|
|
*
|
|
|
|
|
* By default, or if a negative value is provided for one of these options,
|
|
|
|
|
* Tor uses reasonable defaults from the networkstatus consensus document.
|
|
|
|
|
* If no defaults are available there, these options default to 150, .70,
|
|
|
|
|
* .50, .30, 0, and 300 respectively.
|
2012-05-04 05:15:34 +02:00
|
|
|
|
*/
|
|
|
|
|
int PathBiasCircThreshold;
|
|
|
|
|
double PathBiasNoticeRate;
|
2012-10-25 03:03:09 +02:00
|
|
|
|
double PathBiasWarnRate;
|
2012-11-01 02:49:49 +01:00
|
|
|
|
double PathBiasExtremeRate;
|
2012-10-25 03:03:09 +02:00
|
|
|
|
int PathBiasDropGuards;
|
2012-05-04 05:15:34 +02:00
|
|
|
|
int PathBiasScaleThreshold;
|
2013-01-19 04:37:16 +01:00
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parameters for path-bias use detection
|
|
|
|
|
* @{
|
2013-05-20 21:46:00 +02:00
|
|
|
|
* Similar to the above options, these options override the default behavior
|
|
|
|
|
* of Tor's (**currently experimental**) path use bias detection algorithm.
|
|
|
|
|
*
|
|
|
|
|
* Where as the path bias parameters govern thresholds for successfully
|
|
|
|
|
* building circuits, these four path use bias parameters govern thresholds
|
|
|
|
|
* only for circuit usage. Circuits which receive no stream usage are not
|
|
|
|
|
* counted by this detection algorithm. A used circuit is considered
|
|
|
|
|
* successful if it is capable of carrying streams or otherwise receiving
|
|
|
|
|
* well-formed responses to RELAY cells.
|
|
|
|
|
*
|
|
|
|
|
* By default, or if a negative value is provided for one of these options,
|
|
|
|
|
* Tor uses reasonable defaults from the networkstatus consensus document.
|
|
|
|
|
* If no defaults are available there, these options default to 20, .80,
|
|
|
|
|
* .60, and 100, respectively.
|
2013-01-19 04:37:16 +01:00
|
|
|
|
*/
|
|
|
|
|
int PathBiasUseThreshold;
|
|
|
|
|
double PathBiasNoticeUseRate;
|
|
|
|
|
double PathBiasExtremeUseRate;
|
|
|
|
|
int PathBiasScaleUseThreshold;
|
2012-05-04 05:15:34 +02:00
|
|
|
|
/** @} */
|
|
|
|
|
|
2012-11-14 21:20:28 +01:00
|
|
|
|
int IPv6Exit; /**< Do we support exiting to IPv6 addresses? */
|
2012-10-25 06:20:41 +02:00
|
|
|
|
|
2012-12-26 02:04:54 +01:00
|
|
|
|
char *TLSECGroup; /**< One of "P256", "P224", or nil for auto */
|
|
|
|
|
|
2012-12-06 07:53:29 +01:00
|
|
|
|
/** Autobool: should we use the ntor handshake if we can? */
|
|
|
|
|
int UseNTorHandshake;
|
2013-01-29 17:05:13 +01:00
|
|
|
|
|
|
|
|
|
/** Fraction: */
|
|
|
|
|
double PathsNeededToBuildCircuits;
|
2012-11-28 17:09:37 +01:00
|
|
|
|
|
2013-03-09 23:16:11 +01:00
|
|
|
|
/** What expiry time shall we place on our SSL certs? "0" means we
|
|
|
|
|
* should guess a suitable value. */
|
2013-03-09 22:42:35 +01:00
|
|
|
|
int SSLKeyLifetime;
|
|
|
|
|
|
2013-02-15 23:24:13 +01:00
|
|
|
|
/** How long (seconds) do we keep a guard before picking a new one? */
|
|
|
|
|
int GuardLifetime;
|
2013-09-18 00:05:48 +02:00
|
|
|
|
|
2014-10-07 18:53:57 +02:00
|
|
|
|
/** Low-water mark for global scheduler - start sending when estimated
|
|
|
|
|
* queued size falls below this threshold.
|
|
|
|
|
*/
|
2014-11-28 04:51:13 +01:00
|
|
|
|
uint64_t SchedulerLowWaterMark__;
|
2014-10-07 18:53:57 +02:00
|
|
|
|
/** High-water mark for global scheduler - stop sending when estimated
|
|
|
|
|
* queued size exceeds this threshold.
|
|
|
|
|
*/
|
2014-11-28 04:51:13 +01:00
|
|
|
|
uint64_t SchedulerHighWaterMark__;
|
2014-10-07 18:53:57 +02:00
|
|
|
|
/** Flush size for global scheduler - flush this many cells at a time
|
|
|
|
|
* when sending.
|
|
|
|
|
*/
|
2014-11-28 04:51:13 +01:00
|
|
|
|
int SchedulerMaxFlushCells__;
|
2014-08-28 20:10:21 +02:00
|
|
|
|
|
2014-11-13 16:48:15 +01:00
|
|
|
|
/** Is this an exit node? This is a tristate, where "1" means "yes, and use
|
|
|
|
|
* the default exit policy if none is given" and "0" means "no; exit policy
|
|
|
|
|
* is 'reject *'" and "auto" (-1) means "same as 1, but warn the user."
|
|
|
|
|
*
|
|
|
|
|
* XXXX Eventually, the default will be 0. */
|
|
|
|
|
int ExitRelay;
|
|
|
|
|
|
2015-03-01 14:36:40 +01:00
|
|
|
|
/** For how long (seconds) do we declare our singning keys to be valid? */
|
|
|
|
|
int SigningKeyLifetime;
|
|
|
|
|
/** For how long (seconds) do we declare our link keys to be valid? */
|
2015-05-28 16:47:42 +02:00
|
|
|
|
int TestingLinkCertLifetime;
|
2015-03-01 14:36:40 +01:00
|
|
|
|
/** For how long (seconds) do we declare our auth keys to be valid? */
|
|
|
|
|
int TestingAuthKeyLifetime;
|
|
|
|
|
|
|
|
|
|
/** How long before signing keys expire will we try to make a new one? */
|
|
|
|
|
int TestingSigningKeySlop;
|
|
|
|
|
/** How long before link keys expire will we try to make a new one? */
|
|
|
|
|
int TestingLinkKeySlop;
|
|
|
|
|
/** How long before auth keys expire will we try to make a new one? */
|
|
|
|
|
int TestingAuthKeySlop;
|
|
|
|
|
|
2015-09-01 16:22:24 +02:00
|
|
|
|
/** Force use of offline master key features: never generate a master
|
|
|
|
|
* ed25519 identity key except from tor --keygen */
|
|
|
|
|
int OfflineMasterKey;
|
|
|
|
|
|
2015-08-06 03:09:21 +02:00
|
|
|
|
enum {
|
|
|
|
|
FORCE_PASSPHRASE_AUTO=0,
|
|
|
|
|
FORCE_PASSPHRASE_ON,
|
|
|
|
|
FORCE_PASSPHRASE_OFF
|
|
|
|
|
} keygen_force_passphrase;
|
|
|
|
|
int use_keygen_passphrase_fd;
|
|
|
|
|
int keygen_passphrase_fd;
|
2015-09-01 16:41:02 +02:00
|
|
|
|
int change_key_passphrase;
|
2015-09-01 16:58:53 +02:00
|
|
|
|
char *master_key_fname;
|
2002-07-03 18:31:22 +02:00
|
|
|
|
} or_options_t;
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
2005-07-28 21:01:48 +02:00
|
|
|
|
/** Persistent state for an onion router, as saved to disk. */
|
|
|
|
|
typedef struct {
|
2012-10-12 18:22:13 +02:00
|
|
|
|
uint32_t magic_;
|
2006-12-07 21:11:30 +01:00
|
|
|
|
/** The time at which we next plan to write the state to the disk. Equal to
|
2009-05-27 23:55:51 +02:00
|
|
|
|
* TIME_MAX if there are no savable changes, 0 if there are changes that
|
2006-12-07 21:11:30 +01:00
|
|
|
|
* should be saved right away. */
|
|
|
|
|
time_t next_write;
|
2005-07-28 21:01:48 +02:00
|
|
|
|
|
2006-12-07 21:11:30 +01:00
|
|
|
|
/** When was the state last written to disk? */
|
2005-07-28 21:01:48 +02:00
|
|
|
|
time_t LastWritten;
|
2006-12-07 21:11:30 +01:00
|
|
|
|
|
2006-12-09 20:40:16 +01:00
|
|
|
|
/** Fields for accounting bandwidth use. */
|
2005-07-28 21:01:48 +02:00
|
|
|
|
time_t AccountingIntervalStart;
|
|
|
|
|
uint64_t AccountingBytesReadInInterval;
|
|
|
|
|
uint64_t AccountingBytesWrittenInInterval;
|
|
|
|
|
int AccountingSecondsActive;
|
2010-09-03 20:29:17 +02:00
|
|
|
|
int AccountingSecondsToReachSoftLimit;
|
|
|
|
|
time_t AccountingSoftLimitHitAt;
|
|
|
|
|
uint64_t AccountingBytesAtSoftLimit;
|
2005-07-28 21:01:48 +02:00
|
|
|
|
uint64_t AccountingExpectedUsage;
|
|
|
|
|
|
2006-12-07 21:11:30 +01:00
|
|
|
|
/** A list of Entry Guard-related configuration lines. */
|
2006-01-10 23:42:44 +01:00
|
|
|
|
config_line_t *EntryGuards;
|
2005-12-24 00:56:42 +01:00
|
|
|
|
|
2011-08-07 18:05:40 +02:00
|
|
|
|
config_line_t *TransportProxies;
|
|
|
|
|
|
2006-12-07 21:11:30 +01:00
|
|
|
|
/** These fields hold information on the history of bandwidth usage for
|
|
|
|
|
* servers. The "Ends" fields hold the time when we last updated the
|
|
|
|
|
* bandwidth usage. The "Interval" fields hold the granularity, in seconds,
|
|
|
|
|
* of the entries of Values. The "Values" lists hold decimal string
|
|
|
|
|
* representations of the number of bytes read or written in each
|
2011-01-10 20:11:22 +01:00
|
|
|
|
* interval. The "Maxima" list holds decimal strings describing the highest
|
|
|
|
|
* rate achieved during the interval.
|
|
|
|
|
*/
|
2005-12-24 00:56:42 +01:00
|
|
|
|
time_t BWHistoryReadEnds;
|
|
|
|
|
int BWHistoryReadInterval;
|
|
|
|
|
smartlist_t *BWHistoryReadValues;
|
2011-01-10 20:11:22 +01:00
|
|
|
|
smartlist_t *BWHistoryReadMaxima;
|
2005-12-24 00:56:42 +01:00
|
|
|
|
time_t BWHistoryWriteEnds;
|
|
|
|
|
int BWHistoryWriteInterval;
|
|
|
|
|
smartlist_t *BWHistoryWriteValues;
|
2011-01-10 20:11:22 +01:00
|
|
|
|
smartlist_t *BWHistoryWriteMaxima;
|
2010-07-07 14:55:42 +02:00
|
|
|
|
time_t BWHistoryDirReadEnds;
|
|
|
|
|
int BWHistoryDirReadInterval;
|
|
|
|
|
smartlist_t *BWHistoryDirReadValues;
|
2011-01-10 20:11:22 +01:00
|
|
|
|
smartlist_t *BWHistoryDirReadMaxima;
|
2010-07-07 14:55:42 +02:00
|
|
|
|
time_t BWHistoryDirWriteEnds;
|
|
|
|
|
int BWHistoryDirWriteInterval;
|
|
|
|
|
smartlist_t *BWHistoryDirWriteValues;
|
2011-01-10 20:11:22 +01:00
|
|
|
|
smartlist_t *BWHistoryDirWriteMaxima;
|
2005-12-31 09:16:07 +01:00
|
|
|
|
|
2009-08-26 02:13:12 +02:00
|
|
|
|
/** Build time histogram */
|
|
|
|
|
config_line_t * BuildtimeHistogram;
|
2010-06-07 11:36:43 +02:00
|
|
|
|
unsigned int TotalBuildTimes;
|
2010-06-15 10:13:49 +02:00
|
|
|
|
unsigned int CircuitBuildAbandonedCount;
|
2009-08-26 02:13:12 +02:00
|
|
|
|
|
2006-12-09 20:40:16 +01:00
|
|
|
|
/** What version of Tor wrote this state file? */
|
2005-12-31 09:16:07 +01:00
|
|
|
|
char *TorVersion;
|
2006-02-12 23:28:30 +01:00
|
|
|
|
|
2006-12-09 20:40:16 +01:00
|
|
|
|
/** Holds any unrecognized values we found in the state file, in the order
|
2006-12-07 21:11:30 +01:00
|
|
|
|
* in which we found them. */
|
2006-02-12 23:28:30 +01:00
|
|
|
|
config_line_t *ExtraLines;
|
2006-12-15 08:04:37 +01:00
|
|
|
|
|
|
|
|
|
/** When did we last rotate our onion key? "0" for 'no idea'. */
|
|
|
|
|
time_t LastRotatedOnionKey;
|
2005-07-28 21:01:48 +02:00
|
|
|
|
} or_state_t;
|
|
|
|
|
|
2006-12-07 21:11:30 +01:00
|
|
|
|
/** Change the next_write time of <b>state</b> to <b>when</b>, unless the
|
|
|
|
|
* state is already scheduled to be written to disk earlier than <b>when</b>.
|
|
|
|
|
*/
|
|
|
|
|
static INLINE void or_state_mark_dirty(or_state_t *state, time_t when)
|
|
|
|
|
{
|
|
|
|
|
if (state->next_write > when)
|
|
|
|
|
state->next_write = when;
|
|
|
|
|
}
|
|
|
|
|
|
2004-02-26 23:02:22 +01:00
|
|
|
|
#define MAX_SOCKS_REPLY_LEN 1024
|
|
|
|
|
#define MAX_SOCKS_ADDR_LEN 256
|
2010-08-03 23:28:55 +02:00
|
|
|
|
#define SOCKS_NO_AUTH 0x00
|
|
|
|
|
#define SOCKS_USER_PASS 0x02
|
2006-12-13 01:28:56 +01:00
|
|
|
|
|
2006-12-13 23:42:52 +01:00
|
|
|
|
/** Please open a TCP connection to this addr:port. */
|
|
|
|
|
#define SOCKS_COMMAND_CONNECT 0x01
|
|
|
|
|
/** Please turn this FQDN into an IP address, privately. */
|
|
|
|
|
#define SOCKS_COMMAND_RESOLVE 0xF0
|
|
|
|
|
/** Please turn this IP address into an FQDN, privately. */
|
|
|
|
|
#define SOCKS_COMMAND_RESOLVE_PTR 0xF1
|
2007-07-10 19:13:24 +02:00
|
|
|
|
|
2014-10-26 04:43:55 +01:00
|
|
|
|
/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
|
|
|
|
|
#define SOCKS_COMMAND_IS_CONNECT(c) (((c)==SOCKS_COMMAND_CONNECT) || 0)
|
2006-12-12 21:23:17 +01:00
|
|
|
|
#define SOCKS_COMMAND_IS_RESOLVE(c) ((c)==SOCKS_COMMAND_RESOLVE || \
|
|
|
|
|
(c)==SOCKS_COMMAND_RESOLVE_PTR)
|
|
|
|
|
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** State of a SOCKS request from a user to an OP. Also used to encode other
|
|
|
|
|
* information for non-socks user request (such as those on TransPort and
|
|
|
|
|
* DNSPort) */
|
2003-11-11 03:41:31 +01:00
|
|
|
|
struct socks_request_t {
|
2006-12-13 23:42:52 +01:00
|
|
|
|
/** Which version of SOCKS did the client use? One of "0, 4, 5" -- where
|
|
|
|
|
* 0 means that no socks handshake ever took place, and this is just a
|
2007-06-09 07:17:33 +02:00
|
|
|
|
* stub connection (e.g. see connection_ap_make_link()). */
|
2011-06-29 18:00:00 +02:00
|
|
|
|
uint8_t socks_version;
|
|
|
|
|
/** If using socks5 authentication, which authentication type did we
|
|
|
|
|
* negotiate? currently we support 0 (no authentication) and 2
|
|
|
|
|
* (username/password). */
|
|
|
|
|
uint8_t auth_type;
|
|
|
|
|
/** What is this stream's goal? One of the SOCKS_COMMAND_* values */
|
|
|
|
|
uint8_t command;
|
2011-08-02 16:48:39 +02:00
|
|
|
|
/** Which kind of listener created this stream? */
|
|
|
|
|
uint8_t listener_type;
|
2004-10-14 04:47:09 +02:00
|
|
|
|
size_t replylen; /**< Length of <b>reply</b>. */
|
2011-06-29 18:00:00 +02:00
|
|
|
|
uint8_t reply[MAX_SOCKS_REPLY_LEN]; /**< Write an entry into this string if
|
2004-05-10 09:37:10 +02:00
|
|
|
|
* we want to specify our own socks reply,
|
|
|
|
|
* rather than using the default socks4 or
|
|
|
|
|
* socks5 socks reply. We use this for the
|
|
|
|
|
* two-stage socks5 handshake.
|
|
|
|
|
*/
|
2005-12-14 21:40:40 +01:00
|
|
|
|
char address[MAX_SOCKS_ADDR_LEN]; /**< What address did the client ask to
|
2007-05-29 19:31:13 +02:00
|
|
|
|
connect to/resolve? */
|
2004-05-10 09:37:10 +02:00
|
|
|
|
uint16_t port; /**< What port did the client ask to connect to? */
|
2008-02-18 20:24:33 +01:00
|
|
|
|
unsigned int has_finished : 1; /**< Has the SOCKS handshake finished? Used to
|
2007-05-29 19:31:13 +02:00
|
|
|
|
* make sure we send back a socks reply for
|
|
|
|
|
* every connection. */
|
2011-06-29 18:00:00 +02:00
|
|
|
|
unsigned int got_auth : 1; /**< Have we received any authentication data? */
|
2013-03-20 21:17:06 +01:00
|
|
|
|
/** If this is set, we will choose "no authentication" instead of
|
|
|
|
|
* "username/password" authentication if both are offered. Used as input to
|
|
|
|
|
* parse_socks. */
|
|
|
|
|
unsigned int socks_prefer_no_auth : 1;
|
2011-06-29 18:31:17 +02:00
|
|
|
|
|
|
|
|
|
/** Number of bytes in username; 0 if username is NULL */
|
2011-08-06 00:56:30 +02:00
|
|
|
|
size_t usernamelen;
|
2011-06-29 18:31:17 +02:00
|
|
|
|
/** Number of bytes in password; 0 if password is NULL */
|
|
|
|
|
uint8_t passwordlen;
|
|
|
|
|
/** The negotiated username value if any (for socks5), or the entire
|
|
|
|
|
* authentication string (for socks4). This value is NOT nul-terminated;
|
|
|
|
|
* see usernamelen for its length. */
|
|
|
|
|
char *username;
|
|
|
|
|
/** The negotiated password value if any (for socks5). This value is NOT
|
2011-07-11 20:51:26 +02:00
|
|
|
|
* nul-terminated; see passwordlen for its length. */
|
2011-06-29 18:31:17 +02:00
|
|
|
|
char *password;
|
2003-11-11 03:41:31 +01:00
|
|
|
|
};
|
|
|
|
|
|
2004-05-13 09:24:49 +02:00
|
|
|
|
/********************************* circuitbuild.c **********************/
|
|
|
|
|
|
2010-07-21 15:30:26 +02:00
|
|
|
|
/** How many hops does a general-purpose circuit have by default? */
|
|
|
|
|
#define DEFAULT_ROUTE_LEN 3
|
|
|
|
|
|
2010-07-22 01:21:00 +02:00
|
|
|
|
/* Circuit Build Timeout "public" structures. */
|
2009-09-08 10:31:29 +02:00
|
|
|
|
|
2010-12-30 19:54:13 +01:00
|
|
|
|
/** Precision multiplier for the Bw weights */
|
|
|
|
|
#define BW_WEIGHT_SCALE 10000
|
|
|
|
|
#define BW_MIN_WEIGHT_SCALE 1
|
|
|
|
|
#define BW_MAX_WEIGHT_SCALE INT32_MAX
|
|
|
|
|
|
2010-01-22 01:10:02 +01:00
|
|
|
|
/** Total size of the circuit timeout history to accumulate.
|
|
|
|
|
* 1000 is approx 2.5 days worth of continual-use circuits. */
|
|
|
|
|
#define CBT_NCIRCUITS_TO_OBSERVE 1000
|
|
|
|
|
|
2009-09-08 10:31:29 +02:00
|
|
|
|
/** Width of the histogram bins in milliseconds */
|
2010-01-22 01:10:02 +01:00
|
|
|
|
#define CBT_BIN_WIDTH ((build_time_t)50)
|
2009-08-28 08:28:20 +02:00
|
|
|
|
|
2010-05-04 23:42:37 +02:00
|
|
|
|
/** Number of modes to use in the weighted-avg computation of Xm */
|
2010-06-08 06:17:12 +02:00
|
|
|
|
#define CBT_DEFAULT_NUM_XM_MODES 3
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_NUM_XM_MODES 1
|
|
|
|
|
#define CBT_MAX_NUM_XM_MODES 20
|
2010-05-04 23:42:37 +02:00
|
|
|
|
|
2009-09-16 03:00:48 +02:00
|
|
|
|
/** A build_time_t is milliseconds */
|
2009-08-28 08:28:20 +02:00
|
|
|
|
typedef uint32_t build_time_t;
|
2010-06-15 10:13:49 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CBT_BUILD_ABANDONED is our flag value to represent a force-closed
|
|
|
|
|
* circuit (Aka a 'right-censored' pareto value).
|
|
|
|
|
*/
|
|
|
|
|
#define CBT_BUILD_ABANDONED ((build_time_t)(INT32_MAX-1))
|
2010-01-22 01:10:02 +01:00
|
|
|
|
#define CBT_BUILD_TIME_MAX ((build_time_t)(INT32_MAX))
|
2009-09-01 03:10:27 +02:00
|
|
|
|
|
2009-09-08 10:31:29 +02:00
|
|
|
|
/** Save state every 10 circuits */
|
2010-01-22 01:10:02 +01:00
|
|
|
|
#define CBT_SAVE_STATE_EVERY 10
|
2009-09-01 08:09:54 +02:00
|
|
|
|
|
2010-01-22 01:10:02 +01:00
|
|
|
|
/* Circuit build times consensus parameters */
|
|
|
|
|
|
2010-06-08 10:01:47 +02:00
|
|
|
|
/**
|
|
|
|
|
* How long to wait before actually closing circuits that take too long to
|
|
|
|
|
* build in terms of CDF quantile.
|
|
|
|
|
*/
|
|
|
|
|
#define CBT_DEFAULT_CLOSE_QUANTILE 95
|
2011-01-15 19:31:23 +01:00
|
|
|
|
#define CBT_MIN_CLOSE_QUANTILE CBT_MIN_QUANTILE_CUTOFF
|
|
|
|
|
#define CBT_MAX_CLOSE_QUANTILE CBT_MAX_QUANTILE_CUTOFF
|
2010-06-08 10:01:47 +02:00
|
|
|
|
|
2010-01-22 01:10:02 +01:00
|
|
|
|
/**
|
|
|
|
|
* How many circuits count as recent when considering if the
|
|
|
|
|
* connection has gone gimpy or changed.
|
|
|
|
|
*/
|
|
|
|
|
#define CBT_DEFAULT_RECENT_CIRCUITS 20
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_RECENT_CIRCUITS 3
|
|
|
|
|
#define CBT_MAX_RECENT_CIRCUITS 1000
|
2009-09-18 11:01:39 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Maximum count of timeouts that finish the first hop in the past
|
|
|
|
|
* RECENT_CIRCUITS before calculating a new timeout.
|
|
|
|
|
*
|
2010-09-30 00:01:22 +02:00
|
|
|
|
* This tells us whether to abandon timeout history and set
|
|
|
|
|
* the timeout back to whatever circuit_build_times_get_initial_timeout()
|
|
|
|
|
* gives us.
|
2009-09-18 11:01:39 +02:00
|
|
|
|
*/
|
2010-01-22 01:10:02 +01:00
|
|
|
|
#define CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT (CBT_DEFAULT_RECENT_CIRCUITS*9/10)
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_MAX_RECENT_TIMEOUT_COUNT 3
|
|
|
|
|
#define CBT_MAX_MAX_RECENT_TIMEOUT_COUNT 10000
|
2010-01-22 01:10:02 +01:00
|
|
|
|
|
|
|
|
|
/** Minimum circuits before estimating a timeout */
|
|
|
|
|
#define CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE 100
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_MIN_CIRCUITS_TO_OBSERVE 1
|
|
|
|
|
#define CBT_MAX_MIN_CIRCUITS_TO_OBSERVE 10000
|
2010-01-22 01:10:02 +01:00
|
|
|
|
|
|
|
|
|
/** Cutoff percentile on the CDF for our timeout estimation. */
|
|
|
|
|
#define CBT_DEFAULT_QUANTILE_CUTOFF 80
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_QUANTILE_CUTOFF 10
|
|
|
|
|
#define CBT_MAX_QUANTILE_CUTOFF 99
|
2010-01-22 01:10:02 +01:00
|
|
|
|
double circuit_build_times_quantile_cutoff(void);
|
|
|
|
|
|
|
|
|
|
/** How often in seconds should we build a test circuit */
|
|
|
|
|
#define CBT_DEFAULT_TEST_FREQUENCY 60
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_TEST_FREQUENCY 1
|
|
|
|
|
#define CBT_MAX_TEST_FREQUENCY INT32_MAX
|
2010-01-22 01:10:02 +01:00
|
|
|
|
|
|
|
|
|
/** Lowest allowable value for CircuitBuildTimeout in milliseconds */
|
2010-09-30 05:53:50 +02:00
|
|
|
|
#define CBT_DEFAULT_TIMEOUT_MIN_VALUE (1500)
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MIN_TIMEOUT_MIN_VALUE 500
|
|
|
|
|
#define CBT_MAX_TIMEOUT_MIN_VALUE INT32_MAX
|
2010-01-22 01:10:02 +01:00
|
|
|
|
|
|
|
|
|
/** Initial circuit build timeout in milliseconds */
|
|
|
|
|
#define CBT_DEFAULT_TIMEOUT_INITIAL_VALUE (60*1000)
|
2011-01-15 19:31:23 +01:00
|
|
|
|
#define CBT_MIN_TIMEOUT_INITIAL_VALUE CBT_MIN_TIMEOUT_MIN_VALUE
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#define CBT_MAX_TIMEOUT_INITIAL_VALUE INT32_MAX
|
2010-01-22 01:10:02 +01:00
|
|
|
|
int32_t circuit_build_times_initial_timeout(void);
|
2009-12-15 21:46:25 +01:00
|
|
|
|
|
2010-12-30 19:54:13 +01:00
|
|
|
|
#if CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT < CBT_MIN_MAX_RECENT_TIMEOUT_COUNT
|
2009-12-15 21:46:25 +01:00
|
|
|
|
#error "RECENT_CIRCUITS is set too low."
|
|
|
|
|
#endif
|
2009-09-18 11:01:39 +02:00
|
|
|
|
|
|
|
|
|
/** Information about the state of our local network connection */
|
2009-08-27 10:46:06 +02:00
|
|
|
|
typedef struct {
|
2009-09-16 03:00:48 +02:00
|
|
|
|
/** The timestamp we last completed a TLS handshake or received a cell */
|
2009-09-01 03:10:27 +02:00
|
|
|
|
time_t network_last_live;
|
2009-09-18 11:01:39 +02:00
|
|
|
|
/** If the network is not live, how many timeouts has this caused? */
|
|
|
|
|
int nonlive_timeouts;
|
2009-09-21 01:50:44 +02:00
|
|
|
|
/** Circular array of circuits that have made it to the first hop. Slot is
|
2009-09-18 11:01:39 +02:00
|
|
|
|
* 1 if circuit timed out, 0 if circuit succeeded */
|
2010-01-22 01:10:02 +01:00
|
|
|
|
int8_t *timeouts_after_firsthop;
|
|
|
|
|
/** Number of elements allocated for the above array */
|
|
|
|
|
int num_recent_circs;
|
2009-09-18 11:01:39 +02:00
|
|
|
|
/** Index into circular array. */
|
2009-09-21 01:50:44 +02:00
|
|
|
|
int after_firsthop_idx;
|
2009-09-18 11:01:39 +02:00
|
|
|
|
} network_liveness_t;
|
|
|
|
|
|
2013-08-21 18:37:35 +02:00
|
|
|
|
typedef struct circuit_build_times_s circuit_build_times_t;
|
2009-08-27 10:46:06 +02:00
|
|
|
|
|
2002-06-27 00:45:49 +02:00
|
|
|
|
/********************************* config.c ***************************/
|
|
|
|
|
|
2008-03-18 03:39:34 +01:00
|
|
|
|
/** An error from options_trial_assign() or options_init_from_string(). */
|
2008-03-13 16:11:56 +01:00
|
|
|
|
typedef enum setopt_err_t {
|
|
|
|
|
SETOPT_OK = 0,
|
|
|
|
|
SETOPT_ERR_MISC = -1,
|
|
|
|
|
SETOPT_ERR_PARSE = -2,
|
|
|
|
|
SETOPT_ERR_TRANSITION = -3,
|
|
|
|
|
SETOPT_ERR_SETTING = -4,
|
|
|
|
|
} setopt_err_t;
|
|
|
|
|
|
2005-12-14 21:40:40 +01:00
|
|
|
|
/********************************* connection_edge.c *************************/
|
2003-04-12 00:11:11 +02:00
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Enumerates possible origins of a client-side address mapping. */
|
2008-02-21 19:45:11 +01:00
|
|
|
|
typedef enum {
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** We're remapping this address because the controller told us to. */
|
|
|
|
|
ADDRMAPSRC_CONTROLLER,
|
2011-05-13 22:59:31 +02:00
|
|
|
|
/** We're remapping this address because of an AutomapHostsOnResolve
|
|
|
|
|
* configuration. */
|
|
|
|
|
ADDRMAPSRC_AUTOMAP,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** We're remapping this address because our configuration (via torrc, the
|
|
|
|
|
* command line, or a SETCONF command) told us to. */
|
|
|
|
|
ADDRMAPSRC_TORRC,
|
|
|
|
|
/** We're remapping this address because we have TrackHostExit configured,
|
|
|
|
|
* and we want to remember to use the same exit next time. */
|
|
|
|
|
ADDRMAPSRC_TRACKEXIT,
|
|
|
|
|
/** We're remapping this address because we got a DNS resolution from a
|
|
|
|
|
* Tor server that told us what its value was. */
|
2008-02-21 19:45:11 +01:00
|
|
|
|
ADDRMAPSRC_DNS,
|
2012-05-11 23:00:41 +02:00
|
|
|
|
|
2012-06-12 03:49:08 +02:00
|
|
|
|
/** No remapping has occurred. This isn't a possible value for an
|
|
|
|
|
* addrmap_entry_t; it's used as a null value when we need to answer "Why
|
|
|
|
|
* did this remapping happen." */
|
2012-05-11 23:00:41 +02:00
|
|
|
|
ADDRMAPSRC_NONE
|
2008-02-21 19:45:11 +01:00
|
|
|
|
} addressmap_entry_source_t;
|
2014-03-25 16:16:18 +01:00
|
|
|
|
#define addressmap_entry_source_bitfield_t ENUM_BF(addressmap_entry_source_t)
|
2008-08-06 18:32:17 +02:00
|
|
|
|
|
2004-11-03 02:32:26 +01:00
|
|
|
|
/********************************* control.c ***************************/
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Used to indicate the type of a circuit event passed to the controller.
|
|
|
|
|
* The various types are defined in control-spec.txt */
|
2004-11-03 19:33:07 +01:00
|
|
|
|
typedef enum circuit_status_event_t {
|
|
|
|
|
CIRC_EVENT_LAUNCHED = 0,
|
|
|
|
|
CIRC_EVENT_BUILT = 1,
|
|
|
|
|
CIRC_EVENT_EXTENDED = 2,
|
|
|
|
|
CIRC_EVENT_FAILED = 3,
|
|
|
|
|
CIRC_EVENT_CLOSED = 4,
|
|
|
|
|
} circuit_status_event_t;
|
|
|
|
|
|
2012-01-11 16:19:24 +01:00
|
|
|
|
/** Used to indicate the type of a CIRC_MINOR event passed to the controller.
|
2011-11-24 15:54:55 +01:00
|
|
|
|
* The various types are defined in control-spec.txt . */
|
2012-01-11 16:19:24 +01:00
|
|
|
|
typedef enum circuit_status_minor_event_t {
|
|
|
|
|
CIRC_MINOR_EVENT_PURPOSE_CHANGED,
|
|
|
|
|
CIRC_MINOR_EVENT_CANNIBALIZED,
|
|
|
|
|
} circuit_status_minor_event_t;
|
2011-11-24 15:54:55 +01:00
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Used to indicate the type of a stream event passed to the controller.
|
|
|
|
|
* The various types are defined in control-spec.txt */
|
2004-11-03 19:33:07 +01:00
|
|
|
|
typedef enum stream_status_event_t {
|
|
|
|
|
STREAM_EVENT_SENT_CONNECT = 0,
|
|
|
|
|
STREAM_EVENT_SENT_RESOLVE = 1,
|
|
|
|
|
STREAM_EVENT_SUCCEEDED = 2,
|
|
|
|
|
STREAM_EVENT_FAILED = 3,
|
2005-03-02 23:29:58 +01:00
|
|
|
|
STREAM_EVENT_CLOSED = 4,
|
2005-03-12 05:22:01 +01:00
|
|
|
|
STREAM_EVENT_NEW = 5,
|
2005-03-14 04:12:59 +01:00
|
|
|
|
STREAM_EVENT_NEW_RESOLVE = 6,
|
2007-02-05 20:15:13 +01:00
|
|
|
|
STREAM_EVENT_FAILED_RETRIABLE = 7,
|
|
|
|
|
STREAM_EVENT_REMAP = 8
|
2004-11-03 19:33:07 +01:00
|
|
|
|
} stream_status_event_t;
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Used to indicate the type of an OR connection event passed to the
|
|
|
|
|
* controller. The various types are defined in control-spec.txt */
|
2004-11-03 19:33:07 +01:00
|
|
|
|
typedef enum or_conn_status_event_t {
|
|
|
|
|
OR_CONN_EVENT_LAUNCHED = 0,
|
|
|
|
|
OR_CONN_EVENT_CONNECTED = 1,
|
|
|
|
|
OR_CONN_EVENT_FAILED = 2,
|
|
|
|
|
OR_CONN_EVENT_CLOSED = 3,
|
2006-03-08 23:29:08 +01:00
|
|
|
|
OR_CONN_EVENT_NEW = 4,
|
2004-11-03 19:33:07 +01:00
|
|
|
|
} or_conn_status_event_t;
|
|
|
|
|
|
2009-12-25 12:42:35 +01:00
|
|
|
|
/** Used to indicate the type of a buildtime event */
|
|
|
|
|
typedef enum buildtimeout_set_event_t {
|
|
|
|
|
BUILDTIMEOUT_SET_EVENT_COMPUTED = 0,
|
|
|
|
|
BUILDTIMEOUT_SET_EVENT_RESET = 1,
|
|
|
|
|
BUILDTIMEOUT_SET_EVENT_SUSPENDED = 2,
|
|
|
|
|
BUILDTIMEOUT_SET_EVENT_DISCARD = 3,
|
|
|
|
|
BUILDTIMEOUT_SET_EVENT_RESUME = 4
|
|
|
|
|
} buildtimeout_set_event_t;
|
|
|
|
|
|
2005-09-30 22:04:55 +02:00
|
|
|
|
/** Execute the statement <b>stmt</b>, which may log events concerning the
|
|
|
|
|
* connection <b>conn</b>. To prevent infinite loops, disable log messages
|
2006-03-18 10:29:05 +01:00
|
|
|
|
* being sent to controllers if <b>conn</b> is a control connection.
|
2005-09-30 22:04:55 +02:00
|
|
|
|
*
|
|
|
|
|
* Stmt must not contain any return or goto statements.
|
|
|
|
|
*/
|
2005-07-13 07:14:42 +02:00
|
|
|
|
#define CONN_LOG_PROTECT(conn, stmt) \
|
2007-06-17 20:22:39 +02:00
|
|
|
|
STMT_BEGIN \
|
2011-04-26 03:24:04 +02:00
|
|
|
|
int _log_conn_is_control; \
|
|
|
|
|
tor_assert(conn); \
|
|
|
|
|
_log_conn_is_control = (conn->type == CONN_TYPE_CONTROL); \
|
2005-07-13 07:14:42 +02:00
|
|
|
|
if (_log_conn_is_control) \
|
|
|
|
|
disable_control_logging(); \
|
2007-06-17 20:22:39 +02:00
|
|
|
|
STMT_BEGIN stmt; STMT_END; \
|
2005-07-13 07:14:42 +02:00
|
|
|
|
if (_log_conn_is_control) \
|
|
|
|
|
enable_control_logging(); \
|
2007-06-17 20:22:39 +02:00
|
|
|
|
STMT_END
|
2005-07-13 07:14:42 +02:00
|
|
|
|
|
2008-06-07 07:27:34 +02:00
|
|
|
|
/** Enum describing various stages of bootstrapping, for use with controller
|
|
|
|
|
* bootstrap status events. The values range from 0 to 100. */
|
|
|
|
|
typedef enum {
|
2008-06-18 07:35:19 +02:00
|
|
|
|
BOOTSTRAP_STATUS_UNDEF=-1,
|
|
|
|
|
BOOTSTRAP_STATUS_STARTING=0,
|
2008-06-07 07:27:34 +02:00
|
|
|
|
BOOTSTRAP_STATUS_CONN_DIR=5,
|
2008-06-18 07:35:19 +02:00
|
|
|
|
BOOTSTRAP_STATUS_HANDSHAKE=-2,
|
2008-06-07 07:27:34 +02:00
|
|
|
|
BOOTSTRAP_STATUS_HANDSHAKE_DIR=10,
|
|
|
|
|
BOOTSTRAP_STATUS_ONEHOP_CREATE=15,
|
|
|
|
|
BOOTSTRAP_STATUS_REQUESTING_STATUS=20,
|
|
|
|
|
BOOTSTRAP_STATUS_LOADING_STATUS=25,
|
|
|
|
|
BOOTSTRAP_STATUS_LOADING_KEYS=40,
|
|
|
|
|
BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS=45,
|
|
|
|
|
BOOTSTRAP_STATUS_LOADING_DESCRIPTORS=50,
|
|
|
|
|
BOOTSTRAP_STATUS_CONN_OR=80,
|
|
|
|
|
BOOTSTRAP_STATUS_HANDSHAKE_OR=85,
|
|
|
|
|
BOOTSTRAP_STATUS_CIRCUIT_CREATE=90,
|
|
|
|
|
BOOTSTRAP_STATUS_DONE=100
|
|
|
|
|
} bootstrap_status_t;
|
|
|
|
|
|
2002-09-26 14:09:10 +02:00
|
|
|
|
/********************************* directory.c ***************************/
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** A pair of digests created by dir_split_resource_info_fingerprint_pairs() */
|
2008-12-12 20:05:36 +01:00
|
|
|
|
typedef struct {
|
|
|
|
|
char first[DIGEST_LEN];
|
|
|
|
|
char second[DIGEST_LEN];
|
|
|
|
|
} fp_pair_t;
|
2008-12-23 22:17:52 +01:00
|
|
|
|
|
2004-05-12 21:49:48 +02:00
|
|
|
|
/********************************* dirserv.c ***************************/
|
2011-03-16 22:05:37 +01:00
|
|
|
|
|
|
|
|
|
/** An enum to describe what format we're generating a routerstatus line in.
|
|
|
|
|
*/
|
2009-07-31 06:33:53 +02:00
|
|
|
|
typedef enum {
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** For use in a v2 opinion */
|
|
|
|
|
NS_V2,
|
|
|
|
|
/** For use in a consensus networkstatus document (ns flavor) */
|
|
|
|
|
NS_V3_CONSENSUS,
|
|
|
|
|
/** For use in a vote networkstatus document */
|
|
|
|
|
NS_V3_VOTE,
|
|
|
|
|
/** For passing to the controlport in response to a GETINFO request */
|
|
|
|
|
NS_CONTROL_PORT,
|
|
|
|
|
/** For use in a consensus networkstatus document (microdesc flavor) */
|
2009-08-24 18:51:33 +02:00
|
|
|
|
NS_V3_CONSENSUS_MICRODESC
|
2009-07-31 06:33:53 +02:00
|
|
|
|
} routerstatus_format_type_t;
|
2007-07-26 00:56:44 +02:00
|
|
|
|
|
2009-07-31 06:33:53 +02:00
|
|
|
|
#ifdef DIRSERV_PRIVATE
|
|
|
|
|
typedef struct measured_bw_line_t {
|
|
|
|
|
char node_id[DIGEST_LEN];
|
|
|
|
|
char node_hex[MAX_HEX_NICKNAME_LEN+1];
|
2013-04-11 17:43:40 +02:00
|
|
|
|
long int bw_kb;
|
2009-07-31 06:33:53 +02:00
|
|
|
|
} measured_bw_line_t;
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
2007-06-03 05:05:10 +02:00
|
|
|
|
/********************************* dirvote.c ************************/
|
|
|
|
|
|
2007-10-04 18:21:58 +02:00
|
|
|
|
/** Describes the schedule by which votes should be generated. */
|
2007-07-18 22:46:12 +02:00
|
|
|
|
typedef struct vote_timing_t {
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Length in seconds between one consensus becoming valid and the next
|
|
|
|
|
* becoming valid. */
|
2007-07-18 22:46:12 +02:00
|
|
|
|
int vote_interval;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** For how many intervals is a consensus valid? */
|
2007-07-18 22:46:12 +02:00
|
|
|
|
int n_intervals_valid;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Time in seconds allowed to propagate votes */
|
2007-07-18 22:46:12 +02:00
|
|
|
|
int vote_delay;
|
2011-03-16 22:05:37 +01:00
|
|
|
|
/** Time in seconds allowed to propagate signatures */
|
2007-07-18 22:46:12 +02:00
|
|
|
|
int dist_delay;
|
|
|
|
|
} vote_timing_t;
|
2007-06-14 00:39:08 +02:00
|
|
|
|
|
2007-12-17 23:44:11 +01:00
|
|
|
|
/********************************* geoip.c **************************/
|
|
|
|
|
|
2008-05-29 04:29:35 +02:00
|
|
|
|
/** Indicates an action that we might be noting geoip statistics on.
|
|
|
|
|
* Note that if we're noticing CONNECT, we're a bridge, and if we're noticing
|
|
|
|
|
* the others, we're not.
|
|
|
|
|
*/
|
|
|
|
|
typedef enum {
|
2009-07-05 20:48:16 +02:00
|
|
|
|
/** We've noticed a connection as a bridge relay or entry guard. */
|
2008-05-29 04:29:35 +02:00
|
|
|
|
GEOIP_CLIENT_CONNECT = 0,
|
|
|
|
|
/** We've served a networkstatus consensus as a directory server. */
|
|
|
|
|
GEOIP_CLIENT_NETWORKSTATUS = 1,
|
|
|
|
|
} geoip_client_action_t;
|
2009-07-10 13:37:25 +02:00
|
|
|
|
/** Indicates either a positive reply or a reason for rejectng a network
|
|
|
|
|
* status request that will be included in geoip statistics. */
|
|
|
|
|
typedef enum {
|
|
|
|
|
/** Request is answered successfully. */
|
|
|
|
|
GEOIP_SUCCESS = 0,
|
|
|
|
|
/** V3 network status is not signed by a sufficient number of requested
|
|
|
|
|
* authorities. */
|
|
|
|
|
GEOIP_REJECT_NOT_ENOUGH_SIGS = 1,
|
|
|
|
|
/** Requested network status object is unavailable. */
|
|
|
|
|
GEOIP_REJECT_UNAVAILABLE = 2,
|
|
|
|
|
/** Requested network status not found. */
|
|
|
|
|
GEOIP_REJECT_NOT_FOUND = 3,
|
|
|
|
|
/** Network status has not been modified since If-Modified-Since time. */
|
|
|
|
|
GEOIP_REJECT_NOT_MODIFIED = 4,
|
|
|
|
|
/** Directory is busy. */
|
|
|
|
|
GEOIP_REJECT_BUSY = 5,
|
|
|
|
|
} geoip_ns_response_t;
|
|
|
|
|
#define GEOIP_NS_RESPONSE_NUM 6
|
2007-12-17 23:44:11 +01:00
|
|
|
|
|
2009-07-12 16:33:31 +02:00
|
|
|
|
/** Directory requests that we are measuring can be either direct or
|
|
|
|
|
* tunneled. */
|
|
|
|
|
typedef enum {
|
2009-07-14 22:24:50 +02:00
|
|
|
|
DIRREQ_DIRECT = 0,
|
|
|
|
|
DIRREQ_TUNNELED = 1,
|
|
|
|
|
} dirreq_type_t;
|
2009-07-12 16:33:31 +02:00
|
|
|
|
|
|
|
|
|
/** Possible states for either direct or tunneled directory requests that
|
|
|
|
|
* are relevant for determining network status download times. */
|
|
|
|
|
typedef enum {
|
|
|
|
|
/** Found that the client requests a network status; applies to both
|
|
|
|
|
* direct and tunneled requests; initial state of a request that we are
|
|
|
|
|
* measuring. */
|
2009-07-14 22:24:50 +02:00
|
|
|
|
DIRREQ_IS_FOR_NETWORK_STATUS = 0,
|
2009-07-12 16:33:31 +02:00
|
|
|
|
/** Finished writing a network status to the directory connection;
|
|
|
|
|
* applies to both direct and tunneled requests; completes a direct
|
|
|
|
|
* request. */
|
2009-07-14 22:24:50 +02:00
|
|
|
|
DIRREQ_FLUSHING_DIR_CONN_FINISHED = 1,
|
2009-07-12 16:33:31 +02:00
|
|
|
|
/** END cell sent to circuit that initiated a tunneled request. */
|
2009-07-14 22:24:50 +02:00
|
|
|
|
DIRREQ_END_CELL_SENT = 2,
|
2009-07-12 16:33:31 +02:00
|
|
|
|
/** Flushed last cell from queue of the circuit that initiated a
|
|
|
|
|
* tunneled request to the outbuf of the OR connection. */
|
2009-07-14 22:24:50 +02:00
|
|
|
|
DIRREQ_CIRC_QUEUE_FLUSHED = 3,
|
2012-08-01 13:18:42 +02:00
|
|
|
|
/** Flushed last byte from buffer of the channel belonging to the
|
2009-07-12 16:33:31 +02:00
|
|
|
|
* circuit that initiated a tunneled request; completes a tunneled
|
|
|
|
|
* request. */
|
2012-08-01 13:18:42 +02:00
|
|
|
|
DIRREQ_CHANNEL_BUFFER_FLUSHED = 4
|
2009-07-14 22:24:50 +02:00
|
|
|
|
} dirreq_state_t;
|
|
|
|
|
|
2010-06-21 18:52:46 +02:00
|
|
|
|
#define WRITE_STATS_INTERVAL (24*60*60)
|
|
|
|
|
|
2009-08-24 18:51:33 +02:00
|
|
|
|
/********************************* microdesc.c *************************/
|
|
|
|
|
|
|
|
|
|
typedef struct microdesc_cache_t microdesc_cache_t;
|
|
|
|
|
|
2007-10-08 23:21:50 +02:00
|
|
|
|
/********************************* networkstatus.c *********************/
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Possible statuses of a version of Tor, given opinions from the directory
|
|
|
|
|
* servers. */
|
2007-10-11 18:06:47 +02:00
|
|
|
|
typedef enum version_status_t {
|
|
|
|
|
VS_RECOMMENDED=0, /**< This version is listed as recommended. */
|
|
|
|
|
VS_OLD=1, /**< This version is older than any recommended version. */
|
|
|
|
|
VS_NEW=2, /**< This version is newer than any recommended version. */
|
|
|
|
|
VS_NEW_IN_SERIES=3, /**< This version is newer than any recommended version
|
|
|
|
|
* in its series, but later recommended versions exist.
|
|
|
|
|
*/
|
2007-10-16 01:15:24 +02:00
|
|
|
|
VS_UNRECOMMENDED=4, /**< This version is not recommended (general case). */
|
2008-02-06 13:45:04 +01:00
|
|
|
|
VS_EMPTY=5, /**< The version list was empty; no agreed-on versions. */
|
2007-10-16 01:15:24 +02:00
|
|
|
|
VS_UNKNOWN, /**< We have no idea. */
|
2007-10-11 18:06:47 +02:00
|
|
|
|
} version_status_t;
|
|
|
|
|
|
2006-03-27 04:25:34 +02:00
|
|
|
|
/********************************* policies.c ************************/
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Outcome of applying an address policy to an address. */
|
2006-03-27 04:25:34 +02:00
|
|
|
|
typedef enum {
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The address was accepted */
|
2006-03-27 04:25:34 +02:00
|
|
|
|
ADDR_POLICY_ACCEPTED=0,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** The address was rejected */
|
2006-03-27 04:25:34 +02:00
|
|
|
|
ADDR_POLICY_REJECTED=-1,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Part of the address was unknown, but as far as we can tell, it was
|
|
|
|
|
* accepted. */
|
2006-03-27 04:25:34 +02:00
|
|
|
|
ADDR_POLICY_PROBABLY_ACCEPTED=1,
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Part of the address was unknown, but as far as we can tell, it was
|
|
|
|
|
* rejected. */
|
2010-10-02 00:12:30 +02:00
|
|
|
|
ADDR_POLICY_PROBABLY_REJECTED=2,
|
2006-03-27 04:25:34 +02:00
|
|
|
|
} addr_policy_result_t;
|
|
|
|
|
|
2004-03-20 02:48:05 +01:00
|
|
|
|
/********************************* rephist.c ***************************/
|
|
|
|
|
|
2007-02-16 21:01:02 +01:00
|
|
|
|
/** Possible public/private key operations in Tor: used to keep track of where
|
|
|
|
|
* we're spending our time. */
|
2006-10-31 20:17:07 +01:00
|
|
|
|
typedef enum {
|
|
|
|
|
SIGN_DIR, SIGN_RTR,
|
|
|
|
|
VERIFY_DIR, VERIFY_RTR,
|
|
|
|
|
ENC_ONIONSKIN, DEC_ONIONSKIN,
|
|
|
|
|
TLS_HANDSHAKE_C, TLS_HANDSHAKE_S,
|
|
|
|
|
REND_CLIENT, REND_MID, REND_SERVER,
|
|
|
|
|
} pk_op_t;
|
2009-07-05 19:53:25 +02:00
|
|
|
|
|
2004-03-30 21:52:42 +02:00
|
|
|
|
/********************************* rendcommon.c ***************************/
|
|
|
|
|
|
2008-08-08 16:36:11 +02:00
|
|
|
|
/** Hidden-service side configuration of client authorization. */
|
|
|
|
|
typedef struct rend_authorized_client_t {
|
|
|
|
|
char *client_name;
|
|
|
|
|
char descriptor_cookie[REND_DESC_COOKIE_LEN];
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *client_key;
|
2008-08-08 16:36:11 +02:00
|
|
|
|
} rend_authorized_client_t;
|
|
|
|
|
|
2007-12-15 21:28:09 +01:00
|
|
|
|
/** ASCII-encoded v2 hidden service descriptor. */
|
|
|
|
|
typedef struct rend_encoded_v2_service_descriptor_t {
|
|
|
|
|
char desc_id[DIGEST_LEN]; /**< Descriptor ID. */
|
|
|
|
|
char *desc_str; /**< Descriptor string. */
|
|
|
|
|
} rend_encoded_v2_service_descriptor_t;
|
|
|
|
|
|
2011-09-17 12:53:07 +02:00
|
|
|
|
/** The maximum number of non-circuit-build-timeout failures a hidden
|
|
|
|
|
* service client will tolerate while trying to build a circuit to an
|
|
|
|
|
* introduction point. See also rend_intro_point_t.unreachable_count. */
|
|
|
|
|
#define MAX_INTRO_POINT_REACHABILITY_FAILURES 5
|
|
|
|
|
|
2015-04-20 21:51:06 +02:00
|
|
|
|
/** The minimum and maximum number of distinct INTRODUCE2 cells which a
|
|
|
|
|
* hidden service's introduction point will receive before it begins to
|
|
|
|
|
* expire. */
|
|
|
|
|
#define INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS 16384
|
|
|
|
|
/* Double the minimum value so the interval is [min, min * 2]. */
|
|
|
|
|
#define INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS \
|
|
|
|
|
(INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS * 2)
|
2011-10-29 03:35:55 +02:00
|
|
|
|
|
|
|
|
|
/** The minimum number of seconds that an introduction point will last
|
|
|
|
|
* before expiring due to old age. (If it receives
|
|
|
|
|
* INTRO_POINT_LIFETIME_INTRODUCTIONS INTRODUCE2 cells, it may expire
|
|
|
|
|
* sooner.)
|
|
|
|
|
*
|
|
|
|
|
* XXX023 Should this be configurable? */
|
2013-02-09 06:14:45 +01:00
|
|
|
|
#define INTRO_POINT_LIFETIME_MIN_SECONDS (18*60*60)
|
2011-10-29 03:35:55 +02:00
|
|
|
|
/** The maximum number of seconds that an introduction point will last
|
|
|
|
|
* before expiring due to old age.
|
|
|
|
|
*
|
|
|
|
|
* XXX023 Should this be configurable? */
|
2013-02-09 06:14:45 +01:00
|
|
|
|
#define INTRO_POINT_LIFETIME_MAX_SECONDS (24*60*60)
|
2011-10-29 03:35:55 +02:00
|
|
|
|
|
2015-06-01 18:08:13 +02:00
|
|
|
|
/** The maximum number of circuit creation retry we do to an intro point
|
|
|
|
|
* before giving up. We try to reuse intro point that fails during their
|
|
|
|
|
* lifetime so this is a hard limit on the amount of time we do that. */
|
|
|
|
|
#define MAX_INTRO_POINT_CIRCUIT_RETRIES 3
|
|
|
|
|
|
2011-09-11 01:05:53 +02:00
|
|
|
|
/** Introduction point information. Used both in rend_service_t (on
|
|
|
|
|
* the service side) and in rend_service_descriptor_t (on both the
|
|
|
|
|
* client and service side). */
|
2007-12-21 10:28:22 +01:00
|
|
|
|
typedef struct rend_intro_point_t {
|
|
|
|
|
extend_info_t *extend_info; /**< Extend info of this introduction point. */
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *intro_key; /**< Introduction key that replaces the service
|
2007-12-21 10:28:22 +01:00
|
|
|
|
* key, if this descriptor is V2. */
|
2011-09-17 12:19:29 +02:00
|
|
|
|
|
|
|
|
|
/** (Client side only) Flag indicating that a timeout has occurred
|
|
|
|
|
* after sending an INTRODUCE cell to this intro point. After a
|
|
|
|
|
* timeout, an intro point should not be tried again during the same
|
|
|
|
|
* hidden service connection attempt, but it may be tried again
|
|
|
|
|
* during a future connection attempt. */
|
|
|
|
|
unsigned int timed_out : 1;
|
2011-09-17 12:53:07 +02:00
|
|
|
|
|
|
|
|
|
/** (Client side only) The number of times we have failed to build a
|
|
|
|
|
* circuit to this intro point for some reason other than our
|
|
|
|
|
* circuit-build timeout. See also MAX_INTRO_POINT_REACHABILITY_FAILURES. */
|
|
|
|
|
unsigned int unreachable_count : 3;
|
2011-10-06 00:43:02 +02:00
|
|
|
|
|
2011-10-13 17:48:31 +02:00
|
|
|
|
/** (Service side only) Flag indicating that this intro point was
|
|
|
|
|
* included in the last HS descriptor we generated. */
|
|
|
|
|
unsigned int listed_in_last_desc : 1;
|
|
|
|
|
|
2012-07-11 04:18:47 +02:00
|
|
|
|
/** (Service side only) A replay cache recording the RSA-encrypted parts
|
|
|
|
|
* of INTRODUCE2 cells this intro point's circuit has received. This is
|
|
|
|
|
* used to prevent replay attacks. */
|
|
|
|
|
replaycache_t *accepted_intro_rsa_parts;
|
|
|
|
|
|
|
|
|
|
/** (Service side only) Count of INTRODUCE2 cells accepted from this
|
|
|
|
|
* intro point.
|
|
|
|
|
*/
|
|
|
|
|
int accepted_introduce2_count;
|
2011-10-06 08:52:14 +02:00
|
|
|
|
|
2015-04-20 21:51:06 +02:00
|
|
|
|
/** (Service side only) Number of maximum INTRODUCE2 cells that this IP
|
|
|
|
|
* will accept. This is a random value between
|
|
|
|
|
* INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS and
|
|
|
|
|
* INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS. */
|
2015-04-23 15:21:44 +02:00
|
|
|
|
int max_introductions;
|
2015-04-20 21:51:06 +02:00
|
|
|
|
|
2011-10-06 00:43:02 +02:00
|
|
|
|
/** (Service side only) The time at which this intro point was first
|
|
|
|
|
* published, or -1 if this intro point has not yet been
|
|
|
|
|
* published. */
|
|
|
|
|
time_t time_published;
|
2011-10-16 00:40:28 +02:00
|
|
|
|
|
2011-10-29 03:35:55 +02:00
|
|
|
|
/** (Service side only) The time at which this intro point should
|
|
|
|
|
* (start to) expire, or -1 if we haven't decided when this intro
|
|
|
|
|
* point should expire. */
|
|
|
|
|
time_t time_to_expire;
|
|
|
|
|
|
2015-06-01 18:08:13 +02:00
|
|
|
|
/** (Service side only) The amount of circuit creation we've made to this
|
|
|
|
|
* intro point. This is incremented every time we do a circuit relaunch on
|
|
|
|
|
* this object which is triggered when the circuit dies but the node is
|
|
|
|
|
* still in the consensus. After MAX_INTRO_POINT_CIRCUIT_RETRIES, we give
|
|
|
|
|
* up on it. */
|
|
|
|
|
unsigned int circuit_retries;
|
2015-06-01 19:17:37 +02:00
|
|
|
|
|
|
|
|
|
/** (Service side only) Set if this intro point has an established circuit
|
|
|
|
|
* and unset if it doesn't. */
|
|
|
|
|
unsigned int circuit_established:1;
|
2007-12-21 10:28:22 +01:00
|
|
|
|
} rend_intro_point_t;
|
|
|
|
|
|
2012-09-13 13:39:39 +02:00
|
|
|
|
#define REND_PROTOCOL_VERSION_BITMASK_WIDTH 16
|
|
|
|
|
|
2011-09-11 01:09:01 +02:00
|
|
|
|
/** Information used to connect to a hidden service. Used on both the
|
|
|
|
|
* service side and the client side. */
|
2004-03-31 04:07:38 +02:00
|
|
|
|
typedef struct rend_service_descriptor_t {
|
2012-01-18 21:53:30 +01:00
|
|
|
|
crypto_pk_t *pk; /**< This service's public key. */
|
2007-10-28 20:48:16 +01:00
|
|
|
|
int version; /**< Version of the descriptor format: 0 or 2. */
|
2005-06-29 23:46:55 +02:00
|
|
|
|
time_t timestamp; /**< Time when the descriptor was generated. */
|
2014-03-04 18:03:18 +01:00
|
|
|
|
/** Bitmask: which introduce/rendezvous protocols are supported?
|
|
|
|
|
* (We allow bits '0', '1', '2' and '3' to be set.) */
|
|
|
|
|
unsigned protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH;
|
2007-12-21 10:28:22 +01:00
|
|
|
|
/** List of the service's introduction points. Elements are removed if
|
|
|
|
|
* introduction attempts fail. */
|
|
|
|
|
smartlist_t *intro_nodes;
|
2008-09-09 10:41:58 +02:00
|
|
|
|
/** Has descriptor been uploaded to all hidden service directories? */
|
|
|
|
|
int all_uploads_performed;
|
|
|
|
|
/** List of hidden service directories to which an upload request for
|
|
|
|
|
* this descriptor could be sent. Smartlist exists only when at least one
|
|
|
|
|
* of the previous upload requests failed (otherwise it's not important
|
|
|
|
|
* to know which uploads succeeded and which not). */
|
|
|
|
|
smartlist_t *successful_uploads;
|
2004-03-31 04:07:38 +02:00
|
|
|
|
} rend_service_descriptor_t;
|
|
|
|
|
|
2004-05-12 21:49:48 +02:00
|
|
|
|
/********************************* routerlist.c ***************************/
|
|
|
|
|
|
2012-09-12 18:44:18 +02:00
|
|
|
|
/** Represents information about a single trusted or fallback directory
|
|
|
|
|
* server. */
|
2012-09-10 21:55:27 +02:00
|
|
|
|
typedef struct dir_server_t {
|
2005-10-04 23:21:09 +02:00
|
|
|
|
char *description;
|
|
|
|
|
char *nickname;
|
2007-01-03 11:30:26 +01:00
|
|
|
|
char *address; /**< Hostname. */
|
|
|
|
|
uint32_t addr; /**< IPv4 address. */
|
|
|
|
|
uint16_t dir_port; /**< Directory port. */
|
|
|
|
|
uint16_t or_port; /**< OR port: Used for tunneling connections. */
|
2012-09-11 00:13:28 +02:00
|
|
|
|
double weight; /** Weight used when selecting this node at random */
|
2007-01-03 11:30:26 +01:00
|
|
|
|
char digest[DIGEST_LEN]; /**< Digest of identity key. */
|
2007-05-22 19:58:25 +02:00
|
|
|
|
char v3_identity_digest[DIGEST_LEN]; /**< Digest of v3 (authority only,
|
|
|
|
|
* high-security) identity key. */
|
|
|
|
|
|
2005-09-13 23:14:55 +02:00
|
|
|
|
unsigned int is_running:1; /**< True iff we think this server is running. */
|
2012-09-10 21:23:39 +02:00
|
|
|
|
unsigned int is_authority:1; /**< True iff this is a directory authority
|
|
|
|
|
* of some kind. */
|
2007-05-09 06:15:46 +02:00
|
|
|
|
|
2007-01-06 06:42:31 +01:00
|
|
|
|
/** True iff this server has accepted the most recent server descriptor
|
|
|
|
|
* we tried to upload to it. */
|
|
|
|
|
unsigned int has_accepted_serverdesc:1;
|
2006-09-29 01:57:59 +02:00
|
|
|
|
|
2007-05-29 19:31:13 +02:00
|
|
|
|
/** What kind of authority is this? (Bitfield.) */
|
2010-11-08 20:27:36 +01:00
|
|
|
|
dirinfo_type_t type;
|
2007-05-09 06:15:46 +02:00
|
|
|
|
|
2007-11-01 05:14:23 +01:00
|
|
|
|
time_t addr_current_at; /**< When was the document that we derived the
|
|
|
|
|
* address information from published? */
|
2007-05-22 19:58:25 +02:00
|
|
|
|
|
2007-10-09 17:27:15 +02:00
|
|
|
|
routerstatus_t fake_status; /**< Used when we need to pass this trusted
|
2005-12-15 21:44:15 +01:00
|
|
|
|
* dir_server_t to directory_initiate_command_*
|
|
|
|
|
* as a routerstatus_t. Not updated by the
|
|
|
|
|
* router-status management code!
|
|
|
|
|
**/
|
2012-09-10 21:55:27 +02:00
|
|
|
|
} dir_server_t;
|
2004-10-12 17:55:20 +02:00
|
|
|
|
|
2015-02-07 14:30:40 +01:00
|
|
|
|
#define RELAY_REQUIRED_MIN_BANDWIDTH (75*1024)
|
|
|
|
|
#define BRIDGE_REQUIRED_MIN_BANDWIDTH (50*1024)
|
2007-10-11 18:06:47 +02:00
|
|
|
|
|
|
|
|
|
#define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX
|
|
|
|
|
|
2009-10-18 00:54:20 +02:00
|
|
|
|
/* Flags for pick_directory_server() and pick_trusteddirserver(). */
|
2008-12-11 20:12:48 +01:00
|
|
|
|
/** Flag to indicate that we should not automatically be willing to use
|
|
|
|
|
* ourself to answer a directory request.
|
|
|
|
|
* Passed to router_pick_directory_server (et al).*/
|
2007-10-24 20:42:16 +02:00
|
|
|
|
#define PDS_ALLOW_SELF (1<<0)
|
2008-12-11 20:12:48 +01:00
|
|
|
|
/** Flag to indicate that if no servers seem to be up, we should mark all
|
|
|
|
|
* directory servers as up and try again.
|
|
|
|
|
* Passed to router_pick_directory_server (et al).*/
|
2007-10-24 20:42:16 +02:00
|
|
|
|
#define PDS_RETRY_IF_NO_SERVERS (1<<1)
|
2008-12-11 20:12:48 +01:00
|
|
|
|
/** Flag to indicate that we should not exclude directory servers that
|
|
|
|
|
* our ReachableAddress settings would exclude. This usually means that
|
|
|
|
|
* we're going to connect to the server over Tor, and so we don't need to
|
|
|
|
|
* worry about our firewall telling us we can't.
|
|
|
|
|
* Passed to router_pick_directory_server (et al).*/
|
2007-10-24 20:42:16 +02:00
|
|
|
|
#define PDS_IGNORE_FASCISTFIREWALL (1<<2)
|
2008-12-11 20:12:48 +01:00
|
|
|
|
/** Flag to indicate that we should not use any directory authority to which
|
|
|
|
|
* we have an existing directory connection for downloading server descriptors
|
2008-12-11 20:12:55 +01:00
|
|
|
|
* or extrainfo documents.
|
|
|
|
|
*
|
|
|
|
|
* Passed to router_pick_directory_server (et al)
|
|
|
|
|
*/
|
2008-12-11 20:12:48 +01:00
|
|
|
|
#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3)
|
2014-09-23 18:30:47 +02:00
|
|
|
|
/** Flag to indicate that we should not use any directory authority to which
|
|
|
|
|
* we have an existing directory connection for downloading microdescs.
|
|
|
|
|
*
|
|
|
|
|
* Passed to router_pick_directory_server (et al)
|
|
|
|
|
*/
|
2010-05-11 23:20:33 +02:00
|
|
|
|
#define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4)
|
|
|
|
|
|
2013-02-14 18:06:59 +01:00
|
|
|
|
/** This node is to be chosen as a directory guard, so don't choose any
|
|
|
|
|
* node that's currently a guard. */
|
|
|
|
|
#define PDS_FOR_GUARD (1<<5)
|
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Possible ways to weight routers when choosing one randomly. See
|
|
|
|
|
* routerlist_sl_choose_by_bandwidth() for more information.*/
|
2010-04-13 00:12:49 +02:00
|
|
|
|
typedef enum bandwidth_weight_rule_t {
|
2010-01-28 00:01:51 +01:00
|
|
|
|
NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_MID, WEIGHT_FOR_GUARD,
|
|
|
|
|
WEIGHT_FOR_DIR
|
2007-08-24 14:33:53 +02:00
|
|
|
|
} bandwidth_weight_rule_t;
|
2008-07-24 11:22:34 +02:00
|
|
|
|
|
2008-12-17 18:20:31 +01:00
|
|
|
|
/** Flags to be passed to control router_choose_random_node() to indicate what
|
|
|
|
|
* kind of nodes to pick according to what algorithm. */
|
2008-07-24 11:22:34 +02:00
|
|
|
|
typedef enum {
|
|
|
|
|
CRN_NEED_UPTIME = 1<<0,
|
|
|
|
|
CRN_NEED_CAPACITY = 1<<1,
|
|
|
|
|
CRN_NEED_GUARD = 1<<2,
|
|
|
|
|
CRN_ALLOW_INVALID = 1<<3,
|
2008-12-18 17:11:24 +01:00
|
|
|
|
/* XXXX not used, apparently. */
|
Initial conversion to use node_t throughout our codebase.
A node_t is an abstraction over routerstatus_t, routerinfo_t, and
microdesc_t. It should try to present a consistent interface to all
of them. There should be a node_t for a server whenever there is
* A routerinfo_t for it in the routerlist
* A routerstatus_t in the current_consensus.
(note that a microdesc_t alone isn't enough to make a node_t exist,
since microdescriptors aren't usable on their own.)
There are three ways to get a node_t right now: looking it up by ID,
looking it up by nickname, and iterating over the whole list of
microdescriptors.
All (or nearly all) functions that are supposed to return "a router"
-- especially those used in building connections and circuits --
should return a node_t, not a routerinfo_t or a routerstatus_t.
A node_t should hold all the *mutable* flags about a node. This
patch moves the is_foo flags from routerinfo_t into node_t. The
flags in routerstatus_t remain, but they get set from the consensus
and should not change.
Some other highlights of this patch are:
* Looking up routerinfo and routerstatus by nickname is now
unified and based on the "look up a node by nickname" function.
This tries to look only at the values from current consensus,
and not get confused by the routerinfo_t->is_named flag, which
could get set for other weird reasons. This changes the
behavior of how authorities (when acting as clients) deal with
nodes that have been listed by nickname.
* I tried not to artificially increase the size of the diff here
by moving functions around. As a result, some functions that
now operate on nodes are now in the wrong file -- they should
get moved to nodelist.c once this refactoring settles down.
This moving should happen as part of a patch that moves
functions AND NOTHING ELSE.
* Some old code is now left around inside #if 0/1 blocks, and
should get removed once I've verified that I don't want it
sitting around to see how we used to do things.
There are still some unimplemented functions: these are flagged
with "UNIMPLEMENTED_NODELIST()." I'll work on filling in the
implementation here, piece by piece.
I wish this patch could have been smaller, but there did not seem to
be any piece of it that was independent from the rest. Moving flags
forces many functions that once returned routerinfo_t * to return
node_t *, which forces their friends to change, and so on.
2010-09-29 21:00:41 +02:00
|
|
|
|
CRN_WEIGHT_AS_EXIT = 1<<5,
|
|
|
|
|
CRN_NEED_DESC = 1<<6
|
2008-07-24 11:22:34 +02:00
|
|
|
|
} router_crn_flags_t;
|
|
|
|
|
|
2008-12-17 22:50:01 +01:00
|
|
|
|
/** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */
|
|
|
|
|
typedef enum was_router_added_t {
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router was added successfully. */
|
2008-12-22 07:25:49 +01:00
|
|
|
|
ROUTER_ADDED_SUCCESSFULLY = 1,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router descriptor was added with warnings to submitter. */
|
2008-12-22 07:25:49 +01:00
|
|
|
|
ROUTER_ADDED_NOTIFY_GENERATOR = 0,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Extrainfo document was rejected because no corresponding router
|
|
|
|
|
* descriptor was found OR router descriptor was rejected because
|
|
|
|
|
* it was incompatible with its extrainfo document. */
|
2008-12-22 05:53:11 +01:00
|
|
|
|
ROUTER_BAD_EI = -1,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router descriptor was rejected because it is already known. */
|
2014-11-11 19:56:40 +01:00
|
|
|
|
ROUTER_IS_ALREADY_KNOWN = -2,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* General purpose router was rejected, because it was not listed
|
|
|
|
|
* in consensus. */
|
2008-12-22 05:53:11 +01:00
|
|
|
|
ROUTER_NOT_IN_CONSENSUS = -3,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router was neither in directory consensus nor in any of
|
|
|
|
|
* networkstatus documents. Caching it to access later.
|
|
|
|
|
* (Applies to fetched descriptors only.) */
|
2008-12-22 05:53:11 +01:00
|
|
|
|
ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router was rejected by directory authority. */
|
2008-12-22 05:53:11 +01:00
|
|
|
|
ROUTER_AUTHDIR_REJECTS = -5,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Bridge descriptor was rejected because such bridge was not one
|
|
|
|
|
* of the bridges we have listed in our configuration. */
|
2014-10-13 20:11:27 +02:00
|
|
|
|
ROUTER_WAS_NOT_WANTED = -6,
|
2014-11-11 19:37:39 +01:00
|
|
|
|
/* Router descriptor was rejected because it was older than
|
|
|
|
|
* OLD_ROUTER_DESC_MAX_AGE. */
|
2014-11-03 19:30:19 +01:00
|
|
|
|
ROUTER_WAS_TOO_OLD = -7, /* note contrast with 'NOT_NEW' */
|
2014-10-01 17:54:07 +02:00
|
|
|
|
/* DOCDOC */
|
|
|
|
|
ROUTER_CERTS_EXPIRED = -8
|
2008-12-17 22:50:01 +01:00
|
|
|
|
} was_router_added_t;
|
|
|
|
|
|
2004-05-12 21:49:48 +02:00
|
|
|
|
/********************************* routerparse.c ************************/
|
|
|
|
|
|
2004-11-30 00:04:26 +01:00
|
|
|
|
#define MAX_STATUS_TAG_LEN 32
|
|
|
|
|
/** Structure to hold parsed Tor versions. This is a little messier
|
|
|
|
|
* than we would like it to be, because we changed version schemes with 0.1.0.
|
|
|
|
|
*
|
2005-03-19 06:07:19 +01:00
|
|
|
|
* See version-spec.txt for the whole business.
|
2004-11-30 00:04:26 +01:00
|
|
|
|
*/
|
2004-07-13 21:16:49 +02:00
|
|
|
|
typedef struct tor_version_t {
|
|
|
|
|
int major;
|
|
|
|
|
int minor;
|
|
|
|
|
int micro;
|
2004-11-30 00:04:26 +01:00
|
|
|
|
/** Release status. For version in the post-0.1 format, this is always
|
|
|
|
|
* VER_RELEASE. */
|
|
|
|
|
enum { VER_PRE=0, VER_RC=1, VER_RELEASE=2, } status;
|
2004-07-13 21:16:49 +02:00
|
|
|
|
int patchlevel;
|
2004-11-30 00:04:26 +01:00
|
|
|
|
char status_tag[MAX_STATUS_TAG_LEN];
|
2007-04-17 02:58:30 +02:00
|
|
|
|
int svn_revision;
|
2009-06-12 19:38:37 +02:00
|
|
|
|
|
|
|
|
|
int git_tag_len;
|
|
|
|
|
char git_tag[DIGEST_LEN];
|
2004-07-13 21:16:49 +02:00
|
|
|
|
} tor_version_t;
|
|
|
|
|
|
2002-06-27 00:45:49 +02:00
|
|
|
|
#endif
|
2005-06-09 21:03:31 +02:00
|
|
|
|
|