mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 07:09:15 +01:00
[net processing] Add m_our_services and m_their_services to Peer
Track services offered by us and the peer in the Peer object.
This commit is contained in:
@@ -207,6 +207,27 @@ struct Peer {
|
||||
/** Same id as the CNode object for this peer */
|
||||
const NodeId m_id{0};
|
||||
|
||||
/** Services we offered to this peer.
|
||||
*
|
||||
* This is supplied by CConnman during peer initialization. It's const
|
||||
* because there is no protocol defined for renegotiating services
|
||||
* initially offered to a peer. The set of local services we offer should
|
||||
* not change after initialization.
|
||||
*
|
||||
* An interesting example of this is NODE_NETWORK and initial block
|
||||
* download: a node which starts up from scratch doesn't have any blocks
|
||||
* to serve, but still advertises NODE_NETWORK because it will eventually
|
||||
* fulfill this role after IBD completes. P2P code is written in such a
|
||||
* way that it can gracefully handle peers who don't make good on their
|
||||
* service advertisements.
|
||||
*
|
||||
* TODO: remove redundant CNode::nLocalServices*/
|
||||
const ServiceFlags m_our_services;
|
||||
/** Services this peer offered to us.
|
||||
*
|
||||
* TODO: remove redundant CNode::nServices */
|
||||
std::atomic<ServiceFlags> m_their_services{NODE_NONE};
|
||||
|
||||
/** Protects misbehavior data members */
|
||||
Mutex m_misbehavior_mutex;
|
||||
/** Accumulated misbehavior score for this peer */
|
||||
@@ -360,8 +381,9 @@ struct Peer {
|
||||
/** Time of the last getheaders message to this peer */
|
||||
std::atomic<NodeClock::time_point> m_last_getheaders_timestamp{NodeSeconds{}};
|
||||
|
||||
Peer(NodeId id)
|
||||
explicit Peer(NodeId id, ServiceFlags our_services)
|
||||
: m_id{id}
|
||||
, m_our_services{our_services}
|
||||
{}
|
||||
|
||||
private:
|
||||
@@ -482,7 +504,7 @@ public:
|
||||
EXCLUSIVE_LOCKS_REQUIRED(!m_most_recent_block_mutex);
|
||||
|
||||
/** Implement NetEventsInterface */
|
||||
void InitializeNode(CNode* pnode) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
|
||||
void InitializeNode(CNode& node, ServiceFlags our_services) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
|
||||
void FinalizeNode(const CNode& node) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
|
||||
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override
|
||||
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex, !m_most_recent_block_mutex);
|
||||
@@ -1299,21 +1321,21 @@ void PeerManagerImpl::UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_s
|
||||
if (state) state->m_last_block_announcement = time_in_seconds;
|
||||
}
|
||||
|
||||
void PeerManagerImpl::InitializeNode(CNode *pnode)
|
||||
void PeerManagerImpl::InitializeNode(CNode& node, ServiceFlags our_services)
|
||||
{
|
||||
NodeId nodeid = pnode->GetId();
|
||||
NodeId nodeid = node.GetId();
|
||||
{
|
||||
LOCK(cs_main);
|
||||
m_node_states.emplace_hint(m_node_states.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(pnode->IsInboundConn()));
|
||||
m_node_states.emplace_hint(m_node_states.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(node.IsInboundConn()));
|
||||
assert(m_txrequest.Count(nodeid) == 0);
|
||||
}
|
||||
PeerRef peer = std::make_shared<Peer>(nodeid);
|
||||
PeerRef peer = std::make_shared<Peer>(nodeid, our_services);
|
||||
{
|
||||
LOCK(m_peer_mutex);
|
||||
m_peer_map.emplace_hint(m_peer_map.end(), nodeid, peer);
|
||||
}
|
||||
if (!pnode->IsInboundConn()) {
|
||||
PushNodeVersion(*pnode, *peer);
|
||||
if (!node.IsInboundConn()) {
|
||||
PushNodeVersion(node, *peer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2843,6 +2865,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::VERACK));
|
||||
|
||||
pfrom.nServices = nServices;
|
||||
peer->m_their_services = nServices;
|
||||
pfrom.SetAddrLocal(addrMe);
|
||||
{
|
||||
LOCK(pfrom.m_subver_mutex);
|
||||
|
||||
Reference in New Issue
Block a user