1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 22:57:44 +00:00

Kernel: Merge FooSocketHandle classes into a single SocketHandle<Foo>

- IPv4SocketHandle => SocketHandle<IPv4Socket>
- TCPSocketHandle => SocketHandle<TCPSocket>
- UDPSocketHandle => SocketHandle<UDPSocket>
This commit is contained in:
Andreas Kling 2019-08-09 09:16:12 +02:00
parent 5c66c67f32
commit 04603237da
6 changed files with 19 additions and 94 deletions

View file

@ -9,8 +9,6 @@
#include <Kernel/Net/IPv4SocketTuple.h> #include <Kernel/Net/IPv4SocketTuple.h>
#include <Kernel/Net/Socket.h> #include <Kernel/Net/Socket.h>
class IPv4SocketHandle;
class TCPSocketHandle;
class NetworkAdapter; class NetworkAdapter;
class TCPPacket; class TCPPacket;
class TCPSocket; class TCPSocket;
@ -85,27 +83,3 @@ private:
bool m_can_read { false }; bool m_can_read { false };
}; };
class IPv4SocketHandle : public SocketHandle {
public:
IPv4SocketHandle() {}
IPv4SocketHandle(RefPtr<IPv4Socket>&& socket)
: SocketHandle(move(socket))
{
}
IPv4SocketHandle(IPv4SocketHandle&& other)
: SocketHandle(move(other))
{
}
IPv4SocketHandle(const IPv4SocketHandle&) = delete;
IPv4SocketHandle& operator=(const IPv4SocketHandle&) = delete;
IPv4Socket* operator->() { return &socket(); }
const IPv4Socket* operator->() const { return &socket(); }
IPv4Socket& socket() { return static_cast<IPv4Socket&>(SocketHandle::socket()); }
const IPv4Socket& socket() const { return static_cast<const IPv4Socket&>(SocketHandle::socket()); }
};

View file

@ -98,11 +98,12 @@ private:
NonnullRefPtrVector<Socket> m_pending; NonnullRefPtrVector<Socket> m_pending;
}; };
template<typename SocketType>
class SocketHandle { class SocketHandle {
public: public:
SocketHandle() {} SocketHandle() {}
SocketHandle(RefPtr<Socket>&& socket) SocketHandle(NonnullRefPtr<SocketType>&& socket)
: m_socket(move(socket)) : m_socket(move(socket))
{ {
if (m_socket) if (m_socket)
@ -125,12 +126,12 @@ public:
operator bool() const { return m_socket; } operator bool() const { return m_socket; }
Socket* operator->() { return &socket(); } SocketType* operator->() { return &socket(); }
const Socket* operator->() const { return &socket(); } const SocketType* operator->() const { return &socket(); }
Socket& socket() { return *m_socket; } SocketType& socket() { return *m_socket; }
const Socket& socket() const { return *m_socket; } const SocketType& socket() const { return *m_socket; }
private: private:
RefPtr<Socket> m_socket; RefPtr<SocketType> m_socket;
}; };

View file

@ -23,33 +23,33 @@ Lockable<HashMap<IPv4SocketTuple, TCPSocket*>>& TCPSocket::sockets_by_tuple()
return *s_map; return *s_map;
} }
TCPSocketHandle TCPSocket::from_tuple(const IPv4SocketTuple& tuple) SocketHandle<TCPSocket> TCPSocket::from_tuple(const IPv4SocketTuple& tuple)
{ {
LOCKER(sockets_by_tuple().lock()); LOCKER(sockets_by_tuple().lock());
auto exact_match = sockets_by_tuple().resource().get(tuple); auto exact_match = sockets_by_tuple().resource().get(tuple);
if (exact_match.has_value()) if (exact_match.has_value())
return { move(exact_match.value()) }; return { *exact_match.value() };
auto address_tuple = IPv4SocketTuple(tuple.local_address(), tuple.local_port(), IPv4Address(), 0); auto address_tuple = IPv4SocketTuple(tuple.local_address(), tuple.local_port(), IPv4Address(), 0);
auto address_match = sockets_by_tuple().resource().get(address_tuple); auto address_match = sockets_by_tuple().resource().get(address_tuple);
if (address_match.has_value()) if (address_match.has_value())
return { move(address_match.value()) }; return { *address_match.value() };
auto wildcard_tuple = IPv4SocketTuple(IPv4Address(), tuple.local_port(), IPv4Address(), 0); auto wildcard_tuple = IPv4SocketTuple(IPv4Address(), tuple.local_port(), IPv4Address(), 0);
auto wildcard_match = sockets_by_tuple().resource().get(wildcard_tuple); auto wildcard_match = sockets_by_tuple().resource().get(wildcard_tuple);
if (wildcard_match.has_value()) if (wildcard_match.has_value())
return { move(wildcard_match.value()) }; return { *wildcard_match.value() };
return {}; return {};
} }
TCPSocketHandle TCPSocket::from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port) SocketHandle<TCPSocket> TCPSocket::from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port)
{ {
return from_tuple(IPv4SocketTuple(local_address, local_port, peer_address, peer_port)); return from_tuple(IPv4SocketTuple(local_address, local_port, peer_address, peer_port));
} }
TCPSocketHandle TCPSocket::create_client(const IPv4Address& new_local_address, u16 new_local_port, const IPv4Address& new_peer_address, u16 new_peer_port) SocketHandle<TCPSocket> TCPSocket::create_client(const IPv4Address& new_local_address, u16 new_local_port, const IPv4Address& new_peer_address, u16 new_peer_port)
{ {
auto tuple = IPv4SocketTuple(new_local_address, new_local_port, new_peer_address, new_peer_port); auto tuple = IPv4SocketTuple(new_local_address, new_local_port, new_peer_address, new_peer_port);

View file

@ -95,10 +95,10 @@ public:
void record_incoming_data(int); void record_incoming_data(int);
static Lockable<HashMap<IPv4SocketTuple, TCPSocket*>>& sockets_by_tuple(); static Lockable<HashMap<IPv4SocketTuple, TCPSocket*>>& sockets_by_tuple();
static TCPSocketHandle from_tuple(const IPv4SocketTuple& tuple); static SocketHandle<TCPSocket> from_tuple(const IPv4SocketTuple& tuple);
static TCPSocketHandle from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port); static SocketHandle<TCPSocket> from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
TCPSocketHandle create_client(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port); SocketHandle<TCPSocket> create_client(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
protected: protected:
void set_direction(Direction direction) { m_direction = direction; } void set_direction(Direction direction) { m_direction = direction; }
@ -127,27 +127,3 @@ private:
u32 m_packets_out { 0 }; u32 m_packets_out { 0 };
u32 m_bytes_out { 0 }; u32 m_bytes_out { 0 };
}; };
class TCPSocketHandle : public SocketHandle {
public:
TCPSocketHandle() {}
TCPSocketHandle(RefPtr<TCPSocket>&& socket)
: SocketHandle(move(socket))
{
}
TCPSocketHandle(TCPSocketHandle&& other)
: SocketHandle(move(other))
{
}
TCPSocketHandle(const TCPSocketHandle&) = delete;
TCPSocketHandle& operator=(const TCPSocketHandle&) = delete;
TCPSocket* operator->() { return &socket(); }
const TCPSocket* operator->() const { return &socket(); }
TCPSocket& socket() { return static_cast<TCPSocket&>(SocketHandle::socket()); }
const TCPSocket& socket() const { return static_cast<const TCPSocket&>(SocketHandle::socket()); }
};

