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:
Art Yerkes 2004-08-29 20:04:42 +00:00
parent e78fa73912
commit aa3eb8fc7c
10 changed files with 151 additions and 108 deletions

View file

@ -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;

View file

@ -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 */

View file

@ -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 \

View file

@ -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 */

View file

@ -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 );
}

View file

@ -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));
} }

View file

@ -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,

View file

@ -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 */

View file

@ -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 );
}

View file

@ -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