From: Radoslaw Zarzynski Date: Fri, 1 Mar 2019 21:47:22 +0000 (+0100) Subject: msg/async, v2: move ceph_msg_header2 to last frame segment. X-Git-Tag: v14.1.1~70^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=69dbc92ba8af844be0e3d3fc1b01287082753e56;p=ceph.git msg/async, v2: move ceph_msg_header2 to last frame segment. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index ff69c657c385..a34762b1e873 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -1330,8 +1330,9 @@ CtPtr ProtocolV2::handle_message() { recv_stamp = ceph_clock_now(); state = READ_MESSAGE_COMPLETE; + // yeah, footer is conveying header ;-). Renaming needed. FIXME. auto header_frame = MessageHeaderFrame::Decode( - std::move(rx_segments_data[SegmentIndex::Msg::HEADER])); + std::move(rx_segments_data[SegmentIndex::Msg::FOOTER])); // XXX: paranoid copy just to avoid oops ceph_msg_header2 current_header = header_frame.header(); diff --git a/src/msg/async/frames_v2.h b/src/msg/async/frames_v2.h index 010b14c79e52..e5ef06c5cb4d 100644 --- a/src/msg/async/frames_v2.h +++ b/src/msg/async/frames_v2.h @@ -65,10 +65,10 @@ struct segment_t { struct SegmentIndex { struct Msg { - static constexpr std::size_t HEADER = 0; - static constexpr std::size_t FRONT = 1; - static constexpr std::size_t MIDDLE = 2; - static constexpr std::size_t DATA = 3; + static constexpr std::size_t FRONT = 0; + static constexpr std::size_t MIDDLE = 1; + static constexpr std::size_t DATA = 2; + static constexpr std::size_t FOOTER = 3; }; struct Frame { @@ -608,13 +608,17 @@ struct MessageHeaderFrame const ceph::bufferlist& data) { MessageHeaderFrame f = PayloadFrame::Encode(msg_header); + + // FIXME. Together with the frame hierarchy. + ceph::bufferlist preamble; + f.payload.splice(0, FRAME_PREAMBLE_SIZE, &preamble); + // FIXME: plainsize -> ciphersize; for AES-GCM they are equall apart from auth tag size f.fill_preamble({ - segment_t{ f.payload.length() - FRAME_PREAMBLE_SIZE, - segment_t::DEFAULT_ALIGNMENT }, segment_t{ front.length(), segment_t::DEFAULT_ALIGNMENT }, segment_t{ middle.length(), segment_t::DEFAULT_ALIGNMENT }, segment_t{ data.length(), segment_t::PAGE_SIZE_ALIGNMENT }, + segment_t{ f.payload.length(), segment_t::DEFAULT_ALIGNMENT }, }); // FIXME: plainsize -> ciphersize; for AES-GCM they are equall apart from auth tag size @@ -623,15 +627,15 @@ struct MessageHeaderFrame // NOTE: ultimately we'll align these sizes to cipher's block size. // AES-GCM can live without that as it's basically stream cipher. session_stream_handlers.tx->reset_tx_handler({ - f.payload.length(), + preamble.length(), front.length(), middle.length(), - data.length() + data.length(), + f.payload.length() }); - ceph_assert(f.payload.length()); session_stream_handlers.tx->authenticated_encrypt_update( - std::move(f.payload)); + std::move(preamble)); // TODO: switch TxHandler from `bl&&` to `const bl&`. if (front.length()) { @@ -644,21 +648,26 @@ struct MessageHeaderFrame session_stream_handlers.tx->authenticated_encrypt_update(data); } + ceph_assert(f.payload.length()); + session_stream_handlers.tx->authenticated_encrypt_update( + std::move(f.payload)); + // auth tag will be appended at the end f.payload = session_stream_handlers.tx->authenticated_encrypt_final(); } else { epilogue_crc_block_t epilogue; - ceph::bufferlist::const_iterator hdriter(&f.payload, FRAME_PREAMBLE_SIZE); - epilogue.crc_values[SegmentIndex::Msg::HEADER] = - hdriter.crc32c(hdriter.get_remaining(), -1); + // fixme epilogue.crc_values[SegmentIndex::Msg::FRONT] = front.crc32c(-1); epilogue.crc_values[SegmentIndex::Msg::MIDDLE] = middle.crc32c(-1); epilogue.crc_values[SegmentIndex::Msg::DATA] = data.crc32c(-1); - - f.payload.append(front); - f.payload.append(middle); - f.payload.append(data); - f.payload.append(reinterpret_cast(&epilogue), sizeof(epilogue)); + epilogue.crc_values[SegmentIndex::Msg::FOOTER] = f.payload.crc32c(-1); + + preamble.append(front); + preamble.append(middle); + preamble.append(data); + preamble.append(f.payload); + preamble.append(reinterpret_cast(&epilogue), sizeof(epilogue)); + f.payload = std::move(preamble); } return f;