From: Yingxin Cheng Date: Tue, 16 Jul 2019 08:11:57 +0000 (+0800) Subject: crimson/net: use set_ephemeral_port() for non-bound port X-Git-Tag: v15.1.0~2161^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bd9a4a238bd1c5e085e0e1bbf9c678016ce21080;p=ceph-ci.git crimson/net: use set_ephemeral_port() for non-bound port Ephemeral port is different from the bound port when connecting, and different from the peer_addr port when accepting. Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/net/ProtocolV1.cc b/src/crimson/net/ProtocolV1.cc index 30aa8642865..b9805b4889e 100644 --- a/src/crimson/net/ProtocolV1.cc +++ b/src/crimson/net/ProtocolV1.cc @@ -325,6 +325,8 @@ void ProtocolV1::start_connect(const entity_addr_t& _peer_addr, state = state_t::connecting; set_write_state(write_state_t::delay); + // we don't know my ephemeral port yet + conn.set_ephemeral_port(0, SocketConnection::side_t::none); ceph_assert(!socket); conn.peer_addr = _peer_addr; conn.set_peer_type(_peer_type); @@ -351,9 +353,8 @@ void ProtocolV1::start_connect(const entity_addr_t& _peer_addr, ::decode(caddr, p); ceph_assert(p.end()); validate_peer_addr(saddr, conn.peer_addr); - - conn.side = SocketConnection::side_t::connector; - conn.socket_port = caddr.get_port(); + conn.set_ephemeral_port(caddr.get_port(), + SocketConnection::side_t::connector); return messenger.learned_addr(caddr); }).then([this] { // encode/send client's handshake header @@ -608,8 +609,8 @@ void ProtocolV1::start_accept(SocketFRef&& sock, ceph_assert(!socket); conn.peer_addr.u = _peer_addr.u; conn.peer_addr.set_port(0); - conn.side = SocketConnection::side_t::acceptor; - conn.socket_port = _peer_addr.get_port(); + conn.set_ephemeral_port(_peer_addr.get_port(), + SocketConnection::side_t::acceptor); socket = std::move(sock); messenger.accept_conn( seastar::static_pointer_cast(conn.shared_from_this())); diff --git a/src/crimson/net/ProtocolV2.cc b/src/crimson/net/ProtocolV2.cc index bf71adb755c..87e0c1cbda0 100644 --- a/src/crimson/net/ProtocolV2.cc +++ b/src/crimson/net/ProtocolV2.cc @@ -148,6 +148,8 @@ void ProtocolV2::start_accept(SocketFRef&& sock, ceph_assert(state == state_t::NONE); ceph_assert(!socket); conn.target_addr = _peer_addr; + conn.set_ephemeral_port(_peer_addr.get_port(), + SocketConnection::side_t::acceptor); socket = std::move(sock); logger().info("{} ProtocolV2::start_accept(): peer_addr={}", conn, _peer_addr); messenger.accept_conn( @@ -830,6 +832,8 @@ void ProtocolV2::execute_connecting() { trigger_state(state_t::CONNECTING, write_state_t::delay, true); seastar::with_gate(pending_dispatch, [this] { + // we don't know my socket_port yet + conn.set_ephemeral_port(0, SocketConnection::side_t::none); enable_recording(); global_seq = messenger.get_global_seq(); logger().debug("{} UPDATE: gs={}", conn, global_seq); @@ -855,6 +859,8 @@ void ProtocolV2::execute_connecting() dispatch_reset(); abort_in_close(); } + conn.set_ephemeral_port(_my_addr_from_peer.get_port(), + SocketConnection::side_t::connector); if (messenger.get_myaddrs().empty() || messenger.get_myaddrs().front().is_blank_ip()) { return messenger.learned_addr(_my_addr_from_peer); diff --git a/src/crimson/net/SocketConnection.cc b/src/crimson/net/SocketConnection.cc index 19b27dfb791..da5423db1ed 100644 --- a/src/crimson/net/SocketConnection.cc +++ b/src/crimson/net/SocketConnection.cc @@ -124,9 +124,9 @@ void SocketConnection::print(ostream& out) const { out << " >> " << get_peer_name() << " " << peer_addr; } else if (side == side_t::acceptor) { out << " >> " << get_peer_name() << " " << peer_addr - << "@" << socket_port; + << "@" << ephemeral_port; } else { // side == side_t::connector - out << "@" << socket_port + out << "@" << ephemeral_port << " >> " << get_peer_name() << " " << peer_addr; } } diff --git a/src/crimson/net/SocketConnection.h b/src/crimson/net/SocketConnection.h index 38c303a98c4..fc49cfee6ec 100644 --- a/src/crimson/net/SocketConnection.h +++ b/src/crimson/net/SocketConnection.h @@ -32,15 +32,19 @@ class SocketConnection : public Connection { SocketMessenger& messenger; std::unique_ptr protocol; - // if acceptor side, socket_port is different from peer_addr.get_port(); - // if connector side, socket_port is different from my_addr.get_port(). + // if acceptor side, ephemeral_port is different from peer_addr.get_port(); + // if connector side, ephemeral_port is different from my_addr.get_port(). enum class side_t { none, acceptor, connector }; side_t side = side_t::none; - uint16_t socket_port = 0; + uint16_t ephemeral_port = 0; + void set_ephemeral_port(uint16_t port, side_t _side) { + ephemeral_port = port; + side = _side; + } ceph::net::Policy policy; uint64_t features;