tcp: print error when we can't allocate a bucket.

event: Don't report eof if we have bytes to deliver still.
       Made a mistake moving statuses around.  Requeue the request on
       STATUS_PENDING.

svn path=/trunk/; revision=11016
This commit is contained in:
Art Yerkes 2004-09-23 20:51:46 +00:00
parent e91d1416ab
commit b0f758cf33
2 changed files with 14 additions and 4 deletions

View file

@ -23,7 +23,8 @@ int TCPSocketState(void *ClientData,
PTDI_BUCKET Bucket; PTDI_BUCKET Bucket;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
TI_DbgPrint(MID_TRACE,("Called: NewState %x\n", NewState)); TI_DbgPrint(MID_TRACE,("Called: NewState %x (Conn %x)\n",
NewState, Connection));
if( !Connection ) { if( !Connection ) {
TI_DbgPrint(MID_TRACE,("Socket closing.\n")); TI_DbgPrint(MID_TRACE,("Socket closing.\n"));
@ -44,6 +45,10 @@ int TCPSocketState(void *ClientData,
ExFreePool( Bucket ); ExFreePool( Bucket );
} }
} else if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) { } else 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 ) ) { while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
PIRP Irp; PIRP Irp;
OSK_UINT RecvLen = 0, Received = 0; OSK_UINT RecvLen = 0, Received = 0;
@ -70,7 +75,7 @@ int TCPSocketState(void *ClientData,
TI_DbgPrint(MID_TRACE, TI_DbgPrint(MID_TRACE,
("Reading %d bytes to %x\n", RecvLen, RecvBuffer)); ("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
if( NewState & SEL_FIN ) { if( NewState & SEL_FIN && !RecvLen ) {
Status = STATUS_END_OF_FILE; Status = STATUS_END_OF_FILE;
Received = 0; Received = 0;
} else } else
@ -93,7 +98,7 @@ int TCPSocketState(void *ClientData,
Complete( Bucket->Request.RequestContext, Complete( Bucket->Request.RequestContext,
STATUS_SUCCESS, Received ); STATUS_SUCCESS, Received );
} else if( Status == STATUS_SUCCESS ) { } else if( Status == STATUS_PENDING ) {
InsertHeadList( &Connection->ReceiveRequest, InsertHeadList( &Connection->ReceiveRequest,
&Bucket->Entry ); &Bucket->Entry );
break; break;

View file

@ -310,11 +310,16 @@ NTSTATUS TCPReceiveData
(Status == STATUS_SUCCESS && Received == 0) ) { (Status == STATUS_SUCCESS && Received == 0) ) {
/* Freed in TCPSocketState */ /* Freed in TCPSocketState */
Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) ); Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) );
if( !Bucket ) return STATUS_NO_MEMORY; if( !Bucket ) {
TI_DbgPrint(MID_TRACE,("Failed to allocate bucket\n"));
return STATUS_NO_MEMORY;
}
Bucket->Request = *Request; Bucket->Request = *Request;
*BytesReceived = 0;
InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry ); InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry );
Status = STATUS_PENDING; Status = STATUS_PENDING;
TI_DbgPrint(MID_TRACE,("Queued read irp\n"));
} else { } else {
TI_DbgPrint(MID_TRACE,("Got status %x, bytes %d\n", Status, Received)); TI_DbgPrint(MID_TRACE,("Got status %x, bytes %d\n", Status, Received));
*BytesReceived = Received; *BytesReceived = Received;