#pragma once // net_device.h - tiny kernel network-device registry. // // This layer is intentionally below the future socket/IP stack. NIC drivers // register a NET_DEVICE and feed complete Ethernet frames into NetReceiveFrame(). // Protocol code can later subscribe above this layer or bind a real stack. #include #include #include #define NET_DEVICE_NAME_MAX 16u #define NET_HWADDR_MAX 16u #define NET_MTU_ETHERNET 1500u #define NET_ETHERNET_ADDRESS_LENGTH 6u #define NET_ETHERNET_HEADER_LENGTH 14u #define NET_ETHERNET_MIN_FRAME 60u #define NET_ETHERNET_MAX_FRAME (NET_ETHERNET_HEADER_LENGTH + NET_MTU_ETHERNET) struct NET_DEVICE; typedef struct NET_DEVICE NET_DEVICE; typedef KSTATUS (*NET_SEND_FRAME)(NET_DEVICE* device, const void* frame, size_t length); typedef struct NET_DEVICE_STATS { uint64_t TxPackets; uint64_t TxBytes; uint64_t TxErrors; uint64_t RxPackets; uint64_t RxBytes; uint64_t RxDrops; } NET_DEVICE_STATS; struct NET_DEVICE { char Name[NET_DEVICE_NAME_MAX]; uint32_t Index; uint32_t Mtu; uint8_t HardwareAddressLength; uint8_t HardwareAddress[NET_HWADDR_MAX]; void* DriverContext; NET_SEND_FRAME SendFrame; NET_DEVICE_STATS Stats; }; __declspec(dllexport) KSTATUS NetRegisterDevice(NET_DEVICE* device); __declspec(dllexport) uint32_t NetGetDeviceCount(void); __declspec(dllexport) NET_DEVICE* NetGetDevice(uint32_t index); __declspec(dllexport) KSTATUS NetGetDeviceStats(uint32_t index, NET_DEVICE_STATS* stats); __declspec(dllexport) KSTATUS NetSendFrame(uint32_t index, const void* frame, size_t length); __declspec(dllexport) void NetReceiveFrame(NET_DEVICE* device, const void* frame, size_t length);