LCOV - code coverage report
Current view: top level - src - net.h (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 0.0 % 176 0
Test Date: 2024-11-22 13:43:01 Functions: 0.0 % 21 0
Branches: 0.0 % 779 0

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2009-2010 Satoshi Nakamoto
       2                 :             : // Copyright (c) 2009-2022 The Bitcoin Core developers
       3                 :             : // Distributed under the MIT software license, see the accompanying
       4                 :             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5                 :             : 
       6                 :             : #ifndef BITCOIN_NET_H
       7                 :             : #define BITCOIN_NET_H
       8                 :             : 
       9                 :             : #include <bip324.h>
      10                 :             : #include <chainparams.h>
      11                 :             : #include <common/bloom.h>
      12                 :             : #include <compat/compat.h>
      13                 :             : #include <consensus/amount.h>
      14                 :             : #include <crypto/siphash.h>
      15                 :             : #include <hash.h>
      16                 :             : #include <i2p.h>
      17                 :             : #include <kernel/messagestartchars.h>
      18                 :             : #include <net_permissions.h>
      19                 :             : #include <netaddress.h>
      20                 :             : #include <netbase.h>
      21                 :             : #include <netgroup.h>
      22                 :             : #include <node/connection_types.h>
      23                 :             : #include <node/protocol_version.h>
      24                 :             : #include <policy/feerate.h>
      25                 :             : #include <protocol.h>
      26                 :             : #include <random.h>
      27                 :             : #include <span.h>
      28                 :             : #include <streams.h>
      29                 :             : #include <sync.h>
      30                 :             : #include <uint256.h>
      31                 :             : #include <util/check.h>
      32                 :             : #include <util/sock.h>
      33                 :             : #include <util/threadinterrupt.h>
      34                 :             : 
      35                 :             : #include <atomic>
      36                 :             : #include <condition_variable>
      37                 :             : #include <cstdint>
      38                 :             : #include <deque>
      39                 :             : #include <functional>
      40                 :             : #include <list>
      41                 :             : #include <map>
      42                 :             : #include <memory>
      43                 :             : #include <optional>
      44                 :             : #include <queue>
      45                 :             : #include <thread>
      46                 :             : #include <unordered_set>
      47                 :             : #include <vector>
      48                 :             : 
      49                 :             : class AddrMan;
      50                 :             : class BanMan;
      51                 :             : class CChainParams;
      52                 :             : class CNode;
      53                 :             : class CScheduler;
      54                 :             : struct bilingual_str;
      55                 :             : 
      56                 :             : /** Time after which to disconnect, after waiting for a ping response (or inactivity). */
      57                 :             : static constexpr std::chrono::minutes TIMEOUT_INTERVAL{20};
      58                 :             : /** Run the feeler connection loop once every 2 minutes. **/
      59                 :             : static constexpr auto FEELER_INTERVAL = 2min;
      60                 :             : /** Run the extra block-relay-only connection loop once every 5 minutes. **/
      61                 :             : static constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL = 5min;
      62                 :             : /** Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable). */
      63                 :             : static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH = 4 * 1000 * 1000;
      64                 :             : /** Maximum length of the user agent string in `version` message */
      65                 :             : static const unsigned int MAX_SUBVERSION_LENGTH = 256;
      66                 :             : /** Maximum number of automatic outgoing nodes over which we'll relay everything (blocks, tx, addrs, etc) */
      67                 :             : static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS = 8;
      68                 :             : /** Maximum number of addnode outgoing nodes */
      69                 :             : static const int MAX_ADDNODE_CONNECTIONS = 8;
      70                 :             : /** Maximum number of block-relay-only outgoing connections */
      71                 :             : static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS = 2;
      72                 :             : /** Maximum number of feeler connections */
      73                 :             : static const int MAX_FEELER_CONNECTIONS = 1;
      74                 :             : /** -listen default */
      75                 :             : static const bool DEFAULT_LISTEN = true;
      76                 :             : /** The maximum number of peer connections to maintain. */
      77                 :             : static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
      78                 :             : /** The default for -maxuploadtarget. 0 = Unlimited */
      79                 :             : static const std::string DEFAULT_MAX_UPLOAD_TARGET{"0M"};
      80                 :             : /** Default for blocks only*/
      81                 :             : static const bool DEFAULT_BLOCKSONLY = false;
      82                 :             : /** -peertimeout default */
      83                 :             : static const int64_t DEFAULT_PEER_CONNECT_TIMEOUT = 60;
      84                 :             : /** Number of file descriptors required for message capture **/
      85                 :             : static const int NUM_FDS_MESSAGE_CAPTURE = 1;
      86                 :             : /** Interval for ASMap Health Check **/
      87                 :             : static constexpr std::chrono::hours ASMAP_HEALTH_CHECK_INTERVAL{24};
      88                 :             : 
      89                 :             : static constexpr bool DEFAULT_FORCEDNSSEED{false};
      90                 :             : static constexpr bool DEFAULT_DNSSEED{true};
      91                 :             : static constexpr bool DEFAULT_FIXEDSEEDS{true};
      92                 :             : static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000;
      93                 :             : static const size_t DEFAULT_MAXSENDBUFFER    = 1 * 1000;
      94                 :             : 
      95                 :             : static constexpr bool DEFAULT_V2_TRANSPORT{true};
      96                 :             : 
      97                 :             : typedef int64_t NodeId;
      98                 :             : 
      99   [ #  #  #  #  :           0 : struct AddedNodeParams {
             #  #  #  # ]
                 [ #  # ]
     100                 :             :     std::string m_added_node;
     101                 :             :     bool m_use_v2transport;
     102                 :             : };
     103                 :             : 
     104                 :           0 : struct AddedNodeInfo {
     105                 :             :     AddedNodeParams m_params;
     106                 :             :     CService resolvedAddress;
     107                 :             :     bool fConnected;
     108                 :             :     bool fInbound;
     109                 :             : };
     110                 :             : 
     111                 :             : class CNodeStats;
     112                 :             : class CClientUIInterface;
     113                 :             : 
     114                 :           0 : struct CSerializedNetMsg {
     115         [ #  # ]:           0 :     CSerializedNetMsg() = default;
     116                 :           0 :     CSerializedNetMsg(CSerializedNetMsg&&) = default;
     117                 :           0 :     CSerializedNetMsg& operator=(CSerializedNetMsg&&) = default;
     118                 :             :     // No implicit copying, only moves.
     119                 :             :     CSerializedNetMsg(const CSerializedNetMsg& msg) = delete;
     120                 :             :     CSerializedNetMsg& operator=(const CSerializedNetMsg&) = delete;
     121                 :             : 
     122                 :           0 :     CSerializedNetMsg Copy() const
     123                 :             :     {
     124         [ #  # ]:           0 :         CSerializedNetMsg copy;
     125         [ #  # ]:           0 :         copy.data = data;
     126         [ #  # ]:           0 :         copy.m_type = m_type;
     127                 :           0 :         return copy;
     128                 :           0 :     }
     129                 :             : 
     130                 :             :     std::vector<unsigned char> data;
     131                 :             :     std::string m_type;
     132                 :             : 
     133                 :             :     /** Compute total memory usage of this object (own memory + any dynamic memory). */
     134                 :             :     size_t GetMemoryUsage() const noexcept;
     135                 :             : };
     136                 :             : 
     137                 :             : /**
     138                 :             :  * Look up IP addresses from all interfaces on the machine and add them to the
     139                 :             :  * list of local addresses to self-advertise.
     140                 :             :  * The loopback interface is skipped.
     141                 :             :  */
     142                 :             : void Discover();
     143                 :             : 
     144                 :             : uint16_t GetListenPort();
     145                 :             : 
     146                 :             : enum
     147                 :             : {
     148                 :             :     LOCAL_NONE,   // unknown
     149                 :             :     LOCAL_IF,     // address a local interface listens on
     150                 :             :     LOCAL_BIND,   // address explicit bound to
     151                 :             :     LOCAL_MAPPED, // address reported by PCP
     152                 :             :     LOCAL_MANUAL, // address explicitly specified (-externalip=)
     153                 :             : 
     154                 :             :     LOCAL_MAX
     155                 :             : };
     156                 :             : 
     157                 :             : /** Returns a local address that we should advertise to this peer. */
     158                 :             : std::optional<CService> GetLocalAddrForPeer(CNode& node);
     159                 :             : 
     160                 :             : bool AddLocal(const CService& addr, int nScore = LOCAL_NONE);
     161                 :             : bool AddLocal(const CNetAddr& addr, int nScore = LOCAL_NONE);
     162                 :             : void RemoveLocal(const CService& addr);
     163                 :             : bool SeenLocal(const CService& addr);
     164                 :             : bool IsLocal(const CService& addr);
     165                 :             : CService GetLocalAddress(const CNode& peer);
     166                 :             : 
     167                 :             : extern bool fDiscover;
     168                 :             : extern bool fListen;
     169                 :             : 
     170                 :             : /** Subversion as sent to the P2P network in `version` messages */
     171                 :             : extern std::string strSubVersion;
     172                 :             : 
     173                 :             : struct LocalServiceInfo {
     174                 :             :     int nScore;
     175                 :             :     uint16_t nPort;
     176                 :             : };
     177                 :             : 
     178                 :             : extern GlobalMutex g_maplocalhost_mutex;
     179                 :             : extern std::map<CNetAddr, LocalServiceInfo> mapLocalHost GUARDED_BY(g_maplocalhost_mutex);
     180                 :             : 
     181                 :             : extern const std::string NET_MESSAGE_TYPE_OTHER;
     182                 :             : using mapMsgTypeSize = std::map</* message type */ std::string, /* total bytes */ uint64_t>;
     183                 :             : 
     184                 :             : class CNodeStats
     185                 :             : {
     186                 :             : public:
     187                 :             :     NodeId nodeid;
     188                 :             :     std::chrono::seconds m_last_send;
     189                 :             :     std::chrono::seconds m_last_recv;
     190                 :             :     std::chrono::seconds m_last_tx_time;
     191                 :             :     std::chrono::seconds m_last_block_time;
     192                 :             :     std::chrono::seconds m_connected;
     193                 :             :     std::string m_addr_name;
     194                 :             :     int nVersion;
     195                 :             :     std::string cleanSubVer;
     196                 :             :     bool fInbound;
     197                 :             :     // We requested high bandwidth connection to peer
     198                 :             :     bool m_bip152_highbandwidth_to;
     199                 :             :     // Peer requested high bandwidth connection
     200                 :             :     bool m_bip152_highbandwidth_from;
     201                 :             :     int m_starting_height;
     202                 :             :     uint64_t nSendBytes;
     203                 :             :     mapMsgTypeSize mapSendBytesPerMsgType;
     204                 :             :     uint64_t nRecvBytes;
     205                 :             :     mapMsgTypeSize mapRecvBytesPerMsgType;
     206                 :             :     NetPermissionFlags m_permission_flags;
     207                 :             :     std::chrono::microseconds m_last_ping_time;
     208                 :             :     std::chrono::microseconds m_min_ping_time;
     209                 :             :     // Our address, as reported by the peer
     210                 :             :     std::string addrLocal;
     211                 :             :     // Address of this peer
     212                 :             :     CAddress addr;
     213                 :             :     // Bind address of our side of the connection
     214                 :             :     CAddress addrBind;
     215                 :             :     // Network the peer connected through
     216                 :             :     Network m_network;
     217                 :             :     uint32_t m_mapped_as;
     218                 :             :     ConnectionType m_conn_type;
     219                 :             :     /** Transport protocol type. */
     220                 :             :     TransportProtocolType m_transport_type;
     221                 :             :     /** BIP324 session id string in hex, if any. */
     222                 :             :     std::string m_session_id;
     223                 :             : };
     224                 :             : 
     225                 :             : 
     226                 :             : /** Transport protocol agnostic message container.
     227                 :             :  * Ideally it should only contain receive time, payload,
     228                 :             :  * type and size.
     229                 :             :  */
     230                 :           0 : class CNetMessage
     231                 :             : {
     232                 :             : public:
     233                 :             :     DataStream m_recv;                   //!< received message data
     234                 :             :     std::chrono::microseconds m_time{0}; //!< time of message receipt
     235                 :             :     uint32_t m_message_size{0};          //!< size of the payload
     236                 :             :     uint32_t m_raw_message_size{0};      //!< used wire size of the message (including header/checksum)
     237                 :             :     std::string m_type;
     238                 :             : 
     239         [ #  # ]:           0 :     explicit CNetMessage(DataStream&& recv_in) : m_recv(std::move(recv_in)) {}
     240                 :             :     // Only one CNetMessage object will exist for the same message on either
     241                 :             :     // the receive or processing queue. For performance reasons we therefore
     242                 :             :     // delete the copy constructor and assignment operator to avoid the
     243                 :             :     // possibility of copying CNetMessage objects.
     244                 :           0 :     CNetMessage(CNetMessage&&) = default;
     245                 :             :     CNetMessage(const CNetMessage&) = delete;
     246                 :             :     CNetMessage& operator=(CNetMessage&&) = default;
     247                 :             :     CNetMessage& operator=(const CNetMessage&) = delete;
     248                 :             : 
     249                 :             :     /** Compute total memory usage of this object (own memory + any dynamic memory). */
     250                 :             :     size_t GetMemoryUsage() const noexcept;
     251                 :             : };
     252                 :             : 
     253                 :             : /** The Transport converts one connection's sent messages to wire bytes, and received bytes back. */
     254                 :           0 : class Transport {
     255                 :             : public:
     256                 :             :     virtual ~Transport() = default;
     257                 :             : 
     258         [ #  # ]:           0 :     struct Info
     259                 :             :     {
     260                 :             :         TransportProtocolType transport_type;
     261                 :             :         std::optional<uint256> session_id;
     262                 :             :     };
     263                 :             : 
     264                 :             :     /** Retrieve information about this transport. */
     265                 :             :     virtual Info GetInfo() const noexcept = 0;
     266                 :             : 
     267                 :             :     // 1. Receiver side functions, for decoding bytes received on the wire into transport protocol
     268                 :             :     // agnostic CNetMessage (message type & payload) objects.
     269                 :             : 
     270                 :             :     /** Returns true if the current message is complete (so GetReceivedMessage can be called). */
     271                 :             :     virtual bool ReceivedMessageComplete() const = 0;
     272                 :             : 
     273                 :             :     /** Feed wire bytes to the transport.
     274                 :             :      *
     275                 :             :      * @return false if some bytes were invalid, in which case the transport can't be used anymore.
     276                 :             :      *
     277                 :             :      * Consumed bytes are chopped off the front of msg_bytes.
     278                 :             :      */
     279                 :             :     virtual bool ReceivedBytes(Span<const uint8_t>& msg_bytes) = 0;
     280                 :             : 
     281                 :             :     /** Retrieve a completed message from transport.
     282                 :             :      *
     283                 :             :      * This can only be called when ReceivedMessageComplete() is true.
     284                 :             :      *
     285                 :             :      * If reject_message=true is returned the message itself is invalid, but (other than false
     286                 :             :      * returned by ReceivedBytes) the transport is not in an inconsistent state.
     287                 :             :      */
     288                 :             :     virtual CNetMessage GetReceivedMessage(std::chrono::microseconds time, bool& reject_message) = 0;
     289                 :             : 
     290                 :             :     // 2. Sending side functions, for converting messages into bytes to be sent over the wire.
     291                 :             : 
     292                 :             :     /** Set the next message to send.
     293                 :             :      *
     294                 :             :      * If no message can currently be set (perhaps because the previous one is not yet done being
     295                 :             :      * sent), returns false, and msg will be unmodified. Otherwise msg is enqueued (and
     296                 :             :      * possibly moved-from) and true is returned.
     297                 :             :      */
     298                 :             :     virtual bool SetMessageToSend(CSerializedNetMsg& msg) noexcept = 0;
     299                 :             : 
     300                 :             :     /** Return type for GetBytesToSend, consisting of:
     301                 :             :      *  - Span<const uint8_t> to_send: span of bytes to be sent over the wire (possibly empty).
     302                 :             :      *  - bool more: whether there will be more bytes to be sent after the ones in to_send are
     303                 :             :      *    all sent (as signaled by MarkBytesSent()).
     304                 :             :      *  - const std::string& m_type: message type on behalf of which this is being sent
     305                 :             :      *    ("" for bytes that are not on behalf of any message).
     306                 :             :      */
     307                 :             :     using BytesToSend = std::tuple<
     308                 :             :         Span<const uint8_t> /*to_send*/,
     309                 :             :         bool /*more*/,
     310                 :             :         const std::string& /*m_type*/
     311                 :             :     >;
     312                 :             : 
     313                 :             :     /** Get bytes to send on the wire, if any, along with other information about it.
     314                 :             :      *
     315                 :             :      * As a const function, it does not modify the transport's observable state, and is thus safe
     316                 :             :      * to be called multiple times.
     317                 :             :      *
     318                 :             :      * @param[in] have_next_message If true, the "more" return value reports whether more will
     319                 :             :      *            be sendable after a SetMessageToSend call. It is set by the caller when they know
     320                 :             :      *            they have another message ready to send, and only care about what happens
     321                 :             :      *            after that. The have_next_message argument only affects this "more" return value
     322                 :             :      *            and nothing else.
     323                 :             :      *
     324                 :             :      *            Effectively, there are three possible outcomes about whether there are more bytes
     325                 :             :      *            to send:
     326                 :             :      *            - Yes:     the transport itself has more bytes to send later. For example, for
     327                 :             :      *                       V1Transport this happens during the sending of the header of a
     328                 :             :      *                       message, when there is a non-empty payload that follows.
     329                 :             :      *            - No:      the transport itself has no more bytes to send, but will have bytes to
     330                 :             :      *                       send if handed a message through SetMessageToSend. In V1Transport this
     331                 :             :      *                       happens when sending the payload of a message.
     332                 :             :      *            - Blocked: the transport itself has no more bytes to send, and is also incapable
     333                 :             :      *                       of sending anything more at all now, if it were handed another
     334                 :             :      *                       message to send. This occurs in V2Transport before the handshake is
     335                 :             :      *                       complete, as the encryption ciphers are not set up for sending
     336                 :             :      *                       messages before that point.
     337                 :             :      *
     338                 :             :      *            The boolean 'more' is true for Yes, false for Blocked, and have_next_message
     339                 :             :      *            controls what is returned for No.
     340                 :             :      *
     341                 :             :      * @return a BytesToSend object. The to_send member returned acts as a stream which is only
     342                 :             :      *         ever appended to. This means that with the exception of MarkBytesSent (which pops
     343                 :             :      *         bytes off the front of later to_sends), operations on the transport can only append
     344                 :             :      *         to what is being returned. Also note that m_type and to_send refer to data that is
     345                 :             :      *         internal to the transport, and calling any non-const function on this object may
     346                 :             :      *         invalidate them.
     347                 :             :      */
     348                 :             :     virtual BytesToSend GetBytesToSend(bool have_next_message) const noexcept = 0;
     349                 :             : 
     350                 :             :     /** Report how many bytes returned by the last GetBytesToSend() have been sent.
     351                 :             :      *
     352                 :             :      * bytes_sent cannot exceed to_send.size() of the last GetBytesToSend() result.
     353                 :             :      *
     354                 :             :      * If bytes_sent=0, this call has no effect.
     355                 :             :      */
     356                 :             :     virtual void MarkBytesSent(size_t bytes_sent) noexcept = 0;
     357                 :             : 
     358                 :             :     /** Return the memory usage of this transport attributable to buffered data to send. */
     359                 :             :     virtual size_t GetSendMemoryUsage() const noexcept = 0;
     360                 :             : 
     361                 :             :     // 3. Miscellaneous functions.
     362                 :             : 
     363                 :             :     /** Whether upon disconnections, a reconnect with V1 is warranted. */
     364                 :             :     virtual bool ShouldReconnectV1() const noexcept = 0;
     365                 :             : };
     366                 :             : 
     367                 :             : class V1Transport final : public Transport
     368                 :             : {
     369                 :             : private:
     370                 :             :     const MessageStartChars m_magic_bytes;
     371                 :             :     const NodeId m_node_id; // Only for logging
     372                 :             :     mutable Mutex m_recv_mutex; //!< Lock for receive state
     373                 :             :     mutable CHash256 hasher GUARDED_BY(m_recv_mutex);
     374                 :             :     mutable uint256 data_hash GUARDED_BY(m_recv_mutex);
     375                 :             :     bool in_data GUARDED_BY(m_recv_mutex); // parsing header (false) or data (true)
     376                 :             :     DataStream hdrbuf GUARDED_BY(m_recv_mutex){}; // partially received header
     377                 :             :     CMessageHeader hdr GUARDED_BY(m_recv_mutex); // complete header
     378                 :             :     DataStream vRecv GUARDED_BY(m_recv_mutex){}; // received message data
     379                 :             :     unsigned int nHdrPos GUARDED_BY(m_recv_mutex);
     380                 :             :     unsigned int nDataPos GUARDED_BY(m_recv_mutex);
     381                 :             : 
     382                 :             :     const uint256& GetMessageHash() const EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     383                 :             :     int readHeader(Span<const uint8_t> msg_bytes) EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     384                 :             :     int readData(Span<const uint8_t> msg_bytes) EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     385                 :             : 
     386                 :           0 :     void Reset() EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex) {
     387                 :           0 :         AssertLockHeld(m_recv_mutex);
     388         [ #  # ]:           0 :         vRecv.clear();
     389         [ #  # ]:           0 :         hdrbuf.clear();
     390                 :           0 :         hdrbuf.resize(24);
     391                 :           0 :         in_data = false;
     392                 :           0 :         nHdrPos = 0;
     393                 :           0 :         nDataPos = 0;
     394                 :           0 :         data_hash.SetNull();
     395                 :           0 :         hasher.Reset();
     396                 :           0 :     }
     397                 :             : 
     398                 :           0 :     bool CompleteInternal() const noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
     399                 :             :     {
     400                 :           0 :         AssertLockHeld(m_recv_mutex);
     401         [ #  # ]:           0 :         if (!in_data) return false;
     402         [ #  # ]:           0 :         return hdr.nMessageSize == nDataPos;
     403                 :             :     }
     404                 :             : 
     405                 :             :     /** Lock for sending state. */
     406                 :             :     mutable Mutex m_send_mutex;
     407                 :             :     /** The header of the message currently being sent. */
     408                 :             :     std::vector<uint8_t> m_header_to_send GUARDED_BY(m_send_mutex);
     409                 :             :     /** The data of the message currently being sent. */
     410                 :             :     CSerializedNetMsg m_message_to_send GUARDED_BY(m_send_mutex);
     411                 :             :     /** Whether we're currently sending header bytes or message bytes. */
     412                 :             :     bool m_sending_header GUARDED_BY(m_send_mutex) {false};
     413                 :             :     /** How many bytes have been sent so far (from m_header_to_send, or from m_message_to_send.data). */
     414                 :             :     size_t m_bytes_sent GUARDED_BY(m_send_mutex) {0};
     415                 :             : 
     416                 :             : public:
     417                 :             :     explicit V1Transport(const NodeId node_id) noexcept;
     418                 :             : 
     419                 :           0 :     bool ReceivedMessageComplete() const override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
     420                 :             :     {
     421                 :           0 :         AssertLockNotHeld(m_recv_mutex);
     422   [ #  #  #  #  :           0 :         return WITH_LOCK(m_recv_mutex, return CompleteInternal());
                   #  # ]
           [ #  #  #  # ]
     423                 :             :     }
     424                 :             : 
     425                 :             :     Info GetInfo() const noexcept override;
     426                 :             : 
     427                 :           0 :     bool ReceivedBytes(Span<const uint8_t>& msg_bytes) override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
     428                 :             :     {
     429                 :           0 :         AssertLockNotHeld(m_recv_mutex);
     430                 :           0 :         LOCK(m_recv_mutex);
     431   [ #  #  #  #  :           0 :         int ret = in_data ? readData(msg_bytes) : readHeader(msg_bytes);
                   #  # ]
     432         [ #  # ]:           0 :         if (ret < 0) {
     433         [ #  # ]:           0 :             Reset();
     434                 :             :         } else {
     435                 :           0 :             msg_bytes = msg_bytes.subspan(ret);
     436                 :             :         }
     437         [ #  # ]:           0 :         return ret >= 0;
     438                 :           0 :     }
     439                 :             : 
     440                 :             :     CNetMessage GetReceivedMessage(std::chrono::microseconds time, bool& reject_message) override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex);
     441                 :             : 
     442                 :             :     bool SetMessageToSend(CSerializedNetMsg& msg) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     443                 :             :     BytesToSend GetBytesToSend(bool have_next_message) const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     444                 :             :     void MarkBytesSent(size_t bytes_sent) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     445                 :             :     size_t GetSendMemoryUsage() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     446                 :           0 :     bool ShouldReconnectV1() const noexcept override { return false; }
     447                 :             : };
     448                 :             : 
     449                 :             : class V2Transport final : public Transport
     450                 :             : {
     451                 :             : private:
     452                 :             :     /** Contents of the version packet to send. BIP324 stipulates that senders should leave this
     453                 :             :      *  empty, and receivers should ignore it. Future extensions can change what is sent as long as
     454                 :             :      *  an empty version packet contents is interpreted as no extensions supported. */
     455                 :             :     static constexpr std::array<std::byte, 0> VERSION_CONTENTS = {};
     456                 :             : 
     457                 :             :     /** The length of the V1 prefix to match bytes initially received by responders with to
     458                 :             :      *  determine if their peer is speaking V1 or V2. */
     459                 :             :     static constexpr size_t V1_PREFIX_LEN = 16;
     460                 :             : 
     461                 :             :     // The sender side and receiver side of V2Transport are state machines that are transitioned
     462                 :             :     // through, based on what has been received. The receive state corresponds to the contents of,
     463                 :             :     // and bytes received to, the receive buffer. The send state controls what can be appended to
     464                 :             :     // the send buffer and what can be sent from it.
     465                 :             : 
     466                 :             :     /** State type that defines the current contents of the receive buffer and/or how the next
     467                 :             :      *  received bytes added to it will be interpreted.
     468                 :             :      *
     469                 :             :      * Diagram:
     470                 :             :      *
     471                 :             :      *   start(responder)
     472                 :             :      *        |
     473                 :             :      *        |  start(initiator)                           /---------\
     474                 :             :      *        |          |                                  |         |
     475                 :             :      *        v          v                                  v         |
     476                 :             :      *  KEY_MAYBE_V1 -> KEY -> GARB_GARBTERM -> VERSION -> APP -> APP_READY
     477                 :             :      *        |
     478                 :             :      *        \-------> V1
     479                 :             :      */
     480                 :             :     enum class RecvState : uint8_t {
     481                 :             :         /** (Responder only) either v2 public key or v1 header.
     482                 :             :          *
     483                 :             :          * This is the initial state for responders, before data has been received to distinguish
     484                 :             :          * v1 from v2 connections. When that happens, the state becomes either KEY (for v2) or V1
     485                 :             :          * (for v1). */
     486                 :             :         KEY_MAYBE_V1,
     487                 :             : 
     488                 :             :         /** Public key.
     489                 :             :          *
     490                 :             :          * This is the initial state for initiators, during which the other side's public key is
     491                 :             :          * received. When that information arrives, the ciphers get initialized and the state
     492                 :             :          * becomes GARB_GARBTERM. */
     493                 :             :         KEY,
     494                 :             : 
     495                 :             :         /** Garbage and garbage terminator.
     496                 :             :          *
     497                 :             :          * Whenever a byte is received, the last 16 bytes are compared with the expected garbage
     498                 :             :          * terminator. When that happens, the state becomes VERSION. If no matching terminator is
     499                 :             :          * received in 4111 bytes (4095 for the maximum garbage length, and 16 bytes for the
     500                 :             :          * terminator), the connection aborts. */
     501                 :             :         GARB_GARBTERM,
     502                 :             : 
     503                 :             :         /** Version packet.
     504                 :             :          *
     505                 :             :          * A packet is received, and decrypted/verified. If that fails, the connection aborts. The
     506                 :             :          * first received packet in this state (whether it's a decoy or not) is expected to
     507                 :             :          * authenticate the garbage received during the GARB_GARBTERM state as associated
     508                 :             :          * authenticated data (AAD). The first non-decoy packet in this state is interpreted as
     509                 :             :          * version negotiation (currently, that means ignoring the contents, but it can be used for
     510                 :             :          * negotiating future extensions), and afterwards the state becomes APP. */
     511                 :             :         VERSION,
     512                 :             : 
     513                 :             :         /** Application packet.
     514                 :             :          *
     515                 :             :          * A packet is received, and decrypted/verified. If that succeeds, the state becomes
     516                 :             :          * APP_READY and the decrypted contents is kept in m_recv_decode_buffer until it is
     517                 :             :          * retrieved as a message by GetMessage(). */
     518                 :             :         APP,
     519                 :             : 
     520                 :             :         /** Nothing (an application packet is available for GetMessage()).
     521                 :             :          *
     522                 :             :          * Nothing can be received in this state. When the message is retrieved by GetMessage,
     523                 :             :          * the state becomes APP again. */
     524                 :             :         APP_READY,
     525                 :             : 
     526                 :             :         /** Nothing (this transport is using v1 fallback).
     527                 :             :          *
     528                 :             :          * All receive operations are redirected to m_v1_fallback. */
     529                 :             :         V1,
     530                 :             :     };
     531                 :             : 
     532                 :             :     /** State type that controls the sender side.
     533                 :             :      *
     534                 :             :      * Diagram:
     535                 :             :      *
     536                 :             :      *  start(responder)
     537                 :             :      *      |
     538                 :             :      *      |      start(initiator)
     539                 :             :      *      |            |
     540                 :             :      *      v            v
     541                 :             :      *  MAYBE_V1 -> AWAITING_KEY -> READY
     542                 :             :      *      |
     543                 :             :      *      \-----> V1
     544                 :             :      */
     545                 :             :     enum class SendState : uint8_t {
     546                 :             :         /** (Responder only) Not sending until v1 or v2 is detected.
     547                 :             :          *
     548                 :             :          * This is the initial state for responders. The send buffer is empty.
     549                 :             :          * When the receiver determines whether this
     550                 :             :          * is a V1 or V2 connection, the sender state becomes AWAITING_KEY (for v2) or V1 (for v1).
     551                 :             :          */
     552                 :             :         MAYBE_V1,
     553                 :             : 
     554                 :             :         /** Waiting for the other side's public key.
     555                 :             :          *
     556                 :             :          * This is the initial state for initiators. The public key and garbage is sent out. When
     557                 :             :          * the receiver receives the other side's public key and transitions to GARB_GARBTERM, the
     558                 :             :          * sender state becomes READY. */
     559                 :             :         AWAITING_KEY,
     560                 :             : 
     561                 :             :         /** Normal sending state.
     562                 :             :          *
     563                 :             :          * In this state, the ciphers are initialized, so packets can be sent. When this state is
     564                 :             :          * entered, the garbage terminator and version packet are appended to the send buffer (in
     565                 :             :          * addition to the key and garbage which may still be there). In this state a message can be
     566                 :             :          * provided if the send buffer is empty. */
     567                 :             :         READY,
     568                 :             : 
     569                 :             :         /** This transport is using v1 fallback.
     570                 :             :          *
     571                 :             :          * All send operations are redirected to m_v1_fallback. */
     572                 :             :         V1,
     573                 :             :     };
     574                 :             : 
     575                 :             :     /** Cipher state. */
     576                 :             :     BIP324Cipher m_cipher;
     577                 :             :     /** Whether we are the initiator side. */
     578                 :             :     const bool m_initiating;
     579                 :             :     /** NodeId (for debug logging). */
     580                 :             :     const NodeId m_nodeid;
     581                 :             :     /** Encapsulate a V1Transport to fall back to. */
     582                 :             :     V1Transport m_v1_fallback;
     583                 :             : 
     584                 :             :     /** Lock for receiver-side fields. */
     585                 :             :     mutable Mutex m_recv_mutex ACQUIRED_BEFORE(m_send_mutex);
     586                 :             :     /** In {VERSION, APP}, the decrypted packet length, if m_recv_buffer.size() >=
     587                 :             :      *  BIP324Cipher::LENGTH_LEN. Unspecified otherwise. */
     588                 :             :     uint32_t m_recv_len GUARDED_BY(m_recv_mutex) {0};
     589                 :             :     /** Receive buffer; meaning is determined by m_recv_state. */
     590                 :             :     std::vector<uint8_t> m_recv_buffer GUARDED_BY(m_recv_mutex);
     591                 :             :     /** AAD expected in next received packet (currently used only for garbage). */
     592                 :             :     std::vector<uint8_t> m_recv_aad GUARDED_BY(m_recv_mutex);
     593                 :             :     /** Buffer to put decrypted contents in, for converting to CNetMessage. */
     594                 :             :     std::vector<uint8_t> m_recv_decode_buffer GUARDED_BY(m_recv_mutex);
     595                 :             :     /** Current receiver state. */
     596                 :             :     RecvState m_recv_state GUARDED_BY(m_recv_mutex);
     597                 :             : 
     598                 :             :     /** Lock for sending-side fields. If both sending and receiving fields are accessed,
     599                 :             :      *  m_recv_mutex must be acquired before m_send_mutex. */
     600                 :             :     mutable Mutex m_send_mutex ACQUIRED_AFTER(m_recv_mutex);
     601                 :             :     /** The send buffer; meaning is determined by m_send_state. */
     602                 :             :     std::vector<uint8_t> m_send_buffer GUARDED_BY(m_send_mutex);
     603                 :             :     /** How many bytes from the send buffer have been sent so far. */
     604                 :             :     uint32_t m_send_pos GUARDED_BY(m_send_mutex) {0};
     605                 :             :     /** The garbage sent, or to be sent (MAYBE_V1 and AWAITING_KEY state only). */
     606                 :             :     std::vector<uint8_t> m_send_garbage GUARDED_BY(m_send_mutex);
     607                 :             :     /** Type of the message being sent. */
     608                 :             :     std::string m_send_type GUARDED_BY(m_send_mutex);
     609                 :             :     /** Current sender state. */
     610                 :             :     SendState m_send_state GUARDED_BY(m_send_mutex);
     611                 :             :     /** Whether we've sent at least 24 bytes (which would trigger disconnect for V1 peers). */
     612                 :             :     bool m_sent_v1_header_worth GUARDED_BY(m_send_mutex) {false};
     613                 :             : 
     614                 :             :     /** Change the receive state. */
     615                 :             :     void SetReceiveState(RecvState recv_state) noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     616                 :             :     /** Change the send state. */
     617                 :             :     void SetSendState(SendState send_state) noexcept EXCLUSIVE_LOCKS_REQUIRED(m_send_mutex);
     618                 :             :     /** Given a packet's contents, find the message type (if valid), and strip it from contents. */
     619                 :             :     static std::optional<std::string> GetMessageType(Span<const uint8_t>& contents) noexcept;
     620                 :             :     /** Determine how many received bytes can be processed in one go (not allowed in V1 state). */
     621                 :             :     size_t GetMaxBytesToProcess() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     622                 :             :     /** Put our public key + garbage in the send buffer. */
     623                 :             :     void StartSendingHandshake() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_send_mutex);
     624                 :             :     /** Process bytes in m_recv_buffer, while in KEY_MAYBE_V1 state. */
     625                 :             :     void ProcessReceivedMaybeV1Bytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex, !m_send_mutex);
     626                 :             :     /** Process bytes in m_recv_buffer, while in KEY state. */
     627                 :             :     bool ProcessReceivedKeyBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex, !m_send_mutex);
     628                 :             :     /** Process bytes in m_recv_buffer, while in GARB_GARBTERM state. */
     629                 :             :     bool ProcessReceivedGarbageBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     630                 :             :     /** Process bytes in m_recv_buffer, while in VERSION/APP state. */
     631                 :             :     bool ProcessReceivedPacketBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
     632                 :             : 
     633                 :             : public:
     634                 :             :     static constexpr uint32_t MAX_GARBAGE_LEN = 4095;
     635                 :             : 
     636                 :             :     /** Construct a V2 transport with securely generated random keys.
     637                 :             :      *
     638                 :             :      * @param[in] nodeid      the node's NodeId (only for debug log output).
     639                 :             :      * @param[in] initiating  whether we are the initiator side.
     640                 :             :      */
     641                 :             :     V2Transport(NodeId nodeid, bool initiating) noexcept;
     642                 :             : 
     643                 :             :     /** Construct a V2 transport with specified keys and garbage (test use only). */
     644                 :             :     V2Transport(NodeId nodeid, bool initiating, const CKey& key, Span<const std::byte> ent32, std::vector<uint8_t> garbage) noexcept;
     645                 :             : 
     646                 :             :     // Receive side functions.
     647                 :             :     bool ReceivedMessageComplete() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex);
     648                 :             :     bool ReceivedBytes(Span<const uint8_t>& msg_bytes) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex, !m_send_mutex);
     649                 :             :     CNetMessage GetReceivedMessage(std::chrono::microseconds time, bool& reject_message) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex);
     650                 :             : 
     651                 :             :     // Send side functions.
     652                 :             :     bool SetMessageToSend(CSerializedNetMsg& msg) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     653                 :             :     BytesToSend GetBytesToSend(bool have_next_message) const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     654                 :             :     void MarkBytesSent(size_t bytes_sent) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     655                 :             :     size_t GetSendMemoryUsage() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex);
     656                 :             : 
     657                 :             :     // Miscellaneous functions.
     658                 :             :     bool ShouldReconnectV1() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex, !m_send_mutex);
     659                 :             :     Info GetInfo() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex);
     660                 :             : };
     661                 :             : 
     662         [ #  # ]:           0 : struct CNodeOptions
     663                 :             : {
     664                 :             :     NetPermissionFlags permission_flags = NetPermissionFlags::None;
     665                 :             :     std::unique_ptr<i2p::sam::Session> i2p_sam_session = nullptr;
     666                 :             :     bool prefer_evict = false;
     667                 :             :     size_t recv_flood_size{DEFAULT_MAXRECEIVEBUFFER * 1000};
     668                 :             :     bool use_v2transport = false;
     669                 :             : };
     670                 :             : 
     671                 :             : /** Information about a peer */
     672                 :             : class CNode
     673                 :             : {
     674                 :             : public:
     675                 :             :     /** Transport serializer/deserializer. The receive side functions are only called under cs_vRecv, while
     676                 :             :      * the sending side functions are only called under cs_vSend. */
     677                 :             :     const std::unique_ptr<Transport> m_transport;
     678                 :             : 
     679                 :             :     const NetPermissionFlags m_permission_flags;
     680                 :             : 
     681                 :             :     /**
     682                 :             :      * Socket used for communication with the node.
     683                 :             :      * May not own a Sock object (after `CloseSocketDisconnect()` or during tests).
     684                 :             :      * `shared_ptr` (instead of `unique_ptr`) is used to avoid premature close of
     685                 :             :      * the underlying file descriptor by one thread while another thread is
     686                 :             :      * poll(2)-ing it for activity.
     687                 :             :      * @see https://github.com/bitcoin/bitcoin/issues/21744 for details.
     688                 :             :      */
     689                 :             :     std::shared_ptr<Sock> m_sock GUARDED_BY(m_sock_mutex);
     690                 :             : 
     691                 :             :     /** Sum of GetMemoryUsage of all vSendMsg entries. */
     692                 :             :     size_t m_send_memusage GUARDED_BY(cs_vSend){0};
     693                 :             :     /** Total number of bytes sent on the wire to this peer. */
     694                 :             :     uint64_t nSendBytes GUARDED_BY(cs_vSend){0};
     695                 :             :     /** Messages still to be fed to m_transport->SetMessageToSend. */
     696                 :             :     std::deque<CSerializedNetMsg> vSendMsg GUARDED_BY(cs_vSend);
     697                 :             :     Mutex cs_vSend;
     698                 :             :     Mutex m_sock_mutex;
     699                 :             :     Mutex cs_vRecv;
     700                 :             : 
     701                 :             :     uint64_t nRecvBytes GUARDED_BY(cs_vRecv){0};
     702                 :             : 
     703                 :             :     std::atomic<std::chrono::seconds> m_last_send{0s};
     704                 :             :     std::atomic<std::chrono::seconds> m_last_recv{0s};
     705                 :             :     //! Unix epoch time at peer connection
     706                 :             :     const std::chrono::seconds m_connected;
     707                 :             :     // Address of this peer
     708                 :             :     const CAddress addr;
     709                 :             :     // Bind address of our side of the connection
     710                 :             :     const CAddress addrBind;
     711                 :             :     const std::string m_addr_name;
     712                 :             :     /** The pszDest argument provided to ConnectNode(). Only used for reconnections. */
     713                 :             :     const std::string m_dest;
     714                 :             :     //! Whether this peer is an inbound onion, i.e. connected via our Tor onion service.
     715                 :             :     const bool m_inbound_onion;
     716                 :             :     std::atomic<int> nVersion{0};
     717                 :             :     Mutex m_subver_mutex;
     718                 :             :     /**
     719                 :             :      * cleanSubVer is a sanitized string of the user agent byte array we read
     720                 :             :      * from the wire. This cleaned string can safely be logged or displayed.
     721                 :             :      */
     722                 :             :     std::string cleanSubVer GUARDED_BY(m_subver_mutex){};
     723                 :             :     const bool m_prefer_evict{false}; // This peer is preferred for eviction.
     724                 :           0 :     bool HasPermission(NetPermissionFlags permission) const {
     725 [ #  # ][ #  #  :           0 :         return NetPermissions::HasFlag(m_permission_flags, permission);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     726                 :             :     }
     727                 :             :     /** fSuccessfullyConnected is set to true on receiving VERACK from the peer. */
     728                 :             :     std::atomic_bool fSuccessfullyConnected{false};
     729                 :             :     // Setting fDisconnect to true will cause the node to be disconnected the
     730                 :             :     // next time DisconnectNodes() runs
     731                 :             :     std::atomic_bool fDisconnect{false};
     732                 :             :     CSemaphoreGrant grantOutbound;
     733                 :             :     std::atomic<int> nRefCount{0};
     734                 :             : 
     735                 :             :     const uint64_t nKeyedNetGroup;
     736                 :             :     std::atomic_bool fPauseRecv{false};
     737                 :             :     std::atomic_bool fPauseSend{false};
     738                 :             : 
     739                 :             :     const ConnectionType m_conn_type;
     740                 :             : 
     741                 :             :     /** Move all messages from the received queue to the processing queue. */
     742                 :             :     void MarkReceivedMsgsForProcessing()
     743                 :             :         EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex);
     744                 :             : 
     745                 :             :     /** Poll the next message from the processing queue of this connection.
     746                 :             :      *
     747                 :             :      * Returns std::nullopt if the processing queue is empty, or a pair
     748                 :             :      * consisting of the message and a bool that indicates if the processing
     749                 :             :      * queue has more entries. */
     750                 :             :     std::optional<std::pair<CNetMessage, bool>> PollMessage()
     751                 :             :         EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex);
     752                 :             : 
     753                 :             :     /** Account for the total size of a sent message in the per msg type connection stats. */
     754                 :           0 :     void AccountForSentBytes(const std::string& msg_type, size_t sent_bytes)
     755                 :             :         EXCLUSIVE_LOCKS_REQUIRED(cs_vSend)
     756                 :             :     {
     757                 :           0 :         mapSendBytesPerMsgType[msg_type] += sent_bytes;
     758                 :           0 :     }
     759                 :             : 
     760                 :           0 :     bool IsOutboundOrBlockRelayConn() const {
     761      [ #  #  # ]:           0 :         switch (m_conn_type) {
     762                 :             :             case ConnectionType::OUTBOUND_FULL_RELAY:
     763                 :             :             case ConnectionType::BLOCK_RELAY:
     764                 :             :                 return true;
     765                 :           0 :             case ConnectionType::INBOUND:
     766                 :           0 :             case ConnectionType::MANUAL:
     767                 :           0 :             case ConnectionType::ADDR_FETCH:
     768                 :           0 :             case ConnectionType::FEELER:
     769                 :           0 :                 return false;
     770                 :             :         } // no default case, so the compiler can warn about missing cases
     771                 :             : 
     772                 :           0 :         assert(false);
     773                 :             :     }
     774                 :             : 
     775                 :           0 :     bool IsFullOutboundConn() const {
     776   [ #  #  #  #  :           0 :         return m_conn_type == ConnectionType::OUTBOUND_FULL_RELAY;
           #  # ][ #  #  
             #  #  #  # ]
     777                 :             :     }
     778                 :             : 
     779                 :           0 :     bool IsManualConn() const {
     780         [ #  # ]:           0 :         return m_conn_type == ConnectionType::MANUAL;
     781                 :             :     }
     782                 :             : 
     783                 :           0 :     bool IsManualOrFullOutboundConn() const
     784                 :             :     {
     785      [ #  #  # ]:           0 :         switch (m_conn_type) {
     786                 :             :         case ConnectionType::INBOUND:
     787                 :             :         case ConnectionType::FEELER:
     788                 :             :         case ConnectionType::BLOCK_RELAY:
     789                 :             :         case ConnectionType::ADDR_FETCH:
     790                 :             :                 return false;
     791                 :           0 :         case ConnectionType::OUTBOUND_FULL_RELAY:
     792                 :           0 :         case ConnectionType::MANUAL:
     793                 :           0 :                 return true;
     794                 :             :         } // no default case, so the compiler can warn about missing cases
     795                 :             : 
     796                 :           0 :         assert(false);
     797                 :             :     }
     798                 :             : 
     799                 :           0 :     bool IsBlockOnlyConn() const {
     800 [ #  # ][ #  #  :           0 :         return m_conn_type == ConnectionType::BLOCK_RELAY;
          #  #  #  #  #  
             #  #  #  #  
           # ][ #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     801                 :             :     }
     802                 :             : 
     803                 :           0 :     bool IsFeelerConn() const {
     804         [ #  # ]:           0 :         return m_conn_type == ConnectionType::FEELER;
     805                 :             :     }
     806                 :             : 
     807                 :           0 :     bool IsAddrFetchConn() const {
     808   [ #  #  #  #  :           0 :         return m_conn_type == ConnectionType::ADDR_FETCH;
             #  #  #  # ]
     809                 :             :     }
     810                 :             : 
     811                 :           0 :     bool IsInboundConn() const {
     812   [ #  #  #  #  :           0 :         return m_conn_type == ConnectionType::INBOUND;
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     813                 :             :     }
     814                 :             : 
     815                 :           0 :     bool ExpectServicesFromConn() const {
     816      [ #  #  # ]:           0 :         switch (m_conn_type) {
     817                 :             :             case ConnectionType::INBOUND:
     818                 :             :             case ConnectionType::MANUAL:
     819                 :             :             case ConnectionType::FEELER:
     820                 :             :                 return false;
     821                 :           0 :             case ConnectionType::OUTBOUND_FULL_RELAY:
     822                 :           0 :             case ConnectionType::BLOCK_RELAY:
     823                 :           0 :             case ConnectionType::ADDR_FETCH:
     824                 :           0 :                 return true;
     825                 :             :         } // no default case, so the compiler can warn about missing cases
     826                 :             : 
     827                 :           0 :         assert(false);
     828                 :             :     }
     829                 :             : 
     830                 :             :     /**
     831                 :             :      * Get network the peer connected through.
     832                 :             :      *
     833                 :             :      * Returns Network::NET_ONION for *inbound* onion connections,
     834                 :             :      * and CNetAddr::GetNetClass() otherwise. The latter cannot be used directly
     835                 :             :      * because it doesn't detect the former, and it's not the responsibility of
     836                 :             :      * the CNetAddr class to know the actual network a peer is connected through.
     837                 :             :      *
     838                 :             :      * @return network the peer connected through.
     839                 :             :      */
     840                 :             :     Network ConnectedThroughNetwork() const;
     841                 :             : 
     842                 :             :     /** Whether this peer connected through a privacy network. */
     843                 :             :     [[nodiscard]] bool IsConnectedThroughPrivacyNet() const;
     844                 :             : 
     845                 :             :     // We selected peer as (compact blocks) high-bandwidth peer (BIP152)
     846                 :             :     std::atomic<bool> m_bip152_highbandwidth_to{false};
     847                 :             :     // Peer selected us as (compact blocks) high-bandwidth peer (BIP152)
     848                 :             :     std::atomic<bool> m_bip152_highbandwidth_from{false};
     849                 :             : 
     850                 :             :     /** Whether this peer provides all services that we want. Used for eviction decisions */
     851                 :             :     std::atomic_bool m_has_all_wanted_services{false};
     852                 :             : 
     853                 :             :     /** Whether we should relay transactions to this peer. This only changes
     854                 :             :      * from false to true. It will never change back to false. */
     855                 :             :     std::atomic_bool m_relays_txs{false};
     856                 :             : 
     857                 :             :     /** Whether this peer has loaded a bloom filter. Used only in inbound
     858                 :             :      *  eviction logic. */
     859                 :             :     std::atomic_bool m_bloom_filter_loaded{false};
     860                 :             : 
     861                 :             :     /** UNIX epoch time of the last block received from this peer that we had
     862                 :             :      * not yet seen (e.g. not already received from another peer), that passed
     863                 :             :      * preliminary validity checks and was saved to disk, even if we don't
     864                 :             :      * connect the block or it eventually fails connection. Used as an inbound
     865                 :             :      * peer eviction criterium in CConnman::AttemptToEvictConnection. */
     866                 :             :     std::atomic<std::chrono::seconds> m_last_block_time{0s};
     867                 :             : 
     868                 :             :     /** UNIX epoch time of the last transaction received from this peer that we
     869                 :             :      * had not yet seen (e.g. not already received from another peer) and that
     870                 :             :      * was accepted into our mempool. Used as an inbound peer eviction criterium
     871                 :             :      * in CConnman::AttemptToEvictConnection. */
     872                 :             :     std::atomic<std::chrono::seconds> m_last_tx_time{0s};
     873                 :             : 
     874                 :             :     /** Last measured round-trip time. Used only for RPC/GUI stats/debugging.*/
     875                 :             :     std::atomic<std::chrono::microseconds> m_last_ping_time{0us};
     876                 :             : 
     877                 :             :     /** Lowest measured round-trip time. Used as an inbound peer eviction
     878                 :             :      * criterium in CConnman::AttemptToEvictConnection. */
     879                 :             :     std::atomic<std::chrono::microseconds> m_min_ping_time{std::chrono::microseconds::max()};
     880                 :             : 
     881                 :             :     CNode(NodeId id,
     882                 :             :           std::shared_ptr<Sock> sock,
     883                 :             :           const CAddress& addrIn,
     884                 :             :           uint64_t nKeyedNetGroupIn,
     885                 :             :           uint64_t nLocalHostNonceIn,
     886                 :             :           const CAddress& addrBindIn,
     887                 :             :           const std::string& addrNameIn,
     888                 :             :           ConnectionType conn_type_in,
     889                 :             :           bool inbound_onion,
     890                 :             :           CNodeOptions&& node_opts = {});
     891                 :             :     CNode(const CNode&) = delete;
     892                 :             :     CNode& operator=(const CNode&) = delete;
     893                 :             : 
     894                 :           0 :     NodeId GetId() const {
     895 [ #  # ][ #  #  :           0 :         return id;
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     896                 :             :     }
     897                 :             : 
     898                 :           0 :     uint64_t GetLocalNonce() const {
     899         [ #  # ]:           0 :         return nLocalHostNonce;
     900                 :             :     }
     901                 :             : 
     902                 :           0 :     int GetRefCount() const
     903                 :             :     {
     904         [ #  # ]:           0 :         assert(nRefCount >= 0);
     905                 :           0 :         return nRefCount;
     906                 :             :     }
     907                 :             : 
     908                 :             :     /**
     909                 :             :      * Receive bytes from the buffer and deserialize them into messages.
     910                 :             :      *
     911                 :             :      * @param[in]   msg_bytes   The raw data
     912                 :             :      * @param[out]  complete    Set True if at least one message has been
     913                 :             :      *                          deserialized and is ready to be processed
     914                 :             :      * @return  True if the peer should stay connected,
     915                 :             :      *          False if the peer should be disconnected from.
     916                 :             :      */
     917                 :             :     bool ReceiveMsgBytes(Span<const uint8_t> msg_bytes, bool& complete) EXCLUSIVE_LOCKS_REQUIRED(!cs_vRecv);
     918                 :             : 
     919                 :           0 :     void SetCommonVersion(int greatest_common_version)
     920                 :             :     {
     921                 :           0 :         Assume(m_greatest_common_version == INIT_PROTO_VERSION);
     922                 :           0 :         m_greatest_common_version = greatest_common_version;
     923                 :           0 :     }
     924                 :           0 :     int GetCommonVersion() const
     925                 :             :     {
     926 [ #  # ][ #  #  :           0 :         return m_greatest_common_version;
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     927                 :             :     }
     928                 :             : 
     929                 :             :     CService GetAddrLocal() const EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex);
     930                 :             :     //! May not be called more than once
     931                 :             :     void SetAddrLocal(const CService& addrLocalIn) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex);
     932                 :             : 
     933                 :           0 :     CNode* AddRef()
     934                 :             :     {
     935         [ #  # ]:           0 :         nRefCount++;
     936         [ #  # ]:           0 :         return this;
     937                 :             :     }
     938                 :             : 
     939                 :           0 :     void Release()
     940                 :             :     {
     941         [ #  # ]:           0 :         nRefCount--;
     942                 :           0 :     }
     943                 :             : 
     944                 :             :     void CloseSocketDisconnect() EXCLUSIVE_LOCKS_REQUIRED(!m_sock_mutex);
     945                 :             : 
     946                 :             :     void CopyStats(CNodeStats& stats) EXCLUSIVE_LOCKS_REQUIRED(!m_subver_mutex, !m_addr_local_mutex, !cs_vSend, !cs_vRecv);
     947                 :             : 
     948   [ #  #  #  #  :           0 :     std::string ConnectionTypeAsString() const { return ::ConnectionTypeAsString(m_conn_type); }
           #  # ][ #  #  
             #  #  #  # ]
     949                 :             : 
     950                 :             :     /** A ping-pong round trip has completed successfully. Update latest and minimum ping times. */
     951                 :           0 :     void PongReceived(std::chrono::microseconds ping_time) {
     952                 :           0 :         m_last_ping_time = ping_time;
     953                 :           0 :         m_min_ping_time = std::min(m_min_ping_time.load(), ping_time);
     954                 :           0 :     }
     955                 :             : 
     956                 :             : private:
     957                 :             :     const NodeId id;
     958                 :             :     const uint64_t nLocalHostNonce;
     959                 :             :     std::atomic<int> m_greatest_common_version{INIT_PROTO_VERSION};
     960                 :             : 
     961                 :             :     const size_t m_recv_flood_size;
     962                 :             :     std::list<CNetMessage> vRecvMsg; // Used only by SocketHandler thread
     963                 :             : 
     964                 :             :     Mutex m_msg_process_queue_mutex;
     965                 :             :     std::list<CNetMessage> m_msg_process_queue GUARDED_BY(m_msg_process_queue_mutex);
     966                 :             :     size_t m_msg_process_queue_size GUARDED_BY(m_msg_process_queue_mutex){0};
     967                 :             : 
     968                 :             :     // Our address, as reported by the peer
     969                 :             :     CService m_addr_local GUARDED_BY(m_addr_local_mutex);
     970                 :             :     mutable Mutex m_addr_local_mutex;
     971                 :             : 
     972                 :             :     mapMsgTypeSize mapSendBytesPerMsgType GUARDED_BY(cs_vSend);
     973                 :             :     mapMsgTypeSize mapRecvBytesPerMsgType GUARDED_BY(cs_vRecv);
     974                 :             : 
     975                 :             :     /**
     976                 :             :      * If an I2P session is created per connection (for outbound transient I2P
     977                 :             :      * connections) then it is stored here so that it can be destroyed when the
     978                 :             :      * socket is closed. I2P sessions involve a data/transport socket (in `m_sock`)
     979                 :             :      * and a control socket (in `m_i2p_sam_session`). For transient sessions, once
     980                 :             :      * the data socket is closed, the control socket is not going to be used anymore
     981                 :             :      * and is just taking up resources. So better close it as soon as `m_sock` is
     982                 :             :      * closed.
     983                 :             :      * Otherwise this unique_ptr is empty.
     984                 :             :      */
     985                 :             :     std::unique_ptr<i2p::sam::Session> m_i2p_sam_session GUARDED_BY(m_sock_mutex);
     986                 :             : };
     987                 :             : 
     988                 :             : /**
     989                 :             :  * Interface for message handling
     990                 :             :  */
     991                 :           0 : class NetEventsInterface
     992                 :             : {
     993                 :             : public:
     994                 :             :     /** Mutex for anything that is only accessed via the msg processing thread */
     995                 :             :     static Mutex g_msgproc_mutex;
     996                 :             : 
     997                 :             :     /** Initialize a peer (setup state) */
     998                 :             :     virtual void InitializeNode(const CNode& node, ServiceFlags our_services) = 0;
     999                 :             : 
    1000                 :             :     /** Handle removal of a peer (clear state) */
    1001                 :             :     virtual void FinalizeNode(const CNode& node) = 0;
    1002                 :             : 
    1003                 :             :     /**
    1004                 :             :      * Callback to determine whether the given set of service flags are sufficient
    1005                 :             :      * for a peer to be "relevant".
    1006                 :             :      */
    1007                 :             :     virtual bool HasAllDesirableServiceFlags(ServiceFlags services) const = 0;
    1008                 :             : 
    1009                 :             :     /**
    1010                 :             :     * Process protocol messages received from a given node
    1011                 :             :     *
    1012                 :             :     * @param[in]   pnode           The node which we have received messages from.
    1013                 :             :     * @param[in]   interrupt       Interrupt condition for processing threads
    1014                 :             :     * @return                      True if there is more work to be done
    1015                 :             :     */
    1016                 :             :     virtual bool ProcessMessages(CNode* pnode, std::atomic<bool>& interrupt) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex) = 0;
    1017                 :             : 
    1018                 :             :     /**
    1019                 :             :     * Send queued protocol messages to a given node.
    1020                 :             :     *
    1021                 :             :     * @param[in]   pnode           The node which we are sending messages to.
    1022                 :             :     * @return                      True if there is more work to be done
    1023                 :             :     */
    1024                 :             :     virtual bool SendMessages(CNode* pnode) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex) = 0;
    1025                 :             : 
    1026                 :             : 
    1027                 :             : protected:
    1028                 :             :     /**
    1029                 :             :      * Protected destructor so that instances can only be deleted by derived classes.
    1030                 :             :      * If that restriction is no longer desired, this should be made public and virtual.
    1031                 :             :      */
    1032                 :             :     ~NetEventsInterface() = default;
    1033                 :             : };
    1034                 :             : 
    1035                 :             : class CConnman
    1036                 :             : {
    1037                 :             : public:
    1038                 :             : 
    1039                 :             :     struct Options
    1040                 :             :     {
    1041                 :             :         ServiceFlags m_local_services = NODE_NONE;
    1042                 :             :         int m_max_automatic_connections = 0;
    1043                 :             :         CClientUIInterface* uiInterface = nullptr;
    1044                 :             :         NetEventsInterface* m_msgproc = nullptr;
    1045                 :             :         BanMan* m_banman = nullptr;
    1046                 :             :         unsigned int nSendBufferMaxSize = 0;
    1047                 :             :         unsigned int nReceiveFloodSize = 0;
    1048                 :             :         uint64_t nMaxOutboundLimit = 0;
    1049                 :             :         int64_t m_peer_connect_timeout = DEFAULT_PEER_CONNECT_TIMEOUT;
    1050                 :             :         std::vector<std::string> vSeedNodes;
    1051                 :             :         std::vector<NetWhitelistPermissions> vWhitelistedRangeIncoming;
    1052                 :             :         std::vector<NetWhitelistPermissions> vWhitelistedRangeOutgoing;
    1053                 :             :         std::vector<NetWhitebindPermissions> vWhiteBinds;
    1054                 :             :         std::vector<CService> vBinds;
    1055                 :             :         std::vector<CService> onion_binds;
    1056                 :             :         /// True if the user did not specify -bind= or -whitebind= and thus
    1057                 :             :         /// we should bind on `0.0.0.0` (IPv4) and `::` (IPv6).
    1058                 :             :         bool bind_on_any;
    1059                 :             :         bool m_use_addrman_outgoing = true;
    1060                 :             :         std::vector<std::string> m_specified_outgoing;
    1061                 :             :         std::vector<std::string> m_added_nodes;
    1062                 :             :         bool m_i2p_accept_incoming;
    1063                 :             :         bool whitelist_forcerelay = DEFAULT_WHITELISTFORCERELAY;
    1064                 :             :         bool whitelist_relay = DEFAULT_WHITELISTRELAY;
    1065                 :             :     };
    1066                 :             : 
    1067                 :           0 :     void Init(const Options& connOptions) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_total_bytes_sent_mutex)
    1068                 :             :     {
    1069                 :           0 :         AssertLockNotHeld(m_total_bytes_sent_mutex);
    1070                 :             : 
    1071         [ #  # ]:           0 :         m_local_services = connOptions.m_local_services;
    1072                 :           0 :         m_max_automatic_connections = connOptions.m_max_automatic_connections;
    1073         [ #  # ]:           0 :         m_max_outbound_full_relay = std::min(MAX_OUTBOUND_FULL_RELAY_CONNECTIONS, m_max_automatic_connections);
    1074         [ #  # ]:           0 :         m_max_outbound_block_relay = std::min(MAX_BLOCK_RELAY_ONLY_CONNECTIONS, m_max_automatic_connections - m_max_outbound_full_relay);
    1075                 :           0 :         m_max_automatic_outbound = m_max_outbound_full_relay + m_max_outbound_block_relay + m_max_feeler;
    1076         [ #  # ]:           0 :         m_max_inbound = std::max(0, m_max_automatic_connections - m_max_automatic_outbound);
    1077                 :           0 :         m_use_addrman_outgoing = connOptions.m_use_addrman_outgoing;
    1078                 :           0 :         m_client_interface = connOptions.uiInterface;
    1079                 :           0 :         m_banman = connOptions.m_banman;
    1080                 :           0 :         m_msgproc = connOptions.m_msgproc;
    1081                 :           0 :         nSendBufferMaxSize = connOptions.nSendBufferMaxSize;
    1082                 :           0 :         nReceiveFloodSize = connOptions.nReceiveFloodSize;
    1083                 :           0 :         m_peer_connect_timeout = std::chrono::seconds{connOptions.m_peer_connect_timeout};
    1084                 :           0 :         {
    1085                 :           0 :             LOCK(m_total_bytes_sent_mutex);
    1086         [ #  # ]:           0 :             nMaxOutboundLimit = connOptions.nMaxOutboundLimit;
    1087                 :           0 :         }
    1088                 :           0 :         vWhitelistedRangeIncoming = connOptions.vWhitelistedRangeIncoming;
    1089                 :           0 :         vWhitelistedRangeOutgoing = connOptions.vWhitelistedRangeOutgoing;
    1090                 :           0 :         {
    1091                 :           0 :             LOCK(m_added_nodes_mutex);
    1092                 :             :             // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
    1093                 :             :             // peer doesn't support it or immediately disconnects us for another reason.
    1094         [ #  # ]:           0 :             const bool use_v2transport(GetLocalServices() & NODE_P2P_V2);
    1095         [ #  # ]:           0 :             for (const std::string& added_node : connOptions.m_added_nodes) {
    1096                 :           0 :                 m_added_node_params.push_back({added_node, use_v2transport});
    1097                 :             :             }
    1098                 :           0 :         }
    1099                 :           0 :         m_onion_binds = connOptions.onion_binds;
    1100                 :           0 :         whitelist_forcerelay = connOptions.whitelist_forcerelay;
    1101                 :           0 :         whitelist_relay = connOptions.whitelist_relay;
    1102   [ #  #  #  # ]:           0 :     }
    1103                 :             : 
    1104                 :             :     CConnman(uint64_t seed0, uint64_t seed1, AddrMan& addrman, const NetGroupManager& netgroupman,
    1105                 :             :              const CChainParams& params, bool network_active = true);
    1106                 :             : 
    1107                 :             :     ~CConnman();
    1108                 :             : 
    1109                 :             :     bool Start(CScheduler& scheduler, const Options& options) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !m_added_nodes_mutex, !m_addr_fetches_mutex, !mutexMsgProc);
    1110                 :             : 
    1111                 :             :     void StopThreads();
    1112                 :             :     void StopNodes();
    1113                 :           0 :     void Stop()
    1114                 :             :     {
    1115         [ #  # ]:           0 :         StopThreads();
    1116         [ #  # ]:           0 :         StopNodes();
    1117                 :           0 :     };
    1118                 :             : 
    1119                 :             :     void Interrupt() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
    1120         [ #  # ]:           0 :     bool GetNetworkActive() const { return fNetworkActive; };
           [ #  #  #  # ]
    1121         [ #  # ]:           0 :     bool GetUseAddrmanOutgoing() const { return m_use_addrman_outgoing; };
    1122                 :             :     void SetNetworkActive(bool active);
    1123                 :             :     void OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant&& grant_outbound, const char* strDest, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
    1124                 :             :     bool CheckIncomingNonce(uint64_t nonce);
    1125                 :             :     void ASMapHealthCheck();
    1126                 :             : 
    1127                 :             :     // alias for thread safety annotations only, not defined
    1128                 :             :     RecursiveMutex& GetNodesMutex() const LOCK_RETURNED(m_nodes_mutex);
    1129                 :             : 
    1130                 :             :     bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func);
    1131                 :             : 
    1132                 :             :     void PushMessage(CNode* pnode, CSerializedNetMsg&& msg) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1133                 :             : 
    1134                 :             :     using NodeFn = std::function<void(CNode*)>;
    1135                 :           0 :     void ForEachNode(const NodeFn& func)
    1136                 :             :     {
    1137                 :           0 :         LOCK(m_nodes_mutex);
    1138         [ #  # ]:           0 :         for (auto&& node : m_nodes) {
    1139   [ #  #  #  # ]:           0 :             if (NodeFullyConnected(node))
    1140         [ #  # ]:           0 :                 func(node);
    1141                 :             :         }
    1142                 :           0 :     };
    1143                 :             : 
    1144                 :             :     void ForEachNode(const NodeFn& func) const
    1145                 :             :     {
    1146                 :             :         LOCK(m_nodes_mutex);
    1147                 :             :         for (auto&& node : m_nodes) {
    1148                 :             :             if (NodeFullyConnected(node))
    1149                 :             :                 func(node);
    1150                 :             :         }
    1151                 :             :     };
    1152                 :             : 
    1153                 :             :     // Addrman functions
    1154                 :             :     /**
    1155                 :             :      * Return all or many randomly selected addresses, optionally by network.
    1156                 :             :      *
    1157                 :             :      * @param[in] max_addresses  Maximum number of addresses to return (0 = all).
    1158                 :             :      * @param[in] max_pct        Maximum percentage of addresses to return (0 = all). Value must be from 0 to 100.
    1159                 :             :      * @param[in] network        Select only addresses of this network (nullopt = all).
    1160                 :             :      * @param[in] filtered       Select only addresses that are considered high quality (false = all).
    1161                 :             :      */
    1162                 :             :     std::vector<CAddress> GetAddresses(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered = true) const;
    1163                 :             :     /**
    1164                 :             :      * Cache is used to minimize topology leaks, so it should
    1165                 :             :      * be used for all non-trusted calls, for example, p2p.
    1166                 :             :      * A non-malicious call (from RPC or a peer with addr permission) should
    1167                 :             :      * call the function without a parameter to avoid using the cache.
    1168                 :             :      */
    1169                 :             :     std::vector<CAddress> GetAddresses(CNode& requestor, size_t max_addresses, size_t max_pct);
    1170                 :             : 
    1171                 :             :     // This allows temporarily exceeding m_max_outbound_full_relay, with the goal of finding
    1172                 :             :     // a peer that is better than all our current peers.
    1173                 :             :     void SetTryNewOutboundPeer(bool flag);
    1174                 :             :     bool GetTryNewOutboundPeer() const;
    1175                 :             : 
    1176                 :             :     void StartExtraBlockRelayPeers();
    1177                 :             : 
    1178                 :             :     // Count the number of full-relay peer we have.
    1179                 :             :     int GetFullOutboundConnCount() const;
    1180                 :             :     // Return the number of outbound peers we have in excess of our target (eg,
    1181                 :             :     // if we previously called SetTryNewOutboundPeer(true), and have since set
    1182                 :             :     // to false, we may have extra peers that we wish to disconnect). This may
    1183                 :             :     // return a value less than (num_outbound_connections - num_outbound_slots)
    1184                 :             :     // in cases where some outbound connections are not yet fully connected, or
    1185                 :             :     // not yet fully disconnected.
    1186                 :             :     int GetExtraFullOutboundCount() const;
    1187                 :             :     // Count the number of block-relay-only peers we have over our limit.
    1188                 :             :     int GetExtraBlockRelayCount() const;
    1189                 :             : 
    1190                 :             :     bool AddNode(const AddedNodeParams& add) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
    1191                 :             :     bool RemoveAddedNode(const std::string& node) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
    1192                 :             :     bool AddedNodesContain(const CAddress& addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
    1193                 :             :     std::vector<AddedNodeInfo> GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
    1194                 :             : 
    1195                 :             :     /**
    1196                 :             :      * Attempts to open a connection. Currently only used from tests.
    1197                 :             :      *
    1198                 :             :      * @param[in]   address     Address of node to try connecting to
    1199                 :             :      * @param[in]   conn_type   ConnectionType::OUTBOUND, ConnectionType::BLOCK_RELAY,
    1200                 :             :      *                          ConnectionType::ADDR_FETCH or ConnectionType::FEELER
    1201                 :             :      * @param[in]   use_v2transport  Set to true if node attempts to connect using BIP 324 v2 transport protocol.
    1202                 :             :      * @return      bool        Returns false if there are no available
    1203                 :             :      *                          slots for this connection:
    1204                 :             :      *                          - conn_type not a supported ConnectionType
    1205                 :             :      *                          - Max total outbound connection capacity filled
    1206                 :             :      *                          - Max connection capacity for type is filled
    1207                 :             :      */
    1208                 :             :     bool AddConnection(const std::string& address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
    1209                 :             : 
    1210                 :             :     size_t GetNodeCount(ConnectionDirection) const;
    1211                 :             :     std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() const;
    1212                 :             :     uint32_t GetMappedAS(const CNetAddr& addr) const;
    1213                 :             :     void GetNodeStats(std::vector<CNodeStats>& vstats) const;
    1214                 :             :     bool DisconnectNode(const std::string& node);
    1215                 :             :     bool DisconnectNode(const CSubNet& subnet);
    1216                 :             :     bool DisconnectNode(const CNetAddr& addr);
    1217                 :             :     bool DisconnectNode(NodeId id);
    1218                 :             : 
    1219                 :             :     //! Used to convey which local services we are offering peers during node
    1220                 :             :     //! connection.
    1221                 :             :     //!
    1222                 :             :     //! The data returned by this is used in CNode construction,
    1223                 :             :     //! which is used to advertise which services we are offering
    1224                 :             :     //! that peer during `net_processing.cpp:PushNodeVersion()`.
    1225                 :             :     ServiceFlags GetLocalServices() const;
    1226                 :             : 
    1227                 :             :     //! Updates the local services that this node advertises to other peers
    1228                 :             :     //! during connection handshake.
    1229                 :           0 :     void AddLocalServices(ServiceFlags services) { m_local_services = ServiceFlags(m_local_services | services); };
    1230                 :           0 :     void RemoveLocalServices(ServiceFlags services) { m_local_services = ServiceFlags(m_local_services & ~services); }
    1231                 :             : 
    1232                 :             :     uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1233                 :             :     std::chrono::seconds GetMaxOutboundTimeframe() const;
    1234                 :             : 
    1235                 :             :     //! check if the outbound target is reached
    1236                 :             :     //! if param historicalBlockServingLimit is set true, the function will
    1237                 :             :     //! response true if the limit for serving historical blocks has been reached
    1238                 :             :     bool OutboundTargetReached(bool historicalBlockServingLimit) const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1239                 :             : 
    1240                 :             :     //! response the bytes left in the current max outbound cycle
    1241                 :             :     //! in case of no limit, it will always response 0
    1242                 :             :     uint64_t GetOutboundTargetBytesLeft() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1243                 :             : 
    1244                 :             :     std::chrono::seconds GetMaxOutboundTimeLeftInCycle() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1245                 :             : 
    1246                 :             :     uint64_t GetTotalBytesRecv() const;
    1247                 :             :     uint64_t GetTotalBytesSent() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1248                 :             : 
    1249                 :             :     /** Get a unique deterministic randomizer. */
    1250                 :             :     CSipHasher GetDeterministicRandomizer(uint64_t id) const;
    1251                 :             : 
    1252                 :             :     void WakeMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
    1253                 :             : 
    1254                 :             :     /** Return true if we should disconnect the peer for failing an inactivity check. */
    1255                 :             :     bool ShouldRunInactivityChecks(const CNode& node, std::chrono::seconds now) const;
    1256                 :             : 
    1257                 :             :     bool MultipleManualOrFullOutboundConns(Network net) const EXCLUSIVE_LOCKS_REQUIRED(m_nodes_mutex);
    1258                 :             : 
    1259                 :             : private:
    1260   [ #  #  #  # ]:           0 :     struct ListenSocket {
    1261                 :             :     public:
    1262                 :             :         std::shared_ptr<Sock> sock;
    1263         [ #  # ]:           0 :         inline void AddSocketPermissionFlags(NetPermissionFlags& flags) const { NetPermissions::AddFlag(flags, m_permissions); }
    1264                 :           0 :         ListenSocket(std::shared_ptr<Sock> sock_, NetPermissionFlags permissions_)
    1265   [ #  #  #  # ]:           0 :             : sock{sock_}, m_permissions{permissions_}
    1266                 :             :         {
    1267                 :             :         }
    1268                 :             : 
    1269                 :             :     private:
    1270                 :             :         NetPermissionFlags m_permissions;
    1271                 :             :     };
    1272                 :             : 
    1273                 :             :     //! returns the time left in the current max outbound cycle
    1274                 :             :     //! in case of no limit, it will always return 0
    1275                 :             :     std::chrono::seconds GetMaxOutboundTimeLeftInCycle_() const EXCLUSIVE_LOCKS_REQUIRED(m_total_bytes_sent_mutex);
    1276                 :             : 
    1277                 :             :     bool BindListenPort(const CService& bindAddr, bilingual_str& strError, NetPermissionFlags permissions);
    1278                 :             :     bool Bind(const CService& addr, unsigned int flags, NetPermissionFlags permissions);
    1279                 :             :     bool InitBinds(const Options& options);
    1280                 :             : 
    1281                 :             :     void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
    1282                 :             :     void AddAddrFetch(const std::string& strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex);
    1283                 :             :     void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_unused_i2p_sessions_mutex);
    1284                 :             :     void ThreadOpenConnections(std::vector<std::string> connect, Span<const std::string> seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
    1285                 :             :     void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
    1286                 :             :     void ThreadI2PAcceptIncoming();
    1287                 :             :     void AcceptConnection(const ListenSocket& hListenSocket);
    1288                 :             : 
    1289                 :             :     /**
    1290                 :             :      * Create a `CNode` object from a socket that has just been accepted and add the node to
    1291                 :             :      * the `m_nodes` member.
    1292                 :             :      * @param[in] sock Connected socket to communicate with the peer.
    1293                 :             :      * @param[in] permission_flags The peer's permissions.
    1294                 :             :      * @param[in] addr_bind The address and port at our side of the connection.
    1295                 :             :      * @param[in] addr The address and port at the peer's side of the connection.
    1296                 :             :      */
    1297                 :             :     void CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
    1298                 :             :                                       NetPermissionFlags permission_flags,
    1299                 :             :                                       const CAddress& addr_bind,
    1300                 :             :                                       const CAddress& addr);
    1301                 :             : 
    1302                 :             :     void DisconnectNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex, !m_nodes_mutex);
    1303                 :             :     void NotifyNumConnectionsChanged();
    1304                 :             :     /** Return true if the peer is inactive and should be disconnected. */
    1305                 :             :     bool InactivityCheck(const CNode& node) const;
    1306                 :             : 
    1307                 :             :     /**
    1308                 :             :      * Generate a collection of sockets to check for IO readiness.
    1309                 :             :      * @param[in] nodes Select from these nodes' sockets.
    1310                 :             :      * @return sockets to check for readiness
    1311                 :             :      */
    1312                 :             :     Sock::EventsPerSock GenerateWaitSockets(Span<CNode* const> nodes);
    1313                 :             : 
    1314                 :             :     /**
    1315                 :             :      * Check connected and listening sockets for IO readiness and process them accordingly.
    1316                 :             :      */
    1317                 :             :     void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc);
    1318                 :             : 
    1319                 :             :     /**
    1320                 :             :      * Do the read/write for connected sockets that are ready for IO.
    1321                 :             :      * @param[in] nodes Nodes to process. The socket of each node is checked against `what`.
    1322                 :             :      * @param[in] events_per_sock Sockets that are ready for IO.
    1323                 :             :      */
    1324                 :             :     void SocketHandlerConnected(const std::vector<CNode*>& nodes,
    1325                 :             :                                 const Sock::EventsPerSock& events_per_sock)
    1326                 :             :         EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc);
    1327                 :             : 
    1328                 :             :     /**
    1329                 :             :      * Accept incoming connections, one from each read-ready listening socket.
    1330                 :             :      * @param[in] events_per_sock Sockets that are ready for IO.
    1331                 :             :      */
    1332                 :             :     void SocketHandlerListening(const Sock::EventsPerSock& events_per_sock);
    1333                 :             : 
    1334                 :             :     void ThreadSocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc, !m_nodes_mutex, !m_reconnections_mutex);
    1335                 :             :     void ThreadDNSAddressSeed() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_nodes_mutex);
    1336                 :             : 
    1337                 :             :     uint64_t CalculateKeyedNetGroup(const CAddress& ad) const;
    1338                 :             : 
    1339                 :             :     CNode* FindNode(const CNetAddr& ip);
    1340                 :             :     CNode* FindNode(const std::string& addrName);
    1341                 :             :     CNode* FindNode(const CService& addr);
    1342                 :             : 
    1343                 :             :     /**
    1344                 :             :      * Determine whether we're already connected to a given address, in order to
    1345                 :             :      * avoid initiating duplicate connections.
    1346                 :             :      */
    1347                 :             :     bool AlreadyConnectedToAddress(const CAddress& addr);
    1348                 :             : 
    1349                 :             :     bool AttemptToEvictConnection();
    1350                 :             :     CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
    1351                 :             :     void AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector<NetWhitelistPermissions>& ranges) const;
    1352                 :             : 
    1353                 :             :     void DeleteNode(CNode* pnode);
    1354                 :             : 
    1355                 :             :     NodeId GetNewNodeId();
    1356                 :             : 
    1357                 :             :     /** (Try to) send data from node's vSendMsg. Returns (bytes_sent, data_left). */
    1358                 :             :     std::pair<size_t, bool> SocketSendData(CNode& node) const EXCLUSIVE_LOCKS_REQUIRED(node.cs_vSend);
    1359                 :             : 
    1360                 :             :     void DumpAddresses();
    1361                 :             : 
    1362                 :             :     // Network stats
    1363                 :             :     void RecordBytesRecv(uint64_t bytes);
    1364                 :             :     void RecordBytesSent(uint64_t bytes) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
    1365                 :             : 
    1366                 :             :     /**
    1367                 :             :      Return reachable networks for which we have no addresses in addrman and therefore
    1368                 :             :      may require loading fixed seeds.
    1369                 :             :      */
    1370                 :             :     std::unordered_set<Network> GetReachableEmptyNetworks() const;
    1371                 :             : 
    1372                 :             :     /**
    1373                 :             :      * Return vector of current BLOCK_RELAY peers.
    1374                 :             :      */
    1375                 :             :     std::vector<CAddress> GetCurrentBlockRelayOnlyConns() const;
    1376                 :             : 
    1377                 :             :     /**
    1378                 :             :      * Search for a "preferred" network, a reachable network to which we
    1379                 :             :      * currently don't have any OUTBOUND_FULL_RELAY or MANUAL connections.
    1380                 :             :      * There needs to be at least one address in AddrMan for a preferred
    1381                 :             :      * network to be picked.
    1382                 :             :      *
    1383                 :             :      * @param[out]    network        Preferred network, if found.
    1384                 :             :      *
    1385                 :             :      * @return           bool        Whether a preferred network was found.
    1386                 :             :      */
    1387                 :             :     bool MaybePickPreferredNetwork(std::optional<Network>& network);
    1388                 :             : 
    1389                 :             :     // Whether the node should be passed out in ForEach* callbacks
    1390                 :             :     static bool NodeFullyConnected(const CNode* pnode);
    1391                 :             : 
    1392                 :             :     uint16_t GetDefaultPort(Network net) const;
    1393                 :             :     uint16_t GetDefaultPort(const std::string& addr) const;
    1394                 :             : 
    1395                 :             :     // Network usage totals
    1396                 :             :     mutable Mutex m_total_bytes_sent_mutex;
    1397                 :             :     std::atomic<uint64_t> nTotalBytesRecv{0};
    1398                 :             :     uint64_t nTotalBytesSent GUARDED_BY(m_total_bytes_sent_mutex) {0};
    1399                 :             : 
    1400                 :             :     // outbound limit & stats
    1401                 :             :     uint64_t nMaxOutboundTotalBytesSentInCycle GUARDED_BY(m_total_bytes_sent_mutex) {0};
    1402                 :             :     std::chrono::seconds nMaxOutboundCycleStartTime GUARDED_BY(m_total_bytes_sent_mutex) {0};
    1403                 :             :     uint64_t nMaxOutboundLimit GUARDED_BY(m_total_bytes_sent_mutex);
    1404                 :             : 
    1405                 :             :     // P2P timeout in seconds
    1406                 :             :     std::chrono::seconds m_peer_connect_timeout;
    1407                 :             : 
    1408                 :             :     // Whitelisted ranges. Any node connecting from these is automatically
    1409                 :             :     // whitelisted (as well as those connecting to whitelisted binds).
    1410                 :             :     std::vector<NetWhitelistPermissions> vWhitelistedRangeIncoming;
    1411                 :             :     // Whitelisted ranges for outgoing connections.
    1412                 :             :     std::vector<NetWhitelistPermissions> vWhitelistedRangeOutgoing;
    1413                 :             : 
    1414                 :             :     unsigned int nSendBufferMaxSize{0};
    1415                 :             :     unsigned int nReceiveFloodSize{0};
    1416                 :             : 
    1417                 :             :     std::vector<ListenSocket> vhListenSocket;
    1418                 :             :     std::atomic<bool> fNetworkActive{true};
    1419                 :             :     bool fAddressesInitialized{false};
    1420                 :             :     AddrMan& addrman;
    1421                 :             :     const NetGroupManager& m_netgroupman;
    1422                 :             :     std::deque<std::string> m_addr_fetches GUARDED_BY(m_addr_fetches_mutex);
    1423                 :             :     Mutex m_addr_fetches_mutex;
    1424                 :             : 
    1425                 :             :     // connection string and whether to use v2 p2p
    1426                 :             :     std::vector<AddedNodeParams> m_added_node_params GUARDED_BY(m_added_nodes_mutex);
    1427                 :             : 
    1428                 :             :     mutable Mutex m_added_nodes_mutex;
    1429                 :             :     std::vector<CNode*> m_nodes GUARDED_BY(m_nodes_mutex);
    1430                 :             :     std::list<CNode*> m_nodes_disconnected;
    1431                 :             :     mutable RecursiveMutex m_nodes_mutex;
    1432                 :             :     std::atomic<NodeId> nLastNodeId{0};
    1433                 :             :     unsigned int nPrevNodeCount{0};
    1434                 :             : 
    1435                 :             :     // Stores number of full-tx connections (outbound and manual) per network
    1436                 :             :     std::array<unsigned int, Network::NET_MAX> m_network_conn_counts GUARDED_BY(m_nodes_mutex) = {};
    1437                 :             : 
    1438                 :             :     /**
    1439                 :             :      * Cache responses to addr requests to minimize privacy leak.
    1440                 :             :      * Attack example: scraping addrs in real-time may allow an attacker
    1441                 :             :      * to infer new connections of the victim by detecting new records
    1442                 :             :      * with fresh timestamps (per self-announcement).
    1443                 :             :      */
    1444         [ #  # ]:           0 :     struct CachedAddrResponse {
    1445                 :             :         std::vector<CAddress> m_addrs_response_cache;
    1446                 :             :         std::chrono::microseconds m_cache_entry_expiration{0};
    1447                 :             :     };
    1448                 :             : 
    1449                 :             :     /**
    1450                 :             :      * Addr responses stored in different caches
    1451                 :             :      * per (network, local socket) prevent cross-network node identification.
    1452                 :             :      * If a node for example is multi-homed under Tor and IPv6,
    1453                 :             :      * a single cache (or no cache at all) would let an attacker
    1454                 :             :      * to easily detect that it is the same node by comparing responses.
    1455                 :             :      * Indexing by local socket prevents leakage when a node has multiple
    1456                 :             :      * listening addresses on the same network.
    1457                 :             :      *
    1458                 :             :      * The used memory equals to 1000 CAddress records (or around 40 bytes) per
    1459                 :             :      * distinct Network (up to 5) we have/had an inbound peer from,
    1460                 :             :      * resulting in at most ~196 KB. Every separate local socket may
    1461                 :             :      * add up to ~196 KB extra.
    1462                 :             :      */
    1463                 :             :     std::map<uint64_t, CachedAddrResponse> m_addr_response_caches;
    1464                 :             : 
    1465                 :             :     /**
    1466                 :             :      * Services this node offers.
    1467                 :             :      *
    1468                 :             :      * This data is replicated in each Peer instance we create.
    1469                 :             :      *
    1470                 :             :      * This data is not marked const, but after being set it should not
    1471                 :             :      * change. Unless AssumeUTXO is started, in which case, the peer
    1472                 :             :      * will be limited until the background chain sync finishes.
    1473                 :             :      *
    1474                 :             :      * \sa Peer::our_services
    1475                 :             :      */
    1476                 :             :     std::atomic<ServiceFlags> m_local_services;
    1477                 :             : 
    1478                 :             :     std::unique_ptr<CSemaphore> semOutbound;
    1479                 :             :     std::unique_ptr<CSemaphore> semAddnode;
    1480                 :             : 
    1481                 :             :     /**
    1482                 :             :      * Maximum number of automatic connections permitted, excluding manual
    1483                 :             :      * connections but including inbounds. May be changed by the user and is
    1484                 :             :      * potentially limited by the operating system (number of file descriptors).
    1485                 :             :      */
    1486                 :             :     int m_max_automatic_connections;
    1487                 :             : 
    1488                 :             :     /*
    1489                 :             :      * Maximum number of peers by connection type. Might vary from defaults
    1490                 :             :      * based on -maxconnections init value.
    1491                 :             :      */
    1492                 :             : 
    1493                 :             :     // How many full-relay (tx, block, addr) outbound peers we want
    1494                 :             :     int m_max_outbound_full_relay;
    1495                 :             : 
    1496                 :             :     // How many block-relay only outbound peers we want
    1497                 :             :     // We do not relay tx or addr messages with these peers
    1498                 :             :     int m_max_outbound_block_relay;
    1499                 :             : 
    1500                 :             :     int m_max_addnode{MAX_ADDNODE_CONNECTIONS};
    1501                 :             :     int m_max_feeler{MAX_FEELER_CONNECTIONS};
    1502                 :             :     int m_max_automatic_outbound;
    1503                 :             :     int m_max_inbound;
    1504                 :             : 
    1505                 :             :     bool m_use_addrman_outgoing;
    1506                 :             :     CClientUIInterface* m_client_interface;
    1507                 :             :     NetEventsInterface* m_msgproc;
    1508                 :             :     /** Pointer to this node's banman. May be nullptr - check existence before dereferencing. */
    1509                 :             :     BanMan* m_banman;
    1510                 :             : 
    1511                 :             :     /**
    1512                 :             :      * Addresses that were saved during the previous clean shutdown. We'll
    1513                 :             :      * attempt to make block-relay-only connections to them.
    1514                 :             :      */
    1515                 :             :     std::vector<CAddress> m_anchors;
    1516                 :             : 
    1517                 :             :     /** SipHasher seeds for deterministic randomness */
    1518                 :             :     const uint64_t nSeed0, nSeed1;
    1519                 :             : 
    1520                 :             :     /** flag for waking the message processor. */
    1521                 :             :     bool fMsgProcWake GUARDED_BY(mutexMsgProc);
    1522                 :             : 
    1523                 :             :     std::condition_variable condMsgProc;
    1524                 :             :     Mutex mutexMsgProc;
    1525                 :             :     std::atomic<bool> flagInterruptMsgProc{false};
    1526                 :             : 
    1527                 :             :     /**
    1528                 :             :      * This is signaled when network activity should cease.
    1529                 :             :      * A pointer to it is saved in `m_i2p_sam_session`, so make sure that
    1530                 :             :      * the lifetime of `interruptNet` is not shorter than
    1531                 :             :      * the lifetime of `m_i2p_sam_session`.
    1532                 :             :      */
    1533                 :             :     CThreadInterrupt interruptNet;
    1534                 :             : 
    1535                 :             :     /**
    1536                 :             :      * I2P SAM session.
    1537                 :             :      * Used to accept incoming and make outgoing I2P connections from a persistent
    1538                 :             :      * address.
    1539                 :             :      */
    1540                 :             :     std::unique_ptr<i2p::sam::Session> m_i2p_sam_session;
    1541                 :             : 
    1542                 :             :     std::thread threadDNSAddressSeed;
    1543                 :             :     std::thread threadSocketHandler;
    1544                 :             :     std::thread threadOpenAddedConnections;
    1545                 :             :     std::thread threadOpenConnections;
    1546                 :             :     std::thread threadMessageHandler;
    1547                 :             :     std::thread threadI2PAcceptIncoming;
    1548                 :             : 
    1549                 :             :     /** flag for deciding to connect to an extra outbound peer,
    1550                 :             :      *  in excess of m_max_outbound_full_relay
    1551                 :             :      *  This takes the place of a feeler connection */
    1552                 :             :     std::atomic_bool m_try_another_outbound_peer;
    1553                 :             : 
    1554                 :             :     /** flag for initiating extra block-relay-only peer connections.
    1555                 :             :      *  this should only be enabled after initial chain sync has occurred,
    1556                 :             :      *  as these connections are intended to be short-lived and low-bandwidth.
    1557                 :             :      */
    1558                 :             :     std::atomic_bool m_start_extra_block_relay_peers{false};
    1559                 :             : 
    1560                 :             :     /**
    1561                 :             :      * A vector of -bind=<address>:<port>=onion arguments each of which is
    1562                 :             :      * an address and port that are designated for incoming Tor connections.
    1563                 :             :      */
    1564                 :             :     std::vector<CService> m_onion_binds;
    1565                 :             : 
    1566                 :             :     /**
    1567                 :             :      * flag for adding 'forcerelay' permission to whitelisted inbound
    1568                 :             :      * and manual peers with default permissions.
    1569                 :             :      */
    1570                 :             :     bool whitelist_forcerelay;
    1571                 :             : 
    1572                 :             :     /**
    1573                 :             :      * flag for adding 'relay' permission to whitelisted inbound
    1574                 :             :      * and manual peers with default permissions.
    1575                 :             :      */
    1576                 :             :     bool whitelist_relay;
    1577                 :             : 
    1578                 :             :     /**
    1579                 :             :      * Mutex protecting m_i2p_sam_sessions.
    1580                 :             :      */
    1581                 :             :     Mutex m_unused_i2p_sessions_mutex;
    1582                 :             : 
    1583                 :             :     /**
    1584                 :             :      * A pool of created I2P SAM transient sessions that should be used instead
    1585                 :             :      * of creating new ones in order to reduce the load on the I2P network.
    1586                 :             :      * Creating a session in I2P is not cheap, thus if this is not empty, then
    1587                 :             :      * pick an entry from it instead of creating a new session. If connecting to
    1588                 :             :      * a host fails, then the created session is put to this pool for reuse.
    1589                 :             :      */
    1590                 :             :     std::queue<std::unique_ptr<i2p::sam::Session>> m_unused_i2p_sessions GUARDED_BY(m_unused_i2p_sessions_mutex);
    1591                 :             : 
    1592                 :             :     /**
    1593                 :             :      * Mutex protecting m_reconnections.
    1594                 :             :      */
    1595                 :             :     Mutex m_reconnections_mutex;
    1596                 :             : 
    1597                 :             :     /** Struct for entries in m_reconnections. */
    1598                 :             :     struct ReconnectionInfo
    1599                 :             :     {
    1600                 :             :         CAddress addr_connect;
    1601                 :             :         CSemaphoreGrant grant;
    1602                 :             :         std::string destination;
    1603                 :             :         ConnectionType conn_type;
    1604                 :             :         bool use_v2transport;
    1605                 :             :     };
    1606                 :             : 
    1607                 :             :     /**
    1608                 :             :      * List of reconnections we have to make.
    1609                 :             :      */
    1610                 :             :     std::list<ReconnectionInfo> m_reconnections GUARDED_BY(m_reconnections_mutex);
    1611                 :             : 
    1612                 :             :     /** Attempt reconnections, if m_reconnections non-empty. */
    1613                 :             :     void PerformReconnections() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex, !m_unused_i2p_sessions_mutex);
    1614                 :             : 
    1615                 :             :     /**
    1616                 :             :      * Cap on the size of `m_unused_i2p_sessions`, to ensure it does not
    1617                 :             :      * unexpectedly use too much memory.
    1618                 :             :      */
    1619                 :             :     static constexpr size_t MAX_UNUSED_I2P_SESSIONS_SIZE{10};
    1620                 :             : 
    1621                 :             :     /**
    1622                 :             :      * RAII helper to atomically create a copy of `m_nodes` and add a reference
    1623                 :             :      * to each of the nodes. The nodes are released when this object is destroyed.
    1624                 :             :      */
    1625                 :             :     class NodesSnapshot
    1626                 :             :     {
    1627                 :             :     public:
    1628                 :           0 :         explicit NodesSnapshot(const CConnman& connman, bool shuffle)
    1629         [ #  # ]:           0 :         {
    1630                 :           0 :             {
    1631         [ #  # ]:           0 :                 LOCK(connman.m_nodes_mutex);
    1632         [ #  # ]:           0 :                 m_nodes_copy = connman.m_nodes;
    1633         [ #  # ]:           0 :                 for (auto& node : m_nodes_copy) {
    1634                 :           0 :                     node->AddRef();
    1635                 :             :                 }
    1636                 :           0 :             }
    1637         [ #  # ]:           0 :             if (shuffle) {
    1638                 :           0 :                 std::shuffle(m_nodes_copy.begin(), m_nodes_copy.end(), FastRandomContext{});
    1639                 :             :             }
    1640                 :           0 :         }
    1641                 :             : 
    1642                 :           0 :         ~NodesSnapshot()
    1643                 :             :         {
    1644         [ #  # ]:           0 :             for (auto& node : m_nodes_copy) {
    1645                 :           0 :                 node->Release();
    1646                 :             :             }
    1647                 :           0 :         }
    1648                 :             : 
    1649                 :           0 :         const std::vector<CNode*>& Nodes() const
    1650                 :             :         {
    1651         [ #  # ]:           0 :             return m_nodes_copy;
    1652                 :             :         }
    1653                 :             : 
    1654                 :             :     private:
    1655                 :             :         std::vector<CNode*> m_nodes_copy;
    1656                 :             :     };
    1657                 :             : 
    1658                 :             :     const CChainParams& m_params;
    1659                 :             : 
    1660                 :             :     friend struct ConnmanTestMsg;
    1661                 :             : };
    1662                 :             : 
    1663                 :             : /** Defaults to `CaptureMessageToFile()`, but can be overridden by unit tests. */
    1664                 :             : extern std::function<void(const CAddress& addr,
    1665                 :             :                           const std::string& msg_type,
    1666                 :             :                           Span<const unsigned char> data,
    1667                 :             :                           bool is_incoming)>
    1668                 :             :     CaptureMessage;
    1669                 :             : 
    1670                 :             : #endif // BITCOIN_NET_H
        

Generated by: LCOV version 2.0-1