#pragma once #include #include namespace Kernel { struct PseudoHeader { BAN::IPv4Address src_ipv4 { 0 }; BAN::IPv4Address dst_ipv4 { 0 }; BAN::NetworkEndian protocol { 0 }; BAN::NetworkEndian length { 0 }; }; static_assert(sizeof(PseudoHeader) == 12); class NetworkSocket; class NetworkLayer { public: virtual ~NetworkLayer() {} virtual void unbind_socket(uint16_t port) = 0; virtual BAN::ErrorOr bind_socket_with_target(BAN::RefPtr, const sockaddr* target_address, socklen_t target_address_len) = 0; virtual BAN::ErrorOr bind_socket_to_address(BAN::RefPtr, const sockaddr* address, socklen_t address_len) = 0; virtual BAN::ErrorOr get_socket_address(BAN::RefPtr, sockaddr* address, socklen_t* address_len) = 0; virtual BAN::ErrorOr sendto(NetworkSocket&, BAN::ConstByteSpan, const sockaddr*, socklen_t) = 0; virtual Socket::Domain domain() const = 0; virtual size_t header_size() const = 0; protected: NetworkLayer() = default; }; uint16_t calculate_internet_checksum(BAN::ConstByteSpan buffer); uint16_t calculate_internet_checksum(BAN::Span buffers); }