@@ -83,9 +83,7 @@ std::map<CNetAddr, LocalServiceInfo> mapLocalHost;
8383static bool vfLimited[NET_MAX] = {};
8484static CNode* pnodeLocalHost = NULL ;
8585uint64_t nLocalHostNonce = 0 ;
86- CAddrMan addrman;
8786int nMaxConnections = DEFAULT_MAX_PEER_CONNECTIONS;
88- bool fAddressesInitialized = false ;
8987std::string strSubVersion;
9088
9189std::vector<CNode*> vNodes;
@@ -456,21 +454,21 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char* pszDest, bool fCo
456454 return NULL ;
457455}
458456
459- static void DumpBanlist ()
457+ void CConnman:: DumpBanlist ()
460458{
461- CNode:: SweepBanned (); // clean unused entries (if bantime has expired)
459+ SweepBanned (); // clean unused entries (if bantime has expired)
462460
463- if (!CNode:: BannedSetIsDirty ())
461+ if (!BannedSetIsDirty ())
464462 return ;
465463
466464 int64_t nStart = GetTimeMillis ();
467465
468466 CBanDB bandb;
469467 banmap_t banmap;
470- CNode:: SetBannedSetDirty (false );
471- CNode:: GetBanned (banmap);
468+ SetBannedSetDirty (false );
469+ GetBanned (banmap);
472470 if (!bandb.Write (banmap))
473- CNode:: SetBannedSetDirty (true );
471+ SetBannedSetDirty (true );
474472
475473 LogPrint (BCLog::NET, " Flushed %d banned node ips/subnets to banlist.dat %dms\n " ,
476474 banmap.size (), GetTimeMillis () - nStart);
@@ -520,11 +518,7 @@ void CNode::PushVersion()
520518}
521519
522520
523- banmap_t CNode::setBanned;
524- RecursiveMutex CNode::cs_setBanned;
525- bool CNode::setBannedIsDirty;
526-
527- void CNode::ClearBanned ()
521+ void CConnman::ClearBanned ()
528522{
529523 {
530524 LOCK (cs_setBanned);
@@ -535,7 +529,7 @@ void CNode::ClearBanned()
535529 uiInterface.BannedListChanged ();
536530}
537531
538- bool CNode ::IsBanned (CNetAddr ip)
532+ bool CConnman ::IsBanned (CNetAddr ip)
539533{
540534 bool fResult = false ;
541535 {
@@ -552,7 +546,7 @@ bool CNode::IsBanned(CNetAddr ip)
552546 return fResult ;
553547}
554548
555- bool CNode ::IsBanned (CSubNet subnet)
549+ bool CConnman ::IsBanned (CSubNet subnet)
556550{
557551 bool fResult = false ;
558552 {
@@ -567,13 +561,13 @@ bool CNode::IsBanned(CSubNet subnet)
567561 return fResult ;
568562}
569563
570- void CNode ::Ban (const CNetAddr& addr, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch)
564+ void CConnman ::Ban (const CNetAddr& addr, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch)
571565{
572566 CSubNet subNet (addr);
573567 Ban (subNet, banReason, bantimeoffset, sinceUnixEpoch);
574568}
575569
576- void CNode ::Ban (const CSubNet& subNet, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch)
570+ void CConnman ::Ban (const CSubNet& subNet, const BanReason &banReason, int64_t bantimeoffset, bool sinceUnixEpoch)
577571{
578572 CBanEntry banEntry (GetTime ());
579573 banEntry.banReason = banReason;
@@ -605,13 +599,13 @@ void CNode::Ban(const CSubNet& subNet, const BanReason &banReason, int64_t banti
605599 DumpBanlist (); // store banlist to disk immediately if user requested ban
606600}
607601
608- bool CNode ::Unban (const CNetAddr &addr)
602+ bool CConnman ::Unban (const CNetAddr &addr)
609603{
610604 CSubNet subNet (addr);
611605 return Unban (subNet);
612606}
613607
614- bool CNode ::Unban (const CSubNet &subNet)
608+ bool CConnman ::Unban (const CSubNet &subNet)
615609{
616610 {
617611 LOCK (cs_setBanned);
@@ -624,20 +618,20 @@ bool CNode::Unban(const CSubNet &subNet)
624618 return true ;
625619}
626620
627- void CNode ::GetBanned (banmap_t &banMap)
621+ void CConnman ::GetBanned (banmap_t &banMap)
628622{
629623 LOCK (cs_setBanned);
630624 banMap = setBanned; // create a thread safe copy
631625}
632626
633- void CNode ::SetBanned (const banmap_t &banMap)
627+ void CConnman ::SetBanned (const banmap_t &banMap)
634628{
635629 LOCK (cs_setBanned);
636630 setBanned = banMap;
637631 setBannedIsDirty = true ;
638632}
639633
640- void CNode ::SweepBanned ()
634+ void CConnman ::SweepBanned ()
641635{
642636 int64_t now = GetTime ();
643637
@@ -666,13 +660,13 @@ void CNode::SweepBanned()
666660 }
667661}
668662
669- bool CNode ::BannedSetIsDirty ()
663+ bool CConnman ::BannedSetIsDirty ()
670664{
671665 LOCK (cs_setBanned);
672666 return setBannedIsDirty;
673667}
674668
675- void CNode ::SetBannedSetDirty (bool dirty)
669+ void CConnman ::SetBannedSetDirty (bool dirty)
676670{
677671 LOCK (cs_setBanned); // reuse setBanned lock for the isDirty flag
678672 setBannedIsDirty = dirty;
@@ -1046,7 +1040,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
10461040 return ;
10471041 }
10481042
1049- if (CNode:: IsBanned (addr) && !whitelisted) {
1043+ if (IsBanned (addr) && !whitelisted) {
10501044 LogPrintf (" connection from %s dropped (banned)\n " , addr.ToString ());
10511045 CloseSocket (hSocket);
10521046 return ;
@@ -1488,7 +1482,17 @@ void CConnman::ThreadDNSAddressSeed()
14881482}
14891483
14901484
1491- void DumpAddresses ()
1485+
1486+
1487+
1488+
1489+
1490+
1491+
1492+
1493+
1494+
1495+ void CConnman::DumpAddresses ()
14921496{
14931497 int64_t nStart = GetTimeMillis ();
14941498
@@ -1499,7 +1503,7 @@ void DumpAddresses()
14991503 addrman.size (), GetTimeMillis () - nStart);
15001504}
15011505
1502- void DumpData ()
1506+ void CConnman:: DumpData ()
15031507{
15041508 DumpAddresses ();
15051509 DumpBanlist ();
@@ -1740,7 +1744,7 @@ bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
17401744 boost::this_thread::interruption_point ();
17411745 if (!pszDest) {
17421746 if (IsLocal (addrConnect) ||
1743- FindNode ((CNetAddr)addrConnect) || CNode:: IsBanned (addrConnect) ||
1747+ FindNode ((CNetAddr)addrConnect) || IsBanned (addrConnect) ||
17441748 FindNode (addrConnect.ToStringIPPort ()))
17451749 return false ;
17461750 } else if (FindNode (pszDest))
@@ -1954,10 +1958,22 @@ void static Discover(boost::thread_group& threadGroup)
19541958
19551959CConnman::CConnman ()
19561960{
1961+ setBannedIsDirty = false ;
1962+ fAddressesInitialized = false ;
19571963}
19581964
19591965bool StartNode (CConnman& connman, boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError)
19601966{
1967+ Discover (threadGroup);
1968+
1969+ bool ret = connman.Start (threadGroup, scheduler, strNodeError);
1970+
1971+ return ret;
1972+ }
1973+
1974+ bool CConnman::Start (boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError)
1975+ {
1976+
19611977 uiInterface.InitMessage (_ (" Loading addresses..." ));
19621978 // Load addresses from peers.dat
19631979 int64_t nStart = GetTimeMillis ();
@@ -1978,15 +1994,15 @@ bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler&
19781994 CBanDB bandb;
19791995 banmap_t banmap;
19801996 if (bandb.Read (banmap)) {
1981- CNode:: SetBanned (banmap); // thread save setter
1982- CNode:: SetBannedSetDirty (false ); // no need to write down, just read data
1983- CNode:: SweepBanned (); // sweep out unused entries
1997+ SetBanned (banmap); // thread save setter
1998+ SetBannedSetDirty (false ); // no need to write down, just read data
1999+ SweepBanned (); // sweep out unused entries
19842000
19852001 LogPrint (BCLog::NET, " Loaded %d banned node ips/subnets from banlist.dat %dms\n " ,
19862002 banmap.size (), GetTimeMillis () - nStart);
19872003 } else {
19882004 LogPrintf (" Invalid or missing banlist.dat; recreating\n " );
1989- CNode:: SetBannedSetDirty (true ); // force write
2005+ SetBannedSetDirty (true ); // force write
19902006 DumpBanlist ();
19912007 }
19922008
@@ -1996,17 +2012,6 @@ bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler&
19962012
19972013 fAddressesInitialized = true ;
19982014
1999- Discover (threadGroup);
2000-
2001- bool ret = connman.Start (threadGroup, strNodeError);
2002-
2003- // Dump network addresses
2004- scheduler.scheduleEvery (DumpData, DUMP_ADDRESSES_INTERVAL);
2005- return ret;
2006- }
2007-
2008- bool CConnman::Start (boost::thread_group& threadGroup, std::string& strNodeError)
2009- {
20102015 if (semOutbound == NULL ) {
20112016 // initialize semaphore
20122017 int nMaxOutbound = std::min ((MAX_OUTBOUND_CONNECTIONS + MAX_FEELER_CONNECTIONS), nMaxConnections);
@@ -2045,6 +2050,9 @@ bool CConnman::Start(boost::thread_group& threadGroup, std::string& strNodeError
20452050 // Process messages
20462051 threadGroup.create_thread (boost::bind (&TraceThread<boost::function<void ()> >, " msghand" , boost::function<void ()>(boost::bind (&CConnman::ThreadMessageHandler, this ))));
20472052
2053+ // Dump network addresses
2054+ scheduler.scheduleEvery (boost::bind (&CConnman::DumpData, this ), DUMP_ADDRESSES_INTERVAL);
2055+
20482056 return true ;
20492057}
20502058
@@ -2053,11 +2061,6 @@ bool StopNode(CConnman& connman)
20532061 LogPrintf (" StopNode()\n " );
20542062 MapPort (false );
20552063
2056- if (fAddressesInitialized ) {
2057- DumpData ();
2058- fAddressesInitialized = false ;
2059- }
2060-
20612064 connman.Stop ();
20622065 return true ;
20632066}
@@ -2091,6 +2094,12 @@ void CConnman::Stop()
20912094 for (int i=0 ; i<(MAX_OUTBOUND_CONNECTIONS + MAX_FEELER_CONNECTIONS); i++)
20922095 semOutbound->post ();
20932096
2097+ if (fAddressesInitialized )
2098+ {
2099+ DumpData ();
2100+ fAddressesInitialized = false ;
2101+ }
2102+
20942103 // Close sockets
20952104 for (CNode* pnode : vNodes)
20962105 if (pnode->hSocket != INVALID_SOCKET)
@@ -2131,6 +2140,36 @@ CConnman::~CConnman()
21312140{
21322141}
21332142
2143+ size_t CConnman::GetAddressCount () const
2144+ {
2145+ return addrman.size ();
2146+ }
2147+
2148+ void CConnman::SetServices (const CService &addr, ServiceFlags nServices)
2149+ {
2150+ addrman.SetServices (addr, nServices);
2151+ }
2152+
2153+ void CConnman::MarkAddressGood (const CAddress& addr)
2154+ {
2155+ addrman.Good (addr);
2156+ }
2157+
2158+ void CConnman::AddNewAddress (const CAddress& addr, const CAddress& addrFrom, int64_t nTimePenalty)
2159+ {
2160+ addrman.Add (addr, addrFrom, nTimePenalty);
2161+ }
2162+
2163+ void CConnman::AddNewAddresses (const std::vector<CAddress>& vAddr, const CAddress& addrFrom, int64_t nTimePenalty)
2164+ {
2165+ addrman.Add (vAddr, addrFrom, nTimePenalty);
2166+ }
2167+
2168+ std::vector<CAddress> CConnman::GetAddresses ()
2169+ {
2170+ return addrman.GetAddr ();
2171+ }
2172+
21342173void RelayTransaction (const CTransaction& tx)
21352174{
21362175 CDataStream ss (SER_NETWORK, PROTOCOL_VERSION);
0 commit comments