From: Radoslaw Zarzynski Date: Wed, 13 Feb 2019 17:28:53 +0000 (+0100) Subject: msg/async: receive V2 messages with new preable format. X-Git-Tag: v14.1.1~157^2~36 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=862861349b50cc363fd967e27ecdf1d3b4cc9b9d;p=ceph.git msg/async: receive V2 messages with new preable format. Currently we do support messages with single segment only. Adding multi-segment and proper alignment handling is WIP. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index fdcdae74b6c4..57ac399d9db1 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -191,7 +191,7 @@ public: Frame() : preamble_filler(payload.append_hole(FRAME_PREAMBLE_SIZE)) {} ceph::bufferlist &get_buffer() { - fill_preamble({ segment_t{ payload.length(), 1} }, {}); + fill_preamble({ segment_t{ payload.length() - FRAME_PREAMBLE_SIZE, 1} }, {}); return payload; } @@ -362,7 +362,9 @@ struct SignedEncryptedFrame : public PayloadFrame { auto exp_size = this->payload.length() + 16; // FIXME: plainsize -> ciphersize; for AES-GCM they are equall apart // from auth tag size - //this->fill_preamble(this->payload.length() + 16); + this->fill_preamble({ + segment_t{ this->payload.length() + 16 - FRAME_PREAMBLE_SIZE, 16 } + }, {}); protocol.session_stream_handlers.tx->authenticated_encrypt_update( std::move(this->payload)); @@ -528,7 +530,9 @@ struct MessageHeaderFrame : PayloadFrame(msghdr) { // FIXME: plainsize -> ciphersize; for AES-GCM they are equall apart from auth tag size - //fill_preamble(this->payload.length() + front_len + middle_len + data_len + 16); + fill_preamble({ + segment_t { this->payload.length() + front_len + middle_len + data_len + 16 - FRAME_PREAMBLE_SIZE, 16 }, + }, {}); } MessageHeaderFrame(ceph::bufferlist&& text) @@ -1389,10 +1393,10 @@ CtPtr ProtocolV2::read_frame() { } ldout(cct, 20) << __func__ << dendl; - return READ(FRAME_PREAMBLE_SIZE, handle_read_frame_length_and_tag); + return READ(FRAME_PREAMBLE_SIZE, handle_read_frame_preamble_main); } -CtPtr ProtocolV2::handle_read_frame_length_and_tag(char *buffer, int r) { +CtPtr ProtocolV2::handle_read_frame_preamble_main(char *buffer, int r) { ldout(cct, 20) << __func__ << " r=" << r << dendl; if (r < 0) { @@ -1421,22 +1425,17 @@ CtPtr ProtocolV2::handle_read_frame_length_and_tag(char *buffer, int r) { *_dout << dendl; } - try { - ldout(cct, 30) << __func__ << " preamble after decrypt\n"; - preamble.hexdump(*_dout); - *_dout << dendl; + { + const auto& main_preamble = \ + reinterpret_cast(*preamble.c_str()); + next_tag = static_cast(main_preamble.tag); - auto ti = preamble.cbegin(); - uint32_t frame_len; - decode(frame_len, ti); - next_payload_len = frame_len; - uint32_t tag; - decode(tag, ti); - next_tag = static_cast(tag); - } catch (const buffer::error &e) { - lderr(cct) << __func__ << " failed decoding of frame header: " << e - << dendl; - return _fault(); + // FIXME: makeshift solution + ceph_assert_always(main_preamble.num_segments == 1); + + // I expect ceph_le32 will make the endian conversion for me. Passing + // everything through ::decode is unnecessary. + next_payload_len = main_preamble.segments[0].length; } ldout(cct, 10) << __func__ << " next payload_len=" << next_payload_len diff --git a/src/msg/async/ProtocolV2.h b/src/msg/async/ProtocolV2.h index bec10174f890..278c4da1a9cc 100644 --- a/src/msg/async/ProtocolV2.h +++ b/src/msg/async/ProtocolV2.h @@ -147,7 +147,7 @@ private: Ct *handle_hello(char *payload, uint32_t length); CONTINUATION_DECL(ProtocolV2, read_frame); - READ_HANDLER_CONTINUATION_DECL(ProtocolV2, handle_read_frame_length_and_tag); + READ_HANDLER_CONTINUATION_DECL(ProtocolV2, handle_read_frame_preamble_main); READ_HANDLER_CONTINUATION_DECL(ProtocolV2, handle_frame_payload); READ_HANDLER_CONTINUATION_DECL(ProtocolV2, handle_message_header); CONTINUATION_DECL(ProtocolV2, throttle_message); @@ -160,7 +160,7 @@ private: READ_HANDLER_CONTINUATION_DECL(ProtocolV2, handle_message_extra_bytes); Ct *read_frame(); - Ct *handle_read_frame_length_and_tag(char *buffer, int r); + Ct *handle_read_frame_preamble_main(char *buffer, int r); Ct *handle_frame_payload(char *buffer, int r); Ct *ready();