diff --git a/reactos/drivers/lib/oskittcp/include/oskittcp.h b/reactos/drivers/lib/oskittcp/include/oskittcp.h index 133ca4342ce..19425bf0f84 100644 --- a/reactos/drivers/lib/oskittcp/include/oskittcp.h +++ b/reactos/drivers/lib/oskittcp/include/oskittcp.h @@ -67,11 +67,32 @@ typedef struct ifaddr *(*OSKITTCP_FIND_INTERFACE) OSK_UINT FindType, struct sockaddr *ReqAddr ); +typedef void *(*OSKITTCP_MALLOC) + ( void *ClientData, + OSK_UINT Bytes, + OSK_PCHAR File, + OSK_UINT Line ); + +typedef void (*OSKITTCP_FREE) + ( void *ClientData, + void *data, + OSK_PCHAR File, + OSK_UINT Line ); + +typedef int (*OSKITTCP_SLEEP) + ( void *ClientData, void *token, int priority, char *msg, int tmio ); + +typedef void (*OSKITTCP_WAKEUP)( void *ClientData, void *token ); + typedef struct _OSKITTCP_EVENT_HANDLERS { void *ClientData; OSKITTCP_SOCKET_STATE SocketState; OSKITTCP_SEND_PACKET PacketSend; OSKITTCP_FIND_INTERFACE FindInterface; + OSKITTCP_MALLOC TCPMalloc; + OSKITTCP_FREE TCPFree; + OSKITTCP_SLEEP Sleep; + OSKITTCP_WAKEUP Wakeup; } OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS; extern OSKITTCP_EVENT_HANDLERS OtcpEvent; diff --git a/reactos/drivers/lib/oskittcp/include/oskittypes.h b/reactos/drivers/lib/oskittcp/include/oskittypes.h index 9fad9f9c173..aeb5867ebba 100644 --- a/reactos/drivers/lib/oskittcp/include/oskittypes.h +++ b/reactos/drivers/lib/oskittcp/include/oskittypes.h @@ -23,10 +23,10 @@ typedef struct ifaddr { struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ struct sockaddr *ifa_netmask; /* used to determine subnet */ - u_short ifa_flags; /* mostly rt_flags for cloning */ + unsigned short ifa_flags; /* mostly rt_flags for cloning */ short ifa_refcnt; /* extra to malloc for link info */ int ifa_metric; /* cost of going out this interface */ - u_short ifa_mtu; /* MTU */ + unsigned short ifa_mtu; /* MTU */ } OSK_IFADDR, *POSK_IFADDR; #define IFA_ROUTE RTF_UP /* route installed */ diff --git a/reactos/drivers/lib/oskittcp/makefile b/reactos/drivers/lib/oskittcp/makefile index 4c3fca71499..86292675047 100644 --- a/reactos/drivers/lib/oskittcp/makefile +++ b/reactos/drivers/lib/oskittcp/makefile @@ -1,6 +1,6 @@ -# $Id: makefile,v 1.3 2004/08/19 21:38:53 arty Exp $ +# $Id: makefile,v 1.4 2004/08/29 20:04:42 arty Exp $ PATH_TO_TOP = ../../.. @@ -41,7 +41,6 @@ REACTOS_OBJECTS = \ oskittcp/ip_output.o \ oskittcp/kern_clock.o \ oskittcp/kern_subr.o \ - oskittcp/malloc.o \ oskittcp/param.o \ oskittcp/radix.o \ oskittcp/random.o \ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/interface.c b/reactos/drivers/lib/oskittcp/oskittcp/interface.c index d481baf35bd..03da96de05e 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/interface.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/interface.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -28,14 +27,16 @@ unsigned volatile ipending; struct timeval boottime; void *fbsd_malloc( unsigned int bytes, const char *file, int line, ... ) { - void *v = ExAllocatePool( NonPagedPool, bytes ); - if( v ) TrackWithTag( 'fbsd', v, file, line ); - return v; + if( !OtcpEvent.TCPMalloc ) panic("no malloc"); + return OtcpEvent.TCPMalloc + ( OtcpEvent.ClientData, + (OSK_UINT)bytes, (OSK_PCHAR)file, (OSK_UINT)line ); } void fbsd_free( void *data, const char *file, int line, ... ) { - UntrackFL( file, line, data ); - ExFreePool( data ); + if( !OtcpEvent.TCPFree ) panic("no free"); + OtcpEvent.TCPFree( OtcpEvent.ClientData, + data, (OSK_PCHAR)file, (OSK_UINT)line ); } void InitOskitTCP() { @@ -80,7 +81,7 @@ void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) { for( i = 0; i < Len; i++ ) { if( i && !(i & 0xf) ) DbgPrint( "\n" ); - if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) ); + if( !(i & 0xf) ) DbgPrint( "%08x: ", (OSK_UINT)(Data + i) ); DbgPrint( " %02x", Data[i] ); } DbgPrint("\n"); @@ -163,8 +164,8 @@ size_t len; return error; } -int OskitTCPBind( PVOID socket, PVOID connection, - PVOID nam, OSK_UINT namelen ) { +int OskitTCPBind( void *socket, void *connection, + void *nam, OSK_UINT namelen ) { int error = EFAULT; struct socket *so = socket; struct mbuf sabuf = { 0 }; @@ -181,7 +182,7 @@ int OskitTCPBind( PVOID socket, PVOID connection, addr.sa_family = addr.sa_len; addr.sa_len = sizeof(struct sockaddr); - OskitDumpBuffer( (PCHAR)&addr, sizeof(addr) ); + OskitDumpBuffer( (OSK_PCHAR)&addr, sizeof(addr) ); error = sobind(so, &sabuf); @@ -189,8 +190,8 @@ int OskitTCPBind( PVOID socket, PVOID connection, return (error); } -int OskitTCPConnect( PVOID socket, PVOID connection, - PVOID nam, OSK_UINT namelen ) { +int OskitTCPConnect( void *socket, void *connection, + void *nam, OSK_UINT namelen ) { struct socket *so = socket; struct connect_args _uap = { 0, nam, namelen @@ -312,10 +313,10 @@ int OskitTCPListen( void *socket, int backlog ) { } void OskitTCPSetAddress( void *socket, - ULONG LocalAddress, - USHORT LocalPort, - ULONG RemoteAddress, - USHORT RemotePort ) { + OSK_UINT LocalAddress, + OSK_UI16 LocalPort, + OSK_UINT RemoteAddress, + OSK_UI16 RemotePort ) { struct socket *so = socket; struct inpcb *inp = so->so_pcb; inp->inp_laddr.s_addr = LocalAddress; @@ -358,7 +359,7 @@ struct ifaddr *ifa_iffind(struct sockaddr *addr, int type) void oskittcp_die( const char *file, int line ) { DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, line); - KeBugCheck(0); + *((int *)0) = 0; } /* Stuff supporting the BSD network-interface interface */ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/malloc.c b/reactos/drivers/lib/oskittcp/oskittcp/malloc.c deleted file mode 100644 index 2d3fb43500a..00000000000 --- a/reactos/drivers/lib/oskittcp/oskittcp/malloc.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include -#include - -void *fbsd_malloc( size_t size, char *file, int line, ... ) { - void *v; - v = ExAllocatePool( NonPagedPool, size ); - if( v ) TrackWithTag(FBSD_MALLOC,v,file,line); - return v; -} - -void fbsd_free( void *data, char *file, int line, ... ) { - UntrackFL(file,line,data); - ExFreePool( data ); -} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c index 04a6c3aae5f..35efb719a8a 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c @@ -1,70 +1,23 @@ -#include #include -#include #include #include #include -typedef struct _SLEEPING_THREAD { - LIST_ENTRY Entry; - PVOID SleepToken; - KEVENT Event; -} SLEEPING_THREAD, *PSLEEPING_THREAD; - -LIST_ENTRY SleepingThreadsList; -FAST_MUTEX SleepingThreadsLock; - /* clock_init */ int ncallout = 256; struct callout *callout; void init_freebsd_sched() { - ExInitializeFastMutex( &SleepingThreadsLock ); - InitializeListHead( &SleepingThreadsList ); } int tsleep( void *token, int priority, char *wmesg, int tmio ) { - KIRQL OldIrql; - KEVENT Event; - PLIST_ENTRY Entry; - PSLEEPING_THREAD SleepingThread; - - OS_DbgPrint(OSK_MID_TRACE, - ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", - token, priority, wmesg, tmio)); - - SleepingThread = ExAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); - if( SleepingThread ) { - KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); - SleepingThread->SleepToken = token; - - ExAcquireFastMutex( &SleepingThreadsLock ); - InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); - ExReleaseFastMutex( &SleepingThreadsLock ); - - OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); - KeWaitForSingleObject( &SleepingThread->Event, - WrSuspended, - KernelMode, - TRUE, - NULL ); - - ExAcquireFastMutex( &SleepingThreadsLock ); - RemoveEntryList( &SleepingThread->Entry ); - ExReleaseFastMutex( &SleepingThreadsLock ); - - ExFreePool( SleepingThread ); - } - OS_DbgPrint(OSK_MID_TRACE,("Waiting finished: %x\n", token)); - return 0; + if( !OtcpEvent.Sleep ) panic("no sleep"); + return + OtcpEvent.Sleep( OtcpEvent.ClientData, token, priority, wmesg, tmio ); } void wakeup( struct socket *so, void *token ) { - KIRQL OldIrql; - KEVENT Event; - PLIST_ENTRY Entry; - PSLEEPING_THREAD SleepingThread; - UINT flags = 0; + OSK_UINT flags = 0; OS_DbgPrint (OSK_MID_TRACE,("XXX Bytes to receive: %d\n", so->so_rcv.sb_cc)); @@ -92,18 +45,9 @@ void wakeup( struct socket *so, void *token ) { so ? so->so_connection : 0, flags ); - ExAcquireFastMutex( &SleepingThreadsLock ); - Entry = SleepingThreadsList.Flink; - while( Entry != &SleepingThreadsList ) { - SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); - OS_DbgPrint(OSK_MID_TRACE,("Sleeper @ %x\n", SleepingThread)); - if( SleepingThread->SleepToken == token ) { - OS_DbgPrint(OSK_MID_TRACE,("Setting event to wake %x\n", token)); - KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE ); - } - Entry = Entry->Flink; - } - ExReleaseFastMutex( &SleepingThreadsLock ); + if( OtcpEvent.Wakeup ) + OtcpEvent.Wakeup( OtcpEvent.ClientData, token ); + OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token)); } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c index f315e3d1030..c283b2068fb 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c @@ -278,8 +278,6 @@ tcp_usrreq(so, req, m, nam, control) case PRU_SEND_EOF: case PRU_SEND: sbappend(&so->so_snd, m); - OS_DbgPrint(OSK_MID_TRACE,("%d Bytes to send:\n", m->m_len)); - OskitDumpBuffer(m->m_data, m->m_len); if (nam && tp->t_state < TCPS_SYN_SENT) { /* * Do implied connect if not yet connected, diff --git a/reactos/drivers/net/tcpip/include/tcp.h b/reactos/drivers/net/tcpip/include/tcp.h index 569f146027f..b8468b3ab4b 100644 --- a/reactos/drivers/net/tcpip/include/tcp.h +++ b/reactos/drivers/net/tcpip/include/tcp.h @@ -51,6 +51,11 @@ typedef struct TCPv4_PSEUDO_HEADER { USHORT TCPLength; /* Size of TCP segment */ } __attribute__((packed)) TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER; +typedef struct _SLEEPING_THREAD { + LIST_ENTRY Entry; + PVOID SleepToken; + KEVENT Event; +} SLEEPING_THREAD, *PSLEEPING_THREAD; /* Retransmission timeout constants */ diff --git a/reactos/drivers/net/tcpip/transport/tcp/event.c b/reactos/drivers/net/tcpip/transport/tcp/event.c index 6415e05a54c..ceca2b3e4cc 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/event.c +++ b/reactos/drivers/net/tcpip/transport/tcp/event.c @@ -11,6 +11,8 @@ #include "precomp.h" extern ULONG TCP_IPIdentification; +extern LIST_ENTRY SleepingThreadsList; +extern FAST_MUTEX SleepingThreadsLock; int TCPSocketState(void *ClientData, void *WhichSocket, @@ -113,8 +115,8 @@ void TCPPacketSendComplete( PVOID Context, int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { NTSTATUS Status; - NDIS_STATUS NdisStatus; KIRQL OldIrql; + NDIS_STATUS NdisStatus; ROUTE_CACHE_NODE *RCN; IP_PACKET Packet = { 0 }; IP_ADDRESS RemoteAddress, LocalAddress; @@ -179,3 +181,67 @@ end: else return 0; } +void *TCPMalloc( void *ClientData, + OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) { + void *v = ExAllocatePool( NonPagedPool, Bytes ); + if( v ) TrackWithTag( FOURCC('f','b','s','d'), v, File, Line ); + return v; +} + +void TCPFree( void *ClientData, + void *data, OSK_PCHAR File, OSK_UINT Line ) { + UntrackFL( File, Line, data ); + ExFreePool( data ); +} + +int TCPSleep( void *ClientData, void *token, int priority, char *msg, + int tmio ) { + PSLEEPING_THREAD SleepingThread; + + TI_DbgPrint(MID_TRACE, + ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", + token, priority, msg, tmio)); + + SleepingThread = ExAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); + if( SleepingThread ) { + KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); + SleepingThread->SleepToken = token; + + ExAcquireFastMutex( &SleepingThreadsLock ); + InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); + ExReleaseFastMutex( &SleepingThreadsLock ); + + TI_DbgPrint(MID_TRACE,("Waiting on %x\n", token)); + KeWaitForSingleObject( &SleepingThread->Event, + WrSuspended, + KernelMode, + TRUE, + NULL ); + + ExAcquireFastMutex( &SleepingThreadsLock ); + RemoveEntryList( &SleepingThread->Entry ); + ExReleaseFastMutex( &SleepingThreadsLock ); + + ExFreePool( SleepingThread ); + } + TI_DbgPrint(MID_TRACE,("Waiting finished: %x\n", token)); + return 0; +} + +void TCPWakeup( void *ClientData, void *token ) { + PLIST_ENTRY Entry; + PSLEEPING_THREAD SleepingThread; + + ExAcquireFastMutex( &SleepingThreadsLock ); + Entry = SleepingThreadsList.Flink; + while( Entry != &SleepingThreadsList ) { + SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); + TI_DbgPrint(MID_TRACE,("Sleeper @ %x\n", SleepingThread)); + if( SleepingThread->SleepToken == token ) { + TI_DbgPrint(MID_TRACE,("Setting event to wake %x\n", token)); + KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE ); + } + Entry = Entry->Flink; + } + ExReleaseFastMutex( &SleepingThreadsLock ); +} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index 3ff4c884687..808099c40bc 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -14,6 +14,8 @@ LONG TCP_IPIdentification = 0; static BOOLEAN TCPInitialized = FALSE; static NPAGED_LOOKASIDE_LIST TCPSegmentList; +LIST_ENTRY SleepingThreadsList; +FAST_MUTEX SleepingThreadsLock; VOID TCPReceive(PNET_TABLE_ENTRY NTE, PIP_PACKET IPPacket) /* @@ -49,11 +51,25 @@ POSK_IFADDR TCPFindInterface( void *ClientData, OSK_UINT FindType, OSK_SOCKADDR *ReqAddr ); +void *TCPMalloc( void *ClientData, + OSK_UINT bytes, OSK_PCHAR file, OSK_UINT line ); +void TCPFree( void *ClientData, + void *data, OSK_PCHAR file, OSK_UINT line ); + +int TCPSleep( void *ClientData, void *token, int priority, char *msg, + int tmio ); + +void TCPWakeup( void *ClientData, void *token ); + OSKITTCP_EVENT_HANDLERS EventHandlers = { - NULL, /* Client Data */ - TCPSocketState, /* SocketState */ - TCPPacketSend, /* PacketSend */ + NULL, /* Client Data */ + TCPSocketState, /* SocketState */ + TCPPacketSend, /* PacketSend */ TCPFindInterface, /* FindInterface */ + TCPMalloc, /* Malloc */ + TCPFree, /* Free */ + TCPSleep, /* Sleep */ + TCPWakeup /* Wakeup */ }; NTSTATUS TCPStartup(VOID) @@ -63,6 +79,9 @@ NTSTATUS TCPStartup(VOID) * Status of operation */ { + ExInitializeFastMutex( &SleepingThreadsLock ); + InitializeListHead( &SleepingThreadsList ); + InitOskitTCP(); RegisterOskitTCPEventHandlers( &EventHandlers ); @@ -224,10 +243,16 @@ NTSTATUS TCPConnect NTSTATUS TCPClose ( PTDI_REQUEST Request ) { PCONNECTION_ENDPOINT Connection; - + NTSTATUS Status; Connection = Request->Handle.ConnectionContext; - return TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); + TI_DbgPrint(MID_TRACE,("TCPClose started\n")); + + Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); + + TI_DbgPrint(MID_TRACE,("TCPClose finished %x\n", Status)); + + return Status; } NTSTATUS TCPListen