diff options
author | Gregory Maxwell <gmaxwell@gmail.com> | 2012-05-12 18:55:36 -0700 |
---|---|---|
committer | Gregory Maxwell <gmaxwell@gmail.com> | 2012-05-12 18:55:36 -0700 |
commit | 6f7d45a3239519bb3a18893dea0875e80edc8c42 (patch) | |
tree | 5d1aea56c41131213f378681ebebc334fc5aff3d /src/net.cpp | |
parent | 22db3f2c773a1277310e760e86b6f3ea7e60f522 (diff) | |
parent | 5a3cb32e5942adbfb5af90808013c1dde3c03fcf (diff) |
Merge pull request #1272 from sipa/ipv6fixes
A few IPv6 fixes
Diffstat (limited to 'src/net.cpp')
-rw-r--r-- | src/net.cpp | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/net.cpp b/src/net.cpp index f12afb78e6..951595e680 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -38,6 +38,10 @@ void ThreadDNSAddressSeed2(void* parg); bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false); +struct LocalServiceInfo { + int nScore; + int nPort; +}; // // Global state variables @@ -46,7 +50,7 @@ bool fClient = false; static bool fUseUPnP = false; uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); static CCriticalSection cs_mapLocalHost; -static map<CService, int> mapLocalHost; +static map<CNetAddr, LocalServiceInfo> mapLocalHost; static bool vfReachable[NET_MAX] = {}; static bool vfLimited[NET_MAX] = {}; static CNode* pnodeLocalHost = NULL; @@ -98,23 +102,23 @@ bool GetLocal(CService& addr, const CNetAddr *paddrPeer) if (fUseProxy || mapArgs.count("-connect") || fNoListen) return false; - int nBestCount = -1; + int nBestScore = -1; int nBestReachability = -1; { LOCK(cs_mapLocalHost); - for (map<CService, int>::iterator it = mapLocalHost.begin(); it != mapLocalHost.end(); it++) + for (map<CNetAddr, LocalServiceInfo>::iterator it = mapLocalHost.begin(); it != mapLocalHost.end(); it++) { - int nCount = (*it).second; + int nScore = (*it).second.nScore; int nReachability = (*it).first.GetReachabilityFrom(paddrPeer); - if (nReachability > nBestReachability || (nReachability == nBestReachability && nCount > nBestCount)) + if (nReachability > nBestReachability || (nReachability == nBestReachability && nScore > nBestScore)) { - addr = (*it).first; + addr = CService((*it).first, (*it).second.nPort); nBestReachability = nReachability; - nBestCount = nCount; + nBestScore = nScore; } } } - return nBestCount >= 0; + return nBestScore >= 0; } // get best local address for a particular peer as a CAddress @@ -211,7 +215,12 @@ bool AddLocal(const CService& addr, int nScore) { LOCK(cs_mapLocalHost); - mapLocalHost[addr] = std::max(nScore, mapLocalHost[addr]) + (mapLocalHost.count(addr) ? 1 : 0); + bool fAlready = mapLocalHost.count(addr) > 0; + LocalServiceInfo &info = mapLocalHost[addr]; + if (!fAlready || nScore >= info.nScore) { + info.nScore = nScore; + info.nPort = addr.GetPort() + (fAlready ? 1 : 0); + } enum Network net = addr.GetNetwork(); vfReachable[net] = true; if (net == NET_IPV6) vfReachable[NET_IPV4] = true; @@ -222,11 +231,9 @@ bool AddLocal(const CService& addr, int nScore) return true; } -bool AddLocal(const CNetAddr& addr, int nScore, int port) +bool AddLocal(const CNetAddr &addr, int nScore) { - if (port == -1) - port = GetListenPort(); - return AddLocal(CService(addr, port), nScore); + return AddLocal(CService(addr, GetListenPort()), nScore); } /** Make a particular network entirely off-limits (no automatic connects to it) */ @@ -249,7 +256,7 @@ bool SeenLocal(const CService& addr) LOCK(cs_mapLocalHost); if (mapLocalHost.count(addr) == 0) return false; - mapLocalHost[addr]++; + mapLocalHost[addr].nScore++; } AdvertizeLocal(); @@ -1887,8 +1894,9 @@ bool StopNode() fShutdown = true; nTransactionsUpdated++; int64 nStart = GetTime(); - for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++) - semOutbound->post(); + if (semOutbound) + for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++) + semOutbound->post(); do { int nThreadsRunning = 0; |