From: Zhao Junwang Date: Thu, 19 May 2016 11:38:50 +0000 (-0400) Subject: msg: change entity_addr_t encode/decode X-Git-Tag: v11.1.0~515^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a7fe5ae6c72c0731065e3f80f97b4466dbac188;p=ceph.git msg: change entity_addr_t encode/decode Signed-off-by: Zhao Junwang --- diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 18242629c126..fa83dfbd2952 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -17,6 +17,7 @@ #include +#include "include/ceph_features.h" #include "include/types.h" #include "include/blobhash.h" #include "include/encoding.h" @@ -204,6 +205,11 @@ struct ceph_sockaddr_storage { WRITE_CLASS_ENCODER(ceph_sockaddr_storage) struct entity_addr_t { + typedef enum { + TYPE_NONE = 0, + TYPE_LEGACY = 1, + } type_t; + __u32 type; __u32 nonce; union { @@ -371,36 +377,67 @@ struct entity_addr_t { // Apparently on BSD there is also an ss_len that we need to handle; this requires // broader study - void encode(bufferlist& bl, uint64_t features) const { - ::encode(type, bl); - ::encode(nonce, bl); - sockaddr_storage ss = get_sockaddr_storage(); + if ((features & CEPH_FEATURE_MSG_ADDR2) == 0) { + ::encode((__u32)0, bl); + ::encode(nonce, bl); + sockaddr_storage ss = get_sockaddr_storage(); #if defined(__linux__) || defined(DARWIN) || defined(__FreeBSD__) - ::encode(ss, bl); + ::encode(ss, bl); #else - ceph_sockaddr_storage wireaddr; - ::memset(&wireaddr, '\0', sizeof(wireaddr)); - unsigned copysize = MIN(sizeof(wireaddr), sizeof(ss)); - // ceph_sockaddr_storage is in host byte order - ::memcpy(&wireaddr, &ss, copysize); - ::encode(wireaddr, bl); + ceph_sockaddr_storage wireaddr; + ::memset(&wireaddr, '\0', sizeof(wireaddr)); + unsigned copysize = MIN(sizeof(wireaddr), sizeof(ss)); + // ceph_sockaddr_storage is in host byte order + ::memcpy(&wireaddr, &ss, copysize); + ::encode(wireaddr, bl); #endif + return; + } + ::encode((__u8)1, bl); + ENCODE_START(1, 1, bl); + ::encode(type, bl); + ::encode(nonce, bl); + __u32 elen = get_sockaddr_len(); + ::encode(elen, bl); + if (elen) { + bl.append((char*)get_sockaddr(), elen); + } + ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - ::decode(type, bl); - ::decode(nonce, bl); - sockaddr_storage ss; + __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); + ::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); + 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); + set_sockaddr((sockaddr*)&ss); + return; + } + if (marker != 1) + throw buffer::malformed_input("entity_addr_t marker != 1"); + DECODE_START(1, bl); + ::decode(type, bl); + ::decode(nonce, bl); + __u32 elen; + ::decode(elen, bl); + if (elen) { + bl.copy(elen, (char*)get_sockaddr()); + } + DECODE_FINISH(bl); } void dump(Formatter *f) const; @@ -502,8 +539,4 @@ inline ostream& operator<<(ostream& out, const ceph_entity_inst &i) return out << n; } - - - - #endif