From 2ef988c0650989571a7da12494a8b66c398fb2c1 Mon Sep 17 00:00:00 2001 From: Roger Dingledine <arma@torproject.org> Date: Wed, 23 Dec 2009 04:56:24 -0500 Subject: New consensus params "bwconnrate" and "bwconnburst" ...to let us rate-limit client connections as they enter the network. It's controlled in the consensus so we can turn it on and off for experiments. It's starting out off. Based on proposal 163. --- src/or/connection_or.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/or/connection_or.c') diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 84023f5a7..6704af8f0 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -320,6 +320,19 @@ connection_or_finished_connecting(or_connection_t *or_conn) return 0; } +/** Return 1 if identity digest <b>id_digest</b> is known to be a + * currently or recently running relay. Otherwise return 0. */ +static int +connection_or_digest_is_known_relay(const char *id_digest) +{ + if (router_get_consensus_status_by_id(id_digest)) + return 1; /* It's in the consensus: "yes" */ + if (router_get_by_digest(id_digest)) + return 1; /* Not in the consensus, but we have a descriptor for + * it. Probably it was in a recent consensus. "Yes". */ + return 0; +} + /** If we don't necessarily know the router we're connecting to, but we * have an addr/port/id_digest, then fill in as much as we can. Start * by checking to see if this describes a router we know. */ @@ -331,10 +344,24 @@ connection_or_init_conn_from_address(or_connection_t *conn, { or_options_t *options = get_options(); routerinfo_t *r = router_get_by_digest(id_digest); - conn->bandwidthrate = (int)options->BandwidthRate; - conn->read_bucket = conn->bandwidthburst = (int)options->BandwidthBurst; connection_or_set_identity_digest(conn, id_digest); + if (connection_or_digest_is_known_relay(id_digest)) { + /* It's in the consensus, or we have a descriptor for it meaning it + * was probably in a recent consensus. It's a recognized relay: + * give it full bandwidth. */ + conn->bandwidthrate = (int)options->BandwidthRate; + conn->read_bucket = conn->bandwidthburst = (int)options->BandwidthBurst; + } else { /* Not a recognized relay. Squeeze it down based on the + * suggested bandwidth parameters in the consensus. */ + conn->bandwidthrate = + (int)networkstatus_get_param(NULL, "bwconnrate", + (int)options->BandwidthRate); + conn->read_bucket = conn->bandwidthburst = + (int)networkstatus_get_param(NULL, "bwconnburst", + (int)options->BandwidthBurst); + } + conn->_base.port = port; tor_addr_copy(&conn->_base.addr, addr); tor_addr_copy(&conn->real_addr, addr); -- cgit v1.2.3