#pragma once // net_stack.h - provider interface between kernel socket facade and network stack drivers. // // The kernel owns process handles, user-memory copying, NET_DEVICE registration, // and SOCKET_OBJECT lifetime. A stack driver owns protocol implementation. #include #include #include #include #include #define NET_STACK_PROVIDER_VERSION 1u typedef struct NET_STACK_PROVIDER NET_STACK_PROVIDER; struct NET_STACK_PROVIDER { uint32_t Version; const char* Name; KSTATUS (*AttachDevice)(NET_DEVICE* device); KSTATUS (*ReceiveFrame)(NET_DEVICE* device, const void* frame, size_t length); KSTATUS (*SocketCreate)(uint32_t domain, uint32_t type, uint32_t protocol, void** outSocket); void (*SocketClose)(void* socket); KSTATUS (*Bind)(void* socket, const SYS_SOCKET_ADDRESS_IPV4_K* address, size_t addressSize); KSTATUS (*Listen)(void* socket, uint32_t backlog); KSTATUS (*Accept)(void* socket, void** acceptedOut, SYS_SOCKET_ADDRESS_IPV4_K* remoteOut); KSTATUS (*Connect)(void* socket, const SYS_SOCKET_ADDRESS_IPV4_K* address, size_t addressSize); KSTATUS (*Send)(void* socket, const void* buffer, size_t length, uint32_t flags, size_t* sentOut); KSTATUS (*Receive)(void* socket, void* buffer, size_t length, uint32_t flags, size_t* receivedOut); KSTATUS (*SendTo)(void* socket, const void* buffer, size_t length, uint32_t flags, const SYS_SOCKET_ADDRESS_IPV4_K* remote, size_t remoteSize, size_t* sentOut); KSTATUS (*ReceiveFrom)(void* socket, void* buffer, size_t length, uint32_t flags, SYS_SOCKET_ADDRESS_IPV4_K* remoteOut, size_t* receivedOut); KSTATUS (*Shutdown)(void* socket, uint32_t how); KSTATUS (*SetOption)(void* socket, uint32_t option, const void* value, size_t valueSize); KSTATUS (*GetOption)(void* socket, uint32_t option, void* value, size_t valueSize, size_t* actualSizeOut); KSTATUS (*Poll)(void* socket, uint32_t events, uint32_t* returnedEventsOut); KSTATUS (*ResolveHostIpv4)(const char* name, SYS_SOCKET_ADDRESS_IPV4_K* addressOut); }; __declspec(dllexport) KSTATUS NetRegisterStackProvider(const NET_STACK_PROVIDER* provider); __declspec(dllexport) const NET_STACK_PROVIDER* NetGetStackProvider(void);