Browse Source

r17548@catbus: nickm | 2008-01-10 11:08:12 -0500
Make proposal-109 behavior optional.


svn:r13090

Nick Mathewson 17 years ago
parent
commit
ca5f670fab
6 changed files with 37 additions and 7 deletions
  1. 5 0
      ChangeLog
  2. 1 1
      doc/TODO
  3. 11 0
      doc/tor.1.in
  4. 2 0
      src/or/config.c
  5. 12 6
      src/or/dirserv.c
  6. 6 0
      src/or/or.h

+ 5 - 0
ChangeLog

@@ -46,6 +46,11 @@ Changes in version 0.2.0.16-alpha - 2008-01-??
       that don't otherwise fit into the torrc file.
       that don't otherwise fit into the torrc file.
     - The SETCONF command now handles quoted values correctly.
     - The SETCONF command now handles quoted values correctly.
 
 
+  o Minor features (directory authorities):
+    - New configuration options to override default maximum number of
+      servers allowed on a single IP address.  This is important
+      for running a test network on a single host.
+
   o Minor features (other):
   o Minor features (other):
     - Add hidden services and DNSPorts to the list of things that make
     - Add hidden services and DNSPorts to the list of things that make
       Tor accept that it has running ports.  Change starting Tor with
       Tor accept that it has running ports.  Change starting Tor with

+ 1 - 1
doc/TODO

@@ -21,7 +21,7 @@ R - Figure out the autoconf problem with adding a fallback consensus.
 R - add a geoip file
 R - add a geoip file
 W   - figure out license
 W   - figure out license
 R - let bridges set relaybandwidthrate as low as 5kb
 R - let bridges set relaybandwidthrate as low as 5kb
-N - we need a config option to turn off proposal 109 behavior,
+  o we need a config option to turn off proposal 109 behavior,
 RK- make it easier to set up a private tor network on your own computer
 RK- make it easier to set up a private tor network on your own computer
     is very hard.
     is very hard.
     - FAQ entry which is wrong
     - FAQ entry which is wrong

+ 11 - 0
doc/tor.1.in

@@ -1129,6 +1129,17 @@ Authoritative directories only.  If set to 1, the directory server
 rejects all uploaded server descriptors that aren't explicitly listed
 rejects all uploaded server descriptors that aren't explicitly listed
 in the fingerprints file. This acts as a "panic button" if we get
 in the fingerprints file. This acts as a "panic button" if we get
 Sybiled. (Default: 0)
 Sybiled. (Default: 0)
+.LP
+.TP
+\fBAuthDirMaxServersPerAddr\fR \fINUM\fP
+Authoritative directories only.  The maximum number of servers that we
+will list as acceptable on a single IP address.  Set this to "0" for
+"no limit". (Default: 2)
+.LP
+.TP
+\fBAuthDirMaxServersPerAuthAddr\fR \fINUM\fP
+Authoritative directories only.  Like AuthDirMaxServersPerAddr, but
+applies to addresses shared with directory authorities.  (Default: 5)
 
 
 .SH HIDDEN SERVICE OPTIONS
 .SH HIDDEN SERVICE OPTIONS
 .PP
 .PP

+ 2 - 0
src/or/config.c

