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>
40 inline protocol::MessageType
43 return protocol::mtGET_LEDGER;
46 inline protocol::MessageType
49 return protocol::mtREPLAY_DELTA_REQ;
52 inline protocol::MessageType
55 return protocol::mtPROOF_PATH_REQ;
59 template <
class =
void>
65 case protocol::mtMANIFESTS:
67 case protocol::mtPING:
69 case protocol::mtCLUSTER:
71 case protocol::mtENDPOINTS:
73 case protocol::mtTRANSACTION:
75 case protocol::mtGET_LEDGER:
77 case protocol::mtLEDGER_DATA:
79 case protocol::mtPROPOSE_LEDGER:
81 case protocol::mtSTATUS_CHANGE:
83 case protocol::mtHAVE_SET:
85 case protocol::mtVALIDATORLIST:
86 return "validator_list";
87 case protocol::mtVALIDATORLISTCOLLECTION:
88 return "validator_list_collection";
89 case protocol::mtVALIDATION:
91 case protocol::mtGET_PEER_SHARD_INFO:
92 return "get_peer_shard_info";
93 case protocol::mtPEER_SHARD_INFO:
94 return "peer_shard_info";
95 case protocol::mtGET_OBJECTS:
97 case protocol::mtHAVE_TRANSACTIONS:
98 return "have_transactions";
99 case protocol::mtTRANSACTIONS:
100 return "transactions";
101 case protocol::mtSQUELCH:
103 case protocol::mtPROOF_PATH_REQ:
104 return "proof_path_request";
105 case protocol::mtPROOF_PATH_RESPONSE:
106 return "proof_path_response";
107 case protocol::mtREPLAY_DELTA_REQ:
108 return "replay_delta_request";
109 case protocol::mtREPLAY_DELTA_RESPONSE:
110 return "replay_delta_response";
111 case protocol::mtGET_PEER_SHARD_INFO_V2:
112 return "get_peer_shard_info_v2";
113 case protocol::mtPEER_SHARD_INFO_V2:
114 return "peer_shard_info_v2";
115 case protocol::mtSTART_PROTOCOL:
116 return "start_protocol";
117 case protocol::mtGRACEFUL_CLOSE:
118 return "graceful_close";
154 template <
typename BufferSequence>
158 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
162 template <
typename BufferSequence>
166 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::end(
179 template <
class BufferSequence>
182 boost::system::error_code& ec,
183 BufferSequence
const& bufs,
204 ec = make_error_code(boost::system::errc::success);
210 ec = make_error_code(boost::system::errc::protocol_error);
218 ec = make_error_code(boost::system::errc::protocol_error);
222 for (
int i = 0; i != 4; ++i)
230 for (
int i = 0; i != 2; ++i)
233 for (
int i = 0; i != 4; ++i)
242 if ((*iter & 0xFC) == 0)
248 ec = make_error_code(boost::system::errc::success);
254 for (
int i = 0; i != 4; ++i)
260 for (
int i = 0; i != 2; ++i)
266 ec = make_error_code(boost::system::errc::no_message);
278 auto const m = std::make_shared<T>();
295 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
298 else if (!m->ParseFromZeroCopyStream(&stream))
313 auto const m = parseMessageContent<T>(header, buffers);
318 handler.onMessageBegin(
324 handler.onMessage(m);
344 template <
class Buffers,
class Handler>
347 Buffers
const& buffers,
353 auto const size = boost::asio::buffer_size(buffers);
375 result.
second = make_error_code(boost::system::errc::message_size);
380 if (!handler.compressionEnabled() &&
383 result.
second = make_error_code(boost::system::errc::protocol_error);
389 if (header->total_wire_size > size)
391 hint = header->total_wire_size - size;
397 switch (header->message_type)
399 case protocol::mtMANIFESTS:
400 success = detail::invoke<protocol::TMManifests>(
401 *header, buffers, handler);
403 case protocol::mtPING:
405 detail::invoke<protocol::TMPing>(*header, buffers, handler);
407 case protocol::mtCLUSTER:
409 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
411 case protocol::mtENDPOINTS:
412 success = detail::invoke<protocol::TMEndpoints>(
413 *header, buffers, handler);
415 case protocol::mtTRANSACTION:
416 success = detail::invoke<protocol::TMTransaction>(
417 *header, buffers, handler);
419 case protocol::mtGET_LEDGER:
420 success = detail::invoke<protocol::TMGetLedger>(
421 *header, buffers, handler);
423 case protocol::mtLEDGER_DATA:
424 success = detail::invoke<protocol::TMLedgerData>(
425 *header, buffers, handler);
427 case protocol::mtPROPOSE_LEDGER:
428 success = detail::invoke<protocol::TMProposeSet>(
429 *header, buffers, handler);
431 case protocol::mtSTATUS_CHANGE:
432 success = detail::invoke<protocol::TMStatusChange>(
433 *header, buffers, handler);
435 case protocol::mtHAVE_SET:
436 success = detail::invoke<protocol::TMHaveTransactionSet>(
437 *header, buffers, handler);
439 case protocol::mtVALIDATION:
440 success = detail::invoke<protocol::TMValidation>(
441 *header, buffers, handler);
443 case protocol::mtGET_PEER_SHARD_INFO:
444 success = detail::invoke<protocol::TMGetPeerShardInfo>(
445 *header, buffers, handler);
447 case protocol::mtPEER_SHARD_INFO:
448 success = detail::invoke<protocol::TMPeerShardInfo>(
449 *header, buffers, handler);
451 case protocol::mtVALIDATORLIST:
452 success = detail::invoke<protocol::TMValidatorList>(
453 *header, buffers, handler);
455 case protocol::mtVALIDATORLISTCOLLECTION:
456 success = detail::invoke<protocol::TMValidatorListCollection>(
457 *header, buffers, handler);
459 case protocol::mtGET_OBJECTS:
460 success = detail::invoke<protocol::TMGetObjectByHash>(
461 *header, buffers, handler);
463 case protocol::mtHAVE_TRANSACTIONS:
464 success = detail::invoke<protocol::TMHaveTransactions>(
465 *header, buffers, handler);
467 case protocol::mtTRANSACTIONS:
468 success = detail::invoke<protocol::TMTransactions>(
469 *header, buffers, handler);
471 case protocol::mtSQUELCH:
473 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
475 case protocol::mtPROOF_PATH_REQ:
476 success = detail::invoke<protocol::TMProofPathRequest>(
477 *header, buffers, handler);
479 case protocol::mtPROOF_PATH_RESPONSE:
480 success = detail::invoke<protocol::TMProofPathResponse>(
481 *header, buffers, handler);
483 case protocol::mtREPLAY_DELTA_REQ:
484 success = detail::invoke<protocol::TMReplayDeltaRequest>(
485 *header, buffers, handler);
487 case protocol::mtREPLAY_DELTA_RESPONSE:
488 success = detail::invoke<protocol::TMReplayDeltaResponse>(
489 *header, buffers, handler);
491 case protocol::mtGET_PEER_SHARD_INFO_V2:
492 success = detail::invoke<protocol::TMGetPeerShardInfoV2>(
493 *header, buffers, handler);
495 case protocol::mtPEER_SHARD_INFO_V2:
496 success = detail::invoke<protocol::TMPeerShardInfoV2>(
497 *header, buffers, handler);
499 case protocol::mtSTART_PROTOCOL:
500 success = detail::invoke<protocol::TMStartProtocol>(
501 *header, buffers, handler);
503 case protocol::mtGRACEFUL_CLOSE:
504 success = detail::invoke<protocol::TMGracefulClose>(
505 *header, buffers, handler);
508 handler.onMessageUnknown(header->message_type);
513 result.
first = header->total_wire_size;
516 result.
second = make_error_code(boost::system::errc::bad_message);