]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: add a decode_legacy_addr_after_marker helper
authorZhao Junwang <zhjwpku@gmail.com>
Sat, 21 May 2016 05:46:04 +0000 (01:46 -0400)
committerSage Weil <sage@redhat.com>
Tue, 18 Oct 2016 20:40:11 +0000 (16:40 -0400)
This can eliminates duplication between entity_addr_t::decode()
and entity_addrvec::decode().

Signed-off-by: Zhao Junwang <zhjwpku@gmail.com>
src/msg/msg_types.cc
src/msg/msg_types.h

index 309b19a4ff7c7275fde068176a34e4e0bd3d3fe9..ae98032c627eb2b47d84e074665ec1846f0d8434 100644 (file)
@@ -242,23 +242,8 @@ void entity_addrvec_t::decode(bufferlist::iterator& bl)
   ::decode(marker, bl);
   if (marker == 0) {
     // legacy!
-    ::decode(marker, bl);
-    __u16 rest;
-    ::decode(rest, bl);
     entity_addr_t addr;
-    addr.type = addr.TYPE_LEGACY;
-    ::decode(addr.nonce, bl);
-    sockaddr_storage ss;
-#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
-    ::decode(ss, bl);
-#else
-    ceph_sockaddr_storage wireaddr;
-    ::memset(&wireaddr, '\0', sizeof(wireaddr));
-    ::decode(wireaddr, bl);
-    unsigned copysize = MIN(sizeof(wireaddr), sizeof(ss));
-    ::memcpy(&ss, &wireaddr, copysize);
-#endif
-    addr.set_sockaddr((sockaddr*)&ss);
+    addr.decode_legacy_addr_after_marker(bl);
     v.clear();
     v.push_back(addr);
     return;
index c8ac06253abc854e4fdc954a0a605d1c52c7043f..78a6693a73872f2290b4d401e9ba5e4c323b43d3 100644 (file)
@@ -148,8 +148,6 @@ namespace std {
   };
 } // namespace std
 
-
-
 /*
  * an entity's network address.
  * includes a random value that prevents it from being reused.
@@ -201,7 +199,6 @@ struct ceph_sockaddr_storage {
     *this = ss;
   }
 } __attribute__ ((__packed__));
-
 WRITE_CLASS_ENCODER(ceph_sockaddr_storage)
 
 struct entity_addr_t {
@@ -386,6 +383,27 @@ struct entity_addr_t {
 
   bool parse(const char *s, const char **end = 0);
 
+  void decode_legacy_addr_after_marker(bufferlist::iterator& bl)
+  {
+    __u8 marker;
+    __u16 rest;
+    ::decode(marker, bl);
+    ::decode(rest, bl);
+    type = TYPE_LEGACY;
+    ::decode(nonce, bl);
+    sockaddr_storage ss;
+#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
+    ::decode(ss, bl);
+#else
+    ceph_sockaddr_storage wireaddr;
+    ::memset(&wireaddr, '\0', sizeof(wireaddr));
+    ::decode(wireaddr, bl);
+    unsigned copysize = MIN(sizeof(wireaddr), sizeof(ss));
+    ::memcpy(&ss, &wireaddr, copysize);
+#endif
+    set_sockaddr((sockaddr*)&ss);
+  }
+
   // 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
@@ -422,22 +440,7 @@ struct entity_addr_t {
     __u8 marker;
     ::decode(marker, bl);
     if (marker == 0) {
-      ::decode(marker, bl);
-      __u16 rest;
-      ::decode(rest, bl);
-      type = TYPE_LEGACY;
-      ::decode(nonce, bl);
-      sockaddr_storage ss;
-#if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__)
-      ::decode(ss, bl);
-#else
-      ceph_sockaddr_storage wireaddr;
-      ::memset(&wireaddr, '\0', sizeof(wireaddr));
-      ::decode(wireaddr, bl);
-      unsigned copysize = MIN(sizeof(wireaddr), sizeof(ss));
-      ::memcpy(&ss, &wireaddr, copysize);
-#endif
-      set_sockaddr((sockaddr*)&ss);
+      decode_legacy_addr_after_marker(bl);
       return;
     }
     if (marker != 1)