OSK_UINT NewState ) {
PCONNECTION_ENDPOINT Connection = WhichConnection;
- ASSERT_LOCKED(&TCPLock);
-
- TI_DbgPrint(MID_TRACE,("Flags: %c%c%c%c\n",
+ TI_DbgPrint(DEBUG_TCP,("Connection: %x Flags: %c%c%c%c%c\n",
+ Connection,
NewState & SEL_CONNECT ? 'C' : 'c',
NewState & SEL_READ ? 'R' : 'r',
NewState & SEL_FIN ? 'F' : 'f',
- NewState & SEL_ACCEPT ? 'A' : 'a'));
+ NewState & SEL_ACCEPT ? 'A' : 'a',
+ NewState & SEL_WRITE ? 'W' : 'w'));
+
+ /* If this socket is missing its socket context, that means that it
+ * has been created as a new connection in sonewconn but not accepted
+ * yet. We can safely ignore event notifications on these sockets.
+ * Once they are accepted, they will get a socket context and we will
+ * be able to process them.
+ */
+ if (!Connection)
+ return 0;
TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n",
NewState, Connection,
- Connection ? Connection->State ^ NewState :
+ Connection->SignalState ^ NewState,
NewState));
- if( !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));
- }
-
- TI_DbgPrint(MID_TRACE,("Connection signalled: %d\n",
- Connection->Signalled));
+ Connection->SignalState = NewState;
- Connection->SignalState |= NewState;
- if( !Connection->Signalled ) {
- Connection->Signalled = TRUE;
- ExInterlockedInsertTailList( &SignalledConnectionsList, &Connection->SignalList, &SignalledConnectionsLock );
- }
+ HandleSignalledConnection(Connection);
return 0;
}
IP_ADDRESS RemoteAddress, LocalAddress;
PIPv4_HEADER Header;
- ASSERT_LOCKED(&TCPLock);
-
if( *data == 0x45 ) { /* IPv4 */
Header = (PIPv4_HEADER)data;
LocalAddress.Type = IP_ADDRESS_V4;
}
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
- TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
+ TI_DbgPrint(MIN_TRACE,("Unable to get route to %s\n", A2S(&RemoteAddress)));
return OSK_EADDRNOTAVAIL;
}
return 0;
}
-int TCPSleep( void *ClientData, void *token, int priority, char *msg,
- int tmio ) {
- PSLEEPING_THREAD SleepingThread;
- LARGE_INTEGER Timeout;
-
- ASSERT_LOCKED(&TCPLock);
-
- TI_DbgPrint(DEBUG_TCP,
- ("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;
-
- /* We're going to sleep and need to release the lock, otherwise
- it's impossible to re-enter oskittcp to deliver the event that's
- going to wake us */
- TcpipRecursiveMutexLeave( &TCPLock );
-
- 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,
- Executive,
- KernelMode,
- TRUE,
- (tmio != 0) ? &Timeout : NULL );
-
- TcpipAcquireFastMutex( &SleepingThreadsLock );
- RemoveEntryList( &SleepingThread->Entry );
- TcpipReleaseFastMutex( &SleepingThreadsLock );
-
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
- exFreePool( SleepingThread );
- } else
- return OSK_ENOBUFS;
-
- TI_DbgPrint(DEBUG_TCP,("Waiting finished: %x\n", token));
- return 0;
-}
-
-void TCPWakeup( void *ClientData, void *token ) {
- PLIST_ENTRY Entry;
- PSLEEPING_THREAD SleepingThread;
-
- ASSERT_LOCKED(&TCPLock);
-
- 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;
- }
- TcpipReleaseFastMutex( &SleepingThreadsLock );
-}
-
/* Memory management routines
*
* By far the most requests for memory are either for 128 or 2048 byte blocks,
#define SIGNATURE_LARGE 'LLLL'
#define SIGNATURE_SMALL 'SSSS'
#define SIGNATURE_OTHER 'OOOO'
-#define TCP_TAG ' PCT'
-
static NPAGED_LOOKASIDE_LIST LargeLookasideList;
static NPAGED_LOOKASIDE_LIST SmallLookasideList;
NULL,
0,
LARGE_SIZE + sizeof( ULONG ),
- TCP_TAG,
+ OSK_LARGE_TAG,
0 );
ExInitializeNPagedLookasideList( &SmallLookasideList,
NULL,
NULL,
0,
SMALL_SIZE + sizeof( ULONG ),
- TCP_TAG,
+ OSK_SMALL_TAG,
0 );
return STATUS_SUCCESS;
void *v;
ULONG Signature;
- ASSERT_LOCKED(&TCPLock);
-
#if 0 != MEM_PROFILE
static OSK_UINT *Sizes = NULL, *Counts = NULL, ArrayAllocated = 0;
static OSK_UINT ArrayUsed = 0, AllocationCount = 0;
v = ExAllocateFromNPagedLookasideList( &LargeLookasideList );
Signature = SIGNATURE_LARGE;
} else {
- v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) );
+ v = ExAllocatePoolWithTag( NonPagedPool, Bytes + sizeof(ULONG),
+ OSK_OTHER_TAG );
Signature = SIGNATURE_OTHER;
}
if( v ) {
*((ULONG *) v) = Signature;
v = (void *)((char *) v + sizeof(ULONG));
- TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
}
return v;
void *data, OSK_PCHAR File, OSK_UINT Line ) {
ULONG Signature;
- ASSERT_LOCKED(&TCPLock);
-
- UntrackFL( (PCHAR)File, Line, data, FOURCC('f','b','s','d') );
data = (void *)((char *) data - sizeof(ULONG));
Signature = *((ULONG *) data);
if ( SIGNATURE_SMALL == Signature ) {
} else if ( SIGNATURE_LARGE == Signature ) {
ExFreeToNPagedLookasideList( &LargeLookasideList, data );
} else if ( SIGNATURE_OTHER == Signature ) {
- ExFreePool( data );
+ ExFreePoolWithTag( data, OSK_OTHER_TAG );
} else {
ASSERT( FALSE );
}