@@ -143,6 +143,8 @@ static config_var_t _option_vars[] = {
   V(AuthDirRejectUnlisted,       BOOL,     "0"),
   V(AuthDirRejectUnlisted,       BOOL,     "0"),
   V(AuthDirListBadDirs,          BOOL,     "0"),
   V(AuthDirListBadDirs,          BOOL,     "0"),
   V(AuthDirListBadExits,         BOOL,     "0"),
   V(AuthDirListBadExits,         BOOL,     "0"),
+  V(AuthDirMaxServersPerAddr,    UINT,     "2"),
+  V(AuthDirMaxServersPerAuthAddr,UINT,     "5"),
   VAR("AuthoritativeDirectory",  BOOL, AuthoritativeDir,    "0"),
   VAR("AuthoritativeDirectory",  BOOL, AuthoritativeDir,    "0"),
   V(AutomapHostsOnResolve,       BOOL,     "0"),
   V(AutomapHostsOnResolve,       BOOL,     "0"),
   V(AutomapHostsSuffixes,        CSV,      ".onion,.exit"),
   V(AutomapHostsSuffixes,        CSV,      ".onion,.exit"),

+ 12 - 6
src/or/dirserv.c

@@ -1965,18 +1965,24 @@ _compare_routerinfo_by_ip_and_bw(const void **a, const void **b)
 static digestmap_t *
 static digestmap_t *
 get_possible_sybil_list(const smartlist_t *routers)
 get_possible_sybil_list(const smartlist_t *routers)
 {
 {
+  or_options_t *options = get_options();
   digestmap_t *omit_as_sybil;
   digestmap_t *omit_as_sybil;
   smartlist_t *routers_by_ip = smartlist_create();
   smartlist_t *routers_by_ip = smartlist_create();
   uint32_t last_addr;
   uint32_t last_addr;
   int addr_count;
   int addr_count;
+  /* Allow at most this number of Tor servers on a single IP address, ... */
+  int max_with_same_addr = options->AuthDirMaxServersPerAddr;
+  /* ... unless it's a directory authority, in which case allow more. */
+  int max_with_same_addr_on_authority = options->AuthDirMaxServersPerAuthAddr;
+  if (max_with_same_addr <= 0)
+    max_with_same_addr = INT_MAX;
+  if (max_with_same_addr_on_authority <= 0)
+    max_with_same_addr_on_authority = INT_MAX;
+
   smartlist_add_all(routers_by_ip, routers);
   smartlist_add_all(routers_by_ip, routers);
   smartlist_sort(routers_by_ip, _compare_routerinfo_by_ip_and_bw);
   smartlist_sort(routers_by_ip, _compare_routerinfo_by_ip_and_bw);
   omit_as_sybil = digestmap_new();
   omit_as_sybil = digestmap_new();
 
 
-/* Allow at most this number of Tor servers on a single IP address, ... */
-#define MAX_WITH_SAME_ADDR 2
-/* ... unless it's a directory authority, in which case allow more. */
-#define MAX_WITH_SAME_ADDR_ON_AUTHORITY 5
   last_addr = 0;
   last_addr = 0;
   addr_count = 0;
   addr_count = 0;
   SMARTLIST_FOREACH(routers_by_ip, routerinfo_t *, ri,
   SMARTLIST_FOREACH(routers_by_ip, routerinfo_t *, ri,
@@ -1984,9 +1990,9 @@ get_possible_sybil_list(const smartlist_t *routers)
       if (last_addr != ri->addr) {
       if (last_addr != ri->addr) {
         last_addr = ri->addr;
         last_addr = ri->addr;
         addr_count = 1;
         addr_count = 1;
-      } else if (++addr_count > MAX_WITH_SAME_ADDR) {
+      } else if (++addr_count > max_with_same_addr) {
         if (!router_addr_is_trusted_dir(ri->addr) ||
         if (!router_addr_is_trusted_dir(ri->addr) ||
-            addr_count > MAX_WITH_SAME_ADDR_ON_AUTHORITY)
+            addr_count > max_with_same_addr_on_authority)
           digestmap_set(omit_as_sybil, ri->cache_info.identity_digest, ri);
           digestmap_set(omit_as_sybil, ri->cache_info.identity_digest, ri);
       }
       }
     });
     });

+ 6 - 0
src/or/or.h

@@ -2240,6 +2240,12 @@ typedef struct {
                             * and vote for all other exits as good. */
                             * and vote for all other exits as good. */
   int AuthDirRejectUnlisted; /**< Boolean: do we reject all routers that
   int AuthDirRejectUnlisted; /**< Boolean: do we reject all routers that
                               * aren't named in our fingerprint file? */
                               * aren't named in our fingerprint file? */
+  int AuthDirMaxServersPerAddr; /**< Do not permit more than this
+                                 * number of servers per IP address. */
+  int AuthDirMaxServersPerAuthAddr; /**< Do not permit more than this
+                                     * number of servers per IP address shared
+                                     * with an authority. */
+
   char *AccountingStart; /**< How long is the accounting interval, and when
   char *AccountingStart; /**< How long is the accounting interval, and when
                           * does it start? */
                           * does it start? */
   uint64_t AccountingMax; /**< How many bytes do we allow per accounting
   uint64_t AccountingMax; /**< How many bytes do we allow per accounting