aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/or/config.c1
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/routerlist.c4
3 files changed, 6 insertions, 1 deletions
diff --git a/src/or/config.c b/src/or/config.c
index 50d986c355..5872ded220 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -152,6 +152,7 @@ static config_var_t _option_vars[] = {
VAR("DirPort", UINT, DirPort, "0"),
OBSOLETE("DirPostPeriod"),
VAR("DirServer", LINELIST, DirServers, NULL),
+ VAR("EnforceDistinctSubnets", BOOL, EnforceDistinctSubnets,"1"),
VAR("EntryNodes", STRING, EntryNodes, NULL),
VAR("ExcludeNodes", STRING, ExcludeNodes, NULL),
VAR("ExitNodes", STRING, ExitNodes, NULL),
diff --git a/src/or/or.h b/src/or/or.h
index bb7d0b6685..4db05824f4 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1581,6 +1581,8 @@ typedef struct {
char *ServerDNSResolvConfFile; /**< If provided, we configure our internal
* resolver from the file here rather than from
* /etc/resolv.conf (Unix) or the registry (Windows). */
+ int EnforceDistinctSubnets; /** If true, don't allow multiple routers in the
+ * same network zone in the same circuit. */
} or_options_t;
/** Persistent state for an onion router, as saved to disk. */
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 7f0dc577d6..ecef569180 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -629,10 +629,12 @@ routerlist_add_family(smartlist_t *sl, routerinfo_t *router)
{
routerinfo_t *r;
config_line_t *cl;
+ or_options_t *options = get_options();
/* First, add any routers with similar network addresses.
* XXX It's possible this will be really expensive; we'll see. */
- routerlist_add_network_family(sl, router);
+ if (options->EnforceDistinctSubnets)
+ routerlist_add_network_family(sl, router);
if (!router->declared_family)
return;