From 8bb18a83533e8ecf8da018b369fb3a8b71e7f9fd Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 21 Feb 2019 01:42:17 +0100 Subject: [PATCH] msg/async, v2: drop the scaffolding in preamble parsing. Signed-off-by: Radoslaw Zarzynski --- src/msg/async/ProtocolV2.cc | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index 59c6b19351464..ebee09078f3df 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -1458,11 +1458,26 @@ CtPtr ProtocolV2::handle_read_frame_preamble_main(char *buffer, int r) { // everything through ::decode is unnecessary. const auto& main_preamble = \ reinterpret_cast(*preamble.c_str()); - next_tag = static_cast(main_preamble.tag); - // FIXME: makeshift solution - ceph_assert_always(main_preamble.num_segments == 1 || - main_preamble.num_segments == 4); + // verify preamble's CRC before any further processing + const auto rx_crc = ceph_crc32c(0, + reinterpret_cast(&main_preamble), + sizeof(main_preamble) - sizeof(main_preamble.crc)); + if (rx_crc != main_preamble.crc) { + ldout(cct, 10) << __func__ << " crc mismatch for main preamble" + << " rx_crc=" << rx_crc + << " tx_crc=" << main_preamble.crc << dendl; + return _fault(); + } + + // currently we do support only 4 or 1 segments + if (main_preamble.num_segments != 1 && main_preamble.num_segments != 4) { + ldout(cct, 10) << __func__ << " unsupported num_segments=" + << " tx_crc=" << main_preamble.num_segments << dendl; + return _fault(); + } + + next_tag = static_cast(main_preamble.tag); rx_segments_desc.clear(); rx_segments_data.clear(); @@ -1492,17 +1507,6 @@ CtPtr ProtocolV2::handle_read_frame_preamble_main(char *buffer, int r) { next_payload_len += \ session_stream_handlers.rx->get_extra_size_at_final(); } - - // TODO: move this ugliness into dedicated procedure - const auto rx_crc = ceph_crc32c(0, - reinterpret_cast(&main_preamble), - sizeof(main_preamble) - sizeof(main_preamble.crc)); - if (rx_crc != main_preamble.crc) { - ldout(cct, 10) << __func__ << "crc mismatch for main preamble" - << " rx_crc=" << rx_crc - << " tx_crc=" << main_preamble.crc << dendl; - return _fault(); - } } // does it need throttle? -- 2.39.5