diff options
author | Anton Kling <anton@kling.gg> | 2024-04-29 18:00:20 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-29 18:00:20 +0200 |
commit | 7d2ab3a71f4bda9d8ee997764d98b29e13a902c5 (patch) | |
tree | 6dcdc7a674a8047a2dba3e95d3be91b4e3161bd5 /kernel/network | |
parent | d60fa1fc01e600c4a163bbe82fab3f1986cb1476 (diff) |
Kernel/Socket: Move sockets back to being file descriptors
Diffstat (limited to 'kernel/network')
-rw-r--r-- | kernel/network/tcp.c | 14 | ||||
-rw-r--r-- | kernel/network/tcp.h | 2 |
2 files changed, 11 insertions, 5 deletions
diff --git a/kernel/network/tcp.c b/kernel/network/tcp.c index 8740a63..39b8d7c 100644 --- a/kernel/network/tcp.c +++ b/kernel/network/tcp.c @@ -121,6 +121,10 @@ void tcp_send_empty_payload(struct TcpConnection *con, u8 flags) { send_ipv4_packet((ipv4_t){.d = con->outgoing_ip}, 6, send_buffer, send_len); } +void tcp_close_connection(struct TcpConnection *con) { + tcp_send_empty_payload(con, FIN | ACK); +} + void tcp_send_ack(struct TcpConnection *con) { tcp_send_empty_payload(con, ACK); } @@ -170,7 +174,6 @@ void handle_tcp(ipv4_t src_ip, const u8 *payload, u32 payload_length) { u8 flags = header->flags; u16 src_port = htons(n_src_port); - (void)src_port; u16 dst_port = htons(n_dst_port); u32 seq_num = htonl(n_seq_num); u32 ack_num = htonl(n_ack_num); @@ -182,10 +185,12 @@ void handle_tcp(ipv4_t src_ip, const u8 *payload, u32 payload_length) { assert(con); con->ack = seq_num + 1; tcp_send_empty_payload(con, SYN | ACK); + con->seq++; return; } - struct TcpConnection *incoming_connection = tcp_find_connection(dst_port); + struct TcpConnection *incoming_connection = + tcp_find_connection(src_ip, src_port, dst_port); if (!incoming_connection) { kprintf("unable to find open port for incoming connection\n"); } @@ -214,8 +219,8 @@ void handle_tcp(ipv4_t src_ip, const u8 *payload, u32 payload_length) { u16 tcp_payload_length = payload_length - header->data_offset * sizeof(u32); if (tcp_payload_length > 0) { const u8 *tcp_payload = payload + header->data_offset * sizeof(u32); - u32 len = ringbuffer_write(&incoming_connection->buffer, tcp_payload, - tcp_payload_length); + u32 len = ringbuffer_write(&incoming_connection->incoming_buffer, + tcp_payload, tcp_payload_length); assert(len == tcp_payload_length); incoming_connection->ack += len; tcp_send_ack(incoming_connection); @@ -224,6 +229,7 @@ void handle_tcp(ipv4_t src_ip, const u8 *payload, u32 payload_length) { incoming_connection->ack++; tcp_send_empty_payload(incoming_connection, FIN | ACK); + incoming_connection->seq++; incoming_connection->dead = 1; // FIXME: It should wait for a ACK // of the FIN before the connection diff --git a/kernel/network/tcp.h b/kernel/network/tcp.h index 0c53535..1e292b3 100644 --- a/kernel/network/tcp.h +++ b/kernel/network/tcp.h @@ -5,4 +5,4 @@ void tcp_wait_reply(struct TcpConnection *con); void handle_tcp(ipv4_t src_ip, const u8 *payload, u32 payload_length); void send_tcp_packet(struct TcpConnection *con, const u8 *payload, u16 payload_length); -void tcp_close_connection(struct INCOMING_TCP_CONNECTION *s); +void tcp_close_connection(struct TcpConnection *con); |