]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/net: use set_ephemeral_port() for non-bound port
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 16 Jul 2019 08:11:57 +0000 (16:11 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 17 Jul 2019 08:36:55 +0000 (16:36 +0800)
Ephemeral port is different from the bound port when connecting, and
different from the peer_addr port when accepting.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/net/ProtocolV1.cc
src/crimson/net/ProtocolV2.cc
src/crimson/net/SocketConnection.cc
src/crimson/net/SocketConnection.h

index 30aa86428653934ab2892e3362da2c55fa68e399..b9805b4889ea39b811e2a96894d4409a7319cbb1 100644 (file)
@@ -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<SocketConnection>(conn.shared_from_this()));
index bf71adb755c8f97db4a90d7f9df4ba8fab2f54e8..87e0c1cbda01c843c4eadbacaa5f6aebf5ec0b02 100644 (file)
@@ -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);
index 19b27dfb79179b06d77ebb3af92bd08eaae17483..da5423db1edea5b364d06ff04ef4977fe9376752 100644 (file)
@@ -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;
     }
 }
index 38c303a98c441c0d71dd47a117db00d3edd4e51d..fc49cfee6ecd2348b9b7ae71b64cf6796368b304 100644 (file)
@@ -32,15 +32,19 @@ class SocketConnection : public Connection {
   SocketMessenger& messenger;
   std::unique_ptr<Protocol> 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<ceph::thread::Throttle> policy;
   uint64_t features;