Skip to content

Commit ea67232

Browse files
author
MacroFake
committed
Merge bitcoin#25962: net: Add CNodeOptions and increase constness
377e9cc scripted-diff: net: rename permissionFlags to permission_flags (Anthony Towns) 0a7fc42 net: make CNode::m_prefer_evict const (Anthony Towns) d394156 net: make CNode::m_permissionFlags const (Anthony Towns) 9dccc33 net: add CNodeOptions for optional CNode constructor params (Anthony Towns) Pull request description: Adds CNodeOptions to make it easier to add optional parameters to the CNode constructor, and makes prefer_evict and m_permissionFlags actually const. ACKs for top commit: naumenkogs: ACK 377e9cc jonatack: ACK 377e9cc per `git range-diff 52dcb1d 2f3602b 377e9cc` vasild: ACK 377e9cc ryanofsky: Code review ACK 377e9cc. Looks good and feel free to ignore suggestions! Tree-SHA512: 06fd6748770bad75ec8c966fdb73b7534c10bd61838f6f1b36b3f3d6a438e58f6a7d0edb011977e5c118ed7ea85325fac35e10dde520fef249f7a780cf500a85
2 parents 7281fac + 377e9cc commit ea67232

File tree

9 files changed

+47
-38
lines changed

9 files changed

+47
-38
lines changed

src/net.cpp

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
556556
pszDest ? pszDest : "",
557557
conn_type,
558558
/*inbound_onion=*/false,
559-
std::move(i2p_transient_session));
559+
CNodeOptions{ .i2p_sam_session = std::move(i2p_transient_session) });
560560
pnode->AddRef();
561561

562562
// We're making a new connection, harvest entropy from the time (and our peer count)
@@ -637,7 +637,7 @@ void CNode::CopyStats(CNodeStats& stats)
637637
X(mapRecvBytesPerMsgType);
638638
X(nRecvBytes);
639639
}
640-
X(m_permissionFlags);
640+
X(m_permission_flags);
641641

642642
X(m_last_ping_time);
643643
X(m_min_ping_time);
@@ -936,27 +936,27 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
936936

937937
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(*sock)), NODE_NONE};
938938

939-
NetPermissionFlags permissionFlags = NetPermissionFlags::None;
940-
hListenSocket.AddSocketPermissionFlags(permissionFlags);
939+
NetPermissionFlags permission_flags = NetPermissionFlags::None;
940+
hListenSocket.AddSocketPermissionFlags(permission_flags);
941941

942-
CreateNodeFromAcceptedSocket(std::move(sock), permissionFlags, addr_bind, addr);
942+
CreateNodeFromAcceptedSocket(std::move(sock), permission_flags, addr_bind, addr);
943943
}
944944

945945
void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
946-
NetPermissionFlags permissionFlags,
946+
NetPermissionFlags permission_flags,
947947
const CAddress& addr_bind,
948948
const CAddress& addr)
949949
{
950950
int nInbound = 0;
951951
int nMaxInbound = nMaxConnections - m_max_outbound;
952952

953-
AddWhitelistPermissionFlags(permissionFlags, addr);
954-
if (NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::Implicit)) {
955-
NetPermissions::ClearFlag(permissionFlags, NetPermissionFlags::Implicit);
956-
if (gArgs.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) NetPermissions::AddFlag(permissionFlags, NetPermissionFlags::ForceRelay);
957-
if (gArgs.GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY)) NetPermissions::AddFlag(permissionFlags, NetPermissionFlags::Relay);
958-
NetPermissions::AddFlag(permissionFlags, NetPermissionFlags::Mempool);
959-
NetPermissions::AddFlag(permissionFlags, NetPermissionFlags::NoBan);
953+
AddWhitelistPermissionFlags(permission_flags, addr);
954+
if (NetPermissions::HasFlag(permission_flags, NetPermissionFlags::Implicit)) {
955+
NetPermissions::ClearFlag(permission_flags, NetPermissionFlags::Implicit);
956+
if (gArgs.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) NetPermissions::AddFlag(permission_flags, NetPermissionFlags::ForceRelay);
957+
if (gArgs.GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY)) NetPermissions::AddFlag(permission_flags, NetPermissionFlags::Relay);
958+
NetPermissions::AddFlag(permission_flags, NetPermissionFlags::Mempool);
959+
NetPermissions::AddFlag(permission_flags, NetPermissionFlags::NoBan);
960960
}
961961

