From 2ca61bb4609304b3bbf8e7a141ccb56d1fbe41b9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 25 Jan 2019 14:14:55 -0600 Subject: [PATCH] msg/async/ProtocolV2: always send non-empty addrvec for self If we don't know our address yet, send the peer a 0.0.0.0 or :: address with an empty port and a populated nonce. That way the peer can infer our final addr the same way we do from learned_addr. Signed-off-by: Sage Weil --- src/msg/async/AsyncMessenger.h | 4 ++++ src/msg/async/ProtocolV2.cc | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index 666187a720dee..79242be035fdd 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -357,6 +357,10 @@ public: return stack; } + uint64_t get_nonce() const { + return nonce; + } + /** * Increment the global sequence for this AsyncMessenger and return it. * This is for the connect protocol, although it doesn't hurt if somebody diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index bff2a61882e85..e87b202f2a6db 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -2197,13 +2197,24 @@ CtPtr ProtocolV2::send_client_ident() { flags |= CEPH_MSG_CONNECT_LOSSY; } - ClientIdentFrame client_ident(this, messenger->get_myaddrs(), + entity_addrvec_t ma = messenger->get_myaddrs(); + if (ma.empty()) { + entity_addr_t a; + if (connection->target_addr.is_ipv6()) { + a.parse("[::]:0"); + } else { + a.parse("0.0.0.0:0"); + } + a.set_nonce(messenger->get_nonce()); + ma.v.push_back(a); + } + ClientIdentFrame client_ident(this, ma, messenger->get_myname().num(), global_seq, connection->policy.features_supported, connection->policy.features_required, flags); ldout(cct, 5) << __func__ << " sending identification: " - << "addrs=" << messenger->get_myaddrs() + << "addrs=" << ma << " gid=" << messenger->get_myname().num() << " global_seq=" << global_seq << " features_supported=" << std::hex @@ -2554,7 +2565,7 @@ CtPtr ProtocolV2::handle_client_ident(char *payload, uint32_t length) { connection->target_addr.set_type(entity_addr_t::TYPE_MSGR2); if (client_ident.addrs().empty()) { - connection->set_peer_addr(connection->target_addr); + return _fault(); // a v2 peer should never do this } else { for (auto &peer_addr : client_ident.addrs().v) { if (peer_addr.is_blank_ip()) { -- 2.39.5