mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 06:32:44 +00:00 
			
		
		
		
	Kernel: Make sockets use AK::Time
This commit is contained in:
		
							parent
							
								
									719cb93a1a
								
							
						
					
					
						commit
						5c15ca7b84
					
				
					 13 changed files with 54 additions and 53 deletions
				
			
		|  | @ -269,7 +269,7 @@ KResultOr<size_t> IPv4Socket::receive_byte_buffered(FileDescription& description | ||||||
|     return nreceived; |     return nreceived; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, timeval& packet_timestamp) | KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, Time& packet_timestamp) | ||||||
| { | { | ||||||
|     Locker locker(lock()); |     Locker locker(lock()); | ||||||
|     ReceivedPacket packet; |     ReceivedPacket packet; | ||||||
|  | @ -352,7 +352,7 @@ KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& descripti | ||||||
|     return protocol_receive(ReadonlyBytes { packet.data.value().data(), packet.data.value().size() }, buffer, buffer_length, flags); |     return protocol_receive(ReadonlyBytes { packet.data.value().data(), packet.data.value().size() }, buffer, buffer_length, flags); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| KResultOr<size_t> IPv4Socket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> user_addr, Userspace<socklen_t*> user_addr_length, timeval& packet_timestamp) | KResultOr<size_t> IPv4Socket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> user_addr, Userspace<socklen_t*> user_addr_length, Time& packet_timestamp) | ||||||
| { | { | ||||||
|     if (user_addr_length) { |     if (user_addr_length) { | ||||||
|         socklen_t addr_length; |         socklen_t addr_length; | ||||||
|  | @ -377,7 +377,7 @@ KResultOr<size_t> IPv4Socket::recvfrom(FileDescription& description, UserOrKerne | ||||||
|     return nreceived; |     return nreceived; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port, KBuffer&& packet, const timeval& packet_timestamp) | bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port, KBuffer&& packet, const Time& packet_timestamp) | ||||||
| { | { | ||||||
|     LOCKER(lock()); |     LOCKER(lock()); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -57,13 +57,13 @@ public: | ||||||
|     virtual bool can_read(const FileDescription&, size_t) const override; |     virtual bool can_read(const FileDescription&, size_t) const override; | ||||||
|     virtual bool can_write(const FileDescription&, size_t) const override; |     virtual bool can_write(const FileDescription&, size_t) const override; | ||||||
|     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override; |     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override; | ||||||
|     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, timeval&) override; |     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override; | ||||||
|     virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t) override; |     virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t) override; | ||||||
|     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override; |     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override; | ||||||
| 
 | 
 | ||||||
|     virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; |     virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; | ||||||
| 
 | 
 | ||||||
|     bool did_receive(const IPv4Address& peer_address, u16 peer_port, KBuffer&&, const timeval&); |     bool did_receive(const IPv4Address& peer_address, u16 peer_port, KBuffer&&, const Time&); | ||||||
| 
 | 
 | ||||||
|     const IPv4Address& local_address() const { return m_local_address; } |     const IPv4Address& local_address() const { return m_local_address; } | ||||||
|     u16 local_port() const { return m_local_port; } |     u16 local_port() const { return m_local_port; } | ||||||
|  | @ -109,7 +109,7 @@ private: | ||||||
|     virtual bool is_ipv4() const override { return true; } |     virtual bool is_ipv4() const override { return true; } | ||||||
| 
 | 
 | ||||||
|     KResultOr<size_t> receive_byte_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>); |     KResultOr<size_t> receive_byte_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>); | ||||||
|     KResultOr<size_t> receive_packet_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, timeval&); |     KResultOr<size_t> receive_packet_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&); | ||||||
| 
 | 
 | ||||||
|     void set_can_read(bool); |     void set_can_read(bool); | ||||||
| 
 | 
 | ||||||
|  | @ -119,7 +119,7 @@ private: | ||||||
|     struct ReceivedPacket { |     struct ReceivedPacket { | ||||||
|         IPv4Address peer_address; |         IPv4Address peer_address; | ||||||
|         u16 peer_port; |         u16 peer_port; | ||||||
|         timeval timestamp; |         Time timestamp; | ||||||
|         Optional<KBuffer> data; |         Optional<KBuffer> data; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -307,7 +307,7 @@ DoubleBuffer* LocalSocket::send_buffer_for(FileDescription& description) | ||||||
|     return nullptr; |     return nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| KResultOr<size_t> LocalSocket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_size, int, Userspace<sockaddr*>, Userspace<socklen_t*>, timeval&) | KResultOr<size_t> LocalSocket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_size, int, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) | ||||||
| { | { | ||||||
|     auto* socket_buffer = receive_buffer_for(description); |     auto* socket_buffer = receive_buffer_for(description); | ||||||
|     if (!socket_buffer) |     if (!socket_buffer) | ||||||
|  |  | ||||||
|  | @ -61,7 +61,7 @@ public: | ||||||
|     virtual bool can_read(const FileDescription&, size_t) const override; |     virtual bool can_read(const FileDescription&, size_t) const override; | ||||||
|     virtual bool can_write(const FileDescription&, size_t) const override; |     virtual bool can_write(const FileDescription&, size_t) const override; | ||||||
|     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override; |     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override; | ||||||
|     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, timeval&) override; |     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override; | ||||||
|     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override; |     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override; | ||||||
|     virtual KResult chown(FileDescription&, uid_t, gid_t) override; |     virtual KResult chown(FileDescription&, uid_t, gid_t) override; | ||||||
|     virtual KResult chmod(FileDescription&, mode_t) override; |     virtual KResult chmod(FileDescription&, mode_t) override; | ||||||
|  |  | ||||||
|  | @ -193,14 +193,13 @@ void NetworkAdapter::did_receive(ReadonlyBytes payload) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // FIXME: Should use AK::Time internally
 |     m_packet_queue.append({ buffer.value(), kgettimeofday() }); | ||||||
|     m_packet_queue.append({ buffer.value(), kgettimeofday().to_timeval() }); |  | ||||||
| 
 | 
 | ||||||
|     if (on_receive) |     if (on_receive) | ||||||
|         on_receive(); |         on_receive(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t NetworkAdapter::dequeue_packet(u8* buffer, size_t buffer_size, timeval& packet_timestamp) | size_t NetworkAdapter::dequeue_packet(u8* buffer, size_t buffer_size, Time& packet_timestamp) | ||||||
| { | { | ||||||
|     InterruptDisabler disabler; |     InterruptDisabler disabler; | ||||||
|     if (m_packet_queue.is_empty()) |     if (m_packet_queue.is_empty()) | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ public: | ||||||
|     KResult send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); |     KResult send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); | ||||||
|     KResult send_ipv4_fragmented(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); |     KResult send_ipv4_fragmented(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); | ||||||
| 
 | 
 | ||||||
|     size_t dequeue_packet(u8* buffer, size_t buffer_size, timeval& packet_timestamp); |     size_t dequeue_packet(u8* buffer, size_t buffer_size, Time& packet_timestamp); | ||||||
| 
 | 
 | ||||||
|     bool has_queued_packets() const { return !m_packet_queue.is_empty(); } |     bool has_queued_packets() const { return !m_packet_queue.is_empty(); } | ||||||
| 
 | 
 | ||||||
|  | @ -96,7 +96,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     struct PacketWithTimestamp { |     struct PacketWithTimestamp { | ||||||
|         KBuffer packet; |         KBuffer packet; | ||||||
|         timeval timestamp; |         Time timestamp; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     SinglyLinkedList<PacketWithTimestamp> m_packet_queue; |     SinglyLinkedList<PacketWithTimestamp> m_packet_queue; | ||||||
|  |  | ||||||
|  | @ -44,10 +44,10 @@ | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| static void handle_arp(const EthernetFrameHeader&, size_t frame_size); | static void handle_arp(const EthernetFrameHeader&, size_t frame_size); | ||||||
| static void handle_ipv4(const EthernetFrameHeader&, size_t frame_size, const timeval& packet_timestamp); | static void handle_ipv4(const EthernetFrameHeader&, size_t frame_size, const Time& packet_timestamp); | ||||||
| static void handle_icmp(const EthernetFrameHeader&, const IPv4Packet&, const timeval& packet_timestamp); | static void handle_icmp(const EthernetFrameHeader&, const IPv4Packet&, const Time& packet_timestamp); | ||||||
| static void handle_udp(const IPv4Packet&, const timeval& packet_timestamp); | static void handle_udp(const IPv4Packet&, const Time& packet_timestamp); | ||||||
| static void handle_tcp(const IPv4Packet&, const timeval& packet_timestamp); | static void handle_tcp(const IPv4Packet&, const Time& packet_timestamp); | ||||||
| 
 | 
 | ||||||
| [[noreturn]] static void NetworkTask_main(void*); | [[noreturn]] static void NetworkTask_main(void*); | ||||||
| 
 | 
 | ||||||
|  | @ -81,7 +81,7 @@ void NetworkTask_main(void*) | ||||||
|         }; |         }; | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     auto dequeue_packet = [&pending_packets](u8* buffer, size_t buffer_size, timeval& packet_timestamp) -> size_t { |     auto dequeue_packet = [&pending_packets](u8* buffer, size_t buffer_size, Time& packet_timestamp) -> size_t { | ||||||
|         if (pending_packets == 0) |         if (pending_packets == 0) | ||||||
|             return 0; |             return 0; | ||||||
|         size_t packet_size = 0; |         size_t packet_size = 0; | ||||||
|  | @ -100,7 +100,7 @@ void NetworkTask_main(void*) | ||||||
|     size_t buffer_size = 64 * KiB; |     size_t buffer_size = 64 * KiB; | ||||||
|     auto buffer_region = MM.allocate_kernel_region(buffer_size, "Kernel Packet Buffer", Region::Access::Read | Region::Access::Write); |     auto buffer_region = MM.allocate_kernel_region(buffer_size, "Kernel Packet Buffer", Region::Access::Read | Region::Access::Write); | ||||||
|     auto buffer = (u8*)buffer_region->vaddr().get(); |     auto buffer = (u8*)buffer_region->vaddr().get(); | ||||||
|     timeval packet_timestamp; |     Time packet_timestamp; | ||||||
| 
 | 
 | ||||||
|     klog() << "NetworkTask: Enter main loop."; |     klog() << "NetworkTask: Enter main loop."; | ||||||
|     for (;;) { |     for (;;) { | ||||||
|  | @ -205,7 +205,7 @@ void handle_arp(const EthernetFrameHeader& eth, size_t frame_size) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const timeval& packet_timestamp) | void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const Time& packet_timestamp) | ||||||
| { | { | ||||||
|     constexpr size_t minimum_ipv4_frame_size = sizeof(EthernetFrameHeader) + sizeof(IPv4Packet); |     constexpr size_t minimum_ipv4_frame_size = sizeof(EthernetFrameHeader) + sizeof(IPv4Packet); | ||||||
|     if (frame_size < minimum_ipv4_frame_size) { |     if (frame_size < minimum_ipv4_frame_size) { | ||||||
|  | @ -242,7 +242,7 @@ void handle_ipv4(const EthernetFrameHeader& eth, size_t frame_size, const timeva | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void handle_icmp(const EthernetFrameHeader& eth, const IPv4Packet& ipv4_packet, const timeval& packet_timestamp) | void handle_icmp(const EthernetFrameHeader& eth, const IPv4Packet& ipv4_packet, const Time& packet_timestamp) | ||||||
| { | { | ||||||
|     auto& icmp_header = *static_cast<const ICMPHeader*>(ipv4_packet.payload()); |     auto& icmp_header = *static_cast<const ICMPHeader*>(ipv4_packet.payload()); | ||||||
| #if ICMP_DEBUG | #if ICMP_DEBUG | ||||||
|  | @ -290,7 +290,7 @@ void handle_icmp(const EthernetFrameHeader& eth, const IPv4Packet& ipv4_packet, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void handle_udp(const IPv4Packet& ipv4_packet, const timeval& packet_timestamp) | void handle_udp(const IPv4Packet& ipv4_packet, const Time& packet_timestamp) | ||||||
| { | { | ||||||
|     if (ipv4_packet.payload_size() < sizeof(UDPPacket)) { |     if (ipv4_packet.payload_size() < sizeof(UDPPacket)) { | ||||||
|         klog() << "handle_udp: Packet too small (" << ipv4_packet.payload_size() << ", need " << sizeof(UDPPacket) << ")"; |         klog() << "handle_udp: Packet too small (" << ipv4_packet.payload_size() << ", need " << sizeof(UDPPacket) << ")"; | ||||||
|  | @ -319,7 +319,7 @@ void handle_udp(const IPv4Packet& ipv4_packet, const timeval& packet_timestamp) | ||||||
|     socket->did_receive(ipv4_packet.source(), udp_packet.source_port(), KBuffer::copy(&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()), packet_timestamp); |     socket->did_receive(ipv4_packet.source(), udp_packet.source_port(), KBuffer::copy(&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()), packet_timestamp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void handle_tcp(const IPv4Packet& ipv4_packet, const timeval& packet_timestamp) | void handle_tcp(const IPv4Packet& ipv4_packet, const Time& packet_timestamp) | ||||||
| { | { | ||||||
|     if (ipv4_packet.payload_size() < sizeof(TCPPacket)) { |     if (ipv4_packet.payload_size() < sizeof(TCPPacket)) { | ||||||
|         klog() << "handle_tcp: IPv4 payload is too small to be a TCP packet (" << ipv4_packet.payload_size() << ", need " << sizeof(TCPPacket) << ")"; |         klog() << "handle_tcp: IPv4 payload is too small to be a TCP packet (" << ipv4_packet.payload_size() << ", need " << sizeof(TCPPacket) << ")"; | ||||||
|  |  | ||||||
|  | @ -110,8 +110,7 @@ KResult Socket::setsockopt(int level, int option, Userspace<const void*> user_va | ||||||
|             auto timeout = copy_time_from_user(static_ptr_cast<const timeval*>(user_value)); |             auto timeout = copy_time_from_user(static_ptr_cast<const timeval*>(user_value)); | ||||||
|             if (!timeout.has_value()) |             if (!timeout.has_value()) | ||||||
|                 return EFAULT; |                 return EFAULT; | ||||||
|             // FIXME: Should use AK::Time internally
 |             m_send_timeout = timeout.value(); | ||||||
|             m_send_timeout = timeout->to_timeval(); |  | ||||||
|         } |         } | ||||||
|         return KSuccess; |         return KSuccess; | ||||||
|     case SO_RCVTIMEO: |     case SO_RCVTIMEO: | ||||||
|  | @ -121,8 +120,7 @@ KResult Socket::setsockopt(int level, int option, Userspace<const void*> user_va | ||||||
|             auto timeout = copy_time_from_user(static_ptr_cast<const timeval*>(user_value)); |             auto timeout = copy_time_from_user(static_ptr_cast<const timeval*>(user_value)); | ||||||
|             if (!timeout.has_value()) |             if (!timeout.has_value()) | ||||||
|                 return EFAULT; |                 return EFAULT; | ||||||
|             // FIXME: Should use AK::Time internally
 |             m_receive_timeout = timeout.value(); | ||||||
|             m_receive_timeout = timeout->to_timeval(); |  | ||||||
|         } |         } | ||||||
|         return KSuccess; |         return KSuccess; | ||||||
|     case SO_BINDTODEVICE: { |     case SO_BINDTODEVICE: { | ||||||
|  | @ -178,8 +176,11 @@ KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace<vo | ||||||
|     case SO_SNDTIMEO: |     case SO_SNDTIMEO: | ||||||
|         if (size < sizeof(timeval)) |         if (size < sizeof(timeval)) | ||||||
|             return EINVAL; |             return EINVAL; | ||||||
|         if (!copy_to_user(static_ptr_cast<timeval*>(value), &m_send_timeout)) |         { | ||||||
|             return EFAULT; |             timeval tv = m_send_timeout.to_timeval(); | ||||||
|  |             if (!copy_to_user(static_ptr_cast<timeval*>(value), &tv)) | ||||||
|  |                 return EFAULT; | ||||||
|  |         } | ||||||
|         size = sizeof(timeval); |         size = sizeof(timeval); | ||||||
|         if (!copy_to_user(value_size, &size)) |         if (!copy_to_user(value_size, &size)) | ||||||
|             return EFAULT; |             return EFAULT; | ||||||
|  | @ -187,8 +188,11 @@ KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace<vo | ||||||
|     case SO_RCVTIMEO: |     case SO_RCVTIMEO: | ||||||
|         if (size < sizeof(timeval)) |         if (size < sizeof(timeval)) | ||||||
|             return EINVAL; |             return EINVAL; | ||||||
|         if (!copy_to_user(static_ptr_cast<timeval*>(value), &m_receive_timeout)) |         { | ||||||
|             return EFAULT; |             timeval tv = m_send_timeout.to_timeval(); | ||||||
|  |             if (!copy_to_user(static_ptr_cast<timeval*>(value), &tv)) | ||||||
|  |                 return EFAULT; | ||||||
|  |         } | ||||||
|         size = sizeof(timeval); |         size = sizeof(timeval); | ||||||
|         if (!copy_to_user(value_size, &size)) |         if (!copy_to_user(value_size, &size)) | ||||||
|             return EFAULT; |             return EFAULT; | ||||||
|  | @ -243,8 +247,8 @@ KResultOr<size_t> Socket::read(FileDescription& description, size_t, UserOrKerne | ||||||
| { | { | ||||||
|     if (is_shut_down_for_reading()) |     if (is_shut_down_for_reading()) | ||||||
|         return 0; |         return 0; | ||||||
|     timeval tv; |     Time t {}; | ||||||
|     return recvfrom(description, buffer, size, 0, {}, 0, tv); |     return recvfrom(description, buffer, size, 0, {}, 0, t); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| KResultOr<size_t> Socket::write(FileDescription& description, size_t, const UserOrKernelBuffer& data, size_t size) | KResultOr<size_t> Socket::write(FileDescription& description, size_t, const UserOrKernelBuffer& data, size_t size) | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ | ||||||
| #include <AK/NonnullRefPtrVector.h> | #include <AK/NonnullRefPtrVector.h> | ||||||
| #include <AK/RefCounted.h> | #include <AK/RefCounted.h> | ||||||
| #include <AK/RefPtr.h> | #include <AK/RefPtr.h> | ||||||
|  | #include <AK/Time.h> | ||||||
| #include <Kernel/FileSystem/File.h> | #include <Kernel/FileSystem/File.h> | ||||||
| #include <Kernel/KResult.h> | #include <Kernel/KResult.h> | ||||||
| #include <Kernel/Lock.h> | #include <Kernel/Lock.h> | ||||||
|  | @ -106,7 +107,7 @@ public: | ||||||
|     virtual bool is_local() const { return false; } |     virtual bool is_local() const { return false; } | ||||||
|     virtual bool is_ipv4() const { return false; } |     virtual bool is_ipv4() const { return false; } | ||||||
|     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int flags, Userspace<const sockaddr*>, socklen_t) = 0; |     virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int flags, Userspace<const sockaddr*>, socklen_t) = 0; | ||||||
|     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, timeval&) = 0; |     virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) = 0; | ||||||
| 
 | 
 | ||||||
|     virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t); |     virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t); | ||||||
|     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>); |     virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>); | ||||||
|  | @ -127,11 +128,11 @@ public: | ||||||
|     virtual KResult stat(::stat&) const override; |     virtual KResult stat(::stat&) const override; | ||||||
|     virtual String absolute_path(const FileDescription&) const override = 0; |     virtual String absolute_path(const FileDescription&) const override = 0; | ||||||
| 
 | 
 | ||||||
|     bool has_receive_timeout() const { return m_receive_timeout.tv_sec || m_receive_timeout.tv_usec; } |     bool has_receive_timeout() const { return m_receive_timeout != Time::zero(); } | ||||||
|     const timeval& receive_timeout() const { return m_receive_timeout; } |     const Time& receive_timeout() const { return m_receive_timeout; } | ||||||
| 
 | 
 | ||||||
|     bool has_send_timeout() const { return m_send_timeout.tv_sec || m_send_timeout.tv_usec; } |     bool has_send_timeout() const { return m_send_timeout != Time::zero(); } | ||||||
|     const timeval& send_timeout() const { return m_send_timeout; } |     const Time& send_timeout() const { return m_send_timeout; } | ||||||
| 
 | 
 | ||||||
|     bool wants_timestamp() const { return m_timestamp; } |     bool wants_timestamp() const { return m_timestamp; } | ||||||
| 
 | 
 | ||||||
|  | @ -170,8 +171,8 @@ private: | ||||||
| 
 | 
 | ||||||
|     RefPtr<NetworkAdapter> m_bound_interface { nullptr }; |     RefPtr<NetworkAdapter> m_bound_interface { nullptr }; | ||||||
| 
 | 
 | ||||||
|     timeval m_receive_timeout { 0, 0 }; |     Time m_receive_timeout {}; | ||||||
|     timeval m_send_timeout { 0, 0 }; |     Time m_send_timeout {}; | ||||||
|     int m_timestamp { 0 }; |     int m_timestamp { 0 }; | ||||||
| 
 | 
 | ||||||
|     NonnullRefPtrVector<Socket> m_pending; |     NonnullRefPtrVector<Socket> m_pending; | ||||||
|  |  | ||||||
|  | @ -238,14 +238,13 @@ void TCPSocket::send_outgoing_packets() | ||||||
|     auto routing_decision = route_to(peer_address(), local_address(), bound_interface()); |     auto routing_decision = route_to(peer_address(), local_address(), bound_interface()); | ||||||
|     VERIFY(!routing_decision.is_zero()); |     VERIFY(!routing_decision.is_zero()); | ||||||
| 
 | 
 | ||||||
|     // FIXME: Should use AK::Time internally
 |     auto now = kgettimeofday(); | ||||||
|     auto now = kgettimeofday().to_timeval(); |  | ||||||
| 
 | 
 | ||||||
|     LOCKER(m_not_acked_lock, Lock::Mode::Shared); |     LOCKER(m_not_acked_lock, Lock::Mode::Shared); | ||||||
|     for (auto& packet : m_not_acked) { |     for (auto& packet : m_not_acked) { | ||||||
|         timeval diff; |         // FIXME: This doesn't look correct to me. Bug?
 | ||||||
|         timeval_sub(packet.tx_time, now, diff); |         auto diff = packet.tx_time - now; | ||||||
|         if (diff.tv_sec == 0 && diff.tv_usec <= 500000) |         if (diff <= Time::from_nanoseconds(500'000'000)) | ||||||
|             continue; |             continue; | ||||||
|         packet.tx_time = now; |         packet.tx_time = now; | ||||||
|         packet.tx_counter++; |         packet.tx_counter++; | ||||||
|  |  | ||||||
|  | @ -202,7 +202,7 @@ private: | ||||||
|         u32 ack_number { 0 }; |         u32 ack_number { 0 }; | ||||||
|         ByteBuffer buffer; |         ByteBuffer buffer; | ||||||
|         int tx_counter { 0 }; |         int tx_counter { 0 }; | ||||||
|         timeval tx_time { 0, 0 }; |         Time tx_time {}; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     Lock m_not_acked_lock { "TCPSocket unacked packets" }; |     Lock m_not_acked_lock { "TCPSocket unacked packets" }; | ||||||
|  |  | ||||||
|  | @ -252,7 +252,7 @@ KResultOr<ssize_t> Process::sys$recvmsg(int sockfd, Userspace<struct msghdr*> us | ||||||
|     auto data_buffer = UserOrKernelBuffer::for_user_buffer((u8*)iovs[0].iov_base, iovs[0].iov_len); |     auto data_buffer = UserOrKernelBuffer::for_user_buffer((u8*)iovs[0].iov_base, iovs[0].iov_len); | ||||||
|     if (!data_buffer.has_value()) |     if (!data_buffer.has_value()) | ||||||
|         return EFAULT; |         return EFAULT; | ||||||
|     timeval timestamp = { 0, 0 }; |     Time timestamp {}; | ||||||
|     auto result = socket.recvfrom(*description, data_buffer.value(), iovs[0].iov_len, flags, user_addr, user_addr_length, timestamp); |     auto result = socket.recvfrom(*description, data_buffer.value(), iovs[0].iov_len, flags, user_addr, user_addr_length, timestamp); | ||||||
|     if (flags & MSG_DONTWAIT) |     if (flags & MSG_DONTWAIT) | ||||||
|         description->set_blocking(original_blocking); |         description->set_blocking(original_blocking); | ||||||
|  | @ -276,7 +276,7 @@ KResultOr<ssize_t> Process::sys$recvmsg(int sockfd, Userspace<struct msghdr*> us | ||||||
|         if (msg.msg_controllen < control_length) { |         if (msg.msg_controllen < control_length) { | ||||||
|             msg_flags |= MSG_CTRUNC; |             msg_flags |= MSG_CTRUNC; | ||||||
|         } else { |         } else { | ||||||
|             cmsg_timestamp = { { control_length, SOL_SOCKET, SCM_TIMESTAMP }, timestamp }; |             cmsg_timestamp = { { control_length, SOL_SOCKET, SCM_TIMESTAMP }, timestamp.to_timeval() }; | ||||||
|             if (!copy_to_user(msg.msg_control, &cmsg_timestamp, control_length)) |             if (!copy_to_user(msg.msg_control, &cmsg_timestamp, control_length)) | ||||||
|                 return EFAULT; |                 return EFAULT; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -285,8 +285,7 @@ auto Thread::WriteBlocker::override_timeout(const BlockTimeout& timeout) -> cons | ||||||
|     if (description.is_socket()) { |     if (description.is_socket()) { | ||||||
|         auto& socket = *description.socket(); |         auto& socket = *description.socket(); | ||||||
|         if (socket.has_send_timeout()) { |         if (socket.has_send_timeout()) { | ||||||
|             // FIXME: Should use AK::Time internally
 |             Time send_timeout = socket.send_timeout(); | ||||||
|             Time send_timeout = Time::from_timeval(socket.send_timeout()); |  | ||||||
|             m_timeout = BlockTimeout(false, &send_timeout, timeout.start_time(), timeout.clock_id()); |             m_timeout = BlockTimeout(false, &send_timeout, timeout.start_time(), timeout.clock_id()); | ||||||
|             if (timeout.is_infinite() || (!m_timeout.is_infinite() && m_timeout.absolute_time() < timeout.absolute_time())) |             if (timeout.is_infinite() || (!m_timeout.is_infinite() && m_timeout.absolute_time() < timeout.absolute_time())) | ||||||
|                 return m_timeout; |                 return m_timeout; | ||||||
|  | @ -306,8 +305,7 @@ auto Thread::ReadBlocker::override_timeout(const BlockTimeout& timeout) -> const | ||||||
|     if (description.is_socket()) { |     if (description.is_socket()) { | ||||||
|         auto& socket = *description.socket(); |         auto& socket = *description.socket(); | ||||||
|         if (socket.has_receive_timeout()) { |         if (socket.has_receive_timeout()) { | ||||||
|             // FIXME: Should use AK::Time internally
 |             Time receive_timeout = socket.receive_timeout(); | ||||||
|             Time receive_timeout = Time::from_timeval(socket.receive_timeout()); |  | ||||||
|             m_timeout = BlockTimeout(false, &receive_timeout, timeout.start_time(), timeout.clock_id()); |             m_timeout = BlockTimeout(false, &receive_timeout, timeout.start_time(), timeout.clock_id()); | ||||||
|             if (timeout.is_infinite() || (!m_timeout.is_infinite() && m_timeout.absolute_time() < timeout.absolute_time())) |             if (timeout.is_infinite() || (!m_timeout.is_infinite() && m_timeout.absolute_time() < timeout.absolute_time())) | ||||||
|                 return m_timeout; |                 return m_timeout; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ben Wiederhake
						Ben Wiederhake