Kernel: Move on_close_impl from network socket to udp socket
This commit is contained in:
		
							parent
							
								
									be01ccdb08
								
							
						
					
					
						commit
						ba06269b14
					
				| 
						 | 
					@ -51,6 +51,8 @@ namespace Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) override;
 | 
							virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							virtual size_t header_size() const override { return sizeof(IPv4Header); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		IPv4Layer();
 | 
							IPv4Layer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,8 @@ namespace Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) = 0;
 | 
							virtual BAN::ErrorOr<size_t> sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							virtual size_t header_size() const = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected:
 | 
						protected:
 | 
				
			||||||
		NetworkLayer() = default;
 | 
							NetworkLayer() = default;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,8 +40,6 @@ namespace Kernel
 | 
				
			||||||
	protected:
 | 
						protected:
 | 
				
			||||||
		NetworkSocket(NetworkLayer&, ino_t, const TmpInodeInfo&);
 | 
							NetworkSocket(NetworkLayer&, ino_t, const TmpInodeInfo&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual void on_close_impl() override;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		virtual BAN::ErrorOr<long> ioctl_impl(int request, void* arg) override;
 | 
							virtual BAN::ErrorOr<long> ioctl_impl(int request, void* arg) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected:
 | 
						protected:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,8 @@ namespace Kernel
 | 
				
			||||||
	protected:
 | 
						protected:
 | 
				
			||||||
		virtual void receive_packet(BAN::ConstByteSpan, const sockaddr_storage& sender) override;
 | 
							virtual void receive_packet(BAN::ConstByteSpan, const sockaddr_storage& sender) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							virtual void on_close_impl() 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> sendto_impl(BAN::ConstByteSpan message, const sockaddr* address, socklen_t address_len) override;
 | 
							virtual BAN::ErrorOr<size_t> sendto_impl(BAN::ConstByteSpan message, const sockaddr* address, socklen_t address_len) override;
 | 
				
			||||||
		virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan buffer, sockaddr* address, socklen_t* address_len) override;
 | 
							virtual BAN::ErrorOr<size_t> recvfrom_impl(BAN::ByteSpan buffer, sockaddr* address, socklen_t* address_len) override;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
#include <kernel/Networking/IPv4Layer.h>
 | 
					#include <kernel/Networking/IPv4Layer.h>
 | 
				
			||||||
#include <kernel/Networking/NetworkManager.h>
 | 
					#include <kernel/Networking/NetworkManager.h>
 | 
				
			||||||
#include <kernel/Networking/UDPSocket.h>
 | 
					#include <kernel/Networking/UDPSocket.h>
 | 
				
			||||||
 | 
					#include <kernel/Random.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <netinet/in.h>
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,19 +90,18 @@ namespace Kernel
 | 
				
			||||||
		LockGuard _(m_lock);
 | 
							LockGuard _(m_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint16_t port = NetworkSocket::PORT_NONE;
 | 
							uint16_t port = NetworkSocket::PORT_NONE;
 | 
				
			||||||
		for (uint32_t temp = 0xC000; temp < 0xFFFF; temp++)
 | 
							for (uint32_t i = 0; i < 100 && port == NetworkSocket::PORT_NONE; i++)
 | 
				
			||||||
		{
 | 
								if (uint32_t temp = 0xC000 | (Random::get_u32() & 0x3FFF); !m_bound_sockets.contains(temp))
 | 
				
			||||||
			if (!m_bound_sockets.contains(temp))
 | 
									port = temp;
 | 
				
			||||||
			{
 | 
							for (uint32_t temp = 0xC000; temp < 0xFFFF && port == NetworkSocket::PORT_NONE; temp++)
 | 
				
			||||||
 | 
								if (!m_bound_sockets.contains(temp))
 | 
				
			||||||
				port = temp;
 | 
									port = temp;
 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (port == NetworkSocket::PORT_NONE)
 | 
							if (port == NetworkSocket::PORT_NONE)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			dwarnln("No ports available");
 | 
								dwarnln("No ports available");
 | 
				
			||||||
			return BAN::Error::from_errno(EAGAIN);
 | 
								return BAN::Error::from_errno(EAGAIN);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							dprintln_if(DEBUG_IPV4, "using port {}", port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct sockaddr_in target;
 | 
							struct sockaddr_in target;
 | 
				
			||||||
		target.sin_family = AF_INET;
 | 
							target.sin_family = AF_INET;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,16 +15,6 @@ namespace Kernel
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void NetworkSocket::on_close_impl()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (is_bound())
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			m_network_layer.unbind_socket(this, m_port);
 | 
					 | 
				
			||||||
			m_interface = nullptr;
 | 
					 | 
				
			||||||
			m_port = PORT_NONE;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void NetworkSocket::bind_interface_and_port(NetworkInterface* interface, uint16_t port)
 | 
						void NetworkSocket::bind_interface_and_port(NetworkInterface* interface, uint16_t port)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ASSERT(!m_interface);
 | 
							ASSERT(!m_interface);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,14 @@ namespace Kernel
 | 
				
			||||||
		: NetworkSocket(network_layer, ino, inode_info)
 | 
							: NetworkSocket(network_layer, ino, inode_info)
 | 
				
			||||||
	{ }
 | 
						{ }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void UDPSocket::on_close_impl()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (is_bound())
 | 
				
			||||||
 | 
								m_network_layer.unbind_socket(this, m_port);
 | 
				
			||||||
 | 
							m_port = PORT_NONE;
 | 
				
			||||||
 | 
							m_interface = nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void UDPSocket::add_protocol_header(BAN::ByteSpan packet, uint16_t dst_port, PseudoHeader)
 | 
						void UDPSocket::add_protocol_header(BAN::ByteSpan packet, uint16_t dst_port, PseudoHeader)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto& header = packet.as<UDPHeader>();
 | 
							auto& header = packet.as<UDPHeader>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue