Bläddra i källkod

if you're using relaybandwidthrate and relaybandwidthburst, make
sure that's reflected in your router descriptor.


svn:r10114

Roger Dingledine 18 år sedan
förälder
incheckning
b1d93df038
3 ändrade filer med 51 tillägg och 22 borttagningar
  1. 6 2
      ChangeLog
  2. 32 12
      src/or/config.c
  3. 13 8
      src/or/router.c

+ 6 - 2
ChangeLog

@@ -6,10 +6,14 @@ Changes in version 0.2.0.1-alpha - 2007-??-??
       queue for each circuit.  This lets us use less slack memory, and
       queue for each circuit.  This lets us use less slack memory, and
       will eventually let us be smarter about prioritizing different kinds
       will eventually let us be smarter about prioritizing different kinds
       of traffic.
       of traffic.
-    - Allocate cells in memory pools better speed and memory efficiency,
-      especially on platforms where malloc() is inefficient.
+    - Use memory pools to allocate cells with better speed and memory
+      efficiency, especially on platforms where malloc() is inefficient.
     - Stop reading on edge connections when their corresponding circuit
     - Stop reading on edge connections when their corresponding circuit
       buffers are full; start again as the circuits empty out.
       buffers are full; start again as the circuits empty out.
+    - New config options RelayBandwidthRate and RelayBandwidthBurst:
+      a separate set of token buckets for relayed traffic. Right now
+      relayed traffic is defined as answers to directory requests, and
+      OR connections that don't have any local circuits on them.
     - Make PreferTunneledDirConns and TunnelDirConns work even when
     - Make PreferTunneledDirConns and TunnelDirConns work even when
       we have no cached directory info. This means Tor clients can now
       we have no cached directory info. This means Tor clients can now
       do all of their connections protected by TLS.
       do all of their connections protected by TLS.

+ 32 - 12
src/or/config.c

@@ -2275,6 +2275,24 @@ validate_ports_csv(smartlist_t *sl, const char *name, char **msg)
   return 0;
   return 0;
 }
 }
 
 
+/** If <b>value</b> exceeds ROUTER_MAX_DECLARED_BANDWIDTH, write
+ * a complaint into *<b>msg</b> using string <b>desc</b>, and return -1.
+ * Else return 0.
+ */
+static int
+ensure_bandwidth_cap(uint64_t value, const char *desc, char **msg)
+{
+  int r;
+  char buf[1024];
+  if (value > ROUTER_MAX_DECLARED_BANDWIDTH) {
+    r = tor_snprintf(buf, sizeof(buf), "%s must be at most %d",
+                     desc, ROUTER_MAX_DECLARED_BANDWIDTH);
+    *msg = tor_strdup(r >= 0 ? buf : "internal error");
+    return -1;
+  }
+  return 0;
+}
+
 /** Lowest allowable value for RendPostPeriod; if this is too low, hidden
 /** Lowest allowable value for RendPostPeriod; if this is too low, hidden
  * services can overload the directory system. */
  * services can overload the directory system. */
 #define MIN_REND_POST_PERIOD (10*60)
 #define MIN_REND_POST_PERIOD (10*60)
@@ -2644,20 +2662,22 @@ options_validate(or_options_t *old_options, or_options_t *options,
   if (options->KeepalivePeriod < 1)
   if (options->KeepalivePeriod < 1)
     REJECT("KeepalivePeriod option must be positive.");
     REJECT("KeepalivePeriod option must be positive.");
 
 
-  if (options->BandwidthRate > ROUTER_MAX_DECLARED_BANDWIDTH) {
-    r = tor_snprintf(buf, sizeof(buf),
-                     "BandwidthRate must be at most %d",
-                     ROUTER_MAX_DECLARED_BANDWIDTH);
-    *msg = tor_strdup(r >= 0 ? buf : "internal error");
+  if (ensure_bandwidth_cap(options->BandwidthRate,
+                           "BandwidthRate", msg) < 0)
     return -1;
     return -1;
-  }
-  if (options->BandwidthBurst > ROUTER_MAX_DECLARED_BANDWIDTH) {
-    r = tor_snprintf(buf, sizeof(buf),
-                     "BandwidthBurst must be at most %d",
-                     ROUTER_MAX_DECLARED_BANDWIDTH);
-    *msg = tor_strdup(r >= 0 ? buf : "internal error");
+  if (ensure_bandwidth_cap(options->BandwidthBurst,
+                           "BandwidthBurst", msg) < 0)
     return -1;
     return -1;
-  }
+  if (ensure_bandwidth_cap(options->MaxAdvertisedBandwidth,
+                           "MaxAdvertisedBandwidth", msg) < 0)
+    return -1;
+  if (ensure_bandwidth_cap(options->RelayBandwidthRate,
+                           "RelayBandwidthRate", msg) < 0)
+    return -1;
+  if (ensure_bandwidth_cap(options->RelayBandwidthBurst,
+                           "RelayBandwidthBurst", msg) < 0)
+    return -1;
+
   if (server_mode(options)) {
   if (server_mode(options)) {
     if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH*2) {
     if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH*2) {
       r = tor_snprintf(buf, sizeof(buf),
       r = tor_snprintf(buf, sizeof(buf),

+ 13 - 8
src/or/router.c

@@ -944,17 +944,22 @@ router_rebuild_descriptor(int force)
   }
   }
   get_platform_str(platform, sizeof(platform));
   get_platform_str(platform, sizeof(platform));
   ri->platform = tor_strdup(platform);
   ri->platform = tor_strdup(platform);
+
+  /* compute ri->bandwidthrate as the min of various options */
   ri->bandwidthrate = (int)options->BandwidthRate;
   ri->bandwidthrate = (int)options->BandwidthRate;
+  if (ri->bandwidthrate > options->MaxAdvertisedBandwidth)
+    ri->bandwidthrate = (int)options->MaxAdvertisedBandwidth;
+  if (options->RelayBandwidthRate > 0 &&
+      ri->bandwidthrate > options->RelayBandwidthRate)
+    ri->bandwidthrate = (int)options->RelayBandwidthRate;
+
+  /* and compute ri->bandwidthburst similarly */
   ri->bandwidthburst = (int)options->BandwidthBurst;
   ri->bandwidthburst = (int)options->BandwidthBurst;
-  ri->bandwidthcapacity = hibernating ? 0 : rep_hist_bandwidth_assess();
+  if (options->RelayBandwidthBurst > 0 &&
+      ri->bandwidthburst > options->RelayBandwidthBurst)
+    ri->bandwidthburst = (int)options->RelayBandwidthBurst;
 
 
-  if (options->BandwidthRate > options->MaxAdvertisedBandwidth) {
-    if (options->MaxAdvertisedBandwidth > ROUTER_MAX_DECLARED_BANDWIDTH) {
-      ri->bandwidthrate = ROUTER_MAX_DECLARED_BANDWIDTH;
-    } else {
-      ri->bandwidthrate = (int)options->MaxAdvertisedBandwidth;
-    }
-  }
+  ri->bandwidthcapacity = hibernating ? 0 : rep_hist_bandwidth_assess();
 
 
   policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy,
   policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy,
                              options->ExitPolicyRejectPrivate);
                              options->ExitPolicyRejectPrivate);