]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/async, v2: move ceph_msg_header2 to last frame segment.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 1 Mar 2019 21:47:22 +0000 (22:47 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 1 Mar 2019 21:47:53 +0000 (22:47 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/msg/async/ProtocolV2.cc
src/msg/async/frames_v2.h

index ff69c657c3854d0d3fb6ad0727ab9858d97cef53..a34762b1e8730c8b9325cae04f9003daeae51f85 100644 (file)
@@ -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();
 
index 010b14c79e52bd733ca3923f7ed5dce8790c652b..e5ef06c5cb4dee2f2aae7fc2057e142555bdfd17 100644 (file)
@@ -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<MessageHeaderFrame, ceph_msg_header2>::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<const char*>(&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<const char*>(&epilogue), sizeof(epilogue));
+      f.payload = std::move(preamble);
     }
 
     return f;