From c700d9f714f49a00fce4040755cd9b87734a90ea Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 12 Nov 2025 03:34:16 +0200 Subject: [PATCH] Kernel: Implement connect for UDP socket --- kernel/include/kernel/Networking/UDPSocket.h | 4 +++ kernel/kernel/Networking/UDPSocket.cpp | 26 +++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/Networking/UDPSocket.h b/kernel/include/kernel/Networking/UDPSocket.h index 83e6ed0b..f5791025 100644 --- a/kernel/include/kernel/Networking/UDPSocket.h +++ b/kernel/include/kernel/Networking/UDPSocket.h @@ -33,6 +33,7 @@ namespace Kernel protected: virtual void receive_packet(BAN::ConstByteSpan, const sockaddr* sender, socklen_t sender_len) override; + virtual BAN::ErrorOr connect_impl(const sockaddr*, socklen_t) override; virtual BAN::ErrorOr bind_impl(const sockaddr* address, socklen_t address_len) override; virtual BAN::ErrorOr recvmsg_impl(msghdr& message, int flags) override; virtual BAN::ErrorOr sendmsg_impl(const msghdr& message, int flags) override; @@ -63,6 +64,9 @@ namespace Kernel SpinLock m_packet_lock; ThreadBlocker m_packet_thread_blocker; + sockaddr_storage m_peer_address {}; + socklen_t m_peer_address_len { 0 }; + friend class BAN::RefPtr; }; diff --git a/kernel/kernel/Networking/UDPSocket.cpp b/kernel/kernel/Networking/UDPSocket.cpp index 34680a37..caf94682 100644 --- a/kernel/kernel/Networking/UDPSocket.cpp +++ b/kernel/kernel/Networking/UDPSocket.cpp @@ -79,6 +79,15 @@ namespace Kernel m_packet_thread_blocker.unblock(); } + BAN::ErrorOr UDPSocket::connect_impl(const sockaddr* address, socklen_t address_len) + { + if (address_len > static_cast(sizeof(m_peer_address))) + address_len = sizeof(m_peer_address); + memcpy(&m_peer_address, address, address_len); + m_peer_address_len = address_len; + return {}; + } + BAN::ErrorOr UDPSocket::bind_impl(const sockaddr* address, socklen_t address_len) { if (is_bound()) @@ -187,7 +196,22 @@ namespace Kernel offset += message.msg_iov[i].iov_len; } - return TRY(m_network_layer.sendto(*this, buffer.span(), static_cast(message.msg_name), message.msg_namelen)); + sockaddr* address; + socklen_t address_len; + if (!message.msg_name || message.msg_namelen == 0) + { + if (m_peer_address_len == 0) + return BAN::Error::from_errno(EDESTADDRREQ); + address = reinterpret_cast(&m_peer_address); + address_len = m_peer_address_len; + } + else + { + address = static_cast(message.msg_name); + address_len = message.msg_namelen; + } + + return TRY(m_network_layer.sendto(*this, buffer.span(), address, address_len)); } BAN::ErrorOr UDPSocket::ioctl_impl(int request, void* argument)