xrpld
Loading...
Searching...
No Matches
Message.h
1#pragma once
2
3#include <xrpld/overlay/Compression.h>
4
5#include <xrpl/basics/ByteUtilities.h>
6#include <xrpl/protocol/PublicKey.h>
7#include <xrpl/server/Manifest.h>
8
9#include <google/protobuf/message.h>
10
11#include <xrpl.pb.h>
12
13#include <cstddef>
14#include <cstdint>
15#include <memory>
16#include <mutex>
17#include <optional>
18#include <vector>
19
20namespace xrpl {
21
23// Ping messages should be much smaller than the maximum message size,
24// so we define a separate limit for them.
26
27// Allowance for protobuf framing around each manifest in a TMManifests message.
29
47constexpr std::size_t
48maximumManifestsMessageSize(std::size_t const trustedCount, std::size_t const untrustedCount)
49{
50 return (trustedCount + untrustedCount) * (kMaxManifestBytes + kManifestFramingBytes);
51}
52
53// The message size the defaults imply must stay within the overall protocol
54// message limit. The same check for the largest configurable counts lives in
55// OverlayImpl.h, where the configured bound is visible.
56static_assert(
58
59// VFALCO NOTE If we forward declare Message and write out shared_ptr
60// instead of using the in-class type alias, we can remove the
61// entire ripple.pb.h from the main headers.
62//
63
64// packaging of messages into length/type-prepended buffers
65// ready for transmission.
66//
67// Message implements simple "packing" of protocol buffers Messages into
68// a string prepended by a header specifying the message length.
69// MessageType should be a Message class generated by the protobuf compiler.
70//
71
73{
76
77public:
85 Message(
86 ::google::protobuf::Message const& message,
87 protocol::MessageType type,
88 std::optional<PublicKey> const& validator = {});
89
95
96 static std::size_t
97 messageSize(::google::protobuf::Message const& message);
98
99 static std::size_t
100 totalSize(::google::protobuf::Message const& message);
101
110 getBuffer(Compressed tryCompressed);
111
117 {
118 return category_;
119 }
120
126 {
127 return validatorKey_;
128 }
129
130private:
136
146 static void
147 setHeader(
148 std::uint8_t* in,
149 std::uint32_t payloadBytes,
150 int type,
152 std::uint32_t uncompressedBytes);
153
159 void
160 compress();
161
169 static int
170 getType(std::uint8_t const* in);
171};
172
173} // namespace xrpl
std::size_t getCategory() const
Get the traffic category.
Definition Message.h:116
compression::Compressed Compressed
Definition Message.h:74
std::once_flag onceFlag_
Definition Message.h:134
std::optional< PublicKey > validatorKey_
Definition Message.h:135
Message(::google::protobuf::Message const &message, protocol::MessageType type, std::optional< PublicKey > const &validator={})
Constructor.
Definition Message.cpp:21
std::size_t category_
Definition Message.h:133
compression::Algorithm Algorithm
Definition Message.h:75
static int getType(std::uint8_t const *in)
Get the message type from the payload header.
Definition Message.cpp:217
std::optional< PublicKey > const & getValidatorKey() const
Get the validator's key.
Definition Message.h:125
static std::size_t totalSize(::google::protobuf::Message const &message)
Definition Message.cpp:59
std::vector< uint8_t > const & getBuffer(Compressed tryCompressed)
Retrieve the packed message data.
Definition Message.cpp:201
std::vector< uint8_t > buffer_
Definition Message.h:131
static void setHeader(std::uint8_t *in, std::uint32_t payloadBytes, int type, Algorithm compression, std::uint32_t uncompressedBytes)
Set the payload header.
Definition Message.cpp:166
void compress()
Try to compress the payload.
Definition Message.cpp:65
static std::size_t messageSize(::google::protobuf::Message const &message)
Definition Message.cpp:48
std::size_t getBufferSize()
Retrieve the size of the packed but uncompressed message data.
Definition Message.cpp:195
std::vector< uint8_t > bufferCompressed_
Definition Message.h:132
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
constexpr std::size_t kMaximumMessageSize
Definition Message.h:22
constexpr std::size_t kMaximumPingMessageSize
Definition Message.h:25
constexpr std::size_t kMaxTrustedCount
Default number of trusted manifests allowed in a Manifest message.
Definition Manifest.h:232
constexpr std::size_t maximumManifestsMessageSize(std::size_t const trustedCount, std::size_t const untrustedCount)
Upper bound on the wire size of a TMManifests message.
Definition Message.h:48
constexpr std::size_t kMaxManifestBytes
Largest a valid manifest can be, in decoded bytes.
Definition Manifest.h:191
constexpr std::size_t kMaxUntrustedCount
Default number of untrusted manifests to store in cache and allowed in one Manifest message.
Definition Manifest.h:216
constexpr auto megabytes(T value) noexcept
constexpr auto kilobytes(T value) noexcept
constexpr std::size_t kManifestFramingBytes
Definition Message.h:28