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 @@
|
||||
#pragma pack(push, 1)
|
||||
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
#ifndef LWIP_ARCH_CC_H
|
||||
#define LWIP_ARCH_CC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <ke_debug.h>
|
||||
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
#ifndef BYTE_ORDER
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
/* MSVC/freestanding kernel-friendly printf format fallbacks. */
|
||||
#define LWIP_NO_INTTYPES_H 1
|
||||
#define X8_F "02x"
|
||||
#define U16_F "hu"
|
||||
#define S16_F "hd"
|
||||
#define X16_F "hx"
|
||||
#define U32_F "lu"
|
||||
#define S32_F "ld"
|
||||
#define X32_F "lx"
|
||||
#define SZT_F "llu"
|
||||
|
||||
#define LWIP_NO_CTYPE_H 1
|
||||
#define LWIP_TIMEVAL_PRIVATE 1
|
||||
#define LWIP_PROVIDE_ERRNO 1
|
||||
|
||||
/* Used by SYS_LIGHTWEIGHT_PROT. Keep it wide enough for saved RFLAGS. */
|
||||
typedef uintptr_t sys_prot_t;
|
||||
|
||||
#define LWIP_PLATFORM_DIAG(x) do { DbgPrint x; } while (0)
|
||||
#define LWIP_PLATFORM_ASSERT(x) do { KePanic("lwIP assert: %s\n", (x)); } while (0)
|
||||
|
||||
unsigned int lwip_port_rand(void);
|
||||
#define LWIP_RAND() ((uint32_t)lwip_port_rand())
|
||||
|
||||
/* Force lwIP's static heap/aligned buffers to be at least 8-byte aligned. */
|
||||
#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) \
|
||||
__declspec(align(8)) uint8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)]
|
||||
|
||||
#define PACK_STRUCT_USE_INCLUDES
|
||||
|
||||
#endif /* LWIP_ARCH_CC_H */
|
||||
@@ -0,0 +1 @@
|
||||
#pragma pack(pop)
|
||||
@@ -0,0 +1,51 @@
|
||||
#pragma once
|
||||
#ifndef LWIP_ARCH_SYS_ARCH_H
|
||||
#define LWIP_ARCH_SYS_ARCH_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <lwip/opt.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct sys_sem;
|
||||
typedef struct sys_sem* sys_sem_t;
|
||||
#define SYS_SEM_NULL NULL
|
||||
#define sys_sem_valid(sem) ((sem) && (*(sem) != NULL))
|
||||
#define sys_sem_valid_val(sem) ((sem) != NULL)
|
||||
#define sys_sem_set_invalid(sem) do { if ((sem)) { *(sem) = NULL; } } while (0)
|
||||
#define sys_sem_set_invalid_val(sem) do { (sem) = NULL; } while (0)
|
||||
|
||||
struct sys_mutex;
|
||||
typedef struct sys_mutex* sys_mutex_t;
|
||||
#define sys_mutex_valid(mutex) ((mutex) && (*(mutex) != NULL))
|
||||
#define sys_mutex_valid_val(mutex) ((mutex) != NULL)
|
||||
#define sys_mutex_set_invalid(mutex) do { if ((mutex)) { *(mutex) = NULL; } } while (0)
|
||||
|
||||
struct sys_mbox;
|
||||
typedef struct sys_mbox* sys_mbox_t;
|
||||
#define SYS_MBOX_NULL NULL
|
||||
#define sys_mbox_valid(mbox) ((mbox) && (*(mbox) != NULL))
|
||||
#define sys_mbox_valid_val(mbox) ((mbox) != NULL)
|
||||
#define sys_mbox_set_invalid(mbox) do { if ((mbox)) { *(mbox) = NULL; } } while (0)
|
||||
#define sys_mbox_set_invalid_val(mbox) do { (mbox) = NULL; } while (0)
|
||||
|
||||
/*
|
||||
* lwIP only treats sys_thread_t as an opaque handle. Keep it pointer-sized.
|
||||
*
|
||||
* Do NOT make this a by-value incomplete struct. MSVC may compile callers
|
||||
* that see only the incomplete type with a hidden struct-return parameter,
|
||||
* which shifts sys_thread_new(name, thread, arg, ...) so the callee receives
|
||||
* thread == name and arg == thread. The first tcpip_thread then jumps into
|
||||
* the literal string "tcpip" as code.
|
||||
*/
|
||||
typedef void* sys_thread_t;
|
||||
|
||||
void LwipPortSetTimerQuery(uint64_t (*query_ticks_us)(void));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_ARCH_SYS_ARCH_H */
|
||||
@@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
/*
|
||||
* lwipopts.h - kernel port configuration for lwIP 2.2.1.
|
||||
*
|
||||
* This is intentionally a practical first configuration: IPv4, ARP, ICMP,
|
||||
* UDP, TCP, DHCP, DNS and netconn are enabled; IPv6, PPP,
|
||||
* SNMP, lwIP's POSIX socket API, and app protocols stay off.
|
||||
*/
|
||||
|
||||
#define NO_SYS 0
|
||||
#define SYS_LIGHTWEIGHT_PROT 1
|
||||
#define MEM_ALIGNMENT 8
|
||||
|
||||
/* Keep lwIP memory self-contained. It uses its own heap/pools, not malloc(). */
|
||||
#define MEM_LIBC_MALLOC 0
|
||||
#define MEMP_MEM_MALLOC 0
|
||||
#define MEM_SIZE (256 * 1024)
|
||||
#define MEMP_OVERFLOW_CHECK 0
|
||||
#define MEMP_SANITY_CHECK 0
|
||||
|
||||
#define PBUF_POOL_SIZE 64
|
||||
#define PBUF_POOL_BUFSIZE 1536
|
||||
#define MEMP_NUM_PBUF 32
|
||||
#define MEMP_NUM_NETBUF 32
|
||||
#define MEMP_NUM_NETCONN 32
|
||||
#define MEMP_NUM_TCPIP_MSG_API 64
|
||||
#define MEMP_NUM_TCPIP_MSG_INPKT 64
|
||||
#define MEMP_NUM_SYS_TIMEOUT 32
|
||||
|
||||
#define LWIP_IPV4 1
|
||||
#define LWIP_IPV6 0
|
||||
#define LWIP_ARP 1
|
||||
#define LWIP_ETHERNET 1
|
||||
#define LWIP_ICMP 1
|
||||
#define LWIP_IGMP 0
|
||||
#define LWIP_RAW 1
|
||||
#define LWIP_UDP 1
|
||||
#define LWIP_TCP 1
|
||||
#define LWIP_DHCP 1
|
||||
#define LWIP_AUTOIP 0
|
||||
#define LWIP_DNS 1
|
||||
|
||||
#define TCP_MSS 1460
|
||||
#define TCP_WND (4 * TCP_MSS)
|
||||
#define TCP_SND_BUF (4 * TCP_MSS)
|
||||
#define TCP_SND_QUEUELEN 16
|
||||
#define MEMP_NUM_TCP_PCB 16
|
||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
|
||||
#define MEMP_NUM_TCP_SEG 32
|
||||
#define MEMP_NUM_UDP_PCB 16
|
||||
|
||||
#define LWIP_NETCONN 1
|
||||
#define LWIP_SOCKET 0
|
||||
#define LWIP_COMPAT_SOCKETS 0
|
||||
#define LWIP_POSIX_SOCKETS_IO_NAMES 0
|
||||
#define LWIP_SOCKET_SELECT 0
|
||||
#define LWIP_SO_RCVTIMEO 1
|
||||
#define LWIP_SO_SNDTIMEO 1
|
||||
#define LWIP_SO_RCVBUF 1
|
||||
#define LWIP_SO_REUSE 1
|
||||
#define LWIP_TCP_KEEPALIVE 1
|
||||
|
||||
#define TCPIP_THREAD_NAME "tcpip"
|
||||
#define TCPIP_THREAD_STACKSIZE 0
|
||||
#define TCPIP_THREAD_PRIO 2
|
||||
#define TCPIP_MBOX_SIZE 128
|
||||
#define DEFAULT_THREAD_STACKSIZE 0
|
||||
#define DEFAULT_THREAD_PRIO 1
|
||||
#define DEFAULT_RAW_RECVMBOX_SIZE 32
|
||||
#define DEFAULT_UDP_RECVMBOX_SIZE 64
|
||||
#define DEFAULT_TCP_RECVMBOX_SIZE 64
|
||||
#define DEFAULT_ACCEPTMBOX_SIZE 32
|
||||
|
||||
#define LWIP_NETIF_HOSTNAME 1
|
||||
#define LWIP_NETIF_STATUS_CALLBACK 1
|
||||
#define LWIP_NETIF_LINK_CALLBACK 1
|
||||
#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
|
||||
#define CHECKSUM_GEN_IP 1
|
||||
#define CHECKSUM_GEN_UDP 1
|
||||
#define CHECKSUM_GEN_TCP 1
|
||||
#define CHECKSUM_CHECK_IP 1
|
||||
#define CHECKSUM_CHECK_UDP 1
|
||||
#define CHECKSUM_CHECK_TCP 1
|
||||
|
||||
#define LWIP_TIMERS 1
|
||||
#define LWIP_TCPIP_TIMEOUT 1
|
||||
#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 1
|
||||
|
||||
#define LWIP_STATS 0
|
||||
#define LWIP_DEBUG 0
|
||||
#define LWIP_NOASSERT 0
|
||||
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
#ifndef LWIP_PORT_STDLIB_H
|
||||
#define LWIP_PORT_STDLIB_H
|
||||
|
||||
/*
|
||||
* Minimal freestanding stdlib shim for lwIP.
|
||||
*
|
||||
* lwIP 2.2.1 includes <stdlib.h> in a couple of files only for atoi(). If MSVC
|
||||
* finds the UCRT header, it drags errno.h into the kernel build and then lwIP's
|
||||
* own errno values collide with UCRT's. Put this header first in lwIP's include
|
||||
* path so those sources stay freestanding.
|
||||
*/
|
||||
static __inline int atoi(const char* s) {
|
||||
int sign = 1;
|
||||
int value = 0;
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' || *s == '\v' || *s == '\f')
|
||||
++s;
|
||||
|
||||
if (*s == '-') {
|
||||
sign = -1;
|
||||
++s;
|
||||
} else if (*s == '+') {
|
||||
++s;
|
||||
}
|
||||
|
||||
while (*s >= '0' && *s <= '9') {
|
||||
value = value * 10 + (*s - '0');
|
||||
++s;
|
||||
}
|
||||
|
||||
return sign * value;
|
||||
}
|
||||
|
||||
#endif /* LWIP_PORT_STDLIB_H */
|
||||
Reference in new issue
Block a user