diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index e15fc71187..ee324d62bb 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -596,6 +596,21 @@ router_reset_status_download_failures(void)
mark_all_trusteddirservers_up();
}
+/** Look through the routerlist and identify routers that
+ * advertise the same /16 network address as router.
+ * Add each of them to sl.
+ */
+static void
+routerlist_add_network_family(smartlist_t *sl, routerinfo_t *router)
+{
+ SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r,
+ {
+ if (router != r &&
+ (router->addr & 0xffff0000) == (r->addr & 0xffff0000))
+ smartlist_add(sl, r);
+ });
+}
+
/** Add all the family of router to the smartlist sl.
* This is used to make sure we don't pick siblings in a single path.
*/
@@ -605,6 +620,10 @@ routerlist_add_family(smartlist_t *sl, routerinfo_t *router)
routerinfo_t *r;
config_line_t *cl;
+ /* 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 (!router->declared_family)
return;