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:
Roger Dingledine 2004-01-10 23:40:38 +00:00
parent db0c27b362
commit 5086300815
8 changed files with 57 additions and 50 deletions

View File

@ -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;
} }

View File

@ -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 ***** */

View File

@ -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(;;) {

View File

@ -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(;;) {

View File

@ -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) {

View File

@ -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);

View File

@ -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);

View File

@ -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);