20 #ifndef RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
21 #define RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
23 #include <ripple/basics/ByteUtilities.h>
24 #include <ripple/overlay/Compression.h>
25 #include <ripple/overlay/Message.h>
26 #include <ripple/overlay/impl/ZeroCopyStream.h>
27 #include <ripple/protocol/messages.h>
28 #include <boost/asio/buffer.hpp>
29 #include <boost/asio/buffers_iterator.hpp>
30 #include <boost/system/error_code.hpp>
35 #include <ripple.pb.h>
41 inline protocol::MessageType
44 return protocol::mtGET_LEDGER;
47 inline protocol::MessageType
50 return protocol::mtREPLAY_DELTA_REQ;
53 inline protocol::MessageType
56 return protocol::mtPROOF_PATH_REQ;
60 template <
class =
void>
66 case protocol::mtMANIFESTS:
68 case protocol::mtPING:
70 case protocol::mtCLUSTER:
72 case protocol::mtENDPOINTS:
74 case protocol::mtTRANSACTION:
76 case protocol::mtGET_LEDGER:
78 case protocol::mtLEDGER_DATA:
80 case protocol::mtPROPOSE_LEDGER:
82 case protocol::mtSTATUS_CHANGE:
84 case protocol::mtHAVE_SET:
86 case protocol::mtVALIDATORLIST:
87 return "validator_list";
88 case protocol::mtVALIDATORLISTCOLLECTION:
89 return "validator_list_collection";
90 case protocol::mtVALIDATION:
92 case protocol::mtGET_PEER_SHARD_INFO:
93 return "get_peer_shard_info";
94 case protocol::mtPEER_SHARD_INFO:
95 return "peer_shard_info";
96 case protocol::mtGET_OBJECTS:
98 case protocol::mtHAVE_TRANSACTIONS:
99 return "have_transactions";
100 case protocol::mtTRANSACTIONS:
101 return "transactions";
102 case protocol::mtSQUELCH:
104 case protocol::mtPROOF_PATH_REQ:
105 return "proof_path_request";
106 case protocol::mtPROOF_PATH_RESPONSE:
107 return "proof_path_response";
108 case protocol::mtREPLAY_DELTA_REQ:
109 return "replay_delta_request";
110 case protocol::mtREPLAY_DELTA_RESPONSE:
111 return "replay_delta_response";
112 case protocol::mtGET_PEER_SHARD_INFO_V2:
113 return "get_peer_shard_info_v2";
114 case protocol::mtPEER_SHARD_INFO_V2:
115 return "peer_shard_info_v2";
151 template <
typename BufferSequence>
155 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
159 template <
typename BufferSequence>
163 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::end(
176 template <
class BufferSequence>
179 boost::system::error_code& ec,
180 BufferSequence
const& bufs,
201 ec = make_error_code(boost::system::errc::success);
207 ec = make_error_code(boost::system::errc::protocol_error);
215 ec = make_error_code(boost::system::errc::protocol_error);
219 for (
int i = 0; i != 4; ++i)
227 for (
int i = 0; i != 2; ++i)
230 for (
int i = 0; i != 4; ++i)
239 if ((*iter & 0xFC) == 0)
245 ec = make_error_code(boost::system::errc::success);
251 for (
int i = 0; i != 4; ++i)
257 for (
int i = 0; i != 2; ++i)
263 ec = make_error_code(boost::system::errc::no_message);
275 auto const m = std::make_shared<T>();
292 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
295 else if (!m->ParseFromZeroCopyStream(&stream))
310 auto const m = parseMessageContent<T>(header, buffers);
315 handler.onMessageBegin(
321 handler.onMessage(m);
341 template <
class Buffers,
class Handler>
344 Buffers
const& buffers,
350 auto const size = boost::asio::buffer_size(buffers);
372 result.
second = make_error_code(boost::system::errc::message_size);
377 if (!handler.compressionEnabled() &&
380 result.
second = make_error_code(boost::system::errc::protocol_error);
386 if (header->total_wire_size > size)
388 hint = header->total_wire_size - size;
394 switch (header->message_type)
396 case protocol::mtMANIFESTS:
397 success = detail::invoke<protocol::TMManifests>(
398 *header, buffers, handler);
400 case protocol::mtPING:
402 detail::invoke<protocol::TMPing>(*header, buffers, handler);
404 case protocol::mtCLUSTER:
406 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
408 case protocol::mtENDPOINTS:
409 success = detail::invoke<protocol::TMEndpoints>(
410 *header, buffers, handler);
412 case protocol::mtTRANSACTION:
413 success = detail::invoke<protocol::TMTransaction>(
414 *header, buffers, handler);
416 case protocol::mtGET_LEDGER:
417 success = detail::invoke<protocol::TMGetLedger>(
418 *header, buffers, handler);
420 case protocol::mtLEDGER_DATA:
421 success = detail::invoke<protocol::TMLedgerData>(
422 *header, buffers, handler);
424 case protocol::mtPROPOSE_LEDGER:
425 success = detail::invoke<protocol::TMProposeSet>(
426 *header, buffers, handler);
428 case protocol::mtSTATUS_CHANGE:
429 success = detail::invoke<protocol::TMStatusChange>(
430 *header, buffers, handler);
432 case protocol::mtHAVE_SET:
433 success = detail::invoke<protocol::TMHaveTransactionSet>(
434 *header, buffers, handler);
436 case protocol::mtVALIDATION:
437 success = detail::invoke<protocol::TMValidation>(
438 *header, buffers, handler);
440 case protocol::mtGET_PEER_SHARD_INFO:
441 success = detail::invoke<protocol::TMGetPeerShardInfo>(
442 *header, buffers, handler);
444 case protocol::mtPEER_SHARD_INFO:
445 success = detail::invoke<protocol::TMPeerShardInfo>(
446 *header, buffers, handler);
448 case protocol::mtVALIDATORLIST:
449 success = detail::invoke<protocol::TMValidatorList>(
450 *header, buffers, handler);
452 case protocol::mtVALIDATORLISTCOLLECTION:
453 success = detail::invoke<protocol::TMValidatorListCollection>(
454 *header, buffers, handler);
456 case protocol::mtGET_OBJECTS:
457 success = detail::invoke<protocol::TMGetObjectByHash>(
458 *header, buffers, handler);
460 case protocol::mtHAVE_TRANSACTIONS:
461 success = detail::invoke<protocol::TMHaveTransactions>(
462 *header, buffers, handler);
464 case protocol::mtTRANSACTIONS:
465 success = detail::invoke<protocol::TMTransactions>(
466 *header, buffers, handler);
468 case protocol::mtSQUELCH:
470 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
472 case protocol::mtPROOF_PATH_REQ:
473 success = detail::invoke<protocol::TMProofPathRequest>(
474 *header, buffers, handler);
476 case protocol::mtPROOF_PATH_RESPONSE:
477 success = detail::invoke<protocol::TMProofPathResponse>(
478 *header, buffers, handler);
480 case protocol::mtREPLAY_DELTA_REQ:
481 success = detail::invoke<protocol::TMReplayDeltaRequest>(
482 *header, buffers, handler);
484 case protocol::mtREPLAY_DELTA_RESPONSE:
485 success = detail::invoke<protocol::TMReplayDeltaResponse>(
486 *header, buffers, handler);
488 case protocol::mtGET_PEER_SHARD_INFO_V2:
489 success = detail::invoke<protocol::TMGetPeerShardInfoV2>(
490 *header, buffers, handler);
492 case protocol::mtPEER_SHARD_INFO_V2:
493 success = detail::invoke<protocol::TMPeerShardInfoV2>(
494 *header, buffers, handler);
497 handler.onMessageUnknown(header->message_type);
502 result.
first = header->total_wire_size;
505 result.
second = make_error_code(boost::system::errc::bad_message);