TCPSocket.h 7.2 KB

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