]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/simple/Pipe: resurrect support for !CEPH_FEATURE_MSG_AUTH
authorIlya Dryomov <idryomov@gmail.com>
Mon, 20 Nov 2017 15:27:20 +0000 (16:27 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 20 Nov 2017 15:51:01 +0000 (16:51 +0100)
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 <idryomov@gmail.com>
src/msg/simple/Pipe.cc

index 4fefa73ac006d1df8b788be4edba20b7efac84e6..c28c0cf5e1359f1aa30f1fdb7d7b1c90fdb7bd4d 100644 (file)
@@ -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))