962962
{
@@ -987,15 +987,15 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
987987

988988
// Don't accept connections from banned peers.
989989
bool banned = m_banman && m_banman->IsBanned(addr);
990-
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::NoBan) && banned)
990+
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && banned)
991991
{
992992
LogPrint(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToString());
993993
return;
994994
}
995995

996996
// Only accept connections from discouraged peers if our inbound slots aren't (almost) full.
997997
bool discouraged = m_banman && m_banman->IsDiscouraged(addr);
998-
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::NoBan) && nInbound + 1 >= nMaxInbound && discouraged)
998+
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && nInbound + 1 >= nMaxInbound && discouraged)
999999
{
10001000
LogPrint(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToString());
10011001
return;
@@ -1014,7 +1014,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
10141014
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
10151015

10161016
ServiceFlags nodeServices = nLocalServices;
1017-
if (NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::BloomFilter)) {
1017+
if (NetPermissions::HasFlag(permission_flags, NetPermissionFlags::BloomFilter)) {
10181018
nodeServices = static_cast<ServiceFlags>(nodeServices | NODE_BLOOM);
10191019
}
10201020

@@ -1027,10 +1027,12 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
10271027
addr_bind,
10281028
/*addrNameIn=*/"",
10291029
ConnectionType::INBOUND,
1030-
inbound_onion);
1030+
inbound_onion,
1031+
CNodeOptions{
1032+
.permission_flags = permission_flags,
1033+
.prefer_evict = discouraged,
1034+
});
10311035
pnode->AddRef();
1032-
pnode->m_permissionFlags = permissionFlags;
1033-
pnode->m_prefer_evict = discouraged;
10341036
m_msgproc->InitializeNode(*pnode, nodeServices);
10351037

