1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 11:44:58 +00:00

Kernel/Net: Use monotonic time for TCP times

These were using real time as a mistake before; changing the system time
during ongoing TCP connections shouldn’t break them.
This commit is contained in:
kleines Filmröllchen 2023-08-17 19:20:42 +02:00 committed by Tim Schumacher
parent af2886449a
commit ed966a80e2
2 changed files with 9 additions and 6 deletions

View file

@ -19,6 +19,7 @@
#include <Kernel/Net/TCPSocket.h> #include <Kernel/Net/TCPSocket.h>
#include <Kernel/Security/Random.h> #include <Kernel/Security/Random.h>
#include <Kernel/Tasks/Process.h> #include <Kernel/Tasks/Process.h>
#include <Kernel/Time/TimeManagement.h>
namespace Kernel { namespace Kernel {
@ -165,8 +166,9 @@ void TCPSocket::release_for_accept(NonnullRefPtr<TCPSocket> socket)
TCPSocket::TCPSocket(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer, NonnullOwnPtr<KBuffer> scratch_buffer) TCPSocket::TCPSocket(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer, NonnullOwnPtr<KBuffer> scratch_buffer)
: IPv4Socket(SOCK_STREAM, protocol, move(receive_buffer), move(scratch_buffer)) : IPv4Socket(SOCK_STREAM, protocol, move(receive_buffer), move(scratch_buffer))
, m_last_ack_sent_time(TimeManagement::the().monotonic_time())
, m_last_retransmit_time(TimeManagement::the().monotonic_time())
{ {
m_last_retransmit_time = kgettimeofday();
} }
TCPSocket::~TCPSocket() TCPSocket::~TCPSocket()
@ -258,7 +260,7 @@ ErrorOr<void> TCPSocket::send_tcp_packet(u16 flags, UserOrKernelBuffer const* pa
if (flags & TCPFlags::ACK) { if (flags & TCPFlags::ACK) {
m_last_ack_number_sent = m_ack_number; m_last_ack_number_sent = m_ack_number;
m_last_ack_sent_time = kgettimeofday(); m_last_ack_sent_time = TimeManagement::the().monotonic_time();
tcp_packet.set_ack_number(m_ack_number); tcp_packet.set_ack_number(m_ack_number);
} }
@ -358,7 +360,7 @@ bool TCPSocket::should_delay_next_ack() const
return false; return false;
// RFC 1122 says we should not delay ACKs for more than 500 milliseconds. // RFC 1122 says we should not delay ACKs for more than 500 milliseconds.
if (kgettimeofday() >= m_last_ack_sent_time + Duration::from_milliseconds(500)) if (TimeManagement::the().monotonic_time(TimePrecision::Precise) >= m_last_ack_sent_time + Duration::from_milliseconds(500))
return false; return false;
return true; return true;
@ -585,7 +587,7 @@ void TCPSocket::dequeue_for_retransmit()
void TCPSocket::retransmit_packets() void TCPSocket::retransmit_packets()
{ {
auto now = kgettimeofday(); auto now = TimeManagement::the().monotonic_time();
// RFC6298 says we should have at least one second between retransmits. According to // RFC6298 says we should have at least one second between retransmits. According to
// RFC1122 we must do exponential backoff - even for SYN packets. // RFC1122 we must do exponential backoff - even for SYN packets.

View file

@ -10,6 +10,7 @@
#include <AK/Function.h> #include <AK/Function.h>
#include <AK/HashMap.h> #include <AK/HashMap.h>
#include <AK/SinglyLinkedList.h> #include <AK/SinglyLinkedList.h>
#include <AK/Time.h>
#include <Kernel/Library/LockWeakPtr.h> #include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/Locking/MutexProtected.h> #include <Kernel/Locking/MutexProtected.h>
#include <Kernel/Net/IPv4Socket.h> #include <Kernel/Net/IPv4Socket.h>
@ -215,11 +216,11 @@ private:
u32 m_duplicate_acks { 0 }; u32 m_duplicate_acks { 0 };
u32 m_last_ack_number_sent { 0 }; u32 m_last_ack_number_sent { 0 };
UnixDateTime m_last_ack_sent_time; MonotonicTime m_last_ack_sent_time;
// FIXME: Make this configurable (sysctl) // FIXME: Make this configurable (sysctl)
static constexpr u32 maximum_retransmits = 5; static constexpr u32 maximum_retransmits = 5;
UnixDateTime m_last_retransmit_time; MonotonicTime m_last_retransmit_time;
u32 m_retransmit_attempts { 0 }; u32 m_retransmit_attempts { 0 };
// Default to maximum window size. receive_tcp_packet() will update from the // Default to maximum window size. receive_tcp_packet() will update from the