From 07890592ff9d65ce2b3a8430dded2fea10a75e03 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Mon, 20 Nov 2017 16:27:20 +0100 Subject: [PATCH] msg/simple/Pipe: resurrect support for !CEPH_FEATURE_MSG_AUTH Revert CEPH_FEATURE_MSG_AUTH-related hunks of commit 7ba4d5324e2d ("msg/simple/Pipe: remove legacy feature case handle"), which removed code that handled !CEPH_FEATURE_MSG_AUTH footers. It's needed for kernels prior to 3.19, where cephx signatures aren't supported. Signed-off-by: Ilya Dryomov --- src/msg/simple/Pipe.cc | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/msg/simple/Pipe.cc b/src/msg/simple/Pipe.cc index 4fefa73ac00..c28c0cf5e13 100644 --- a/src/msg/simple/Pipe.cc +++ b/src/msg/simple/Pipe.cc @@ -2156,8 +2156,19 @@ int Pipe::read_message(Message **pm, AuthSessionHandler* auth_handler) } // footer - if (tcp_read((char*)&footer, sizeof(footer)) < 0) - goto out_dethrottle; + if (connection_state->has_feature(CEPH_FEATURE_MSG_AUTH)) { + if (tcp_read((char*)&footer, sizeof(footer)) < 0) + goto out_dethrottle; + } else { + ceph_msg_footer_old old_footer; + if (tcp_read((char*)&old_footer, sizeof(old_footer)) < 0) + goto out_dethrottle; + footer.front_crc = old_footer.front_crc; + footer.middle_crc = old_footer.middle_crc; + footer.data_crc = old_footer.data_crc; + footer.sig = 0; + footer.flags = old_footer.flags; + } aborted = (footer.flags & CEPH_MSG_FOOTER_COMPLETE) == 0; ldout(msgr->cct,10) << "aborted = " << aborted << dendl; @@ -2405,10 +2416,26 @@ int Pipe::write_message(const ceph_msg_header& header, const ceph_msg_footer& fo // send footer; if receiver doesn't support signatures, use the old footer format - msgvec[msg.msg_iovlen].iov_base = (void*)&footer; - msgvec[msg.msg_iovlen].iov_len = sizeof(footer); - msglen += sizeof(footer); - msg.msg_iovlen++; + ceph_msg_footer_old old_footer; + if (connection_state->has_feature(CEPH_FEATURE_MSG_AUTH)) { + msgvec[msg.msg_iovlen].iov_base = (void*)&footer; + msgvec[msg.msg_iovlen].iov_len = sizeof(footer); + msglen += sizeof(footer); + msg.msg_iovlen++; + } else { + if (msgr->crcflags & MSG_CRC_HEADER) { + old_footer.front_crc = footer.front_crc; + old_footer.middle_crc = footer.middle_crc; + } else { + old_footer.front_crc = old_footer.middle_crc = 0; + } + old_footer.data_crc = msgr->crcflags & MSG_CRC_DATA ? footer.data_crc : 0; + old_footer.flags = footer.flags; + msgvec[msg.msg_iovlen].iov_base = (char*)&old_footer; + msgvec[msg.msg_iovlen].iov_len = sizeof(old_footer); + msglen += sizeof(old_footer); + msg.msg_iovlen++; + } // send if (do_sendmsg(&msg, msglen)) -- 2.39.5