10361038
LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString());
@@ -2722,20 +2724,22 @@ CNode::CNode(NodeId idIn,
27222724
const std::string& addrNameIn,
27232725
ConnectionType conn_type_in,
27242726
bool inbound_onion,
2725-
std::unique_ptr<i2p::sam::Session>&& i2p_sam_session)
2727+
CNodeOptions&& node_opts)
27262728
: m_deserializer{std::make_unique<V1TransportDeserializer>(V1TransportDeserializer(Params(), idIn, SER_NETWORK, INIT_PROTO_VERSION))},
27272729
m_serializer{std::make_unique<V1TransportSerializer>(V1TransportSerializer())},
2730+
m_permission_flags{node_opts.permission_flags},
27282731
m_sock{sock},
27292732
m_connected{GetTime<std::chrono::seconds>()},
27302733
addr{addrIn},
27312734
addrBind{addrBindIn},
27322735
m_addr_name{addrNameIn.empty() ? addr.ToStringIPPort() : addrNameIn},
27332736
m_inbound_onion{inbound_onion},
2737+
m_prefer_evict{node_opts.prefer_evict},
27342738
nKeyedNetGroup{nKeyedNetGroupIn},
27352739
id{idIn},
27362740
nLocalHostNonce{nLocalHostNonceIn},
27372741
m_conn_type{conn_type_in},
2738-
m_i2p_sam_session{std::move(i2p_sam_session)}
2742+
m_i2p_sam_session{std::move(node_opts.i2p_sam_session)}
27392743
{
27402744
if (inbound_onion) assert(conn_type_in == ConnectionType::INBOUND);
27412745

src/net.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ class CNodeStats
204204
mapMsgTypeSize mapSendBytesPerMsgType;
205205
uint64_t nRecvBytes;
206206
mapMsgTypeSize mapRecvBytesPerMsgType;
207-
NetPermissionFlags m_permissionFlags;
207+
NetPermissionFlags m_permission_flags;
208208
std::chrono::microseconds m_last_ping_time;
209209
std::chrono::microseconds m_min_ping_time;
210210
// Our address, as reported by the peer
@@ -334,6 +334,13 @@ class V1TransportSerializer : public TransportSerializer {
334334
void prepareForTransport(CSerializedNetMsg& msg, std::vector<unsigned char>& header) const override;
335335
};
336336

337+
struct CNodeOptions
338+
{
339+
NetPermissionFlags permission_flags = NetPermissionFlags::None;
340+
std::unique_ptr<i2p::sam::Session> i2p_sam_session = nullptr;
341+
bool prefer_evict = false;
342+
};
343+
337344
/** Information about a peer */
338345
class CNode
339346
{
@@ -344,7 +351,7 @@ class CNode
344351
const std::unique_ptr<TransportDeserializer> m_deserializer; // Used only by SocketHandler thread
345352
const std::unique_ptr<const TransportSerializer> m_serializer;
346353

347-
NetPermissionFlags m_permissionFlags{NetPermissionFlags::None}; // treated as const outside of fuzz tester
354+
const NetPermissionFlags m_permission_flags;
348355

349356
/**
350357
* Socket used for communication with the node.
@@ -393,9 +400,9 @@ class CNode
393400
* from the wire. This cleaned string can safely be logged or displayed.
394401
*/
395402
std::string cleanSubVer GUARDED_BY(m_subver_mutex){};
396-
bool m_prefer_evict{false}; // This peer is preferred for eviction. (treated as const)
403+
const bool m_prefer_evict{false}; // This peer is preferred for eviction.
397404
bool HasPermission(NetPermissionFlags permission) const {
398-
return NetPermissions::HasFlag(m_permissionFlags, permission);
405+
return NetPermissions::HasFlag(m_permission_flags, permission);
399406
}
400407
/** fSuccessfullyConnected is set to true on receiving VERACK from the peer. */
401408
std::atomic_bool fSuccessfullyConnected{false};
@@ -522,7 +529,7 @@ class CNode
522529
const std::string& addrNameIn,
523530
ConnectionType conn_type_in,
524531
bool inbound_onion,
525-
std::unique_ptr<i2p::sam::Session>&& i2p_sam_session = nullptr);
532+
CNodeOptions&& node_opts = {});
526533
CNode(const CNode&) = delete;
527534
CNode& operator=(const CNode&) = delete;
528535

@@ -890,12 +897,12 @@ class CConnman
890897
* Create a `CNode` object from a socket that has just been accepted and add the node to
891898
* the `m_nodes` member.
892899
* @param[in] sock Connected socket to communicate with the peer.
893-
* @param[in] permissionFlags The peer's permissions.
900+
* @param[in] permission_flags The peer's permissions.
894901
* @param[in] addr_bind The address and port at our side of the connection.
895902
* @param[in] addr The address and port at the peer's side of the connection.
896903
*/
897904
void CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
898-
NetPermissionFlags permissionFlags,
905+
NetPermissionFlags permission_flags,
899906
const CAddress& addr_bind,
900907
const CAddress& addr);
901908

src/qt/rpcconsole.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,11 +1182,11 @@ void RPCConsole::updateDetailWidget()
11821182
ui->peerSubversion->setText(QString::fromStdString(stats->nodeStats.cleanSubVer));
11831183
ui->peerConnectionType->setText(GUIUtil::ConnectionTypeToQString(stats->nodeStats.m_conn_type, /*prepend_direction=*/true));
11841184
ui->peerNetwork->setText(GUIUtil::NetworkToQString(stats->nodeStats.m_network));
1185-
if (stats->nodeStats.m_permissionFlags == NetPermissionFlags::None) {
1185+
if (stats->nodeStats.m_permission_flags == NetPermissionFlags::None) {
11861186
ui->peerPermissions->setText(ts.na);
11871187
} else {
11881188
QStringList permissions;
1189-
for (const auto& permission : NetPermissions::ToStrings(stats->nodeStats.m_permissionFlags)) {
1189+
for (const auto& permission : NetPermissions::ToStrings(stats->nodeStats.m_permission_flags)) {
11901190
permissions.append(QString::fromStdString(permission));
11911191
}
11921192
ui->peerPermissions->setText(permissions.join(" & "));

src/rpc/net.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ static RPCHelpMan getpeerinfo()
242242
obj.pushKV("addr_rate_limited", statestats.m_addr_rate_limited);
243243
}
244244
UniValue permissions(UniValue::VARR);
245-
for (const auto& permission : NetPermissions::ToStrings(stats.m_permissionFlags)) {
245+
for (const auto& permission : NetPermissions::ToStrings(stats.m_permission_flags)) {
246246
permissions.push_back(permission);
247247
}
248248
obj.pushKV("permissions", permissions);

src/test/denialofservice_tests.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
6868
/*successfully_connected=*/true,
6969
/*remote_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
7070
/*local_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
71-
/*permission_flags=*/NetPermissionFlags::None,
7271
/*version=*/PROTOCOL_VERSION,
7372
/*relay_txs=*/true);
7473
TestOnlyResetTimeData();

src/test/fuzz/util.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ void FillNode(FuzzedDataProvider& fuzzed_data_provider, ConnmanTestMsg& connman,
295295
/*successfully_connected=*/fuzzed_data_provider.ConsumeBool(),
296296
/*remote_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
297297
/*local_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
298-
/*permission_flags=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS),
299298
/*version=*/fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max()),
300299
/*relay_txs=*/fuzzed_data_provider.ConsumeBool());
301300
}

src/test/fuzz/util.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ auto ConsumeNode(FuzzedDataProvider& fuzzed_data_provider, const std::optional<N
301301
const std::string addr_name = fuzzed_data_provider.ConsumeRandomLengthString(64);
302302
const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES);
303303
const bool inbound_onion{conn_type == ConnectionType::INBOUND ? fuzzed_data_provider.ConsumeBool() : false};
304+
NetPermissionFlags permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
304305
if constexpr (ReturnUniquePtr) {
305306
return std::make_unique<CNode>(node_id,
306307
sock,
@@ -310,7 +311,8 @@ auto ConsumeNode(FuzzedDataProvider& fuzzed_data_provider, const std::optional<N
310311
addr_bind,
311312
addr_name,
312313
conn_type,
313-
inbound_onion);
314+
inbound_onion,
315+
CNodeOptions{ .permission_flags = permission_flags });
314316
} else {
315317
return CNode{node_id,
316318
sock,
@@ -320,7 +322,8 @@ auto ConsumeNode(FuzzedDataProvider& fuzzed_data_provider, const std::optional<N
320322
addr_bind,
321323
addr_name,
322324
conn_type,
323-
inbound_onion};
325+
inbound_onion,
326+
CNodeOptions{ .permission_flags = permission_flags }};
324327
}
325328
}
326329
inline std::unique_ptr<CNode> ConsumeNodeAsUniquePtr(FuzzedDataProvider& fdp, const std::optional<NodeId>& node_id_in = std::nullopt) { return ConsumeNode<true>(fdp, node_id_in); }

src/test/util/net.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ void ConnmanTestMsg::Handshake(CNode& node,
1717
bool successfully_connected,
1818
ServiceFlags remote_services,
1919
ServiceFlags local_services,
20-
NetPermissionFlags permission_flags,
2120
int32_t version,
2221
bool relay_txs)
2322
{
@@ -56,7 +55,6 @@ void ConnmanTestMsg::Handshake(CNode& node,
5655
assert(peerman.GetNodeStateStats(node.GetId(), statestats));
5756
assert(statestats.m_relay_txs == (relay_txs && !node.IsBlockOnlyConn()));
5857
assert(statestats.their_services == remote_services);
59-
node.m_permissionFlags = permission_flags;
6058
if (successfully_connected) {
6159
CSerializedNetMsg msg_verack{mm.Make(NetMsgType::VERACK)};
6260
(void)connman.ReceiveMsgFrom(node, msg_verack);

src/test/util/net.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ struct ConnmanTestMsg : public CConnman {
4343
bool successfully_connected,
4444
ServiceFlags remote_services,
4545
ServiceFlags local_services,
46-
NetPermissionFlags permission_flags,
4746
int32_t version,
4847
bool relay_txs);
4948

0 commit comments

Comments
 (0)