From af8a516fc22865abd80d6e26f1541fa3d6bebfdc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 9 May 2024 00:42:44 +0200 Subject: MHR-23: :boom:, refactors. - Move NewBoot to /Boot, thus making Kernel directory only containing the kernel. Signed-off-by: Amlal El Mahrouss --- Kernel/NetworkKit/IP.hpp | 83 +++++++++++++++++++++++++++++++++++++ Kernel/NetworkKit/IPCEP.hxx | 57 +++++++++++++++++++++++++ Kernel/NetworkKit/MAC.hxx | 29 +++++++++++++ Kernel/NetworkKit/NetworkDevice.hpp | 65 +++++++++++++++++++++++++++++ Kernel/NetworkKit/NetworkDevice.inl | 27 ++++++++++++ Kernel/NetworkKit/compile_flags.txt | 5 +++ 6 files changed, 266 insertions(+) create mode 100644 Kernel/NetworkKit/IP.hpp create mode 100644 Kernel/NetworkKit/IPCEP.hxx create mode 100644 Kernel/NetworkKit/MAC.hxx create mode 100644 Kernel/NetworkKit/NetworkDevice.hpp create mode 100644 Kernel/NetworkKit/NetworkDevice.inl create mode 100644 Kernel/NetworkKit/compile_flags.txt (limited to 'Kernel/NetworkKit') diff --git a/Kernel/NetworkKit/IP.hpp b/Kernel/NetworkKit/IP.hpp new file mode 100644 index 00000000..94d0d3be --- /dev/null +++ b/Kernel/NetworkKit/IP.hpp @@ -0,0 +1,83 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include + +namespace NewOS +{ + class RawIPAddress6; + class RawIPAddress; + class IPFactory; + + class RawIPAddress final + { + private: + explicit RawIPAddress(char bytes[4]); + ~RawIPAddress() = default; + + RawIPAddress& operator=(const RawIPAddress&) = delete; + RawIPAddress(const RawIPAddress&) = default; + + public: + char* Address(); + + char& operator[](const Size& index); + + bool operator==(const RawIPAddress& ipv6); + bool operator!=(const RawIPAddress& ipv6); + + private: + char fAddr[4]; + + friend IPFactory; // it is the one creating these addresses, thus this + // is why the constructors are private. + }; + + /** + * @brief IPv6 address. + */ + class RawIPAddress6 final + { + private: + explicit RawIPAddress6(char Bytes[8]); + ~RawIPAddress6() = default; + + RawIPAddress6& operator=(const RawIPAddress6&) = delete; + RawIPAddress6(const RawIPAddress6&) = default; + + public: + char* Address() + { + return fAddr; + } + + char& operator[](const Size& index); + + bool operator==(const RawIPAddress6& ipv6); + bool operator!=(const RawIPAddress6& ipv6); + + private: + char fAddr[8]; + + friend IPFactory; + }; + + /** + * @brief IP Creation helpers + */ + class IPFactory final + { + public: + static ErrorOr ToStringView(Ref ipv6); + static ErrorOr ToStringView(Ref ipv4); + static bool IpCheckVersion4(const char* ip); + }; +} // namespace NewOS diff --git a/Kernel/NetworkKit/IPCEP.hxx b/Kernel/NetworkKit/IPCEP.hxx new file mode 100644 index 00000000..5c34d47e --- /dev/null +++ b/Kernel/NetworkKit/IPCEP.hxx @@ -0,0 +1,57 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs. + + File: IPCEP.hxx, Purpose: Common IPC protocol. + +------------------------------------------- */ + +#ifndef _INC_IPC_ENDPOINT_HXX_ +#define _INC_IPC_ENDPOINT_HXX_ + +#include +#include + +/// @brief Common IPC Endpoint Protocol (Common IPC for short). + +/// IA separator. +#define kRemoteSeparator "." + +/// Interchange address, consists of domain:namespace. +#define kRemoteInvalid "00.00.00.00:0000" +#define kRemoteBitWidth 96 /* 96-bit address space. */ + +#define kRemoteHeaderMagic 0xFEEDFACE + +namespace NewOS +{ + /// @brief 96-bit number to represent the domain and namespace + struct PACKED IPCEPAddress + { + UInt32 RemoteAddress; + UInt64 RemoteNamespace; + }; + + typedef struct IPCEPAddress IPCEPAddressType; + + enum + { + kIPCEPLittleEndian = 0, + kIPCEPBigEndian = 1 + }; + + /// @brief IPCEP connection header + typedef struct IPCEPConnectionHeader + { + UInt32 IpcHeader; // kRemoteHeaderMagic + UInt8 IpcEndianess; // 0 : LE, 1 : BE + SizeT IpcPacketSize; + IPCEPAddressType IpcFrom; + IPCEPAddressType IpcTo; + UInt32 IpcCRC32; + SizeT IpcDataSize; + Char IpcData[]; + } PACKED IPCEPConnectionHeader; +} // namespace NewOS + +#endif // _INC_IPC_ENDPOINT_HXX_ diff --git a/Kernel/NetworkKit/MAC.hxx b/Kernel/NetworkKit/MAC.hxx new file mode 100644 index 00000000..30a865ac --- /dev/null +++ b/Kernel/NetworkKit/MAC.hxx @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#pragma once + +#include +#include +#include + +namespace NewOS +{ + class MacAddressGetter; + + /// \brief This retrieves the MAC address of the device. + /// \note Listens for the current NIC. + class MacAddressGetter final + { + public: + explicit MacAddressGetter() = default; + + public: + StringView& AsString(); + Array& AsBytes(); + }; + +} // namespace NewOS diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp new file mode 100644 index 00000000..b00ce7a6 --- /dev/null +++ b/Kernel/NetworkKit/NetworkDevice.hpp @@ -0,0 +1,65 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#ifndef __NETWORK_DEVICE__ +#define __NETWORK_DEVICE__ + +#include +#include + +namespace NewOS +{ + struct NetworkDeviceCommand; + class NetworkDevice; + + /** +* \brief Network device interface, establishes a connection to the NIC. +*/ + class NetworkDevice final : public DeviceInterface + { + public: + NetworkDevice(void (*out)(NetworkDeviceCommand), + void (*in)(NetworkDeviceCommand), + void (*onCleanup)(void) = nullptr); + + ~NetworkDevice() override; + + public: + NetworkDevice& operator=(const NetworkDevice&) = default; + NetworkDevice(const NetworkDevice&) = default; + + public: + const char* Name() const override; + + private: + void (*fCleanup)(void); + }; + + struct PACKED NetworkDeviceCommand final + { + UInt32 CommandName; + UInt32 CommandType; + UInt32 CommandFlags; + VoidPtr CommandBuffer; + SizeT CommandSizeBuffer; + }; + + /// @brief TCP device. + using TCPNetworkDevice = NetworkDevice; + + /// @brief UDP device. + using UDPNetworkDevice = NetworkDevice; + + /// @brief PPP device. + using PPPNetworkDevice = NetworkDevice; + + /// @brief HPC device. + using HPCNetworkDevice = NetworkDevice; +} // namespace NewOS + +#include + +#endif // !__NETWORK_DEVICE__ diff --git a/Kernel/NetworkKit/NetworkDevice.inl b/Kernel/NetworkKit/NetworkDevice.inl new file mode 100644 index 00000000..0b927d0e --- /dev/null +++ b/Kernel/NetworkKit/NetworkDevice.inl @@ -0,0 +1,27 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +/*** + Dtor and ctors. +*/ + +namespace NewOS { +NetworkDevice::NetworkDevice(void (*out)(NetworkDeviceCommand), + void (*in)(NetworkDeviceCommand), + void (*on_cleanup)(void)) + : DeviceInterface(out, in), fCleanup(on_cleanup) { + kcout << "NK: NetworkDevice initialize.\r"; + + MUST_PASS(out && in && on_cleanup); +} + +NetworkDevice::~NetworkDevice() { + MUST_PASS(fCleanup); + + kcout << "NK: NetworkDevice cleanup.\r"; + if (fCleanup) fCleanup(); +} +} // namespace NewOS diff --git a/Kernel/NetworkKit/compile_flags.txt b/Kernel/NetworkKit/compile_flags.txt new file mode 100644 index 00000000..a37ae6bf --- /dev/null +++ b/Kernel/NetworkKit/compile_flags.txt @@ -0,0 +1,5 @@ +-nostdlib +-ffreestanding +-std=c++20 +-I./ +-I../ -- cgit v1.2.3