1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 22:18:11 +00:00

Kernel: Add a LoopbackAdapter for talking to yourself via 127.0.0.1.

Choosing adapter for transmit is done by adapter_for_route_to(IPv4Address).
This is just hard-coded logic right now but can be expanded to support a
proper routing table.

Also start moving kernel networking code into Kernel/Net/.
This commit is contained in:
Andreas Kling 2019-04-02 15:46:44 +02:00
parent f8a1d2746e
commit 718bea73b3
11 changed files with 95 additions and 25 deletions

View file

@ -2,6 +2,7 @@
#include <Kernel/TCP.h>
#include <Kernel/NetworkAdapter.h>
#include <Kernel/Process.h>
#include <Kernel/Net/Routing.h>
#include <Kernel/RandomDevice.h>
Lockable<HashMap<word, TCPSocket*>>& TCPSocket::sockets_by_port()
@ -63,18 +64,18 @@ int TCPSocket::protocol_receive(const ByteBuffer& packet_buffer, void* buffer, s
int TCPSocket::protocol_send(const void* data, int data_length)
{
// FIXME: Figure out the adapter somehow differently.
auto* adapter = NetworkAdapter::from_ipv4_address(IPv4Address(192, 168, 5, 2));
auto* adapter = adapter_for_route_to(destination_address());
if (!adapter)
ASSERT_NOT_REACHED();
return -EHOSTUNREACH;
send_tcp_packet(TCPFlags::PUSH | TCPFlags::ACK, data, data_length);
return data_length;
}
void TCPSocket::send_tcp_packet(word flags, const void* payload, int payload_size)
{
// FIXME: Figure out the adapter somehow differently.
auto& adapter = *NetworkAdapter::from_ipv4_address(IPv4Address(192, 168, 5, 2));
// FIXME: Maybe the socket should be bound to an adapter instead of looking it up every time?
auto* adapter = adapter_for_route_to(destination_address());
ASSERT(adapter);
auto buffer = ByteBuffer::create_zeroed(sizeof(TCPPacket) + payload_size);
auto& tcp_packet = *(TCPPacket*)(buffer.pointer());
@ -96,9 +97,9 @@ void TCPSocket::send_tcp_packet(word flags, const void* payload, int payload_siz
}
memcpy(tcp_packet.payload(), payload, payload_size);
tcp_packet.set_checksum(compute_tcp_checksum(adapter.ipv4_address(), destination_address(), tcp_packet, payload_size));
tcp_packet.set_checksum(compute_tcp_checksum(adapter->ipv4_address(), destination_address(), tcp_packet, payload_size));
kprintf("sending tcp packet from %s:%u to %s:%u with (%s %s) seq_no=%u, ack_no=%u\n",
adapter.ipv4_address().to_string().characters(),
adapter->ipv4_address().to_string().characters(),
source_port(),
destination_address().to_string().characters(),
destination_port(),
@ -107,7 +108,7 @@ void TCPSocket::send_tcp_packet(word flags, const void* payload, int payload_siz
tcp_packet.sequence_number(),
tcp_packet.ack_number()
);
adapter.send_ipv4(MACAddress(), destination_address(), IPv4Protocol::TCP, move(buffer));
adapter->send_ipv4(MACAddress(), destination_address(), IPv4Protocol::TCP, move(buffer));
}
NetworkOrdered<word> TCPSocket::compute_tcp_checksum(const IPv4Address& source, const IPv4Address& destination, const TCPPacket& packet, word payload_size)
@ -153,10 +154,9 @@ NetworkOrdered<word> TCPSocket::compute_tcp_checksum(const IPv4Address& source,
KResult TCPSocket::protocol_connect()
{
// FIXME: Figure out the adapter somehow differently.
auto* adapter = NetworkAdapter::from_ipv4_address(IPv4Address(192, 168, 5, 2));
auto* adapter = adapter_for_route_to(destination_address());
if (!adapter)
ASSERT_NOT_REACHED();
return KResult(-EHOSTUNREACH);
allocate_source_port_if_needed();