TCPSocket.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/SinglyLinkedList.h>
  10. #include <AK/WeakPtr.h>
  11. #include <Kernel/KResult.h>
  12. #include <Kernel/Net/IPv4Socket.h>
  13. namespace Kernel {
  14. class TCPSocket final : public IPv4Socket {
  15. public:
  16. static void for_each(Function<void(const TCPSocket&)>);
  17. static KResultOr<NonnullRefPtr<TCPSocket>> create(int protocol);
  18. virtual ~TCPSocket() override;
  19. enum class Direction {
  20. Unspecified,
  21. Outgoing,
  22. Incoming,
  23. Passive,
  24. };
  25. static const char* to_string(Direction direction)
  26. {
  27. switch (direction) {
  28. case Direction::Unspecified:
  29. return "Unspecified";
  30. case Direction::Outgoing:
  31. return "Outgoing";
  32. case Direction::Incoming:
  33. return "Incoming";
  34. case Direction::Passive:
  35. return "Passive";
  36. default:
  37. return "None";
  38. }
  39. }
  40. enum class State {
  41. Closed,
  42. Listen,
  43. SynSent,
  44. SynReceived,
  45. Established,
  46. CloseWait,
  47. LastAck,
  48. FinWait1,
  49. FinWait2,
  50. Closing,
  51. TimeWait,
  52. };
  53. static const char* to_string(State state)
  54. {
  55. switch (state) {
  56. case State::Closed:
  57. return "Closed";
  58. case State::Listen:
  59. return "Listen";
  60. case State::SynSent:
  61. return "SynSent";
  62. case State::SynReceived:
  63. return "SynReceived";
  64. case State::Established:
  65. return "Established";
  66. case State::CloseWait:
  67. return "CloseWait";
  68. case State::LastAck:
  69. return "LastAck";
  70. case State::FinWait1:
  71. return "FinWait1";
  72. case State::FinWait2:
  73. return "FinWait2";
  74. case State::Closing:
  75. return "Closing";
  76. case State::TimeWait:
  77. return "TimeWait";
  78. default:
  79. return "None";
  80. }
  81. }
  82. enum class Error {
  83. None,
  84. FINDuringConnect,
  85. RSTDuringConnect,
  86. UnexpectedFlagsDuringConnect,
  87. RetransmitTimeout,
  88. };
  89. static const char* to_string(Error error)
  90. {
  91. switch (error) {
  92. case Error::None:
  93. return "None";
  94. case Error::FINDuringConnect:
  95. return "FINDuringConnect";
  96. case Error::RSTDuringConnect:
  97. return "RSTDuringConnect";
  98. case Error::UnexpectedFlagsDuringConnect:
  99. return "UnexpectedFlagsDuringConnect";
  100. default:
  101. return "Invalid";
  102. }
  103. }
  104. State state() const { return m_state; }
  105. void set_state(State state);
  106. Direction direction() const { return m_direction; }
  107. bool has_error() const { return m_error != Error::None; }
  108. Error error() const { return m_error; }
  109. void set_error(Error error) { m_error = error; }
  110. void set_ack_number(u32 n) { m_ack_number = n; }
  111. void set_sequence_number(u32 n) { m_sequence_number = n; }
  112. u32 ack_number() const { return m_ack_number; }
  113. u32 sequence_number() const { return m_sequence_number; }
  114. u32 packets_in() const { return m_packets_in; }
  115. u32 bytes_in() const { return m_bytes_in; }
  116. u32 packets_out() const { return m_packets_out; }
  117. u32 bytes_out() const { return m_bytes_out; }
  118. // FIXME: Make this configurable?
  119. static constexpr u32 maximum_duplicate_acks = 5;
  120. void set_duplicate_acks(u32 acks) { m_duplicate_acks = acks; }
  121. u32 duplicate_acks() const { return m_duplicate_acks; }
  122. KResult send_ack(bool allow_duplicate = false);
  123. KResult send_tcp_packet(u16 flags, const UserOrKernelBuffer* = nullptr, size_t = 0);
  124. void receive_tcp_packet(const TCPPacket&, u16 size);
  125. bool should_delay_next_ack() const;
  126. static Lockable<HashMap<IPv4SocketTuple, TCPSocket*>>& sockets_by_tuple();
  127. static RefPtr<TCPSocket> from_tuple(const IPv4SocketTuple& tuple);
  128. static Lockable<HashMap<IPv4SocketTuple, RefPtr<TCPSocket>>>& closing_sockets();
  129. RefPtr<TCPSocket> create_client(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
  130. void set_originator(TCPSocket& originator) { m_originator = originator; }
  131. bool has_originator() { return !!m_originator; }
  132. void release_to_originator();
  133. void release_for_accept(RefPtr<TCPSocket>);
  134. static Lockable<HashTable<TCPSocket*>>& sockets_for_retransmit();
  135. void retransmit_packets();
  136. virtual KResult close() override;
  137. protected:
  138. void set_direction(Direction direction) { m_direction = direction; }
  139. private:
  140. explicit TCPSocket(int protocol);
  141. virtual const char* class_name() const override { return "TCPSocket"; }
  142. static NetworkOrdered<u16> compute_tcp_checksum(const IPv4Address& source, const IPv4Address& destination, const TCPPacket&, u16 payload_size);
  143. virtual void shut_down_for_writing() override;
  144. virtual KResultOr<size_t> protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override;
  145. virtual KResultOr<size_t> protocol_send(const UserOrKernelBuffer&, size_t) override;
  146. virtual KResult protocol_connect(FileDescription&, ShouldBlock) override;
  147. virtual KResultOr<u16> protocol_allocate_local_port() override;
  148. virtual bool protocol_is_disconnected() const override;
  149. virtual KResult protocol_bind() override;
  150. virtual KResult protocol_listen() override;
  151. void enqueue_for_retransmit();
  152. void dequeue_for_retransmit();
  153. WeakPtr<TCPSocket> m_originator;
  154. HashMap<IPv4SocketTuple, NonnullRefPtr<TCPSocket>> m_pending_release_for_accept;
  155. Direction m_direction { Direction::Unspecified };
  156. Error m_error { Error::None };
  157. RefPtr<NetworkAdapter> m_adapter;
  158. u32 m_sequence_number { 0 };
  159. u32 m_ack_number { 0 };
  160. State m_state { State::Closed };
  161. u32 m_packets_in { 0 };
  162. u32 m_bytes_in { 0 };
  163. u32 m_packets_out { 0 };
  164. u32 m_bytes_out { 0 };
  165. struct OutgoingPacket {
  166. u32 ack_number { 0 };
  167. NetworkByteBuffer buffer;
  168. int tx_counter { 0 };
  169. };
  170. Lock m_not_acked_lock { "TCPSocket unacked packets" };
  171. SinglyLinkedList<OutgoingPacket> m_not_acked;
  172. u32 m_duplicate_acks { 0 };
  173. u32 m_last_ack_number_sent { 0 };
  174. Time m_last_ack_sent_time;
  175. // FIXME: Make this configurable (sysctl)
  176. static constexpr u32 maximum_retransmits = 5;
  177. Time m_last_retransmit_time;
  178. u32 m_retransmit_attempts { 0 };
  179. };
  180. }