]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
solaris big endian fixes
authorRohan Mars <code@rohanmars.com>
Tue, 27 Oct 2015 03:38:15 +0000 (20:38 -0700)
committerRohan Mars <code@rohanmars.com>
Fri, 13 Nov 2015 01:30:49 +0000 (17:30 -0800)
Signed-off-by: Rohan Mars <code@rohanmars.com>
src/auth/cephx/CephxSessionHandler.cc
src/include/byteorder.h
src/msg/msg_types.h
src/msg/simple/Pipe.cc

index eaebd152fb2635283da4d9e0fbb3d5b19e845b15..30ed852ba6fc3880c983ee9354ca8e645f620f00 100644 (file)
@@ -41,8 +41,9 @@ int CephxSessionHandler::_calc_signature(Message *m, uint64_t *psig)
     __le32 middle_crc;
     __le32 data_crc;
   } __attribute__ ((packed)) sigblock = {
-    1, AUTH_ENC_MAGIC, 4*4,
-    header.crc, footer.front_crc, footer.middle_crc, footer.data_crc
+    1, mswab64(AUTH_ENC_MAGIC), mswab32(4*4),
+    mswab32(header.crc), mswab32(footer.front_crc),
+    mswab32(footer.middle_crc), mswab32(footer.data_crc)
   };
   bufferlist bl_plaintext;
   bl_plaintext.append(buffer::create_static(sizeof(sigblock), (char*)&sigblock));
index 191d24256db9941c237a0044a9ea0cafd46bf2e7..d6ff8b66dee7408fa434556a78e7ccc527fb0096 100644 (file)
 # endif
 #endif
 
+#if defined(__sun) && defined(__SVR4)
+# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#  define CEPH_BIG_ENDIAN
+# elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#  define CEPH_LITTLE_ENDIAN
+# endif
+#endif
+
+
+
+
 static __inline__ __u16 swab16(__u16 val) 
 {
   return (val >> 8) | (val << 8);
index bf668e034731b79bbc4140ad39d158b71992fc3b..8f98b88eb926f623dd56a658b0e8de85c6f361e9 100644 (file)
@@ -151,8 +151,9 @@ namespace std {
  * ipv4 for now.
  */
 
+#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
 /*
- * encode sockaddr.ss_family in big endian
+ * encode sockaddr.ss_family as network byte order 
  */
 static inline void encode(const sockaddr_storage& a, bufferlist& bl) {
   struct sockaddr_storage ss = a;
@@ -174,6 +175,28 @@ static inline void decode(sockaddr_storage& a, bufferlist::iterator& bl) {
   a.ss_family = ntohs(a.ss_family);
 #endif
 }
+#endif
+
+// define a wire format for sockaddr that matches Linux's.
+struct ceph_sockaddr_storage {
+  __le16 ss_family;
+  __u8 __ss_padding[128 - sizeof(__le16)];
+
+  void encode(bufferlist& bl) const {
+    struct ceph_sockaddr_storage ss = *this;
+    ss.ss_family = htons(ss.ss_family);
+    ::encode_raw(ss, bl);
+  }
+
+  void decode(bufferlist::iterator& bl) {
+    struct ceph_sockaddr_storage ss;
+    ::decode_raw(ss, bl);
+    ss.ss_family = ntohs(ss.ss_family);
+    *this = ss;
+  }
+} __attribute__ ((__packed__));
+
+WRITE_CLASS_ENCODER(ceph_sockaddr_storage)
 
 struct entity_addr_t {
   __u32 type;
@@ -330,15 +353,37 @@ struct entity_addr_t {
 
   bool parse(const char *s, const char **end = 0);
 
+  // Right now, these only deal with sockaddr_storage that have only family and content.
+  // Apparently on BSD there is also an ss_len that we need to handle; this requires
+  // broader study
+
+
   void encode(bufferlist& bl) const {
     ::encode(type, bl);
     ::encode(nonce, bl);
+#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
     ::encode(addr, bl);
+#else
+    ceph_sockaddr_storage wireaddr;
+    ::memset(&wireaddr, '\0', sizeof(wireaddr));
+    unsigned copysize = MIN(sizeof(wireaddr), sizeof(addr));
+    // ceph_sockaddr_storage is in host byte order
+    ::memcpy(&wireaddr, &addr, copysize);
+    ::encode(wireaddr, bl);
+#endif
   }
   void decode(bufferlist::iterator& bl) {
     ::decode(type, bl);
     ::decode(nonce, bl);
+#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
     ::decode(addr, bl);
+#else
+    ceph_sockaddr_storage wireaddr;
+    ::memset(&wireaddr, '\0', sizeof(wireaddr));
+    ::decode(wireaddr, bl);
+    unsigned copysize = MIN(sizeof(wireaddr), sizeof(addr));
+    ::memcpy(&addr, &wireaddr, copysize);
+#endif
   }
 
   void dump(Formatter *f) const;
index d1483785de7ce3bd5efebcce24fcdc0e36f7cd8b..de94c15bf045e9fe16fd26889103aa3ecfb7dd27 100644 (file)
@@ -935,7 +935,12 @@ int Pipe::connect()
 
   // identify peer
   {
+#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
     bufferptr p(sizeof(paddr) * 2);
+#else
+    int wirelen = sizeof(__u32) * 2 + sizeof(ceph_sockaddr_storage);
+    bufferptr p(wirelen * 2);
+#endif
     addrbl.push_back(p);
   }
   if (tcp_read(addrbl.c_str(), addrbl.length()) < 0) {