From: Ilya Dryomov Date: Mon, 20 Nov 2017 15:23:15 +0000 (+0100) Subject: msg/async/AsyncConnection: resurrect support for !CEPH_FEATURE_MSG_AUTH X-Git-Tag: v13.0.1~119^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=87b075dc5865f1cb16d72560faa21a01253e6441;p=ceph.git msg/async/AsyncConnection: resurrect support for !CEPH_FEATURE_MSG_AUTH Revert CEPH_FEATURE_MSG_AUTH-related hunks of commit 83f7e392a163 ("msg/async/AsyncConnection: 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 --- diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index a2abbce56297e..99a631a740508 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -639,8 +639,15 @@ void AsyncConnection::process() case STATE_OPEN_MESSAGE_READ_FOOTER_AND_DISPATCH: { ceph_msg_footer footer; - - r = read_until(sizeof(footer), state_buffer); + ceph_msg_footer_old old_footer; + unsigned len; + // footer + if (has_feature(CEPH_FEATURE_MSG_AUTH)) + len = sizeof(footer); + else + len = sizeof(old_footer); + + r = read_until(len, state_buffer); if (r < 0) { ldout(async_msgr->cct, 1) << __func__ << " read footer data error " << dendl; goto fail; @@ -648,7 +655,16 @@ void AsyncConnection::process() break; } - footer = *((ceph_msg_footer*)state_buffer); + if (has_feature(CEPH_FEATURE_MSG_AUTH)) { + footer = *((ceph_msg_footer*)state_buffer); + } else { + old_footer = *((ceph_msg_footer_old*)state_buffer); + 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; + } int aborted = (footer.flags & CEPH_MSG_FOOTER_COMPLETE) == 0; ldout(async_msgr->cct, 10) << __func__ << " aborted = " << aborted << dendl; if (aborted) { @@ -2199,7 +2215,22 @@ ssize_t AsyncConnection::write_message(Message *m, bufferlist& bl, bool more) outcoming_bl.claim_append(bl); } - outcoming_bl.append((char*)&footer, sizeof(footer)); + // send footer; if receiver doesn't support signatures, use the old footer format + ceph_msg_footer_old old_footer; + if (has_feature(CEPH_FEATURE_MSG_AUTH)) { + outcoming_bl.append((char*)&footer, sizeof(footer)); + } else { + if (msgr->crcflags & MSG_CRC_HEADER) { + old_footer.front_crc = footer.front_crc; + old_footer.middle_crc = footer.middle_crc; + old_footer.data_crc = footer.data_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; + outcoming_bl.append((char*)&old_footer, sizeof(old_footer)); + } m->trace.event("async writing message"); ldout(async_msgr->cct, 20) << __func__ << " sending " << m->get_seq()