1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 23:25:08 +00:00

IPv4: More work on the TCP implementation.

Reading from the peer now kinda works. Something still going wrong with
sending packets but it's getting closer.
This commit is contained in:
Andreas Kling 2019-03-14 01:00:10 +01:00
parent 66d55f8e0c
commit be46f1bb1f
3 changed files with 30 additions and 21 deletions

View file

@ -295,15 +295,22 @@ void handle_tcp(const EthernetFrameHeader& eth, int frame_size)
size_t payload_size = ipv4_packet.payload_size() - tcp_packet.header_size();
if (tcp_packet.ack_number() != socket->tcp_sequence_number()) {
kprintf("handle_tcp: ack/seq mismatch: got %u, wanted %u\n", tcp_packet.ack_number(), socket->tcp_sequence_number());
return;
}
if (tcp_packet.has_syn() && tcp_packet.has_ack()) {
socket->set_tcp_ack_number(socket->tcp_sequence_number() + payload_size + 1);
socket->set_tcp_ack_number(tcp_packet.sequence_number() + payload_size + 1);
socket->send_tcp_packet(*adapter, TCPFlags::ACK);
socket->set_connected(true);
kprintf("Connected!\n");
kprintf("handle_tcp: Connection established!\n");
socket->set_tcp_state(Connected);
return;
}
socket->set_tcp_ack_number(socket->tcp_sequence_number() + payload_size);
socket->send_tcp_packet(*adapter, TCPFlags::ACK);
socket->did_receive(ByteBuffer::copy((const byte*)&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()));