From 83d870e58457a1d335a1d9b9966a6a1887cc297b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 24 Nov 2025 03:02:43 +0100 Subject: feat! breaking changes on kernel sources. Signed-off-by: Amlal El Mahrouss --- src/kernel/NetworkKit/IP.h | 76 ++++++++++++++++++++++++++++ src/kernel/NetworkKit/IPC.h | 90 +++++++++++++++++++++++++++++++++ src/kernel/NetworkKit/LTE.h | 16 ++++++ src/kernel/NetworkKit/MAC.h | 34 +++++++++++++ src/kernel/NetworkKit/NetworkDevice.h | 83 ++++++++++++++++++++++++++++++ src/kernel/NetworkKit/NetworkDevice.inl | 32 ++++++++++++ 6 files changed, 331 insertions(+) create mode 100644 src/kernel/NetworkKit/IP.h create mode 100644 src/kernel/NetworkKit/IPC.h create mode 100644 src/kernel/NetworkKit/LTE.h create mode 100644 src/kernel/NetworkKit/MAC.h create mode 100644 src/kernel/NetworkKit/NetworkDevice.h create mode 100644 src/kernel/NetworkKit/NetworkDevice.inl (limited to 'src/kernel/NetworkKit') diff --git a/src/kernel/NetworkKit/IP.h b/src/kernel/NetworkKit/IP.h new file mode 100644 index 00000000..b19d132f --- /dev/null +++ b/src/kernel/NetworkKit/IP.h @@ -0,0 +1,76 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include +#include +#include +#include + +namespace Kernel { +class RawIPAddress6; +class RawIPAddress; +class IPFactory; + +class RawIPAddress final { + private: + explicit RawIPAddress(UInt8 bytes[4]); + ~RawIPAddress() = default; + + RawIPAddress& operator=(const RawIPAddress&) = delete; + RawIPAddress(const RawIPAddress&) = default; + + public: + UInt8* Address(); + + UInt8& operator[](const Size& index); + + BOOL operator==(const RawIPAddress& ipv6); + BOOL operator!=(const RawIPAddress& ipv6); + + private: + UInt8 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(UInt8 Bytes[16]); + ~RawIPAddress6() = default; + + RawIPAddress6& operator=(const RawIPAddress6&) = delete; + RawIPAddress6(const RawIPAddress6&) = default; + + public: + UInt8* Address() { return fAddr; } + + UInt8& operator[](const Size& index); + + bool operator==(const RawIPAddress6& ipv6); + bool operator!=(const RawIPAddress6& ipv6); + + private: + UInt8 fAddr[16]; + + friend IPFactory; +}; + +/** + * @brief IP Creation helpers + */ +class IPFactory final { + public: + static ErrorOr ToKString(Ref& ipv6); + static ErrorOr ToKString(Ref& ipv4); + static bool IpCheckVersion4(const Char* ip); +}; +} // namespace Kernel diff --git a/src/kernel/NetworkKit/IPC.h b/src/kernel/NetworkKit/IPC.h new file mode 100644 index 00000000..c08a9457 --- /dev/null +++ b/src/kernel/NetworkKit/IPC.h @@ -0,0 +1,90 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.. + + File: IPC.h. + Purpose: IPC protocol. + +======================================== */ + +#ifndef INC_IPC_H +#define INC_IPC_H + +#include +#include +#include + +/// @file IPC.h +/// @brief IPC comm. protocol. + +/// IA separator. +#define kIPCRemoteSeparator ":" + +/// Interchange address, consists of ProcessID:TEAM. +#define kIPCRemoteInvalid "00:00" + +#define kIPCHeaderMagic (0x4950434) + +namespace Kernel { +struct IPC_ADDR; +struct IPC_MSG; + +/// @brief 128-bit IPC address. +struct PACKED IPC_ADDR final { + UInt64 UserProcessID; + UInt64 UserProcessTeam; + + //////////////////////////////////// + // some operators. + //////////////////////////////////// + + BOOL operator==(const IPC_ADDR& addr) noexcept; + BOOL operator==(IPC_ADDR& addr) noexcept; + BOOL operator!=(const IPC_ADDR& addr) noexcept; + BOOL operator!=(IPC_ADDR& addr) noexcept; +}; + +typedef struct IPC_ADDR IPC_ADDR; + +enum { + kIPCLittleEndian = 0, + kIPCBigEndian = 1, + kIPCMixedEndian = 2, +}; + +constexpr inline auto kIPCMsgSize = 6094U; + +enum { + kIPCLockInvalid = 0, + kIPCLockFree = 1, + kIPCLockUsed = 2, +}; + +/// @brief IPC connection header, message cannot be greater than 6K. +typedef struct IPC_MSG final { + UInt32 IpcHeaderMagic; // cRemoteHeaderMagic + UInt8 IpcEndianess; // 0 : LE, 1 : BE + SizeT IpcPacketSize; + IPC_ADDR IpcFrom; + IPC_ADDR IpcTo; + UInt32 IpcCRC32; + UInt32 IpcMsg; + UInt32 IpcMsgSz; + UInt8 IpcData[kIPCMsgSize]; + UInt32 IpcLock; + /// @brief Passes the message to target, could be anything, HTTP packet, JSON or whatever. + static Bool Pass(IPC_MSG* self, IPC_MSG* target) noexcept; +} PACKED ALIGN(8) IPC_MSG; + +/// @brief Sanitize packet function +/// @retval true packet is correct. +/// @retval false packet is incorrect and process has crashed. +BOOL ipc_sanitize_packet(_Input IPC_MSG* pckt_in); + +/// @brief Construct packet function +/// @retval true packet is correct. +/// @retval false packet is incorrect and process has crashed. +BOOL ipc_construct_packet(_Output _Input IPC_MSG** pckt_in); +} // namespace Kernel + +#endif // INC_IPC_H diff --git a/src/kernel/NetworkKit/LTE.h b/src/kernel/NetworkKit/LTE.h new file mode 100644 index 00000000..c29f1687 --- /dev/null +++ b/src/kernel/NetworkKit/LTE.h @@ -0,0 +1,16 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.. + + File: LTE.h. + Purpose: LTE protocol classes. + +======================================== */ + +#ifndef _INC_NETWORK_LTE_H_ +#define _INC_NETWORK_LTE_H_ + +#include +#include + +#endif // ifndef _INC_NETWORK_LTE_H_ diff --git a/src/kernel/NetworkKit/MAC.h b/src/kernel/NetworkKit/MAC.h new file mode 100644 index 00000000..382eca77 --- /dev/null +++ b/src/kernel/NetworkKit/MAC.h @@ -0,0 +1,34 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#pragma once + +#include +#include +#include + +#define kMACAddrLen (32U) + +namespace Kernel { +class MacAddressGetter; + +/// \brief This retrieves the MAC address of the device. +/// \note Listens for the current NIC. +class MacAddressGetter final { + public: + MacAddressGetter() = default; + ~MacAddressGetter() = default; + + NE_COPY_DEFAULT(MacAddressGetter) + + public: + Array& AsBytes(); + + private: + Array fMacAddress; +}; + +} // namespace Kernel diff --git a/src/kernel/NetworkKit/NetworkDevice.h b/src/kernel/NetworkKit/NetworkDevice.h new file mode 100644 index 00000000..3afa8484 --- /dev/null +++ b/src/kernel/NetworkKit/NetworkDevice.h @@ -0,0 +1,83 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#ifndef __INC_NETWORK_DEVICE_H__ +#define __INC_NETWORK_DEVICE_H__ + +#include +#include + +/// @note Can either work with: Ethernet, GPRS, WiFi + +namespace Kernel { +struct NetworkDeviceCommand; +class NetworkDevice; + +/** + * \brief Network device interface, establishes a connection to the NIC. + */ +class NetworkDevice final NE_DEVICE { + public: + NetworkDevice(void (*out)(DeviceInterface*, NetworkDeviceCommand), + void (*in)(DeviceInterface*, NetworkDeviceCommand), + void (*cleanup)(void) = nullptr); + + ~NetworkDevice() override; + + public: + NetworkDevice& operator=(const NetworkDevice&) = default; + NetworkDevice(const NetworkDevice&) = default; + + public: + const Char* Name() const override; + Boolean Name(const Char* newStr); + + private: + Void (*fCleanup)(void); +}; + +struct 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 IPC device. +using IPCNetworkDevice = NetworkDevice; + +/// @brief GRPS device. +using GPRSNetworkDevice = NetworkDevice; + +/// @brief GSM device. +using GSMNetworkDevice = NetworkDevice; + +/// @brief Bluetooth device. +using BTNetworkDevice = NetworkDevice; + +/// @brief Printer device. +using PrinterNetworkDevice = NetworkDevice; + +/// @brief Debug device. +using DBGNetworkDevice = NetworkDevice; + +/// @brief LTE device. +using LTENetworkDevice = NetworkDevice; +} // namespace Kernel + +#include + +#endif // !__INC_NETWORK_DEVICE_H__ diff --git a/src/kernel/NetworkKit/NetworkDevice.inl b/src/kernel/NetworkKit/NetworkDevice.inl new file mode 100644 index 00000000..a86d7e56 --- /dev/null +++ b/src/kernel/NetworkKit/NetworkDevice.inl @@ -0,0 +1,32 @@ +/* ======================================== + + Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +/*** + Dtor and ctors. +*/ + +#ifndef __INC_NETWORK_DEVICE_H__ +#include +#endif // __INC_NETWORK_DEVICE_H__ + +namespace Kernel { +inline NetworkDevice::NetworkDevice(void (*out)(DeviceInterface*, + NetworkDeviceCommand), + void (*in)(DeviceInterface*, + NetworkDeviceCommand), + void (*on_cleanup)(void)) + : DeviceInterface(out, in), fCleanup(on_cleanup) { + kout << "NetworkDevice initialized.\r"; + + MUST_PASS(out && in && on_cleanup); +} + +inline NetworkDevice::~NetworkDevice() { + kout << "NetworkDevice cleanup.\r"; + + if (fCleanup) fCleanup(); +} +} // namespace Kernel -- cgit v1.2.3