mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
Oskit can now be linked from userland. This is part one of my plan.
tcpip: provide malloc + free, sleep + wakeup functions oskittcp: remove functions and headers that imply km and supply them from the user. tcp_usrreq: i was printing a possibly free mbuf here. svn path=/trunk/; revision=10734
This commit is contained in:
parent
e78fa73912
commit
aa3eb8fc7c
10 changed files with 151 additions and 108 deletions
|
@ -67,11 +67,32 @@ typedef struct ifaddr *(*OSKITTCP_FIND_INTERFACE)
|
||||||
OSK_UINT FindType,
|
OSK_UINT FindType,
|
||||||
struct sockaddr *ReqAddr );
|
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 {
|
typedef struct _OSKITTCP_EVENT_HANDLERS {
|
||||||
void *ClientData;
|
void *ClientData;
|
||||||
OSKITTCP_SOCKET_STATE SocketState;
|
OSKITTCP_SOCKET_STATE SocketState;
|
||||||
OSKITTCP_SEND_PACKET PacketSend;
|
OSKITTCP_SEND_PACKET PacketSend;
|
||||||
OSKITTCP_FIND_INTERFACE FindInterface;
|
OSKITTCP_FIND_INTERFACE FindInterface;
|
||||||
|
OSKITTCP_MALLOC TCPMalloc;
|
||||||
|
OSKITTCP_FREE TCPFree;
|
||||||
|
OSKITTCP_SLEEP Sleep;
|
||||||
|
OSKITTCP_WAKEUP Wakeup;
|
||||||
} OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS;
|
} OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS;
|
||||||
|
|
||||||
extern OSKITTCP_EVENT_HANDLERS OtcpEvent;
|
extern OSKITTCP_EVENT_HANDLERS OtcpEvent;
|
||||||
|
|
|
@ -23,10 +23,10 @@ typedef struct ifaddr {
|
||||||
struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */
|
struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */
|
||||||
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
|
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
|
||||||
struct sockaddr *ifa_netmask; /* used to determine subnet */
|
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 */
|
short ifa_refcnt; /* extra to malloc for link info */
|
||||||
int ifa_metric; /* cost of going out this interface */
|
int ifa_metric; /* cost of going out this interface */
|
||||||
u_short ifa_mtu; /* MTU */
|
unsigned short ifa_mtu; /* MTU */
|
||||||
} OSK_IFADDR, *POSK_IFADDR;
|
} OSK_IFADDR, *POSK_IFADDR;
|
||||||
|
|
||||||
#define IFA_ROUTE RTF_UP /* route installed */
|
#define IFA_ROUTE RTF_UP /* route installed */
|
||||||
|
|
|
@ -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 = ../../..
|
PATH_TO_TOP = ../../..
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ REACTOS_OBJECTS = \
|
||||||
oskittcp/ip_output.o \
|
oskittcp/ip_output.o \
|
||||||
oskittcp/kern_clock.o \
|
oskittcp/kern_clock.o \
|
||||||
oskittcp/kern_subr.o \
|
oskittcp/kern_subr.o \
|
||||||
oskittcp/malloc.o \
|
|
||||||
oskittcp/param.o \
|
oskittcp/param.o \
|
||||||
oskittcp/radix.o \
|
oskittcp/radix.o \
|
||||||
oskittcp/random.o \
|
oskittcp/random.o \
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <oskittcp.h>
|
#include <oskittcp.h>
|
||||||
#include <oskitdebug.h>
|
#include <oskitdebug.h>
|
||||||
#include <ntddk.h>
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -28,14 +27,16 @@ unsigned volatile ipending;
|
||||||
struct timeval boottime;
|
struct timeval boottime;
|
||||||
|
|
||||||
void *fbsd_malloc( unsigned int bytes, const char *file, int line, ... ) {
|
void *fbsd_malloc( unsigned int bytes, const char *file, int line, ... ) {
|
||||||
void *v = ExAllocatePool( NonPagedPool, bytes );
|
if( !OtcpEvent.TCPMalloc ) panic("no malloc");
|
||||||
if( v ) TrackWithTag( 'fbsd', v, file, line );
|
return OtcpEvent.TCPMalloc
|
||||||
return v;
|
( OtcpEvent.ClientData,
|
||||||
|
(OSK_UINT)bytes, (OSK_PCHAR)file, (OSK_UINT)line );
|
||||||
}
|
}
|
||||||
|
|
||||||
void fbsd_free( void *data, const char *file, int line, ... ) {
|
void fbsd_free( void *data, const char *file, int line, ... ) {
|
||||||
UntrackFL( file, line, data );
|
if( !OtcpEvent.TCPFree ) panic("no free");
|
||||||
ExFreePool( data );
|
OtcpEvent.TCPFree( OtcpEvent.ClientData,
|
||||||
|
data, (OSK_PCHAR)file, (OSK_UINT)line );
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitOskitTCP() {
|
void InitOskitTCP() {
|
||||||
|
@ -80,7 +81,7 @@ void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) {
|
||||||
|
|
||||||
for( i = 0; i < Len; i++ ) {
|
for( i = 0; i < Len; i++ ) {
|
||||||
if( i && !(i & 0xf) ) DbgPrint( "\n" );
|
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( " %02x", Data[i] );
|
||||||
}
|
}
|
||||||
DbgPrint("\n");
|
DbgPrint("\n");
|
||||||
|
@ -163,8 +164,8 @@ size_t len;
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int OskitTCPBind( PVOID socket, PVOID connection,
|
int OskitTCPBind( void *socket, void *connection,
|
||||||
PVOID nam, OSK_UINT namelen ) {
|
void *nam, OSK_UINT namelen ) {
|
||||||
int error = EFAULT;
|
int error = EFAULT;
|
||||||
struct socket *so = socket;
|
struct socket *so = socket;
|
||||||
struct mbuf sabuf = { 0 };
|
struct mbuf sabuf = { 0 };
|
||||||
|
@ -181,7 +182,7 @@ int OskitTCPBind( PVOID socket, PVOID connection,
|
||||||
addr.sa_family = addr.sa_len;
|
addr.sa_family = addr.sa_len;
|
||||||
addr.sa_len = sizeof(struct sockaddr);
|
addr.sa_len = sizeof(struct sockaddr);
|
||||||
|
|
||||||
OskitDumpBuffer( (PCHAR)&addr, sizeof(addr) );
|
OskitDumpBuffer( (OSK_PCHAR)&addr, sizeof(addr) );
|
||||||
|
|
||||||
error = sobind(so, &sabuf);
|
error = sobind(so, &sabuf);
|
||||||
|
|
||||||
|
@ -189,8 +190,8 @@ int OskitTCPBind( PVOID socket, PVOID connection,
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
int OskitTCPConnect( PVOID socket, PVOID connection,
|
int OskitTCPConnect( void *socket, void *connection,
|
||||||
PVOID nam, OSK_UINT namelen ) {
|
void *nam, OSK_UINT namelen ) {
|
||||||
struct socket *so = socket;
|
struct socket *so = socket;
|
||||||
struct connect_args _uap = {
|
struct connect_args _uap = {
|
||||||
0, nam, namelen
|
0, nam, namelen
|
||||||
|
@ -312,10 +313,10 @@ int OskitTCPListen( void *socket, int backlog ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OskitTCPSetAddress( void *socket,
|
void OskitTCPSetAddress( void *socket,
|
||||||
ULONG LocalAddress,
|
OSK_UINT LocalAddress,
|
||||||
USHORT LocalPort,
|
OSK_UI16 LocalPort,
|
||||||
ULONG RemoteAddress,
|
OSK_UINT RemoteAddress,
|
||||||
USHORT RemotePort ) {
|
OSK_UI16 RemotePort ) {
|
||||||
struct socket *so = socket;
|
struct socket *so = socket;
|
||||||
struct inpcb *inp = so->so_pcb;
|
struct inpcb *inp = so->so_pcb;
|
||||||
inp->inp_laddr.s_addr = LocalAddress;
|
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 ) {
|
void oskittcp_die( const char *file, int line ) {
|
||||||
DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, 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 */
|
/* Stuff supporting the BSD network-interface interface */
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
#include <oskittcp.h>
|
|
||||||
#include <oskitdebug.h>
|
|
||||||
#include <ntddk.h>
|
|
||||||
#include <memtrack.h>
|
|
||||||
|
|
||||||
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 );
|
|
||||||
}
|
|
|
@ -1,70 +1,23 @@
|
||||||
#include <roscfg.h>
|
|
||||||
#include <oskittcp.h>
|
#include <oskittcp.h>
|
||||||
#include <ntddk.h>
|
|
||||||
#include <sys/callout.h>
|
#include <sys/callout.h>
|
||||||
#include <oskitfreebsd.h>
|
#include <oskitfreebsd.h>
|
||||||
#include <oskitdebug.h>
|
#include <oskitdebug.h>
|
||||||
|
|
||||||
typedef struct _SLEEPING_THREAD {
|
|
||||||
LIST_ENTRY Entry;
|
|
||||||
PVOID SleepToken;
|
|
||||||
KEVENT Event;
|
|
||||||
} SLEEPING_THREAD, *PSLEEPING_THREAD;
|
|
||||||
|
|
||||||
LIST_ENTRY SleepingThreadsList;
|
|
||||||
FAST_MUTEX SleepingThreadsLock;
|
|
||||||
|
|
||||||
/* clock_init */
|
/* clock_init */
|
||||||
int ncallout = 256;
|
int ncallout = 256;
|
||||||
struct callout *callout;
|
struct callout *callout;
|
||||||
|
|
||||||
void init_freebsd_sched() {
|
void init_freebsd_sched() {
|
||||||
ExInitializeFastMutex( &SleepingThreadsLock );
|
|
||||||
InitializeListHead( &SleepingThreadsList );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsleep( void *token, int priority, char *wmesg, int tmio ) {
|
int tsleep( void *token, int priority, char *wmesg, int tmio ) {
|
||||||
KIRQL OldIrql;
|
if( !OtcpEvent.Sleep ) panic("no sleep");
|
||||||
KEVENT Event;
|
return
|
||||||
PLIST_ENTRY Entry;
|
OtcpEvent.Sleep( OtcpEvent.ClientData, token, priority, wmesg, tmio );
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wakeup( struct socket *so, void *token ) {
|
void wakeup( struct socket *so, void *token ) {
|
||||||
KIRQL OldIrql;
|
OSK_UINT flags = 0;
|
||||||
KEVENT Event;
|
|
||||||
PLIST_ENTRY Entry;
|
|
||||||
PSLEEPING_THREAD SleepingThread;
|
|
||||||
UINT flags = 0;
|
|
||||||
|
|
||||||
OS_DbgPrint
|
OS_DbgPrint
|
||||||
(OSK_MID_TRACE,("XXX Bytes to receive: %d\n", so->so_rcv.sb_cc));
|
(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,
|
so ? so->so_connection : 0,
|
||||||
flags );
|
flags );
|
||||||
|
|
||||||
ExAcquireFastMutex( &SleepingThreadsLock );
|
if( OtcpEvent.Wakeup )
|
||||||
Entry = SleepingThreadsList.Flink;
|
OtcpEvent.Wakeup( OtcpEvent.ClientData, token );
|
||||||
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 );
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token));
|
OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -278,8 +278,6 @@ tcp_usrreq(so, req, m, nam, control)
|
||||||
case PRU_SEND_EOF:
|
case PRU_SEND_EOF:
|
||||||
case PRU_SEND:
|
case PRU_SEND:
|
||||||
sbappend(&so->so_snd, m);
|
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) {
|
if (nam && tp->t_state < TCPS_SYN_SENT) {
|
||||||
/*
|
/*
|
||||||
* Do implied connect if not yet connected,
|
* Do implied connect if not yet connected,
|
||||||
|
|
|
@ -51,6 +51,11 @@ typedef struct TCPv4_PSEUDO_HEADER {
|
||||||
USHORT TCPLength; /* Size of TCP segment */
|
USHORT TCPLength; /* Size of TCP segment */
|
||||||
} __attribute__((packed)) TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER;
|
} __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 */
|
/* Retransmission timeout constants */
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
extern ULONG TCP_IPIdentification;
|
extern ULONG TCP_IPIdentification;
|
||||||
|
extern LIST_ENTRY SleepingThreadsList;
|
||||||
|
extern FAST_MUTEX SleepingThreadsLock;
|
||||||
|
|
||||||
int TCPSocketState(void *ClientData,
|
int TCPSocketState(void *ClientData,
|
||||||
void *WhichSocket,
|
void *WhichSocket,
|
||||||
|
@ -113,8 +115,8 @@ void TCPPacketSendComplete( PVOID Context,
|
||||||
|
|
||||||
int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
|
int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
NDIS_STATUS NdisStatus;
|
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
NDIS_STATUS NdisStatus;
|
||||||
ROUTE_CACHE_NODE *RCN;
|
ROUTE_CACHE_NODE *RCN;
|
||||||
IP_PACKET Packet = { 0 };
|
IP_PACKET Packet = { 0 };
|
||||||
IP_ADDRESS RemoteAddress, LocalAddress;
|
IP_ADDRESS RemoteAddress, LocalAddress;
|
||||||
|
@ -179,3 +181,67 @@ end:
|
||||||
else return 0;
|
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 );
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
LONG TCP_IPIdentification = 0;
|
LONG TCP_IPIdentification = 0;
|
||||||
static BOOLEAN TCPInitialized = FALSE;
|
static BOOLEAN TCPInitialized = FALSE;
|
||||||
static NPAGED_LOOKASIDE_LIST TCPSegmentList;
|
static NPAGED_LOOKASIDE_LIST TCPSegmentList;
|
||||||
|
LIST_ENTRY SleepingThreadsList;
|
||||||
|
FAST_MUTEX SleepingThreadsLock;
|
||||||
|
|
||||||
VOID TCPReceive(PNET_TABLE_ENTRY NTE, PIP_PACKET IPPacket)
|
VOID TCPReceive(PNET_TABLE_ENTRY NTE, PIP_PACKET IPPacket)
|
||||||
/*
|
/*
|
||||||
|
@ -49,11 +51,25 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
|
||||||
OSK_UINT FindType,
|
OSK_UINT FindType,
|
||||||
OSK_SOCKADDR *ReqAddr );
|
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 = {
|
OSKITTCP_EVENT_HANDLERS EventHandlers = {
|
||||||
NULL, /* Client Data */
|
NULL, /* Client Data */
|
||||||
TCPSocketState, /* SocketState */
|
TCPSocketState, /* SocketState */
|
||||||
TCPPacketSend, /* PacketSend */
|
TCPPacketSend, /* PacketSend */
|
||||||
TCPFindInterface, /* FindInterface */
|
TCPFindInterface, /* FindInterface */
|
||||||
|
TCPMalloc, /* Malloc */
|
||||||
|
TCPFree, /* Free */
|
||||||
|
TCPSleep, /* Sleep */
|
||||||
|
TCPWakeup /* Wakeup */
|
||||||
};
|
};
|
||||||
|
|
||||||
NTSTATUS TCPStartup(VOID)
|
NTSTATUS TCPStartup(VOID)
|
||||||
|
@ -63,6 +79,9 @@ NTSTATUS TCPStartup(VOID)
|
||||||
* Status of operation
|
* Status of operation
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
|
ExInitializeFastMutex( &SleepingThreadsLock );
|
||||||
|
InitializeListHead( &SleepingThreadsList );
|
||||||
|
|
||||||
InitOskitTCP();
|
InitOskitTCP();
|
||||||
RegisterOskitTCPEventHandlers( &EventHandlers );
|
RegisterOskitTCPEventHandlers( &EventHandlers );
|
||||||
|
|
||||||
|
@ -224,10 +243,16 @@ NTSTATUS TCPConnect
|
||||||
NTSTATUS TCPClose
|
NTSTATUS TCPClose
|
||||||
( PTDI_REQUEST Request ) {
|
( PTDI_REQUEST Request ) {
|
||||||
PCONNECTION_ENDPOINT Connection;
|
PCONNECTION_ENDPOINT Connection;
|
||||||
|
NTSTATUS Status;
|
||||||
Connection = Request->Handle.ConnectionContext;
|
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
|
NTSTATUS TCPListen
|
||||||
|
|
Loading…
Reference in a new issue