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:
parent
f8a1d2746e
commit
718bea73b3
11 changed files with 95 additions and 25 deletions
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue