mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 04:38:11 +00:00
IPv4: Use the UDP-to-socket map to handle incoming UDP packets.
This commit is contained in:
parent
209a16bb7f
commit
3ad9561b80
2 changed files with 22 additions and 11 deletions
|
@ -50,8 +50,14 @@ IPv4Socket::IPv4Socket(int type, int protocol)
|
||||||
|
|
||||||
IPv4Socket::~IPv4Socket()
|
IPv4Socket::~IPv4Socket()
|
||||||
{
|
{
|
||||||
LOCKER(all_sockets().lock());
|
{
|
||||||
all_sockets().resource().remove(this);
|
LOCKER(all_sockets().lock());
|
||||||
|
all_sockets().resource().remove(this);
|
||||||
|
}
|
||||||
|
if (type() == SOCK_DGRAM) {
|
||||||
|
LOCKER(sockets_by_udp_port().lock());
|
||||||
|
sockets_by_udp_port().resource().remove(m_source_port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IPv4Socket::get_address(sockaddr* address, socklen_t* address_size)
|
bool IPv4Socket::get_address(sockaddr* address, socklen_t* address_size)
|
||||||
|
@ -128,6 +134,7 @@ void IPv4Socket::allocate_source_port_if_needed()
|
||||||
auto it = sockets_by_udp_port().resource().find(port);
|
auto it = sockets_by_udp_port().resource().find(port);
|
||||||
if (it == sockets_by_udp_port().resource().end()) {
|
if (it == sockets_by_udp_port().resource().end()) {
|
||||||
m_source_port = port;
|
m_source_port = port;
|
||||||
|
sockets_by_udp_port().resource().set(port, this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,14 +229,18 @@ void handle_udp(const EthernetFrameHeader& eth, int frame_size)
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LOCKER(IPv4Socket::all_sockets().lock());
|
RetainPtr<IPv4Socket> socket;
|
||||||
for (RetainPtr<IPv4Socket> socket : IPv4Socket::all_sockets().resource()) {
|
{
|
||||||
LOCKER(socket->lock());
|
LOCKER(IPv4Socket::sockets_by_udp_port().lock());
|
||||||
if (socket->type() != SOCK_DGRAM)
|
auto it = IPv4Socket::sockets_by_udp_port().resource().find(udp_packet.destination_port());
|
||||||
continue;
|
if (it == IPv4Socket::sockets_by_udp_port().resource().end())
|
||||||
if (socket->source_port() != udp_packet.destination_port())
|
return;
|
||||||
continue;
|
ASSERT((*it).value);
|
||||||
socket->did_receive(ByteBuffer::copy((const byte*)&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()));
|
socket = *(*it).value;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCKER(socket->lock());
|
||||||
|
ASSERT(socket->type() == SOCK_DGRAM);
|
||||||
|
ASSERT(socket->source_port() == udp_packet.destination_port());
|
||||||
|
socket->did_receive(ByteBuffer::copy((const byte*)&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue