mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 22:17:42 +00:00
Kernel: Hold socket back from accept() until it's fully set up
This commit is contained in:
parent
d53c9d4416
commit
72f728b0d6
3 changed files with 21 additions and 2 deletions
|
@ -459,6 +459,7 @@ void handle_tcp(const IPv4Packet& ipv4_packet)
|
||||||
socket->set_setup_state(Socket::SetupState::Completed);
|
socket->set_setup_state(Socket::SetupState::Completed);
|
||||||
socket->set_connected(true);
|
socket->set_connected(true);
|
||||||
}
|
}
|
||||||
|
socket->release_to_originator();
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
kprintf("handle_tcp: unexpected flags in SynReceived state\n");
|
kprintf("handle_tcp: unexpected flags in SynReceived state\n");
|
||||||
|
|
|
@ -79,14 +79,27 @@ RefPtr<TCPSocket> TCPSocket::create_client(const IPv4Address& new_local_address,
|
||||||
client->set_peer_address(new_peer_address);
|
client->set_peer_address(new_peer_address);
|
||||||
client->set_peer_port(new_peer_port);
|
client->set_peer_port(new_peer_port);
|
||||||
client->set_direction(Direction::Incoming);
|
client->set_direction(Direction::Incoming);
|
||||||
|
client->set_originator(*this);
|
||||||
|
|
||||||
queue_connection_from(client);
|
m_pending_release_for_accept.set(tuple, client);
|
||||||
|
|
||||||
sockets_by_tuple().resource().set(tuple, client);
|
sockets_by_tuple().resource().set(tuple, client);
|
||||||
|
|
||||||
return from_tuple(tuple);
|
return from_tuple(tuple);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TCPSocket::release_to_originator()
|
||||||
|
{
|
||||||
|
ASSERT(!!m_originator);
|
||||||
|
m_originator->release_for_accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSocket::release_for_accept(RefPtr<TCPSocket> socket)
|
||||||
|
{
|
||||||
|
ASSERT(m_pending_release_for_accept.contains(socket->tuple()));
|
||||||
|
m_pending_release_for_accept.remove(socket->tuple());
|
||||||
|
queue_connection_from(*socket);
|
||||||
|
}
|
||||||
|
|
||||||
TCPSocket::TCPSocket(int protocol)
|
TCPSocket::TCPSocket(int protocol)
|
||||||
: IPv4Socket(SOCK_STREAM, protocol)
|
: IPv4Socket(SOCK_STREAM, protocol)
|
||||||
{
|
{
|
||||||
|
|
|
@ -126,6 +126,9 @@ public:
|
||||||
static RefPtr<TCPSocket> from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
|
static RefPtr<TCPSocket> from_endpoints(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
|
||||||
|
|
||||||
RefPtr<TCPSocket> create_client(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
|
RefPtr<TCPSocket> create_client(const IPv4Address& local_address, u16 local_port, const IPv4Address& peer_address, u16 peer_port);
|
||||||
|
void set_originator(RefPtr<TCPSocket> originator) { m_originator = originator; }
|
||||||
|
void release_to_originator();
|
||||||
|
void release_for_accept(RefPtr<TCPSocket>);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void set_direction(Direction direction) { m_direction = direction; }
|
void set_direction(Direction direction) { m_direction = direction; }
|
||||||
|
@ -144,6 +147,8 @@ private:
|
||||||
virtual KResult protocol_bind() override;
|
virtual KResult protocol_bind() override;
|
||||||
virtual KResult protocol_listen() override;
|
virtual KResult protocol_listen() override;
|
||||||
|
|
||||||
|
RefPtr<TCPSocket> m_originator;
|
||||||
|
HashMap<IPv4SocketTuple, NonnullRefPtr<TCPSocket>> m_pending_release_for_accept;
|
||||||
Direction m_direction { Direction::Unspecified };
|
Direction m_direction { Direction::Unspecified };
|
||||||
Error m_error { Error::None };
|
Error m_error { Error::None };
|
||||||
WeakPtr<NetworkAdapter> m_adapter;
|
WeakPtr<NetworkAdapter> m_adapter;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue