add lwIP TCP/IP stack as a runtime driver, native socket syscalls, SysGetMemoryStatus replacing CatchAllDebugBucket, fix timeGetTime to return milliseconds, fix SysSleep to interpret argument as milliseconds, SysGetTick now returns microseconds, harden all syscalls against bad user pointers with CopyFromUser/CopyToUser/MmProbeUser throughout, add networking test apps, port-forward 8080 in runa.bat, split LWIP_DRIVER_CFLAGS, add settings.ini to deploy, remove ethernet.c stub
This commit is contained in:
1 parent
18b4dd0f61
commit
df13b8056c
365 files changed
+143263
-1362
No files matched your search
@@ -0,0 +1,65 @@
|
||||
// net_stack.c - single network stack provider registry.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <net_stack.h>
|
||||
#include <net_device.h>
|
||||
#include <ke_debug.h>
|
||||
#include <ke_spinlock.h>
|
||||
|
||||
static const NET_STACK_PROVIDER* gNetStackProvider = 0;
|
||||
static SPINLOCK gNetStackLock = SPINLOCK_INIT;
|
||||
|
||||
static KSTATUS NetValidateStackProvider(const NET_STACK_PROVIDER* p) {
|
||||
if (!p || p->Version != NET_STACK_PROVIDER_VERSION || !p->Name)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (!p->AttachDevice || !p->ReceiveFrame || !p->SocketCreate || !p->SocketClose ||
|
||||
!p->Bind || !p->Listen || !p->Accept || !p->Connect ||
|
||||
!p->Send || !p->Receive || !p->SendTo || !p->ReceiveFrom ||
|
||||
!p->Shutdown || !p->SetOption || !p->GetOption || !p->Poll ||
|
||||
!p->ResolveHostIpv4) {
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
__declspec(dllexport) KSTATUS NetRegisterStackProvider(const NET_STACK_PROVIDER* provider) {
|
||||
KSTATUS st = NetValidateStackProvider(provider);
|
||||
if (!KSUCCESS(st))
|
||||
return st;
|
||||
|
||||
uintptr_t flags = KeAcquireSpinlock(&gNetStackLock);
|
||||
if (gNetStackProvider) {
|
||||
KeReleaseSpinlock(&gNetStackLock, flags);
|
||||
return STATUS_ALREADY_EXISTS;
|
||||
}
|
||||
gNetStackProvider = provider;
|
||||
KeReleaseSpinlock(&gNetStackLock, flags);
|
||||
|
||||
DbgPrint("NET: registered stack provider %s\n", provider->Name);
|
||||
|
||||
// Stack drivers usually load before NIC drivers, but support the other
|
||||
// order so driver.ini remains simple while the loader is still flat.
|
||||
uint32_t count = NetGetDeviceCount();
|
||||
for (uint32_t i = 0; i < count; ++i) {
|
||||
NET_DEVICE* dev = NetGetDevice(i);
|
||||
if (!dev)
|
||||
continue;
|
||||
KSTATUS attach = provider->AttachDevice(dev);
|
||||
if (!KSUCCESS(attach)) {
|
||||
DbgPrint("NET: provider %s attach for %s failed: 0x%x\n",
|
||||
provider->Name, dev->Name, attach);
|
||||
}
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
__declspec(dllexport) const NET_STACK_PROVIDER* NetGetStackProvider(void) {
|
||||
uintptr_t flags = KeAcquireSpinlock(&gNetStackLock);
|
||||
const NET_STACK_PROVIDER* p = gNetStackProvider;
|
||||
KeReleaseSpinlock(&gNetStackLock, flags);
|
||||
return p;
|
||||
}
|
||||
Reference in new issue
Block a user