From 0185e164517eff4deea06354d99ade7832f209bb Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 2 Nov 2010 04:57:37 +0000 Subject: [PATCH] [LWIP] - Fix build and a few implementation bugs svn path=/branches/tcp-rewrite-branch/; revision=49426 --- lib/drivers/lwip/lwip.rbuild | 4 +- lib/drivers/lwip/src/api/tcpip.c | 1 + lib/drivers/lwip/src/include/arch/sys_arch.h | 18 ++-- lib/drivers/lwip/src/sys_arch.c | 97 +++++++------------- 4 files changed, 46 insertions(+), 74 deletions(-) diff --git a/lib/drivers/lwip/lwip.rbuild b/lib/drivers/lwip/lwip.rbuild index 7bcc5a56082..13ff802cc55 100755 --- a/lib/drivers/lwip/lwip.rbuild +++ b/lib/drivers/lwip/lwip.rbuild @@ -45,12 +45,12 @@ ip_addr.c ip_frag.c - + asn1_dec.c asn1_enc.c diff --git a/lib/drivers/lwip/src/api/tcpip.c b/lib/drivers/lwip/src/api/tcpip.c index 857e7d9bd64..846d2fde0f8 100644 --- a/lib/drivers/lwip/src/api/tcpip.c +++ b/lib/drivers/lwip/src/api/tcpip.c @@ -46,6 +46,7 @@ #include "lwip/pbuf.h" #include "lwip/tcpip.h" #include "lwip/init.h" +#include "lwip/ip.h" #include "netif/etharp.h" #include "netif/ppp_oe.h" diff --git a/lib/drivers/lwip/src/include/arch/sys_arch.h b/lib/drivers/lwip/src/include/arch/sys_arch.h index 2a31498082b..963d10a3d53 100755 --- a/lib/drivers/lwip/src/include/arch/sys_arch.h +++ b/lib/drivers/lwip/src/include/arch/sys_arch.h @@ -1,20 +1,21 @@ /* ReactOS-Specific lwIP binding header - by Cameron Gutman */ /* Implmentation specific structs */ -typedef KEVENT sys_sem_t; +typedef struct _sys_sem_t +{ + KEVENT Event; + int Valid; +} sys_sem_t; typedef struct _sys_mbox_t { KSPIN_LOCK Lock; LIST_ENTRY ListHead; KEVENT Event; + int Valid; } sys_mbox_t; -typedef struct _sys_prot_t -{ - KSPIN_LOCK Lock; - KIRQL OldIrql; -} sys_prot_t; +typedef KIRQL sys_prot_t; typedef u32_t sys_thread_t; @@ -35,10 +36,7 @@ void sys_arch_protect(sys_prot_t *lev); void -sys_arch_unprotect(sys_prot_t *lev); - -void -sys_arch_decl_protect(sys_prot_t *lev); +sys_arch_unprotect(sys_prot_t lev); void sys_shutdown(void); diff --git a/lib/drivers/lwip/src/sys_arch.c b/lib/drivers/lwip/src/sys_arch.c index bf7753aa8de..21c5f367617 100755 --- a/lib/drivers/lwip/src/sys_arch.c +++ b/lib/drivers/lwip/src/sys_arch.c @@ -15,13 +15,10 @@ static LARGE_INTEGER StartTime; typedef struct _thread_t { - PVOID ThreadId; HANDLE Handle; - struct sys_timeouts Timeouts; void (* ThreadFunction)(void *arg); void *ThreadContext; LIST_ENTRY ListEntry; - char Name[1]; } *thread_t; u32_t sys_now(void) @@ -36,23 +33,14 @@ u32_t sys_now(void) void sys_arch_protect(sys_prot_t *lev) { - KIRQL OldIrql; - - KeAcquireSpinLock(&lev->Lock, &OldIrql); - - lev->OldIrql = OldIrql; -} - -void -sys_arch_unprotect(sys_prot_t *lev) -{ - KeReleaseSpinLock(&lev->Lock, lev->OldIrql); + /* Preempt the dispatcher */ + KeRaiseIrql(DISPATCH_LEVEL, lev); } void -sys_arch_decl_protect(sys_prot_t *lev) +sys_arch_unprotect(sys_prot_t lev) { - KeInitializeSpinLock(&lev->Lock); + KeLowerIrql(lev); } err_t @@ -64,21 +52,35 @@ sys_sem_new(sys_sem_t *sem, u8_t count) * so I optimize for this case by using a synchronization event and setting its initial state * to signalled for a lock and non-signalled for a completion event */ - KeInitializeEvent(sem, SynchronizationEvent, count); + KeInitializeEvent(&sem->Event, SynchronizationEvent, count); + + sem->Valid = 1; return ERR_OK; } +int sys_sem_valid(sys_sem_t *sem) +{ + return sem->Valid; +} + +void sys_sem_set_invalid(sys_sem_t *sem) +{ + sem->Valid = 0; +} + void sys_sem_free(sys_sem_t* sem) { /* No op (allocated in stack) */ + + sys_sem_set_invalid(sem); } void sys_sem_signal(sys_sem_t* sem) { - KeSetEvent(sem, IO_NO_INCREMENT, FALSE); + KeSetEvent(&sem->Event, IO_NO_INCREMENT, FALSE); } u32_t @@ -87,7 +89,7 @@ sys_arch_sem_wait(sys_sem_t* sem, u32_t timeout) LARGE_INTEGER LargeTimeout, PreWaitTime, PostWaitTime; UINT64 TimeDiff; NTSTATUS Status; - PVOID WaitObjects[] = {sem, &TerminationEvent}; + PVOID WaitObjects[] = {&sem->Event, &TerminationEvent}; LargeTimeout.QuadPart = Int32x32To64(timeout, -10000); @@ -131,15 +133,27 @@ sys_mbox_new(sys_mbox_t *mbox, int size) KeInitializeEvent(&mbox->Event, NotificationEvent, FALSE); + mbox->Valid = 1; + return ERR_OK; } +int sys_mbox_valid(sys_mbox_t *mbox) +{ + return mbox->Valid; +} + +void sys_mbox_set_invalid(sys_mbox_t *mbox) +{ + mbox->Valid = 0; +} + void sys_mbox_free(sys_mbox_t *mbox) { ASSERT(IsListEmpty(&mbox->ListHead)); - /* No op (allocated on stack) */ + sys_mbox_set_invalid(mbox); } void @@ -236,43 +250,6 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg) return ERR_OK; } -struct sys_timeouts *sys_arch_timeouts(void) -{ - KIRQL OldIrql; - PLIST_ENTRY CurrentEntry; - thread_t Container; - - KeAcquireSpinLock(&ThreadListLock, &OldIrql); - CurrentEntry = ThreadListHead.Flink; - while (CurrentEntry != &ThreadListHead) - { - Container = CONTAINING_RECORD(CurrentEntry, struct _thread_t, ListEntry); - - if (Container->ThreadId == KeGetCurrentThread()) - { - KeReleaseSpinLock(&ThreadListLock, OldIrql); - return &Container->Timeouts; - } - - CurrentEntry = CurrentEntry->Flink; - } - KeReleaseSpinLock(&ThreadListLock, OldIrql); - - Container = ExAllocatePool(NonPagedPool, sizeof(*Container)); - if (!Container) - return SYS_ARCH_NULL; - - Container->Name[0] = ANSI_NULL; - Container->ThreadFunction = NULL; - Container->ThreadContext = NULL; - Container->Timeouts.next = NULL; - Container->ThreadId = KeGetCurrentThread(); - - ExInterlockedInsertHeadList(&ThreadListHead, &Container->ListEntry, &ThreadListLock); - - return &Container->Timeouts; -} - VOID NTAPI LwipThreadMain(PVOID Context) @@ -280,8 +257,6 @@ LwipThreadMain(PVOID Context) thread_t Container = Context; KIRQL OldIrql; - Container->ThreadId = KeGetCurrentThread(); - ExInterlockedInsertHeadList(&ThreadListHead, &Container->ListEntry, &ThreadListLock); Container->ThreadFunction(Container->ThreadContext); @@ -301,14 +276,12 @@ sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize thread_t Container; NTSTATUS Status; - Container = ExAllocatePool(NonPagedPool, strlen(name) + sizeof(*Container)); + Container = ExAllocatePool(NonPagedPool, sizeof(*Container)); if (!Container) return 0; - strcpy(Container->Name, name); Container->ThreadFunction = thread; Container->ThreadContext = arg; - Container->Timeouts.next = NULL; Status = PsCreateSystemThread(&Container->Handle, THREAD_ALL_ACCESS, -- 2.17.1