From 9731226228dd9e6175a9ae510a0c8cbf0b10b88f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Jan 2008 13:25:51 -0800 Subject: [PATCH] convert more types in ceph_fs.h to __le* notation --- src/fakefuse.cc | 4 +- src/fakesyn.cc | 4 +- src/include/ceph_fs.h | 20 +++++----- src/kernel/messenger.c | 6 +-- src/messages/MClientRequest.h | 8 ++-- src/messages/MOSDOp.h | 8 ++-- src/messages/MOSDOpReply.h | 2 +- src/messages/MOSDSubOp.h | 2 +- src/messages/MOSDSubOpReply.h | 2 +- src/msg/FakeMessenger.cc | 12 +++--- src/msg/Message.cc | 7 ++-- src/msg/Message.h | 12 +++--- src/msg/SimpleMessenger.cc | 70 ++++++++++++++++++----------------- src/msg/msg_types.h | 69 ++++++++++++++++++++++------------ 14 files changed, 127 insertions(+), 99 deletions(-) diff --git a/src/fakefuse.cc b/src/fakefuse.cc index 69c49a9264e80..87292701fdfed 100644 --- a/src/fakefuse.cc +++ b/src/fakefuse.cc @@ -88,9 +88,9 @@ int main(int argc, const char **argv) { MonMap *monmap = new MonMap(g_conf.num_mon); entity_addr_t a; - a.v.nonce = getpid(); + a.nonce = getpid(); for (int i=0; imon_inst[i] = entity_inst_t(entity_name_t::MON(i), a); // hack ; see FakeMessenger.cc } diff --git a/src/fakesyn.cc b/src/fakesyn.cc index b474e4008530f..48dba2d7ec4c5 100644 --- a/src/fakesyn.cc +++ b/src/fakesyn.cc @@ -86,9 +86,9 @@ int main(int argc, const char **argv) MonMap *monmap = new MonMap(g_conf.num_mon); entity_addr_t a; - a.v.nonce = getpid(); + a.nonce = getpid(); for (int i=0; imon_inst[i] = entity_inst_t(entity_name_t::MON(i), a); // hack ; see FakeMessenger.cc } diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 9971ff9058bb1..8f45fb1ac81c2 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -189,8 +189,8 @@ struct ceph_eversion { * entity_name */ struct ceph_entity_name { - __u32 type; - __u32 num; + __le32 type; + __le32 num; }; #define CEPH_ENTITY_TYPE_MON 1 @@ -210,13 +210,13 @@ struct ceph_entity_name { * entity_addr */ struct ceph_entity_addr { - __u32 erank; /* entity's rank in process */ - __u32 nonce; /* unique id for process (e.g. pid) */ + __le32 erank; /* entity's rank in process */ + __le32 nonce; /* unique id for process (e.g. pid) */ struct sockaddr_in ipaddr; }; #define ceph_entity_addr_is_local(a,b) \ - ((a).nonce == (b).nonce && \ + (le32_to_cpu((a).nonce) == le32_to_cpu((b).nonce) && \ (a).ipaddr.sin_addr.s_addr == (b).ipaddr.sin_addr.s_addr) #define ceph_entity_addr_equal(a, b) \ @@ -232,12 +232,12 @@ struct ceph_entity_inst { * message header */ struct ceph_msg_header { - __u32 seq; /* message seq# for this session */ - __u32 type; /* message type */ + __le64 seq; /* message seq# for this session */ + __le32 type; /* message type */ + __le32 front_len; + __le32 data_off; /* sender: include full offset; receiver: mask against ~PAGE_MASK */ + __le32 data_len; /* bytes of data payload */ struct ceph_entity_inst src, dst; - __u32 front_len; - __u32 data_off; /* sender: include full offset; receiver: mask against ~PAGE_MASK */ - __u32 data_len; /* bytes of data payload */ } __attribute__ ((packed)); diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index 5108ce1652be4..c7fdfd3c440fe 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -377,7 +377,7 @@ static void prepare_write_message(struct ceph_connection *con) /* encode header */ ceph_encode_header(&con->out_hdr, &m->hdr); - dout(20, "prepare_write_message %p seq %d type %d len %d+%d\n", + dout(20, "prepare_write_message %p seq %lld type %d len %d+%d\n", m, m->hdr.seq, m->hdr.type, m->hdr.front_len, m->hdr.data_len); BUG_ON(m->hdr.front_len != m->front.iov_len); @@ -713,7 +713,7 @@ static void process_ack(struct ceph_connection *con, __u32 ack) while (!list_empty(&con->out_sent)) { m = list_entry(con->out_sent.next, struct ceph_msg, list_head); if (m->hdr.seq > ack) break; - dout(5, "got ack for %d type %d at %p\n", m->hdr.seq, m->hdr.type, m); + dout(5, "got ack for seq %llu type %d at %p\n", m->hdr.seq, m->hdr.type, m); list_del(&m->list_head); ceph_msg_put(m); } @@ -1158,7 +1158,7 @@ int ceph_msg_send(struct ceph_messenger *msgr, struct ceph_msg *msg, unsigned lo ceph_name_type_str(msg->hdr.dst.name.type), msg->hdr.dst.name.num, msg->hdr.type, ceph_msg_type_name(msg->hdr.type), msg->hdr.front_len, msg->hdr.data_len); - dout(2, "ceph_msg_send queuing %p seq %u for %s%d on %p\n", msg, msg->hdr.seq, + dout(2, "ceph_msg_send queuing %p seq %llu for %s%d on %p\n", msg, msg->hdr.seq, ceph_name_type_str(msg->hdr.dst.name.type), msg->hdr.dst.name.num, con); ceph_msg_get(msg); list_add_tail(&msg->list_head, &con->out_queue); diff --git a/src/messages/MClientRequest.h b/src/messages/MClientRequest.h index e951132bc3b16..15a289786935e 100644 --- a/src/messages/MClientRequest.h +++ b/src/messages/MClientRequest.h @@ -83,8 +83,8 @@ public: MClientRequest(int op, entity_inst_t ci) : Message(CEPH_MSG_CLIENT_REQUEST) { memset(&head, 0, sizeof(head)); this->head.op = op; - this->head.client_inst.name = ci.name.v; - this->head.client_inst.addr = ci.addr.v; + this->head.client_inst.name = ci.name; + this->head.client_inst.addr = ci.addr; } void set_mdsmap_epoch(epoch_t e) { head.mdsmap_epoch = e; } @@ -168,8 +168,8 @@ public: head.mds_wants_replica_in_dirino = cpu_to_le64(dirino); } void set_client_inst(const entity_inst_t& i) { - head.client_inst.name = i.name.v; - head.client_inst.addr = i.addr.v; + head.client_inst.name = i.name; + head.client_inst.addr = i.addr; } entity_inst_t get_client_inst() { return entity_inst_t(head.client_inst); diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index 1a6e0a520c808..b8f45bb702d40 100644 --- a/src/messages/MOSDOp.h +++ b/src/messages/MOSDOp.h @@ -73,7 +73,7 @@ public: entity_name_t get_client() { return head.client_inst.name; } entity_inst_t get_client_inst() { return head.client_inst; } - void set_client_addr(const entity_addr_t& a) { head.client_inst.addr = a.v; } + void set_client_addr(const entity_addr_t& a) { head.client_inst.addr = a; } object_t get_oid() { return object_t(head.oid); } pg_t get_pg() { return head.layout.ol_pgid; } @@ -103,8 +103,8 @@ public: object_t oid, ceph_object_layout ol, epoch_t mapepoch, int op) : Message(CEPH_MSG_OSD_OP) { memset(&head, 0, sizeof(head)); - head.client_inst.name = asker.name.v; - head.client_inst.addr = asker.addr.v; + head.client_inst.name = asker.name; + head.client_inst.addr = asker.addr; head.tid = cpu_to_le64(tid); head.client_inc = inc; head.oid = oid; @@ -138,7 +138,7 @@ public: virtual void encode_payload() { ::_encode(head, payload); - env.data_off = head.offset; + env.data_off = cpu_to_le32(head.offset); } const char *get_type_name() { return "osd_op"; } diff --git a/src/messages/MOSDOpReply.h b/src/messages/MOSDOpReply.h index aafd9d61d98e3..9b85b80bf878d 100644 --- a/src/messages/MOSDOpReply.h +++ b/src/messages/MOSDOpReply.h @@ -80,7 +80,7 @@ public: } virtual void encode_payload() { ::_encode(head, payload); - env.data_off = head.offset; + env.data_off = cpu_to_le32(head.offset); } const char *get_type_name() { return "osd_op_reply"; } diff --git a/src/messages/MOSDSubOp.h b/src/messages/MOSDSubOp.h index a5fed10b802ed..74b163eb8b362 100644 --- a/src/messages/MOSDSubOp.h +++ b/src/messages/MOSDSubOp.h @@ -105,7 +105,7 @@ public: virtual void encode_payload() { ::_encode(st, payload); ::_encode(attrset, payload); - env.data_off = st.offset; + env.data_off = cpu_to_le32(st.offset); } const char *get_type_name() { return "osd_sub_op"; } diff --git a/src/messages/MOSDSubOpReply.h b/src/messages/MOSDSubOpReply.h index f448279924912..ead3368b568a5 100644 --- a/src/messages/MOSDSubOpReply.h +++ b/src/messages/MOSDSubOpReply.h @@ -100,7 +100,7 @@ public: virtual void encode_payload() { ::_encode(st, payload); ::_encode(attrset, payload); - env.data_off = st.offset; + env.data_off = cpu_to_le32(st.offset); } const char *get_type_name() { return "osd_op_reply"; } diff --git a/src/msg/FakeMessenger.cc b/src/msg/FakeMessenger.cc index d36c281f8e414..bae18d3650cf4 100644 --- a/src/msg/FakeMessenger.cc +++ b/src/msg/FakeMessenger.cc @@ -170,7 +170,7 @@ int fakemessenger_do_loop_2() FakeMessenger *mgr = 0; Dispatcher *dis = 0; - unsigned drank = m->get_source_addr().v.erank; + unsigned drank = m->get_source_addr().erank; if (drank < directory.size() && directory[drank]) { mgr = directory[drank]; if (mgr) @@ -245,7 +245,7 @@ int fakemessenger_do_loop_2() it != shutdown_set.end(); it++) { dout(7) << "fakemessenger: removing " << *it << " from directory" << dendl; - int r = it->v.erank; + int r = it->erank; assert(directory[r]); directory[r] = 0; num_entity--; @@ -278,8 +278,8 @@ FakeMessenger::FakeMessenger(entity_name_t me) : Messenger(me) unsigned r = directory.size(); _myinst.name = me; _myinst.addr.set_port(0); - _myinst.addr.v.erank = r; - _myinst.addr.v.nonce = getpid(); + _myinst.addr.erank = r; + _myinst.addr.nonce = getpid(); // add to directory directory.push_back(this); @@ -331,7 +331,7 @@ int FakeMessenger::shutdown() { dout(2) << "shutdown on messenger " << this << " has " << num_incoming() << " queued" << dendl; lock.Lock(); - assert(directory[_myinst.addr.v.erank] == this); + assert(directory[_myinst.addr.erank] == this); shutdown_set.insert(_myinst.addr); /* @@ -386,7 +386,7 @@ int FakeMessenger::send_message(Message *m, entity_inst_t inst) #endif // queue - unsigned drank = inst.addr.v.erank; + unsigned drank = inst.addr.erank; if (drank < directory.size() && directory[drank] && shutdown_set.count(inst.addr) == 0) { dout(1) << "--> " << get_myname() << " -> " << inst.name << " --- " << *m << " -- " << m diff --git a/src/msg/Message.cc b/src/msg/Message.cc index ed4ebb8487e41..e556fb2f96adc 100644 --- a/src/msg/Message.cc +++ b/src/msg/Message.cc @@ -114,7 +114,8 @@ decode_message(ceph_msg_header& env, bufferlist& front, bufferlist& data) { // make message Message *m = 0; - switch(env.type) { + int type = le32_to_cpu(env.type); + switch (type) { // -- with payload -- @@ -361,11 +362,11 @@ decode_message(ceph_msg_header& env, bufferlist& front, bufferlist& data) // -- simple messages without payload -- case CEPH_MSG_SHUTDOWN: - m = new MGenericMessage(env.type); + m = new MGenericMessage(type); break; default: - dout(0) << "can't decode unknown message type " << env.type << dendl; + dout(0) << "can't decode unknown message type " << type << dendl; assert(0); } diff --git a/src/msg/Message.h b/src/msg/Message.h index a13a8c020d1b8..c5e7e536e347a 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -122,8 +122,8 @@ protected: public: Message() { }; Message(int t) { - env.type = t; - env.data_off = 0; + env.type = cpu_to_le32(t); + env.data_off = cpu_to_le32(0); } virtual ~Message() { } @@ -147,11 +147,11 @@ public: // ENVELOPE ---- // type - int get_type() { return env.type; } - void set_type(int t) { env.type = t; } + int get_type() { return le32_to_cpu(env.type); } + void set_type(int t) { env.type = cpu_to_le32(t); } - unsigned get_seq() { return env.seq; } - void set_seq(unsigned s) { env.seq = s; } + unsigned get_seq() { return le64_to_cpu(env.seq); } + void set_seq(unsigned s) { env.seq = cpu_to_le64(s); } // source/dest entity_inst_t& get_dest_inst() { return *(entity_inst_t*)&env.dst; } diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index 40d58d2c31d6e..0533d473f8950 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -121,7 +121,7 @@ int Rank::Accepter::bind() } // use whatever user specified (if anything) - sockaddr_in listen_addr = g_my_addr.v.ipaddr; + sockaddr_in listen_addr = g_my_addr.ipaddr; /* socket creation */ listen_sd = ::socket(AF_INET, SOCK_STREAM, 0); @@ -133,7 +133,7 @@ int Rank::Accepter::bind() /* bind to port */ int rc = ::bind(listen_sd, (struct sockaddr *) &listen_addr, sizeof(listen_addr)); if (rc < 0) - derr(0) << "accepter.bind unable to bind to " << g_my_addr.v.ipaddr << dendl; + derr(0) << "accepter.bind unable to bind to " << g_my_addr.ipaddr << dendl; assert(rc >= 0); // what port did we get? @@ -165,16 +165,16 @@ int Rank::Accepter::bind() memcpy((char*)&listen_addr.sin_addr.s_addr, myhostname->h_addr_list[0], myhostname->h_length); - rank.rank_addr.v.ipaddr = listen_addr; + rank.rank_addr.ipaddr = listen_addr; rank.rank_addr.set_port(0); } if (rank.rank_addr.get_port() == 0) { entity_addr_t tmp; - tmp.v.ipaddr = listen_addr; + tmp.ipaddr = listen_addr; rank.rank_addr.set_port(tmp.get_port()); - rank.rank_addr.v.nonce = getpid(); // FIXME: pid might not be best choice here. + rank.rank_addr.nonce = getpid(); // FIXME: pid might not be best choice here. } - rank.rank_addr.v.erank = 0; + rank.rank_addr.erank = 0; dout(1) << "accepter.bind rank_addr is " << rank.rank_addr << dendl; return 0; @@ -405,7 +405,7 @@ Rank::EntityMessenger *Rank::register_entity(entity_name_t name) local[erank] = msgr; stopped[erank] = false; msgr->_myinst.addr = rank_addr; - msgr->_myinst.addr.v.erank = erank; + msgr->_myinst.addr.erank = erank; dout(10) << "register_entity " << name << " at " << msgr->_myinst.addr << dendl; @@ -438,16 +438,16 @@ void Rank::submit_message(Message *m, const entity_addr_t& dest_addr) // lookup entity_addr_t dest_proc_addr = dest_addr; - dest_proc_addr.v.erank = 0; + dest_proc_addr.erank = 0; lock.Lock(); { // local? - if (ceph_entity_addr_is_local(dest_addr.v, rank_addr.v)) { - if (dest_addr.v.erank < max_local && local[dest_addr.v.erank]) { + if (rank_addr.is_local_to(dest_addr)) { + if (dest_addr.erank < max_local && local[dest_addr.erank]) { // local dout(20) << "submit_message " << *m << " dest " << dest << " local" << dendl; - local[dest_addr.v.erank]->queue_message(m); + local[dest_addr.erank]->queue_message(m); } else { derr(0) << "submit_message " << *m << " dest " << dest << " " << dest_addr << " local but not in local map? dropping." << dendl; //assert(0); // hmpf, this is probably mds->mon beacon from newsyn. @@ -771,11 +771,11 @@ int Rank::Pipe::accept() state = STATE_CLOSED; return -1; } - if (peer_addr.v.ipaddr.sin_addr.s_addr == htonl(INADDR_ANY)) { + if (peer_addr.ipaddr.sin_addr.s_addr == htonl(INADDR_ANY)) { // peer apparently doesn't know what ip they have; figure it out for them. entity_addr_t old_addr = peer_addr; - socklen_t len = sizeof(peer_addr.v.ipaddr); - int r = ::getpeername(sd, (sockaddr*)&peer_addr.v.ipaddr, &len); + socklen_t len = sizeof(peer_addr.ipaddr); + int r = ::getpeername(sd, (sockaddr*)&peer_addr.ipaddr, &len); if (r < 0) { dout(0) << "accept failed to getpeername " << errno << " " << strerror(errno) << dendl; state = STATE_CLOSED; @@ -912,10 +912,10 @@ int Rank::Pipe::connect() assert(rc>=0); // connect! - dout(10) << "connecting to " << peer_addr.v.ipaddr << dendl; - rc = ::connect(newsd, (sockaddr*)&peer_addr.v.ipaddr, sizeof(peer_addr.v.ipaddr)); + dout(10) << "connecting to " << peer_addr.ipaddr << dendl; + rc = ::connect(newsd, (sockaddr*)&peer_addr.ipaddr, sizeof(peer_addr.ipaddr)); if (rc < 0) { - dout(2) << "connect error " << peer_addr.v.ipaddr + dout(2) << "connect error " << peer_addr.ipaddr << ", " << errno << ": " << strerror(errno) << dendl; goto fail; } @@ -935,7 +935,7 @@ int Rank::Pipe::connect() goto fail; } dout(20) << "connect read peer addr " << paddr << dendl; - if (!ceph_entity_addr_is_local(peer_addr.v, paddr.v)) { + if (!peer_addr.is_local_to(paddr)) { dout(0) << "connect peer identifies itself as " << paddr << "... wrong node!" << dendl; goto fail; @@ -1119,7 +1119,7 @@ void Rank::Pipe::report_failures() q.pop_front(); if (policy.drop_msg_callback) { - unsigned srcrank = m->get_source_inst().addr.v.erank; + unsigned srcrank = m->get_source_inst().addr.erank; if (srcrank >= rank.max_local || rank.local[srcrank] == 0) { dout(1) << "fail on " << *m << ", srcrank " << srcrank << " dne, dropping" << dendl; delete m; @@ -1256,7 +1256,7 @@ void Rank::Pipe::reader() rank.lock.Lock(); { - unsigned erank = m->get_dest_inst().addr.v.erank; + unsigned erank = m->get_dest_inst().addr.erank; if (erank < rank.max_local && rank.local[erank]) { // find entity entity = rank.local[erank]; @@ -1421,23 +1421,25 @@ Message *Rank::Pipe::read_message() if (tcp_read( sd, (char*)&env, sizeof(env) ) < 0) return 0; - dout(20) << "reader got envelope type=" << env.type + dout(20) << "reader got envelope type=" << le32_to_cpu(env.type) << " src " << env.src << " dst " << env.dst - << " front=" << env.front_len - << " data=" << env.data_len << " at " << env.data_off + << " front=" << le32_to_cpu(env.front_len) + << " data=" << le32_to_cpu(env.data_len) + << " off " << le32_to_cpu(env.data_off) << dendl; if (env.src.addr.ipaddr.sin_addr.s_addr == htonl(INADDR_ANY)) { dout(10) << "reader munging src addr " << env.src << " to be " << peer_addr << dendl; - env.src.addr.ipaddr = peer_addr.v.ipaddr; + env.src.addr.ipaddr = peer_addr.ipaddr; } // read front bufferlist front; bufferptr bp; - if (env.front_len) { - bp = buffer::create(env.front_len); - if (tcp_read( sd, bp.c_str(), env.front_len ) < 0) + int front_len = le32_to_cpu(env.front_len); + if (front_len) { + bp = buffer::create(front_len); + if (tcp_read( sd, bp.c_str(), front_len ) < 0) return 0; front.push_back(bp); dout(20) << "reader got front " << front.length() << dendl; @@ -1445,11 +1447,13 @@ Message *Rank::Pipe::read_message() // read data bufferlist data; - if (env.data_len) { - int left = env.data_len; - if (env.data_off & ~PAGE_MASK) { + int data_len = le32_to_cpu(env.data_len); + int data_off = le32_to_cpu(env.data_off); + if (data_len) { + int left = data_len; + if (data_off & ~PAGE_MASK) { // head - int head = MIN(PAGE_SIZE - (env.data_off & ~PAGE_MASK), + int head = MIN(PAGE_SIZE - (data_off & ~PAGE_MASK), (unsigned)left); bp = buffer::create(head); if (tcp_read( sd, bp.c_str(), head ) < 0) @@ -1563,8 +1567,8 @@ int Rank::Pipe::write_message(Message *m) { // get envelope, buffers ceph_msg_header *env = &m->get_env(); - env->front_len = m->get_payload().length(); - env->data_len = m->get_data().length(); + env->front_len = cpu_to_le32(m->get_payload().length()); + env->data_len = cpu_to_le32(m->get_data().length()); bufferlist blist; blist.claim( m->get_payload() ); diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index f1a0f3e971847..3d7e05e8e32d0 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -21,7 +21,7 @@ class entity_name_t { public: - struct ceph_entity_name v; + __u32 _type, _num; public: static const int TYPE_MON = CEPH_ENTITY_TYPE_MON; @@ -33,9 +33,10 @@ public: static const int NEW = -1; // cons - entity_name_t() { v.type = v.num = 0; } - entity_name_t(int t, int n) { v.type = t; v.num = n; } - entity_name_t(const ceph_entity_name &n) : v(n) { } + entity_name_t() : _type(0), _num(0) { } + entity_name_t(int t, int n) : _type(t), _num(n) { } + entity_name_t(const ceph_entity_name &n) : + _type(le32_to_cpu(n.type)), _num(le32_to_cpu(n.num)) { } // static cons static entity_name_t MON(int i=NEW) { return entity_name_t(TYPE_MON, i); } @@ -44,8 +45,8 @@ public: static entity_name_t CLIENT(int i=NEW) { return entity_name_t(TYPE_CLIENT, i); } static entity_name_t ADMIN(int i=NEW) { return entity_name_t(TYPE_ADMIN, i); } - int num() const { return v.num; } - int type() const { return v.type; } + int num() const { return _num; } + int type() const { return _type; } const char *type_str() const { switch (type()) { case TYPE_MDS: return "mds"; @@ -64,6 +65,12 @@ public: bool is_osd() const { return type() == TYPE_OSD; } bool is_mon() const { return type() == TYPE_MON; } bool is_admin() const { return type() == TYPE_ADMIN; } + + operator ceph_entity_name() const { + ceph_entity_name n = { cpu_to_le32(_type), cpu_to_le32(_num) }; + return n; + } + }; inline bool operator== (const entity_name_t& l, const entity_name_t& r) { @@ -89,7 +96,7 @@ namespace __gnu_cxx { { size_t operator()( const entity_name_t m ) const { - return rjhash32(m.v.type) ^ rjhash32(m.v.num); + return rjhash32(m.type()) ^ rjhash32(m.num()); } }; } @@ -103,28 +110,50 @@ namespace __gnu_cxx { * ipv4 for now. */ struct entity_addr_t { - struct ceph_entity_addr v; + __u32 erank; + __u32 nonce; + struct sockaddr_in ipaddr; - entity_addr_t() { - memset(&v, 0, sizeof(v)); - v.ipaddr.sin_family = AF_INET; + entity_addr_t() : erank(0), nonce(0) { + memset(&ipaddr, 0, sizeof(ipaddr)); + ipaddr.sin_family = AF_INET; + } + entity_addr_t(const ceph_entity_addr &v) { + erank = le32_to_cpu(v.erank); + nonce = le32_to_cpu(v.nonce); + ipaddr = v.ipaddr; } void set_ipquad(int pos, int val) { - unsigned char *ipq = (unsigned char*)&v.ipaddr.sin_addr.s_addr; + unsigned char *ipq = (unsigned char*)&ipaddr.sin_addr.s_addr; ipq[pos] = val; } void set_port(int port) { - v.ipaddr.sin_port = htons(port); + ipaddr.sin_port = htons(port); } int get_port() { - return ntohs(v.ipaddr.sin_port); + return ntohs(ipaddr.sin_port); + } + + operator ceph_entity_addr() const { + ceph_entity_addr a = { + cpu_to_le32(erank), + cpu_to_le32(nonce), + ipaddr + }; + return a; + } + + bool is_local_to(const entity_addr_t &other) { + return + nonce == other.nonce && + memcpy(&ipaddr, &other.ipaddr, sizeof(ipaddr)) == 0; } }; inline ostream& operator<<(ostream& out, const entity_addr_t &addr) { - return out << addr.v.ipaddr << '/' << addr.v.nonce << '/' << addr.v.erank; + return out << addr.ipaddr << '/' << addr.nonce << '/' << addr.erank; } inline bool operator==(const entity_addr_t& a, const entity_addr_t& b) { return memcmp(&a, &b, sizeof(a)) == 0; } @@ -154,14 +183,8 @@ struct entity_inst_t { entity_addr_t addr; entity_inst_t() {} entity_inst_t(entity_name_t n, const entity_addr_t& a) : name(n), addr(a) {} - entity_inst_t(const ceph_entity_inst& i) { - name.v = i.name; - addr.v = i.addr; - } - entity_inst_t(const ceph_entity_name& n, const ceph_entity_addr &a) { - name.v = n; - addr.v = a; - } + entity_inst_t(const ceph_entity_inst& i) : name(i.name), addr(i.addr) { } + entity_inst_t(const ceph_entity_name& n, const ceph_entity_addr &a) : name(n), addr(a) {} }; -- 2.39.5