#include "precomp.h"
-extern ULONG TCP_IPIdentification;
-extern LIST_ENTRY SleepingThreadsList;
-extern FAST_MUTEX SleepingThreadsLock;
-extern RECURSIVE_MUTEX TCPLock;
-
int TCPSocketState(void *ClientData,
- void *WhichSocket,
+ void *WhichSocket,
void *WhichConnection,
OSK_UINT NewState ) {
- NTSTATUS Status = STATUS_SUCCESS;
PCONNECTION_ENDPOINT Connection = WhichConnection;
- PTCP_COMPLETION_ROUTINE Complete;
- PTDI_BUCKET Bucket;
- PLIST_ENTRY Entry;
- TI_DbgPrint(MID_TRACE,("Called: NewState %x (Conn %x) (Change %x)\n",
+ TI_DbgPrint(MID_TRACE,("Flags: %c%c%c%c\n",
+ NewState & SEL_CONNECT ? 'C' : 'c',
+ NewState & SEL_READ ? 'R' : 'r',
+ NewState & SEL_FIN ? 'F' : 'f',
+ NewState & SEL_ACCEPT ? 'A' : 'a'));
+
+ TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n",
NewState, Connection,
- Connection ? Connection->State ^ NewState :
+ Connection ? Connection->State ^ NewState :
NewState));
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
if( !Connection ) {
- TI_DbgPrint(MID_TRACE,("Socket closing.\n"));
+ TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
Connection = FileFindConnectionByContext( WhichSocket );
- if( !Connection ) {
- TcpipRecursiveMutexLeave( &TCPLock );
+ if( !Connection )
return 0;
- } else
- TI_DbgPrint(MID_TRACE,("Found socket %x\n", Connection));
+ else
+ TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
}
- if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
- !(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
- while( !IsListEmpty( &Connection->ConnectRequest ) ) {
- Connection->State |= NewState & (SEL_CONNECT | SEL_FIN);
- Entry = RemoveHeadList( &Connection->ConnectRequest );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
- TI_DbgPrint(MID_TRACE,
- ("Completing Connect Request %x\n", Bucket->Request));
- if( NewState & SEL_FIN ) Status = STATUS_CONNECTION_REFUSED;
- TcpipRecursiveMutexLeave( &TCPLock );
- Complete( Bucket->Request.RequestContext, Status, 0 );
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
- /* Frees the bucket allocated in TCPConnect */
- PoolFreeBuffer( Bucket );
- }
- }
- if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
- TI_DbgPrint(MID_TRACE,("Readable (or closed): irp list %s\n",
- IsListEmpty(&Connection->ReceiveRequest) ?
- "empty" : "nonempty"));
-
- while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
- PIRP Irp;
- OSK_UINT RecvLen = 0, Received = 0;
- OSK_PCHAR RecvBuffer = 0;
- PMDL Mdl;
- NTSTATUS Status;
-
- Entry = RemoveHeadList( &Connection->ReceiveRequest );
- Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
- Complete = Bucket->Request.RequestNotifyObject;
-
- TI_DbgPrint(MID_TRACE,
- ("Readable, Completing read request %x\n",
- Bucket->Request));
-
- Irp = Bucket->Request.RequestContext;
- Mdl = Irp->MdlAddress;
-
- TI_DbgPrint(MID_TRACE,
- ("Getting the user buffer from %x\n", Mdl));
-
- NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
-
- TI_DbgPrint(MID_TRACE,
- ("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
-
- if( (NewState & SEL_FIN) && !RecvLen ) {
- TI_DbgPrint(MID_TRACE, ("EOF From socket\n"));
- Status = STATUS_END_OF_FILE;
- Received = 0;
- } else {
- TI_DbgPrint(MID_TRACE, ("Connection: %x\n", Connection));
- TI_DbgPrint
- (MID_TRACE,
- ("Connection->SocketContext: %x\n",
- Connection->SocketContext));
- TI_DbgPrint(MID_TRACE, ("RecvBuffer: %x\n", RecvBuffer));
-
- Status = TCPTranslateError
- ( OskitTCPRecv( Connection->SocketContext,
- RecvBuffer,
- RecvLen,
- &Received,
- 0 ) );
- }
-
- TI_DbgPrint(MID_TRACE,("TCP Bytes: %d\n", Received));
-
- if( Status == STATUS_SUCCESS && Received != 0 ) {
- TI_DbgPrint(MID_TRACE,("Received %d bytes with status %x\n",
- Received, Status));
-
- TI_DbgPrint(MID_TRACE,
- ("Completing Receive Request: %x\n",
- Bucket->Request));
-
- TcpipRecursiveMutexLeave( &TCPLock );
- Complete( Bucket->Request.RequestContext,
- STATUS_SUCCESS, Received );
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
- } else if( Status == STATUS_PENDING ||
- (Status == STATUS_SUCCESS && Received == 0) ) {
- InsertHeadList( &Connection->ReceiveRequest,
- &Bucket->Entry );
- break;
- } else {
- TI_DbgPrint(MID_TRACE,
- ("Completing Receive request: %x %x\n",
- Bucket->Request, Status));
- TcpipRecursiveMutexLeave( &TCPLock );
- Complete( Bucket->Request.RequestContext, Status, 0 );
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
- }
- }
- }
+ TI_DbgPrint(MID_TRACE,("Connection signalled: %d\n",
+ Connection->Signalled));
- TcpipRecursiveMutexLeave( &TCPLock );
+ Connection->SignalState |= NewState;
+ if( !Connection->Signalled ) {
+ Connection->Signalled = TRUE;
+ InsertTailList( &SignalledConnections, &Connection->SignalList );
+ }
return 0;
}
void TCPPacketSendComplete( PVOID Context,
PNDIS_PACKET NdisPacket,
NDIS_STATUS NdisStatus ) {
- TI_DbgPrint(MID_TRACE,("called %x\n", NdisPacket));
+ TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
FreeNdisPacket(NdisPacket);
- TI_DbgPrint(MID_TRACE,("done\n"));
+ TI_DbgPrint(DEBUG_TCP,("done\n"));
}
#define STRINGIFY(x) #x
RemoteAddress.Type = IP_ADDRESS_V4;
RemoteAddress.Address.IPv4Address = Header->DstAddr;
} else {
- DbgPrint("Don't currently handle IPv6\n");
- KeBugCheck(4);
+ TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
+ OskitDumpBuffer( data, len );
+ return OSK_EINVAL;
}
RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4;
- DbgPrint("OSKIT SENDING PACKET *** %x -> %x\n",
- LocalAddress.Address.IPv4Address,
- RemoteAddress.Address.IPv4Address);
-
- if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
+ if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
+ TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
return OSK_EADDRNOTAVAIL;
+ }
- NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
+ NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
MaxLLHeaderSize + len );
-
+
if (NdisStatus != NDIS_STATUS_SUCCESS) {
- TI_DbgPrint(MAX_TRACE, ("Error from NDIS: %08x\n", NdisStatus));
- return STATUS_NO_MEMORY;
+ TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus));
+ return OSK_ENOBUFS;
}
- GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize,
+ GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize,
(PCHAR *)&Packet.Header, &Packet.ContigSize );
RtlCopyMemory( Packet.Header, data, len );
void *TCPMalloc( void *ClientData,
OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) {
void *v = PoolAllocateBuffer( Bytes );
- if( v ) TrackWithTag( FOURCC('f','b','s','d'), v, File, Line );
+ if( v ) TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
return v;
}
void TCPFree( void *ClientData,
void *data, OSK_PCHAR File, OSK_UINT Line ) {
- UntrackFL( File, Line, data );
+ UntrackFL( (PCHAR)File, Line, data );
PoolFreeBuffer( data );
}
int TCPSleep( void *ClientData, void *token, int priority, char *msg,
int tmio ) {
PSLEEPING_THREAD SleepingThread;
-
- TI_DbgPrint(MID_TRACE,
+
+ TI_DbgPrint(DEBUG_TCP,
("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
token, priority, msg, tmio));
InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
TcpipReleaseFastMutex( &SleepingThreadsLock );
- TI_DbgPrint(MID_TRACE,("Waiting on %x\n", token));
+ TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
KeWaitForSingleObject( &SleepingThread->Event,
WrSuspended,
KernelMode,
PoolFreeBuffer( SleepingThread );
}
- TI_DbgPrint(MID_TRACE,("Waiting finished: %x\n", token));
+ TI_DbgPrint(DEBUG_TCP,("Waiting finished: %x\n", token));
return 0;
}
Entry = SleepingThreadsList.Flink;
while( Entry != &SleepingThreadsList ) {
SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
- TI_DbgPrint(MID_TRACE,("Sleeper @ %x\n", SleepingThread));
+ TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
if( SleepingThread->SleepToken == token ) {
- TI_DbgPrint(MID_TRACE,("Setting event to wake %x\n", token));
+ TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
}
Entry = Entry->Flink;