mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 04:13:28 +01:00
split the token bucket into 'rate' and 'burst' params
we're not entirely migrated to burst yet, for backward compatibility note some win32 probable-bugs clean up routerlist.c svn:r982
This commit is contained in:
parent
db0c27b362
commit
5086300815
@ -153,6 +153,9 @@ static void config_assign(or_options_t *options, struct config_line *list) {
|
|||||||
/* string options */
|
/* string options */
|
||||||
config_compare(list, "Address", CONFIG_TYPE_STRING, &options->Address) ||
|
config_compare(list, "Address", CONFIG_TYPE_STRING, &options->Address) ||
|
||||||
|
|
||||||
|
config_compare(list, "BandwidthRate", CONFIG_TYPE_INT, &options->BandwidthRate) ||
|
||||||
|
config_compare(list, "BandwidthBurst", CONFIG_TYPE_INT, &options->BandwidthBurst) ||
|
||||||
|
|
||||||
config_compare(list, "DebugLogFile", CONFIG_TYPE_STRING, &options->DebugLogFile) ||
|
config_compare(list, "DebugLogFile", CONFIG_TYPE_STRING, &options->DebugLogFile) ||
|
||||||
config_compare(list, "DataDirectory", CONFIG_TYPE_STRING, &options->DataDirectory) ||
|
config_compare(list, "DataDirectory", CONFIG_TYPE_STRING, &options->DataDirectory) ||
|
||||||
config_compare(list, "DirPort", CONFIG_TYPE_INT, &options->DirPort) ||
|
config_compare(list, "DirPort", CONFIG_TYPE_INT, &options->DirPort) ||
|
||||||
@ -194,7 +197,6 @@ static void config_assign(or_options_t *options, struct config_line *list) {
|
|||||||
config_compare(list, "SocksPort", CONFIG_TYPE_INT, &options->SocksPort) ||
|
config_compare(list, "SocksPort", CONFIG_TYPE_INT, &options->SocksPort) ||
|
||||||
config_compare(list, "SocksBindAddress",CONFIG_TYPE_STRING,&options->SocksBindAddress) ||
|
config_compare(list, "SocksBindAddress",CONFIG_TYPE_STRING,&options->SocksBindAddress) ||
|
||||||
|
|
||||||
config_compare(list, "TotalBandwidth", CONFIG_TYPE_INT, &options->TotalBandwidth) ||
|
|
||||||
config_compare(list, "TrafficShaping", CONFIG_TYPE_BOOL, &options->TrafficShaping) ||
|
config_compare(list, "TrafficShaping", CONFIG_TYPE_BOOL, &options->TrafficShaping) ||
|
||||||
|
|
||||||
config_compare(list, "User", CONFIG_TYPE_STRING, &options->User)
|
config_compare(list, "User", CONFIG_TYPE_STRING, &options->User)
|
||||||
@ -211,10 +213,11 @@ static void config_assign(or_options_t *options, struct config_line *list) {
|
|||||||
/* prints the usage of tor. */
|
/* prints the usage of tor. */
|
||||||
void print_usage(void) {
|
void print_usage(void) {
|
||||||
printf("tor -f <torrc> [args]\n"
|
printf("tor -f <torrc> [args]\n"
|
||||||
|
"See man page for more options.\n\n"
|
||||||
|
"-b <bandwidth>\t\tbytes/second rate limiting\n"
|
||||||
"-d <file>\t\tDebug file\n"
|
"-d <file>\t\tDebug file\n"
|
||||||
"-m <max>\t\tMax number of connections\n"
|
"-m <max>\t\tMax number of connections\n"
|
||||||
"-l <level>\t\tLog level\n"
|
"-l <level>\t\tLog level\n"
|
||||||
"-t <bandwidth>\t\tTotal bandwidth\n"
|
|
||||||
"-r <file>\t\tList of known routers\n");
|
"-r <file>\t\tList of known routers\n");
|
||||||
printf("\nClient options:\n"
|
printf("\nClient options:\n"
|
||||||
"-e \"nick1 nick2 ...\"\t\tExit nodes\n"
|
"-e \"nick1 nick2 ...\"\t\tExit nodes\n"
|
||||||
@ -269,7 +272,8 @@ void init_options(or_options_t *options) {
|
|||||||
options->KeepalivePeriod = 300;
|
options->KeepalivePeriod = 300;
|
||||||
options->MaxOnionsPending = 100;
|
options->MaxOnionsPending = 100;
|
||||||
options->NewCircuitPeriod = 60; /* once a minute */
|
options->NewCircuitPeriod = 60; /* once a minute */
|
||||||
options->TotalBandwidth = 800000; /* at most 800kB/s total sustained incoming */
|
options->BandwidthRate = 800000; /* at most 800kB/s total sustained incoming */
|
||||||
|
options->BandwidthBurst = 10000000; /* max burst on the token bucket */
|
||||||
options->NumCpus = 1;
|
options->NumCpus = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,6 +290,7 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* XXX add to this log_fn the exit node's nickname? */
|
||||||
log_fn(LOG_INFO,"end cell (%s) for stream %d. Removing stream.",
|
log_fn(LOG_INFO,"end cell (%s) for stream %d. Removing stream.",
|
||||||
connection_edge_end_reason(cell->payload+RELAY_HEADER_SIZE, rh.length),
|
connection_edge_end_reason(cell->payload+RELAY_HEADER_SIZE, rh.length),
|
||||||
conn->stream_id);
|
conn->stream_id);
|
||||||
@ -880,7 +881,8 @@ int connection_ap_can_use_exit(connection_t *conn, routerinfo_t *exit)
|
|||||||
exit->nickname, conn->socks_request->address,
|
exit->nickname, conn->socks_request->address,
|
||||||
conn->socks_request->port);
|
conn->socks_request->port);
|
||||||
addr = client_dns_lookup_entry(conn->socks_request->address);
|
addr = client_dns_lookup_entry(conn->socks_request->address);
|
||||||
return router_supports_exit_address(addr, conn->socks_request->port, exit);
|
return router_compare_addr_to_exit_policy(addr,
|
||||||
|
conn->socks_request->port, exit->exit_policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ***** Client DNS code ***** */
|
/* ***** Client DNS code ***** */
|
||||||
|
@ -127,6 +127,7 @@ int cpuworker_main(void *data) {
|
|||||||
close(fdarray[0]); /* this is the side of the socketpair the parent uses */
|
close(fdarray[0]); /* this is the side of the socketpair the parent uses */
|
||||||
fd = fdarray[1]; /* this side is ours */
|
fd = fdarray[1]; /* this side is ours */
|
||||||
connection_free_all(); /* so the child doesn't hold the parent's fd's open */
|
connection_free_all(); /* so the child doesn't hold the parent's fd's open */
|
||||||
|
/* XXX probably don't close all the fd's on MS_WINDOWS? */
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
|
||||||
|
@ -396,6 +396,7 @@ int dnsworker_main(void *data) {
|
|||||||
close(fdarray[0]); /* this is the side of the socketpair the parent uses */
|
close(fdarray[0]); /* this is the side of the socketpair the parent uses */
|
||||||
fd = fdarray[1]; /* this side is ours */
|
fd = fdarray[1]; /* this side is ours */
|
||||||
connection_free_all(); /* so the child doesn't hold the parent's fd's open */
|
connection_free_all(); /* so the child doesn't hold the parent's fd's open */
|
||||||
|
/* XXX probably don't close all the fd's on MS_WINDOWS? */
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
|
||||||
|
@ -347,8 +347,8 @@ static void run_scheduled_events(time_t now) {
|
|||||||
* increment global_read_bucket.
|
* increment global_read_bucket.
|
||||||
*/
|
*/
|
||||||
stats_n_bytes_read += stats_prev_global_read_bucket-global_read_bucket;
|
stats_n_bytes_read += stats_prev_global_read_bucket-global_read_bucket;
|
||||||
if(global_read_bucket < 9*options.TotalBandwidth) {
|
if(global_read_bucket < options.BandwidthBurst) {
|
||||||
global_read_bucket += options.TotalBandwidth;
|
global_read_bucket += options.BandwidthRate;
|
||||||
log_fn(LOG_DEBUG,"global_read_bucket now %d.", global_read_bucket);
|
log_fn(LOG_DEBUG,"global_read_bucket now %d.", global_read_bucket);
|
||||||
}
|
}
|
||||||
stats_prev_global_read_bucket = global_read_bucket;
|
stats_prev_global_read_bucket = global_read_bucket;
|
||||||
@ -418,7 +418,7 @@ static int init_from_config(int argc, char **argv) {
|
|||||||
log_fn(LOG_DEBUG, "Successfully opened DebugLogFile '%s'.", options.DebugLogFile);
|
log_fn(LOG_DEBUG, "Successfully opened DebugLogFile '%s'.", options.DebugLogFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
global_read_bucket = options.TotalBandwidth; /* start it at 1 second of traffic */
|
global_read_bucket = options.BandwidthBurst; /* start it at max traffic */
|
||||||
stats_prev_global_read_bucket = global_read_bucket;
|
stats_prev_global_read_bucket = global_read_bucket;
|
||||||
|
|
||||||
if(options.User || options.Group) {
|
if(options.User || options.Group) {
|
||||||
|
@ -389,7 +389,8 @@ typedef struct {
|
|||||||
int is_running;
|
int is_running;
|
||||||
|
|
||||||
/* link info */
|
/* link info */
|
||||||
uint32_t bandwidth;
|
uint32_t bandwidthrate;
|
||||||
|
uint32_t bandwidthburst;
|
||||||
struct exit_policy_t *exit_policy;
|
struct exit_policy_t *exit_policy;
|
||||||
} routerinfo_t;
|
} routerinfo_t;
|
||||||
|
|
||||||
@ -505,7 +506,8 @@ typedef struct {
|
|||||||
int KeepalivePeriod;
|
int KeepalivePeriod;
|
||||||
int MaxOnionsPending;
|
int MaxOnionsPending;
|
||||||
int NewCircuitPeriod;
|
int NewCircuitPeriod;
|
||||||
int TotalBandwidth;
|
int BandwidthRate;
|
||||||
|
int BandwidthBurst;
|
||||||
int NumCpus;
|
int NumCpus;
|
||||||
int loglevel;
|
int loglevel;
|
||||||
} or_options_t;
|
} or_options_t;
|
||||||
@ -800,8 +802,6 @@ int router_get_router_hash(const char *s, char *digest);
|
|||||||
int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey);
|
int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey);
|
||||||
routerinfo_t *router_get_entry_from_string(const char **s);
|
routerinfo_t *router_get_entry_from_string(const char **s);
|
||||||
int router_add_exit_policy_from_string(routerinfo_t *router, const char *s);
|
int router_add_exit_policy_from_string(routerinfo_t *router, const char *s);
|
||||||
int router_supports_exit_address(uint32_t addr, uint16_t port,
|
|
||||||
routerinfo_t *router);
|
|
||||||
int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port,
|
int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port,
|
||||||
struct exit_policy_t *policy);
|
struct exit_policy_t *policy);
|
||||||
int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port);
|
int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port);
|
||||||
|
@ -338,7 +338,8 @@ int router_rebuild_descriptor(void) {
|
|||||||
ri->onion_pkey = crypto_pk_dup_key(get_onion_key());
|
ri->onion_pkey = crypto_pk_dup_key(get_onion_key());
|
||||||
ri->link_pkey = crypto_pk_dup_key(get_link_key());
|
ri->link_pkey = crypto_pk_dup_key(get_link_key());
|
||||||
ri->identity_pkey = crypto_pk_dup_key(get_identity_key());
|
ri->identity_pkey = crypto_pk_dup_key(get_identity_key());
|
||||||
ri->bandwidth = options.TotalBandwidth;
|
ri->bandwidthrate = options.BandwidthRate;
|
||||||
|
ri->bandwidthburst = options.BandwidthBurst;
|
||||||
ri->exit_policy = NULL; /* zero it out first */
|
ri->exit_policy = NULL; /* zero it out first */
|
||||||
router_add_exit_policy_from_config(ri);
|
router_add_exit_policy_from_config(ri);
|
||||||
if (desc_routerinfo)
|
if (desc_routerinfo)
|
||||||
@ -421,7 +422,8 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
|
|||||||
router->or_port,
|
router->or_port,
|
||||||
router->socks_port,
|
router->socks_port,
|
||||||
router->dir_port,
|
router->dir_port,
|
||||||
(int) router->bandwidth,
|
(int) router->bandwidthrate,
|
||||||
|
/* XXXBC also write bandwidthburst */
|
||||||
platform,
|
platform,
|
||||||
published,
|
published,
|
||||||
onion_pkey, link_pkey, identity_pkey);
|
onion_pkey, link_pkey, identity_pkey);
|
||||||
|
@ -22,7 +22,7 @@ extern or_options_t options; /* command-line and config-file options */
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Enumeration of possible token types. The ones starting with K_ correspond
|
/* Enumeration of possible token types. The ones starting with K_ correspond
|
||||||
* to directory 'keywords'. _SIGNATURE and _PUBLIC_KEY are self-explanitory.
|
* to directory 'keywords'. _SIGNATURE and _PUBLIC_KEY are self-explanatory.
|
||||||
* _ERR is an error in the tokenizing process, _EOF is an end-of-file marker,
|
* _ERR is an error in the tokenizing process, _EOF is an end-of-file marker,
|
||||||
* and _NIL is used to encode not-a-token.
|
* and _NIL is used to encode not-a-token.
|
||||||
*/
|
*/
|
||||||
@ -64,10 +64,9 @@ typedef struct directory_token_t {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* static function prototypes */
|
/* static function prototypes */
|
||||||
static int router_set_routerlist_from_string(const char *s);
|
static int
|
||||||
|
router_set_routerlist_from_string(const char *s);
|
||||||
static int
|
static int
|
||||||
router_get_list_from_string_impl(const char **s, routerlist_t **dest,
|
router_get_list_from_string_impl(const char **s, routerlist_t **dest,
|
||||||
int n_good_nicknames,
|
int n_good_nicknames,
|
||||||
@ -75,23 +74,24 @@ router_get_list_from_string_impl(const char **s, routerlist_t **dest,
|
|||||||
static int
|
static int
|
||||||
router_get_routerlist_from_directory_impl(const char *s, routerlist_t **dest,
|
router_get_routerlist_from_directory_impl(const char *s, routerlist_t **dest,
|
||||||
crypto_pk_env_t *pkey);
|
crypto_pk_env_t *pkey);
|
||||||
static int router_add_exit_policy(routerinfo_t *router,
|
static int
|
||||||
directory_token_t *tok);
|
router_add_exit_policy(routerinfo_t *router, directory_token_t *tok);
|
||||||
static int router_resolve_routerlist(routerlist_t *dir);
|
static int
|
||||||
|
router_resolve_routerlist(routerlist_t *dir);
|
||||||
|
|
||||||
|
static int
|
||||||
|
_router_get_next_token(const char **s, directory_token_t *tok);
|
||||||
static int _router_get_next_token(const char **s, directory_token_t *tok);
|
|
||||||
#ifdef DEBUG_ROUTER_TOKENS
|
#ifdef DEBUG_ROUTER_TOKENS
|
||||||
static int router_get_next_token(const char **s, directory_token_t *tok);
|
static int
|
||||||
|
router_get_next_token(const char **s, directory_token_t *tok);
|
||||||
#else
|
#else
|
||||||
#define router_get_next_token _router_get_next_token
|
#define router_get_next_token _router_get_next_token
|
||||||
#endif
|
#endif
|
||||||
static int router_get_hash_impl(const char *s, char *digest,
|
static int
|
||||||
const char *start_str,
|
router_get_hash_impl(const char *s, char *digest,
|
||||||
const char *end_str);
|
const char *start_str, const char *end_str);
|
||||||
static void router_release_token(directory_token_t *tok);
|
static void
|
||||||
|
router_release_token(directory_token_t *tok);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@ -262,7 +262,6 @@ int router_set_routerlist_from_file(char *routerfile)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Helper function: read routerinfo elements from s, and throw out the
|
/* Helper function: read routerinfo elements from s, and throw out the
|
||||||
* ones that don't parse and resolve. Replace the current
|
* ones that don't parse and resolve. Replace the current
|
||||||
* routerlist. */
|
* routerlist. */
|
||||||
@ -296,8 +295,8 @@ int router_get_router_hash(const char *s, char *digest)
|
|||||||
"router ","router-signature");
|
"router ","router-signature");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return 0 if myversion is in versionlist. Else return -1. (versionlist
|
/* return 0 if myversion is in versionlist. Else return -1.
|
||||||
* contains a comma-separated list of versions.) */
|
* (versionlist contains a comma-separated list of versions.) */
|
||||||
int compare_recommended_versions(const char *myversion,
|
int compare_recommended_versions(const char *myversion,
|
||||||
const char *versionlist) {
|
const char *versionlist) {
|
||||||
int len_myversion = strlen(myversion);
|
int len_myversion = strlen(myversion);
|
||||||
@ -319,8 +318,7 @@ int compare_recommended_versions(const char *myversion,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Replace the current routerlist with the routers stored in the directory
|
/* Replace the current routerlist with the routers stored in the directory
|
||||||
* 's'. If pkey is provided, make sure that 's' is signed with pkey.
|
* 's'. If pkey is provided, make sure that 's' is signed with pkey. */
|
||||||
*/
|
|
||||||
int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
|
int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
|
||||||
{
|
{
|
||||||
if (router_get_routerlist_from_directory_impl(s, &routerlist, pkey)) {
|
if (router_get_routerlist_from_directory_impl(s, &routerlist, pkey)) {
|
||||||
@ -344,7 +342,6 @@ int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,17 +393,6 @@ router_resolve_routerlist(routerlist_t *rl)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Addr is 0 for "IP unknown".
|
|
||||||
*
|
|
||||||
* Returns -1 for 'rejected', 0 for accepted, 1 for 'maybe' (since IP is
|
|
||||||
* unknown.
|
|
||||||
*/
|
|
||||||
int router_supports_exit_address(uint32_t addr, uint16_t port,
|
|
||||||
routerinfo_t *router)
|
|
||||||
{
|
|
||||||
return router_compare_addr_to_exit_policy(addr, port, router->exit_policy);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Addr is 0 for "IP unknown".
|
/* Addr is 0 for "IP unknown".
|
||||||
*
|
*
|
||||||
* Returns -1 for 'rejected', 0 for accepted, 1 for 'maybe' (since IP is
|
* Returns -1 for 'rejected', 0 for accepted, 1 for 'maybe' (since IP is
|
||||||
@ -716,7 +702,8 @@ routerinfo_t *router_get_entry_from_string(const char**s) {
|
|||||||
router = tor_malloc_zero(sizeof(routerinfo_t));
|
router = tor_malloc_zero(sizeof(routerinfo_t));
|
||||||
router->onion_pkey = router->identity_pkey = router->link_pkey = NULL;
|
router->onion_pkey = router->identity_pkey = router->link_pkey = NULL;
|
||||||
|
|
||||||
if (N_ARGS != 6) {
|
/* XXXBC move to <7 once we require bandwidthburst */
|
||||||
|
if (N_ARGS < 6) {
|
||||||
log_fn(LOG_WARN,"Wrong # of arguments to \"router\"");
|
log_fn(LOG_WARN,"Wrong # of arguments to \"router\"");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -749,12 +736,22 @@ routerinfo_t *router_get_entry_from_string(const char**s) {
|
|||||||
router->dir_port = atoi(ARGS[4]);
|
router->dir_port = atoi(ARGS[4]);
|
||||||
|
|
||||||
/* Router->bandwidth */
|
/* Router->bandwidth */
|
||||||
router->bandwidth = atoi(ARGS[5]);
|
router->bandwidthrate = atoi(ARGS[5]);
|
||||||
if (!router->bandwidth) {
|
if (!router->bandwidthrate) {
|
||||||
log_fn(LOG_WARN,"bandwidth unreadable or 0. Failing.");
|
log_fn(LOG_WARN,"bandwidthrate unreadable or 0. Failing.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if XXXBC
|
||||||
|
router->bandwidthburst = atoi(ARGS[6]);
|
||||||
|
if (!router->bandwidthburst) {
|
||||||
|
log_fn(LOG_WARN,"bandwidthburst unreadable or 0. Failing.");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
router->bandwidthburst = 10*router->bandwidthrate;
|
||||||
|
#endif
|
||||||
|
|
||||||
log_fn(LOG_DEBUG,"or_port %d, socks_port %d, dir_port %d, bandwidth %u.",
|
log_fn(LOG_DEBUG,"or_port %d, socks_port %d, dir_port %d, bandwidth %u.",
|
||||||
router->or_port, router->socks_port, router->dir_port,
|
router->or_port, router->socks_port, router->dir_port,
|
||||||
(unsigned) router->bandwidth);
|
(unsigned) router->bandwidth);
|
||||||
|
Loading…
Reference in New Issue
Block a user