Author: cgutman
Date: Thu Aug 11 21:52:41 2011
New Revision: 53189
URL:
http://svn.reactos.org/svn/reactos?rev=53189&view=rev
Log:
[LWIP]
- Rewrite receive code to make it much simpler, handle some corner cases that weren't
treated correctly, and fix the data corruption bug
- Downloaded successfully (no data corruption): OpenOffice 2.4, OpenOffice 3.3, BitTorrent
7.2.1, Firefox 5, Firefox 3.6, Firefox 3, Firefox 2, Abyss Web Server, Opera 9.64, and
Opera 11.01
Modified:
trunk/reactos/lib/drivers/ip/transport/tcp/event.c
trunk/reactos/lib/drivers/lwip/src/include/rosip.h
trunk/reactos/lib/drivers/lwip/src/rostcp.c
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/event.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/event.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/event.c [iso-8859-1] Thu Aug 11 21:52:41
2011
@@ -451,59 +451,46 @@
DereferenceObject(Connection);
}
-u32_t
-TCPRecvEventHandler(void *arg, struct pbuf *p)
+VOID
+TCPRecvEventHandler(void *arg)
{
PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
PTDI_BUCKET Bucket;
PLIST_ENTRY Entry;
PIRP Irp;
PMDL Mdl;
- UINT Received = 0;
+ UINT Received;
UINT RecvLen;
PUCHAR RecvBuffer;
-
- ASSERT(p);
-
- ReferenceObject(Connection);
-
- if ((Entry = ExInterlockedRemoveHeadList(&Connection->ReceiveRequest,
&Connection->Lock)))
+ NTSTATUS Status;
+
+ ReferenceObject(Connection);
+
+ while ((Entry = ExInterlockedRemoveHeadList(&Connection->ReceiveRequest,
&Connection->Lock)))
{
Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
Irp = Bucket->Request.RequestContext;
Mdl = Irp->MdlAddress;
-
- TI_DbgPrint(DEBUG_TCP,
- ("[IP, TCPRecvEventHandler] Getting the user buffer from
%x\n", Mdl));
-
+
NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
-
- TI_DbgPrint(DEBUG_TCP,
- ("[IP, TCPRecvEventHandler] Reading %d bytes to %x\n",
RecvLen, RecvBuffer));
-
- TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
- TI_DbgPrint(DEBUG_TCP, ("[IP, TCPRecvEventHandler]
Connection->SocketContext: %x\n", Connection->SocketContext));
- TI_DbgPrint(DEBUG_TCP, ("[IP, TCPRecvEventHandler] RecvBuffer: %x\n",
RecvBuffer));
-
- RecvLen = MIN(p->tot_len, RecvLen);
-
- for (Received = 0; Received < RecvLen; Received += p->len, p = p->next)
- {
- RtlCopyMemory(RecvBuffer + Received, p->payload, p->len);
- }
-
- TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received));
-
- Bucket->Status = STATUS_SUCCESS;
+
+ Status = LibTCPGetDataFromConnectionQueue(Connection, RecvBuffer, RecvLen,
&Received);
+ if (Status == STATUS_PENDING)
+ {
+ ExInterlockedInsertHeadList(&Connection->ReceiveRequest,
+ &Bucket->Entry,
+ &Connection->Lock);
+ break;
+ }
+
+ Bucket->Status = Status;
Bucket->Information = Received;
-
+
CompleteBucket(Connection, Bucket, FALSE);
}
DereferenceObject(Connection);
-
- return Received;
}
VOID
Modified: trunk/reactos/lib/drivers/lwip/src/include/rosip.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/lwip/src/inclu…
==============================================================================
--- trunk/reactos/lib/drivers/lwip/src/include/rosip.h [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/lwip/src/include/rosip.h [iso-8859-1] Thu Aug 11 21:52:41
2011
@@ -91,7 +91,7 @@
extern void TCPAcceptEventHandler(void *arg, PTCP_PCB newpcb);
extern void TCPSendEventHandler(void *arg, const u16_t space);
extern void TCPFinEventHandler(void *arg, const err_t err);
-extern u32_t TCPRecvEventHandler(void *arg, struct pbuf *p);
+extern void TCPRecvEventHandler(void *arg);
/* TCP functions */
PTCP_PCB LibTCPSocket(void *arg);
Modified: trunk/reactos/lib/drivers/lwip/src/rostcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/lwip/src/rostc…
==============================================================================
--- trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Thu Aug 11 21:52:41 2011
@@ -207,37 +207,13 @@
return ERR_OK;
}
- ASSERT(!LibTCPDequeuePacket(Connection));
-
if (p)
{
- len = TCPRecvEventHandler(arg, p);
- if (len == p->tot_len)
- {
- tcp_recved(pcb, len);
-
- pbuf_free(p);
-
- return ERR_OK;
- }
- else if (len != 0)
- {
- DbgPrint("UNTESTED CASE: NOT ALL DATA TAKEN! EXTRA DATA MAY BE
LOST!\n");
-
- tcp_recved(pcb, len);
-
- /* Possible memory leak of pbuf here? */
-
- return ERR_OK;
- }
- else
- {
- LibTCPEnqueuePacket(Connection, p);
-
- tcp_recved(pcb, p->tot_len);
-
- return ERR_OK;
- }
+ LibTCPEnqueuePacket(Connection, p);
+
+ tcp_recved(pcb, p->tot_len);
+
+ TCPRecvEventHandler(arg);
}
else if (err == ERR_OK)
{