From: Zhao Junwang Date: Sat, 21 May 2016 05:46:04 +0000 (-0400) Subject: msg: add a decode_legacy_addr_after_marker helper X-Git-Tag: v11.1.0~515^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=27d736a531f3108f0e022a446fd4be0758cca81e;p=ceph.git msg: add a decode_legacy_addr_after_marker helper This can eliminates duplication between entity_addr_t::decode() and entity_addrvec::decode(). Signed-off-by: Zhao Junwang --- diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index 309b19a4ff7c..ae98032c627e 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -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; diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index c8ac06253abc..78a6693a7387 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -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)