Kernel: Implement connect for UDP socket
This commit is contained in:
parent
59cfc339b0
commit
c700d9f714
|
|
@ -33,6 +33,7 @@ namespace Kernel
|
||||||
protected:
|
protected:
|
||||||
virtual void receive_packet(BAN::ConstByteSpan, const sockaddr* sender, socklen_t sender_len) override;
|
virtual void receive_packet(BAN::ConstByteSpan, const sockaddr* sender, socklen_t sender_len) override;
|
||||||
|
|
||||||
|
virtual BAN::ErrorOr<void> connect_impl(const sockaddr*, socklen_t) override;
|
||||||
virtual BAN::ErrorOr<void> bind_impl(const sockaddr* address, socklen_t address_len) override;
|
virtual BAN::ErrorOr<void> bind_impl(const sockaddr* address, socklen_t address_len) override;
|
||||||
virtual BAN::ErrorOr<size_t> recvmsg_impl(msghdr& message, int flags) override;
|
virtual BAN::ErrorOr<size_t> recvmsg_impl(msghdr& message, int flags) override;
|
||||||
virtual BAN::ErrorOr<size_t> sendmsg_impl(const msghdr& message, int flags) override;
|
virtual BAN::ErrorOr<size_t> sendmsg_impl(const msghdr& message, int flags) override;
|
||||||
|
|
@ -63,6 +64,9 @@ namespace Kernel
|
||||||
SpinLock m_packet_lock;
|
SpinLock m_packet_lock;
|
||||||
ThreadBlocker m_packet_thread_blocker;
|
ThreadBlocker m_packet_thread_blocker;
|
||||||
|
|
||||||
|
sockaddr_storage m_peer_address {};
|
||||||
|
socklen_t m_peer_address_len { 0 };
|
||||||
|
|
||||||
friend class BAN::RefPtr<UDPSocket>;
|
friend class BAN::RefPtr<UDPSocket>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,15 @@ namespace Kernel
|
||||||
m_packet_thread_blocker.unblock();
|
m_packet_thread_blocker.unblock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> UDPSocket::connect_impl(const sockaddr* address, socklen_t address_len)
|
||||||
|
{
|
||||||
|
if (address_len > static_cast<socklen_t>(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<void> UDPSocket::bind_impl(const sockaddr* address, socklen_t address_len)
|
BAN::ErrorOr<void> UDPSocket::bind_impl(const sockaddr* address, socklen_t address_len)
|
||||||
{
|
{
|
||||||
if (is_bound())
|
if (is_bound())
|
||||||
|
|
@ -187,7 +196,22 @@ namespace Kernel
|
||||||
offset += message.msg_iov[i].iov_len;
|
offset += message.msg_iov[i].iov_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRY(m_network_layer.sendto(*this, buffer.span(), static_cast<sockaddr*>(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<sockaddr*>(&m_peer_address);
|
||||||
|
address_len = m_peer_address_len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
address = static_cast<sockaddr*>(message.msg_name);
|
||||||
|
address_len = message.msg_namelen;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRY(m_network_layer.sendto(*this, buffer.span(), address, address_len));
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> UDPSocket::ioctl_impl(int request, void* argument)
|
BAN::ErrorOr<long> UDPSocket::ioctl_impl(int request, void* argument)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue