changeset 2481:bdf78041eb31 draft

Add -blocknet to prevent connections to a given network
author Pieter Wuille <pieter.wuille@gmail.com>
date Fri, 04 May 2012 16:46:22 +0200
parents 6cdba1bfff00
children 6499c25a47e7
files src/init.cpp src/net.cpp src/net.h
diffstat 3 files changed, 36 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -189,6 +189,7 @@
             "  -connect=<ip>    \t\t  " + _("Connect only to the specified node") + "\n" +
             "  -seednode=<ip>   \t\t  " + _("Connect to a node to retrieve peer addresses, and disconnect") + "\n" +
             "  -externalip=<ip> \t  "   + _("Specify your own public address") + "\n" +
+            "  -blocknet=<net>  \t  "   + _("Do not connect to addresses in network net (ipv4, ipv6)") + "\n" +
             "  -discover        \t  "   + _("Try to discover public IP address (default: 1)") + "\n" +
             "  -irc             \t  "   + _("Find peers using internet relay chat (default: 0)") + "\n" +
             "  -listen          \t  "   + _("Accept connections from outside (default: 1)") + "\n" +
@@ -560,6 +561,17 @@
         SoftSetBoolArg("-discover", false);
     }
 
+    if (mapArgs.count("-blocknet")) {
+        BOOST_FOREACH(std::string snet, mapMultiArgs["-blocknet"]) {
+            enum Network net = ParseNetwork(snet);
+            if (net == NET_UNROUTABLE) {
+                ThreadSafeMessageBox(_("Unknown network specified in -blocknet"), _("Bitcoin"), wxOK | wxMODAL);
+                return false;
+            }
+            SetLimited(net);
+        }
+    }
+
     fNameLookup = GetBoolArg("-dns");
     fProxyNameLookup = GetBoolArg("-proxydns");
     if (fProxyNameLookup)
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -48,6 +48,7 @@
 static CCriticalSection cs_mapLocalHost;
 static map<CNetAddr, int> mapLocalHost;
 static bool vfReachable[NET_MAX] = {};
+static bool vfLimited[NET_MAX] = {};
 static CNode* pnodeLocalHost = NULL;
 uint64 nLocalHostNonce = 0;
 array<int, THREAD_MAX> vnThreadsRunning;
@@ -225,7 +226,20 @@
     return true;
 }
 
-// vote for a local address
+/** Make a particular network entirely off-limits (no automatic connects to it) */
+void SetLimited(enum Network net, bool fLimited)
+{
+    LOCK(cs_mapLocalHost);
+    vfLimited[net] = fLimited;
+}
+
+bool IsLimited(const CNetAddr& addr)
+{
+    LOCK(cs_mapLocalHost);
+    return vfLimited[addr.GetNetwork()];
+}
+
+/** vote for a local address */
 bool SeenLocal(const CNetAddr& addr)
 {
     {
@@ -240,18 +254,19 @@
     return true;
 }
 
-// check whether a given address is potentially local
+/** check whether a given address is potentially local */
 bool IsLocal(const CNetAddr& addr)
 {
     LOCK(cs_mapLocalHost);
     return mapLocalHost.count(addr) > 0;
 }
 
-// check whether a given address is in a network we can probably connect to
+/** check whether a given address is in a network we can probably connect to */
 bool IsReachable(const CNetAddr& addr)
 {
     LOCK(cs_mapLocalHost);
-    return vfReachable[addr.GetNetwork()];
+    enum Network net = addr.GetNetwork();
+    return vfReachable[net] && !vfLimited[net];
 }
 
 bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const char* pszKeyword, CNetAddr& ipRet)
@@ -1409,6 +1424,9 @@
 
             nTries++;
 
+            if (IsLimited(addr))
+                continue;
+
             // only consider very recently tried nodes after 30 failed attempts
             if (nANow - addr.nLastTry < 600 && nTries < 30)
                 continue;
--- a/src/net.h
+++ b/src/net.h
@@ -54,6 +54,8 @@
     LOCAL_MAX
 };
 
+void SetLimited(enum Network net, bool fLimited = true);
+bool IsLimited(const CNetAddr& addr);
 bool AddLocal(const CNetAddr& addr, int nScore = LOCAL_NONE);
 bool SeenLocal(const CNetAddr& addr);
 bool IsLocal(const CNetAddr& addr);