aboutsummaryrefslogtreecommitdiff
path: root/src/net.h
diff options
context:
space:
mode:
authorPieter Wuille <pieter@wuille.net>2023-09-08 13:55:47 -0400
committerPieter Wuille <pieter@wuille.net>2023-09-10 16:12:27 -0400
commit9bde93df2c84b6d5f333aa56cbd0b28b6ad337b0 (patch)
tree45de45e54ee709645a0752419188ce5fa970c16a /src/net.h
parentb6934fd03f080d437acb1fd2b665503c3d6de785 (diff)
net: do not use send buffer to store/cache garbage
Before this commit the V2Transport::m_send_buffer is used to store the garbage: * During MAYBE_V1 state, it's there despite not being sent. * During AWAITING_KEY state, while it is being sent. * At the end of the AWAITING_KEY state it cannot be wiped as it's still needed to compute the garbage authentication packet. Change this by introducing a separate m_send_garbage field, taking over the first and last role listed above. This means the garbage is only in the send buffer when it's actually being sent, removing a few special cases related to this.
Diffstat (limited to 'src/net.h')
-rw-r--r--src/net.h10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/net.h b/src/net.h
index cf7a240202..81fbbfd195 100644
--- a/src/net.h
+++ b/src/net.h
@@ -540,8 +540,8 @@ private:
enum class SendState : uint8_t {
/** (Responder only) Not sending until v1 or v2 is detected.
*
- * This is the initial state for responders. The send buffer contains the public key to
- * send, but nothing is sent in this state yet. When the receiver determines whether this
+ * This is the initial state for responders. The send buffer is empty.
+ * When the receiver determines whether this
* is a V1 or V2 connection, the sender state becomes AWAITING_KEY (for v2) or V1 (for v1).
*/
MAYBE_V1,
@@ -601,6 +601,8 @@ private:
std::vector<uint8_t> m_send_buffer GUARDED_BY(m_send_mutex);
/** How many bytes from the send buffer have been sent so far. */
uint32_t m_send_pos GUARDED_BY(m_send_mutex) {0};
+ /** The garbage sent, or to be sent (MAYBE_V1 and AWAITING_KEY state only). */
+ std::vector<uint8_t> m_send_garbage GUARDED_BY(m_send_mutex);
/** Type of the message being sent. */
std::string m_send_type GUARDED_BY(m_send_mutex);
/** Current sender state. */
@@ -614,6 +616,8 @@ private:
static std::optional<std::string> GetMessageType(Span<const uint8_t>& contents) noexcept;
/** Determine how many received bytes can be processed in one go (not allowed in V1 state). */
size_t GetMaxBytesToProcess() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex);
+ /** Put our public key + garbage in the send buffer. */
+ void StartSendingHandshake() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_send_mutex);
/** Process bytes in m_recv_buffer, while in KEY_MAYBE_V1 state. */
void ProcessReceivedMaybeV1Bytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex, !m_send_mutex);
/** Process bytes in m_recv_buffer, while in KEY state. */
@@ -636,7 +640,7 @@ public:
V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in) noexcept;
/** Construct a V2 transport with specified keys and garbage (test use only). */
- V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in, const CKey& key, Span<const std::byte> ent32, Span<const uint8_t> garbage) noexcept;
+ V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in, const CKey& key, Span<const std::byte> ent32, std::vector<uint8_t> garbage) noexcept;
// Receive side functions.
bool ReceivedMessageComplete() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex);