From 8cc81c2953d247eaa7c13227ed5d78f471cc21b4 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 18 Dec 2020 16:13:23 +0100 Subject: [PATCH] Kernel/Net: Make IPv4Socket::protocol_receive() take a ReadonlyBytes The overrides of this function don't need to know how the original packet was stored, so let's just give them a ReadonlyBytes view of the raw packet data. --- Kernel/Net/IPv4Socket.cpp | 4 ++-- Kernel/Net/IPv4Socket.h | 2 +- Kernel/Net/TCPSocket.cpp | 6 +++--- Kernel/Net/TCPSocket.h | 2 +- Kernel/Net/UDPSocket.cpp | 4 ++-- Kernel/Net/UDPSocket.h | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 182a2078f6..3377162b25 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -363,7 +363,7 @@ KResultOr IPv4Socket::receive_packet_buffered(FileDescription& descripti return bytes_written; } - return protocol_receive(packet.data.value(), buffer, buffer_length, flags); + return protocol_receive(ReadonlyBytes { packet.data.value().data(), packet.data.value().size() }, buffer, buffer_length, flags); } KResultOr IPv4Socket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace user_addr, Userspace user_addr_length, timeval& packet_timestamp) @@ -408,7 +408,7 @@ bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port, return false; } auto scratch_buffer = UserOrKernelBuffer::for_kernel_buffer(m_scratch_buffer.value().data()); - auto nreceived_or_error = protocol_receive(packet, scratch_buffer, m_scratch_buffer.value().size(), 0); + auto nreceived_or_error = protocol_receive(ReadonlyBytes { packet.data(), packet.size() }, scratch_buffer, m_scratch_buffer.value().size(), 0); if (nreceived_or_error.is_error()) return false; ssize_t nwritten = m_receive_buffer.write(scratch_buffer, nreceived_or_error.value()); diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index 67c339a67a..3f492c6309 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -96,7 +96,7 @@ protected: virtual KResult protocol_bind() { return KSuccess; } virtual KResult protocol_listen() { return KSuccess; } - virtual KResultOr protocol_receive(const KBuffer&, UserOrKernelBuffer&, size_t, int) { return -ENOTIMPL; } + virtual KResultOr protocol_receive(ReadonlyBytes /* raw_ipv4_packet */, UserOrKernelBuffer&, size_t, int) { return -ENOTIMPL; } virtual KResultOr protocol_send(const UserOrKernelBuffer&, size_t) { return -ENOTIMPL; } virtual KResult protocol_connect(FileDescription&, ShouldBlock) { return KSuccess; } virtual int protocol_allocate_local_port() { return 0; } diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index 91b5252207..de8b1fff16 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -167,12 +167,12 @@ NonnullRefPtr TCPSocket::create(int protocol) return adopt(*new TCPSocket(protocol)); } -KResultOr TCPSocket::protocol_receive(const KBuffer& packet_buffer, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) +KResultOr TCPSocket::protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) { (void)flags; - auto& ipv4_packet = *(const IPv4Packet*)(packet_buffer.data()); + auto& ipv4_packet = *reinterpret_cast(raw_ipv4_packet.data()); auto& tcp_packet = *static_cast(ipv4_packet.payload()); - size_t payload_size = packet_buffer.size() - sizeof(IPv4Packet) - tcp_packet.header_size(); + size_t payload_size = raw_ipv4_packet.size() - sizeof(IPv4Packet) - tcp_packet.header_size(); #ifdef TCP_SOCKET_DEBUG klog() << "payload_size " << payload_size << ", will it fit in " << buffer_size << "?"; #endif diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index 452de7deec..83230b3f08 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -177,7 +177,7 @@ private: virtual void shut_down_for_writing() override; - virtual KResultOr protocol_receive(const KBuffer&, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override; + virtual KResultOr protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override; virtual KResultOr protocol_send(const UserOrKernelBuffer&, size_t) override; virtual KResult protocol_connect(FileDescription&, ShouldBlock) override; virtual int protocol_allocate_local_port() override; diff --git a/Kernel/Net/UDPSocket.cpp b/Kernel/Net/UDPSocket.cpp index 22db799af7..8698201518 100644 --- a/Kernel/Net/UDPSocket.cpp +++ b/Kernel/Net/UDPSocket.cpp @@ -79,10 +79,10 @@ NonnullRefPtr UDPSocket::create(int protocol) return adopt(*new UDPSocket(protocol)); } -KResultOr UDPSocket::protocol_receive(const KBuffer& packet_buffer, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) +KResultOr UDPSocket::protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) { (void)flags; - auto& ipv4_packet = *(const IPv4Packet*)(packet_buffer.data()); + auto& ipv4_packet = *(const IPv4Packet*)(raw_ipv4_packet.data()); auto& udp_packet = *static_cast(ipv4_packet.payload()); ASSERT(udp_packet.length() >= sizeof(UDPPacket)); // FIXME: This should be rejected earlier. ASSERT(buffer_size >= (udp_packet.length() - sizeof(UDPPacket))); diff --git a/Kernel/Net/UDPSocket.h b/Kernel/Net/UDPSocket.h index d640be316e..f05b4e55ce 100644 --- a/Kernel/Net/UDPSocket.h +++ b/Kernel/Net/UDPSocket.h @@ -43,7 +43,7 @@ private: virtual const char* class_name() const override { return "UDPSocket"; } static Lockable>& sockets_by_port(); - virtual KResultOr protocol_receive(const KBuffer&, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override; + virtual KResultOr protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override; virtual KResultOr protocol_send(const UserOrKernelBuffer&, size_t) override; virtual KResult protocol_connect(FileDescription&, ShouldBlock) override; virtual int protocol_allocate_local_port() override;