feat: add ethernet & TCP/IP stack

This commit is contained in:
2026-02-17 13:19:11 +01:00
parent f7e6ce70a0
commit 20fa8a9be2
23 changed files with 2409 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
/*
* Tcp.hpp
* Transmission Control Protocol
* Copyright (c) 2025 Daniel Hammer
*/
#pragma once
#include <cstdint>
#include <CppLib/Spinlock.hpp>
namespace Net::Tcp {
constexpr uint16_t HEADER_SIZE = 20; // Without options
// TCP flags
constexpr uint8_t FLAG_FIN = 0x01;
constexpr uint8_t FLAG_SYN = 0x02;
constexpr uint8_t FLAG_RST = 0x04;
constexpr uint8_t FLAG_PSH = 0x08;
constexpr uint8_t FLAG_ACK = 0x10;
struct Header {
uint16_t SrcPort;
uint16_t DstPort;
uint32_t SeqNum;
uint32_t AckNum;
uint8_t DataOffset; // Upper 4 bits = offset in 32-bit words
uint8_t Flags;
uint16_t Window;
uint16_t Checksum;
uint16_t UrgentPtr;
} __attribute__((packed));
// TCP connection states
enum class State {
Closed,
Listen,
SynSent,
SynReceived,
Established,
FinWait1,
FinWait2,
CloseWait,
LastAck,
TimeWait
};
// Opaque connection handle
struct Connection;
// Initialize the TCP subsystem
void Initialize();
// Handle an incoming TCP segment (called by IPv4 layer)
void OnPacketReceived(uint32_t srcIp, uint32_t dstIp, const uint8_t* data, uint16_t length);
// Listen on a port. Returns a connection handle in Listen state.
Connection* Listen(uint16_t port);
// Accept an incoming connection on a listening socket.
// Blocks until a connection arrives. Returns a new connection in Established state.
Connection* Accept(Connection* listener);
// Actively connect to a remote host:port. Returns connection in Established state or nullptr.
Connection* Connect(uint32_t destIp, uint16_t destPort, uint16_t srcPort);
// Send data on an established connection. Returns number of bytes sent.
int Send(Connection* conn, const uint8_t* data, uint16_t length);
// Receive data from an established connection. Returns number of bytes received.
// Blocks until data is available or connection is closed.
int Receive(Connection* conn, uint8_t* buffer, uint16_t bufferSize);
// Close a TCP connection gracefully
void Close(Connection* conn);
// Get the state of a connection
State GetState(Connection* conn);
}