]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async: receive V2 messages with new preable format.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 13 Feb 2019 17:28:53 +0000 (18:28 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 21 Feb 2019 20:58:35 +0000 (21:58 +0100)
Currently we do support messages with single segment only.
Adding multi-segment and proper alignment handling is WIP.

Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/msg/async/ProtocolV2.cc
src/msg/async/ProtocolV2.h

index fdcdae74b6c46b546f081f51a366997d6bd1daaf..57ac399d9db1c9ca37d043e0f731fa81817a7e12 100644 (file)
@@ -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<T, Args...> {
     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<MessageHeaderFrame, ceph_msg_header2>(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_main_t&>(*preamble.c_str());
+    next_tag = static_cast<Tag>(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>(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
index bec10174f89030ea077f3f238f9c6a640e41e3fd..278c4da1a9cc658c5e5c05c9a65a6c13c1260229 100644 (file)
@@ -147,7 +147,7 @@ private:
   Ct<ProtocolV2> *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<ProtocolV2> *read_frame();
-  Ct<ProtocolV2> *handle_read_frame_length_and_tag(char *buffer, int r);
+  Ct<ProtocolV2> *handle_read_frame_preamble_main(char *buffer, int r);
   Ct<ProtocolV2> *handle_frame_payload(char *buffer, int r);
 
   Ct<ProtocolV2> *ready();