View file

@ -13,7 +13,7 @@ Lockable<HashMap<u16, UDPSocket*>>& UDPSocket::sockets_by_port()
return *s_map; return *s_map;
} }
UDPSocketHandle UDPSocket::from_port(u16 port) SocketHandle<UDPSocket> UDPSocket::from_port(u16 port)
{ {
RefPtr<UDPSocket> socket; RefPtr<UDPSocket> socket;
{ {
@ -24,7 +24,7 @@ UDPSocketHandle UDPSocket::from_port(u16 port)
socket = (*it).value; socket = (*it).value;
ASSERT(socket); ASSERT(socket);
} }
return { move(socket) }; return { *socket };
} }
UDPSocket::UDPSocket(int protocol) UDPSocket::UDPSocket(int protocol)

View file

@ -2,14 +2,12 @@
#include <Kernel/Net/IPv4Socket.h> #include <Kernel/Net/IPv4Socket.h>
class UDPSocketHandle;
class UDPSocket final : public IPv4Socket { class UDPSocket final : public IPv4Socket {
public: public:
static NonnullRefPtr<UDPSocket> create(int protocol); static NonnullRefPtr<UDPSocket> create(int protocol);
virtual ~UDPSocket() override; virtual ~UDPSocket() override;
static UDPSocketHandle from_port(u16); static SocketHandle<UDPSocket> from_port(u16);
private: private:
explicit UDPSocket(int protocol); explicit UDPSocket(int protocol);
@ -22,27 +20,3 @@ private:
virtual int protocol_allocate_local_port() override; virtual int protocol_allocate_local_port() override;
virtual KResult protocol_bind() override; virtual KResult protocol_bind() override;
}; };
class UDPSocketHandle : public SocketHandle {
public:
UDPSocketHandle() {}
UDPSocketHandle(RefPtr<UDPSocket>&& socket)
: SocketHandle(move(socket))
{
}
UDPSocketHandle(UDPSocketHandle&& other)
: SocketHandle(move(other))
{
}
UDPSocketHandle(const UDPSocketHandle&) = delete;
UDPSocketHandle& operator=(const UDPSocketHandle&) = delete;
UDPSocket* operator->() { return &socket(); }
const UDPSocket* operator->() const { return &socket(); }
UDPSocket& socket() { return static_cast<UDPSocket&>(SocketHandle::socket()); }
const UDPSocket& socket() const { return static_cast<const UDPSocket&>(SocketHandle::socket()); }
};