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
|
|
|
/* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */
|
|
|
|
/* See LICENSE for licensing information */
|
|
|
|
/* $Id$ */
|
|
|
|
|
2002-06-27 00:45:49 +02:00
|
|
|
/**
|
|
|
|
* config.c
|
|
|
|
* Routines for loading the configuration file.
|
|
|
|
*
|
|
|
|
* Matej Pfajfar <mp292@cam.ac.uk>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "or.h"
|
2002-09-03 20:44:24 +02:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
const char *
|
|
|
|
basename(const char *filename)
|
|
|
|
{
|
|
|
|
char *result;
|
|
|
|
/* XXX This won't work on windows. */
|
|
|
|
result = strrchr(filename, '/');
|
|
|
|
if (result)
|
|
|
|
return result;
|
|
|
|
else
|
|
|
|
return filename;
|
|
|
|
}
|
2002-06-27 00:45:49 +02:00
|
|
|
|
|
|
|
/* loads the configuration file */
|
|
|
|
int getconfig(char *conf_filename, config_opt_t *options)
|
|
|
|
{
|
|
|
|
FILE *cf = NULL;
|
|
|
|
int retval = 0;
|
|
|
|
|
|
|
|
if ((!conf_filename) || (!options))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* load config file */
|
|
|
|
cf = open_config(conf_filename);
|
|
|
|
if (!cf)
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"Could not open configuration file %s.",conf_filename);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
retval = parse_config(cf,options);
|
|
|
|
if (retval)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-07-03 18:31:22 +02:00
|
|
|
int getoptions(int argc, char **argv, or_options_t *options)
|
|
|
|
/**
|
2002-07-11 16:50:26 +02:00
|
|
|
|
2002-07-03 18:31:22 +02:00
|
|
|
A replacement for getargs() and getconfig() which uses the <popt> library to parse
|
|
|
|
both command-line arguments and configuration files. A specific configuration file
|
|
|
|
may be specified using the --ConfigFile option. If one is not specified, then the
|
2002-07-11 16:50:26 +02:00
|
|
|
configuration files at /etc/<cmd>rc and ~/.<cmd>rc will be loaded in that order so
|
|
|
|
user preferences will override the ones specified in /etc.
|
|
|
|
|
|
|
|
The --ConfigFile (-f) option may only be used on the command-line. All other command-line
|
2002-07-03 18:31:22 +02:00
|
|
|
options may also be specified in configuration files. <popt> aliases are enabled
|
2002-07-11 16:50:26 +02:00
|
|
|
so a user can define their own options in the /etc/popt or ~/.popt files as outlined
|
|
|
|
in "man popt" pages.
|
|
|
|
|
2002-07-03 18:31:22 +02:00
|
|
|
RETURN VALUE: 0 on success, non-zero on error
|
|
|
|
**/
|
|
|
|
{
|
|
|
|
char *ConfigFile;
|
|
|
|
int Verbose;
|
|
|
|
int code;
|
|
|
|
poptContext optCon;
|
2002-09-03 21:03:16 +02:00
|
|
|
const char *cmd;
|
2002-07-03 18:31:22 +02:00
|
|
|
struct poptOption opt_tab[] =
|
|
|
|
{
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "APPort", 'a', POPT_ARG_INT, &options->APPort,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "application proxy port", "<port>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "CoinWeight", 'w', POPT_ARG_FLOAT, &options->CoinWeight,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "coin weight used in determining routes", "<weight>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "ConfigFile", 'f', POPT_ARG_STRING, &ConfigFile,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "user specified configuration file", "<file>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "LogLevel", 'l', POPT_ARG_STRING, &options->LogLevel,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "emerg|alert|crit|err|warning|notice|info|debug", "<level>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "MaxConn", 'm', POPT_ARG_INT, &options->MaxConn,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "maximum number of incoming connections", "<max>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "OPPort", 'o', POPT_ARG_INT, &options->OPPort,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "onion proxy port", "<port>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "ORPort", 'p', POPT_ARG_INT, &options->ORPort,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "onion router port", "<port>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "PrivateKeyFile", 'k', POPT_ARG_STRING, &options->PrivateKeyFile,
|
2002-07-15 18:42:27 +02:00
|
|
|
0, "maximum number of incoming connections", "<file>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "RouterFile", 'r', POPT_ARG_STRING, &options->RouterFile,
|
2002-07-15 18:42:27 +02:00
|
|
|
0, "local port on which the onion proxy is running", "<file>" },
|
2002-07-11 20:38:16 +02:00
|
|
|
{ "TrafficShaping", 't', POPT_ARG_INT, &options->TrafficShaping,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "which traffic shaping policy to use", "<policy>" },
|
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
|
|
|
{ "LinkPadding", 'P', POPT_ARG_INT, &options->LinkPadding,
|
|
|
|
0, "whether to use link padding", "<padding>" },
|
|
|
|
{ "Role", 'g', POPT_ARG_INT, &options->Role,
|
2002-07-11 20:38:16 +02:00
|
|
|
0, "4-bit global role id", "<role>" },
|
|
|
|
{ "Verbose", 'v', POPT_ARG_NONE, &Verbose,
|
2002-07-11 16:50:26 +02:00
|
|
|
0, "display options selected before execution", NULL },
|
2002-07-03 18:31:22 +02:00
|
|
|
POPT_AUTOHELP /* handles --usage and --help automatically */
|
|
|
|
POPT_TABLEEND /* marks end of table */
|
|
|
|
};
|
|
|
|
cmd = basename(argv[0]);
|
|
|
|
optCon = poptGetContext(cmd,argc,(const char **)argv,opt_tab,0);
|
|
|
|
|
|
|
|
poptReadDefaultConfig(optCon,0); /* read <popt> alias definitions */
|
|
|
|
|
2002-07-11 20:38:16 +02:00
|
|
|
/* assign default option values */
|
|
|
|
|
|
|
|
bzero(options,sizeof(or_options_t));
|
2002-07-11 21:03:44 +02:00
|
|
|
options->LogLevel = "debug";
|
2002-07-11 20:38:16 +02:00
|
|
|
options->loglevel = LOG_DEBUG;
|
|
|
|
options->CoinWeight = 0.8;
|
2002-08-23 08:49:43 +02:00
|
|
|
options->LinkPadding = 0;
|
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
|
|
|
options->Role = ROLE_OR_LISTEN | ROLE_OR_CONNECT_ALL | ROLE_OP_LISTEN | ROLE_AP_LISTEN;
|
2002-07-03 18:31:22 +02:00
|
|
|
|
|
|
|
code = poptGetNextOpt(optCon); /* first we handle command-line args */
|
2002-07-03 18:53:34 +02:00
|
|
|
if ( code == -1 )
|
2002-07-03 18:31:22 +02:00
|
|
|
{
|
2002-07-11 16:50:26 +02:00
|
|
|
if ( ConfigFile ) /* handle user-specified config file */
|
2002-07-03 18:53:34 +02:00
|
|
|
code = poptReadOptions(optCon,ConfigFile);
|
|
|
|
else /* load Default configuration files */
|
|
|
|
code = poptReadDefaultOptions(cmd,optCon);
|
2002-07-03 18:31:22 +02:00
|
|
|
}
|
|
|
|
|
2002-07-03 18:53:34 +02:00
|
|
|
switch(code) /* error checking */
|
2002-07-03 18:31:22 +02:00
|
|
|
{
|
2002-07-03 18:53:34 +02:00
|
|
|
case INT_MIN:
|
2002-07-11 16:50:26 +02:00
|
|
|
log(LOG_ERR, "%s: Unable to open configuration file.\n", ConfigFile);
|
2002-07-03 21:58:18 +02:00
|
|
|
break;
|
2002-07-03 18:53:34 +02:00
|
|
|
case -1:
|
|
|
|
code = 0;
|
2002-07-03 21:58:18 +02:00
|
|
|
break;
|
2002-07-03 18:53:34 +02:00
|
|
|
default:
|
2002-07-10 14:37:49 +02:00
|
|
|
poptPrintUsage(optCon, stderr, 0);
|
2002-07-11 16:50:26 +02:00
|
|
|
log(LOG_ERR, "%s: %s\n", poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(code));
|
2002-07-03 21:58:18 +02:00
|
|
|
break;
|
2002-07-03 18:31:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
poptFreeContext(optCon);
|
|
|
|
|
2002-07-11 21:03:44 +02:00
|
|
|
if ( code ) return code; /* return here if we encountered any problems */
|
|
|
|
|
|
|
|
/* Display options upon user request */
|
|
|
|
|
|
|
|
if ( Verbose )
|
|
|
|
{
|
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
|
|
|
printf("LogLevel=%s, Role=%d\n",
|
2002-07-11 21:03:44 +02:00
|
|
|
options->LogLevel,
|
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
|
|
|
options->Role);
|
2002-07-11 21:03:44 +02:00
|
|
|
printf("RouterFile=%s, PrivateKeyFile=%s\n",
|
|
|
|
options->RouterFile,
|
|
|
|
options->PrivateKeyFile);
|
|
|
|
printf("ORPort=%d, OPPort=%d, APPort=%d\n",
|
|
|
|
options->ORPort,options->OPPort,
|
|
|
|
options->APPort);
|
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
|
|
|
printf("CoinWeight=%6.4f, MaxConn=%d, TrafficShaping=%d, LinkPadding=%d\n",
|
2002-07-11 21:03:44 +02:00
|
|
|
options->CoinWeight,
|
|
|
|
options->MaxConn,
|
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
|
|
|
options->TrafficShaping,
|
|
|
|
options->LinkPadding);
|
2002-07-11 21:03:44 +02:00
|
|
|
}
|
|
|
|
|
2002-07-11 16:50:26 +02:00
|
|
|
/* Validate options */
|
|
|
|
|
|
|
|
if ( options->LogLevel )
|
|
|
|
{
|
|
|
|
if (!strcmp(options->LogLevel,"emerg"))
|
|
|
|
options->loglevel = LOG_EMERG;
|
|
|
|
else if (!strcmp(options->LogLevel,"alert"))
|
|
|
|
options->loglevel = LOG_ALERT;
|
|
|
|
else if (!strcmp(options->LogLevel,"crit"))
|
|
|
|
options->loglevel = LOG_CRIT;
|
|
|
|
else if (!strcmp(options->LogLevel,"err"))
|
|
|
|
options->loglevel = LOG_ERR;
|
|
|
|
else if (!strcmp(options->LogLevel,"warning"))
|
|
|
|
options->loglevel = LOG_WARNING;
|
|
|
|
else if (!strcmp(options->LogLevel,"notice"))
|
|
|
|
options->loglevel = LOG_NOTICE;
|
|
|
|
else if (!strcmp(options->LogLevel,"info"))
|
|
|
|
options->loglevel = LOG_INFO;
|
|
|
|
else if (!strcmp(options->LogLevel,"debug"))
|
|
|
|
options->loglevel = LOG_DEBUG;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"LogLevel must be one of emerg|alert|crit|err|warning|notice|info|debug.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->RouterFile == NULL )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"RouterFile option required, but not found.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->PrivateKeyFile == NULL )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"PrivateKeyFile option required, but not found.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->ORPort < 1 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"ORPort option required and must be a positive integer value.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->OPPort < 1 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"OPPort option required and must be a positive integer value.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->APPort < 1 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"APPort option required and must be a positive integer value.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->CoinWeight < 0.0 || options->CoinWeight >= 1.0 )
|
|
|
|
{
|
2002-07-15 18:42:27 +02:00
|
|
|
log(LOG_ERR,"CoinWeight option must be a value from 0.0 upto 1.0, but not including 1.0.");
|
2002-07-11 16:50:26 +02:00
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->MaxConn <= 0 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"MaxConn option must be a non-zero positive integer.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
2002-09-03 20:36:40 +02:00
|
|
|
if ( options->MaxConn >= MAXCONNECTIONS )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"MaxConn option must be less than %d.", MAXCONNECTIONS);
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
2002-07-11 16:50:26 +02:00
|
|
|
if ( options->TrafficShaping != 0 && options->TrafficShaping != 1 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"TrafficShaping option must be either 0 or 1.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
if ( options->LinkPadding != 0 && options->LinkPadding != 1 )
|
|
|
|
{
|
|
|
|
log(LOG_ERR,"LinkPadding option must be either 0 or 1.");
|
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( options->Role < 0 || options->Role > 15 )
|
2002-07-11 20:38:16 +02:00
|
|
|
{
|
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
|
|
|
log(LOG_ERR,"Role option must be an integer between 0 and 15 (inclusive).");
|
2002-07-11 20:38:16 +02:00
|
|
|
code = -1;
|
|
|
|
}
|
|
|
|
|
2002-07-03 18:53:34 +02:00
|
|
|
return code;
|
2002-07-03 18:31:22 +02:00
|
|
|
}
|
|
|
|
|