- NewState & SEL_CONNECT ? 'C' : 'c',
- NewState & SEL_READ ? 'R' : 'r',
- NewState & SEL_FIN ? 'F' : 'f',
- NewState & SEL_ACCEPT ? 'A' : 'a'));
+ NewState & SEL_CONNECT ? 'C' : 'c',
+ NewState & SEL_READ ? 'R' : 'r',
+ NewState & SEL_FIN ? 'F' : 'f',
+ NewState & SEL_ACCEPT ? 'A' : 'a'));
- TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
- Connection = FileFindConnectionByContext( WhichSocket );
- if( !Connection )
- return 0;
- else
- TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
+ TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
+ Connection = FileFindConnectionByContext( WhichSocket );
+ if( !Connection )
+ return 0;
+ else
+ TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
- if( !Connection->Signalled ) {
- Connection->Signalled = TRUE;
- InsertTailList( &SignalledConnections, &Connection->SignalList );
+
+ NewState = HandleSignalledConnection(Connection);
+
+ KeAcquireSpinLock(&SignalledConnectionsLock, &OldIrql);
+ if ((NewState == 0 || NewState == SEL_FIN) &&
+ (OldState != 0 && OldState != SEL_FIN))
+ {
+ RemoveEntryList(&Connection->SignalList);
+ }
+ else if (NewState != 0 && NewState != SEL_FIN)
+ {
+ InsertTailList(&SignalledConnectionsList, &Connection->SignalList);
- PNDIS_PACKET NdisPacket,
- NDIS_STATUS NdisStatus ) {
+ PNDIS_PACKET NdisPacket,
+ NDIS_STATUS NdisStatus ) {
TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
FreeNdisPacket(NdisPacket);
TI_DbgPrint(DEBUG_TCP,("done\n"));
TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
FreeNdisPacket(NdisPacket);
TI_DbgPrint(DEBUG_TCP,("done\n"));
- Header = (PIPv4_HEADER)data;
- LocalAddress.Type = IP_ADDRESS_V4;
- LocalAddress.Address.IPv4Address = Header->SrcAddr;
- RemoteAddress.Type = IP_ADDRESS_V4;
- RemoteAddress.Address.IPv4Address = Header->DstAddr;
+ Header = (PIPv4_HEADER)data;
+ LocalAddress.Type = IP_ADDRESS_V4;
+ LocalAddress.Address.IPv4Address = Header->SrcAddr;
+ RemoteAddress.Type = IP_ADDRESS_V4;
+ RemoteAddress.Address.IPv4Address = Header->DstAddr;
- TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
- OskitDumpBuffer( data, len );
- return OSK_EINVAL;
+ TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
+ OskitDumpBuffer( data, len );
+ return OSK_EINVAL;
- TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
- return OSK_EADDRNOTAVAIL;
+ TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
+ return OSK_EADDRNOTAVAIL;
- NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
- MaxLLHeaderSize + len );
+ NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL, len );
- GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize,
- (PCHAR *)&Packet.Header, &Packet.ContigSize );
+ GetDataPtr( Packet.NdisPacket, 0,
+ (PCHAR *)&Packet.Header, &Packet.ContigSize );
}
int TCPSleep( void *ClientData, void *token, int priority, char *msg,
}
int TCPSleep( void *ClientData, void *token, int priority, char *msg,
- ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
- token, priority, msg, tmio));
+ ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
+ token, priority, msg, tmio));
- KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE );
- SleepingThread->SleepToken = token;
+ KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE );
+ SleepingThread->SleepToken = token;
- TcpipRecursiveMutexLeave( &TCPLock );
+ TcpipRecursiveMutexLeave( &TCPLock );
+
+ TcpipAcquireFastMutex( &SleepingThreadsLock );
+ InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
+ TcpipReleaseFastMutex( &SleepingThreadsLock );
- TcpipAcquireFastMutex( &SleepingThreadsLock );
- InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
- TcpipReleaseFastMutex( &SleepingThreadsLock );
+ Timeout.QuadPart = Int32x32To64(tmio, -10000);
- TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
- KeWaitForSingleObject( &SleepingThread->Event,
- WrSuspended,
- KernelMode,
- TRUE,
- NULL );
+ TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
+ KeWaitForSingleObject( &SleepingThread->Event,
+ Executive,
+ KernelMode,
+ TRUE,
+ (tmio != 0) ? &Timeout : NULL );
- TcpipAcquireFastMutex( &SleepingThreadsLock );
- RemoveEntryList( &SleepingThread->Entry );
- TcpipReleaseFastMutex( &SleepingThreadsLock );
+ TcpipAcquireFastMutex( &SleepingThreadsLock );
+ RemoveEntryList( &SleepingThread->Entry );
+ TcpipReleaseFastMutex( &SleepingThreadsLock );
TcpipAcquireFastMutex( &SleepingThreadsLock );
Entry = SleepingThreadsList.Flink;
while( Entry != &SleepingThreadsList ) {
TcpipAcquireFastMutex( &SleepingThreadsLock );
Entry = SleepingThreadsList.Flink;
while( Entry != &SleepingThreadsList ) {
- SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
- TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
- if( SleepingThread->SleepToken == token ) {
- TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
- KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
- }
- Entry = Entry->Flink;
+ SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
+ TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
+ if( SleepingThread->SleepToken == token ) {
+ TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
+ KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
+ }
+ Entry = Entry->Flink;
-#define SIGNATURE_LARGE TAG('L','L','L','L')
-#define SIGNATURE_SMALL TAG('S','S','S','S')
-#define SIGNATURE_OTHER TAG('O','O','O','O')
-#define TCP_TAG TAG('T','C','P',' ')
+#define SIGNATURE_LARGE 'LLLL'
+#define SIGNATURE_SMALL 'SSSS'
+#define SIGNATURE_OTHER 'OOOO'
+#define TCP_TAG ' PCT'
#if 0 != MEM_PROFILE
static OSK_UINT *Sizes = NULL, *Counts = NULL, ArrayAllocated = 0;
static OSK_UINT ArrayUsed = 0, AllocationCount = 0;
#if 0 != MEM_PROFILE
static OSK_UINT *Sizes = NULL, *Counts = NULL, ArrayAllocated = 0;
static OSK_UINT ArrayUsed = 0, AllocationCount = 0;
- if ( ArrayAllocated <= ArrayUsed ) {
- NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated );
- NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) );
- if ( NULL != NewArray ) {
- if ( 0 != ArrayAllocated ) {
- memcpy( NewArray, Sizes,
- ArrayAllocated * sizeof( OSK_UINT ) );
- exFreePool( Sizes );
- memcpy( NewArray + NewSize, Counts,
- ArrayAllocated * sizeof( OSK_UINT ) );
- exFreePool( Counts );
- }
- Sizes = NewArray;
- Counts = NewArray + NewSize;
- ArrayAllocated = NewSize;
- } else if ( 0 != ArrayAllocated ) {
- exFreePool( Sizes );
- exFreePool( Counts );
- ArrayAllocated = 0;
- }
- }
- if ( ArrayUsed < ArrayAllocated ) {
- Sizes[ArrayUsed] = Bytes;
- Counts[ArrayUsed] = 1;
- ArrayUsed++;
- }
+ if ( ArrayAllocated <= ArrayUsed ) {
+ NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated );
+ NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) );
+ if ( NULL != NewArray ) {
+ if ( 0 != ArrayAllocated ) {
+ memcpy( NewArray, Sizes,
+ ArrayAllocated * sizeof( OSK_UINT ) );
+ exFreePool( Sizes );
+ memcpy( NewArray + NewSize, Counts,
+ ArrayAllocated * sizeof( OSK_UINT ) );
+ exFreePool( Counts );
+ }
+ Sizes = NewArray;
+ Counts = NewArray + NewSize;
+ ArrayAllocated = NewSize;
+ } else if ( 0 != ArrayAllocated ) {
+ exFreePool( Sizes );
+ exFreePool( Counts );
+ ArrayAllocated = 0;
+ }
+ }
+ if ( ArrayUsed < ArrayAllocated ) {
+ Sizes[ArrayUsed] = Bytes;
+ Counts[ArrayUsed] = 1;
+ ArrayUsed++;
+ }
- TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n"));
- for ( i = 0; i < ArrayUsed; i++ ) {
- TI_DbgPrint(DEBUG_TCP,
- ("Size %4u Count %5u\n", Sizes[i], Counts[i]));
- }
- TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n"));
+ TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n"));
+ for ( i = 0; i < ArrayUsed; i++ ) {
+ TI_DbgPrint(DEBUG_TCP,
+ ("Size %4u Count %5u\n", Sizes[i], Counts[i]));
+ }
+ TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n"));
- v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) );
- Signature = SIGNATURE_OTHER;
+ v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) );
+ Signature = SIGNATURE_OTHER;
- *((ULONG *) v) = Signature;
- v = (void *)((char *) v + sizeof(ULONG));
- TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
+ *((ULONG *) v) = Signature;
+ v = (void *)((char *) v + sizeof(ULONG));
+ TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
UntrackFL( (PCHAR)File, Line, data, FOURCC('f','b','s','d') );
data = (void *)((char *) data - sizeof(ULONG));
Signature = *((ULONG *) data);
if ( SIGNATURE_SMALL == Signature ) {
UntrackFL( (PCHAR)File, Line, data, FOURCC('f','b','s','d') );
data = (void *)((char *) data - sizeof(ULONG));
Signature = *((ULONG *) data);
if ( SIGNATURE_SMALL == Signature ) {