Author: cmihail
Date: Tue Aug 2 19:20:40 2011
New Revision: 53033
URL:
http://svn.reactos.org/svn/reactos?rev=53033&view=rev
Log:
[TCPIP]
- Remove debug prints
- Modify error code translations
[lwIP]
- Fix race conditions caused by checking the SocketContexts of connections from outside
the lwIP main thread context
- Don't explicitly remove callbacks from pcbs (no reason to do apperently)
- Use pbuf_free_callback (which can be safely called from outside the lwIP main thread
context) instead of pbuf_free
Modified:
branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/accept.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/if.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/core/tcp.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rosmem.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/sys_arch.c
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/accept.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Tue
Aug 2 19:20:40 2011
@@ -20,8 +20,6 @@
PTDI_CONNECTION_INFORMATION WhoIsConnecting;
PTA_IP_ADDRESS RemoteAddress;
struct ip_addr ipaddr;
-
- DbgPrint("[IP, TCPCheckPeerForAccept] Called\n");
if (Request->RequestFlags & TDI_QUERY_ACCEPT)
DbgPrint("TDI_QUERY_ACCEPT NOT SUPPORTED!!!\n");
@@ -39,8 +37,6 @@
RemoteAddress->Address[0].Address[0].in_addr = ipaddr.addr;
- DbgPrint("[IP, TCPCheckPeerForAccept] Leaving. Status %x\n", Status);
-
return Status;
}
@@ -60,7 +56,6 @@
ASSERT_KM_POINTER(Connection->AddressFile);
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Called\n"));
- DbgPrint("[IP, TCPListen] Called\n");
TI_DbgPrint(DEBUG_TCP, ("Connection->SocketContext %x\n",
Connection->SocketContext));
@@ -99,7 +94,6 @@
UnlockObject(Connection, OldIrql);
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Leaving. Status = %x\n", Status));
- DbgPrint("[IP, TCPListen] Leaving. Status = %x\n", Status);
return Status;
}
@@ -112,8 +106,6 @@
PTDI_BUCKET Bucket;
KIRQL OldIrql;
BOOLEAN Found = FALSE;
-
- DbgPrint("[IP, TCPAbortListenForSocket] Called\n");
LockObject(Listener, &OldIrql);
@@ -136,9 +128,6 @@
UnlockObject(Listener, OldIrql);
- DbgPrint("[IP, TCPAbortListenForSocket] Leaving. Status = %s\n",
- Found == TRUE ? "TRUE" : "FALSE");
-
return Found;
}
@@ -151,8 +140,6 @@
NTSTATUS Status;
PTDI_BUCKET Bucket;
KIRQL OldIrql;
-
- DbgPrint("[IP, TCPAccept] Called\n");
LockObject(Listener, &OldIrql);
@@ -175,6 +162,5 @@
UnlockObject(Listener, OldIrql);
- DbgPrint("[IP, TCPAccept] Leaving. Status = %x\n", Status);
return Status;
}
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c [iso-8859-1] Tue
Aug 2 19:20:40 2011
@@ -69,9 +69,7 @@
PLIST_ENTRY Entry;
ReferenceObject(Connection);
-
- DbgPrint("[IP, FlushAllQueues] Flushing recv/all with status: 0x%x for
Connection = 0x%x\n", Status, Connection);
-
+
while ((Entry = ExInterlockedRemoveHeadList(&Connection->ReceiveRequest,
&Connection->Lock)))
{
Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
@@ -91,7 +89,6 @@
//
if (Status == STATUS_SUCCESS)
{
- DbgPrint("[IP, FlushAllQueues] Flushed recv only after graceful
closure\n");
DereferenceObject(Connection);
return;
}
@@ -102,8 +99,6 @@
Bucket->Status = Status;
Bucket->Information = 0;
-
- DbgPrint("[IP, FlushAllQueues] Completing Listen request for Connection =
0x%x\n", Bucket->AssociatedEndpoint);
DereferenceObject(Bucket->AssociatedEndpoint);
CompleteBucket(Connection, Bucket, FALSE);
@@ -129,15 +124,11 @@
Bucket->Status = Status;
Bucket->Information = 0;
-
- DbgPrint("[IP, FlushAllQueues] Completing Connection request for Connection
= 0x%x\n", Bucket->AssociatedEndpoint);
-
- CompleteBucket(Connection, Bucket, FALSE);
- }
-
- DereferenceObject(Connection);
-
- DbgPrint("[IP, FlushAllQueues] Leaving\n");
+
+ CompleteBucket(Connection, Bucket, FALSE);
+ }
+
+ DereferenceObject(Connection);
}
VOID
@@ -145,21 +136,15 @@
{
PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
const NTSTATUS status = TCPTranslateError(err);
-
- DbgPrint("[IP, TCPFinEventHandler] Called for Connection( 0x%x )->
SocketContext = pcb (0x%x)\n", Connection, Connection->SocketContext);
/* Only clear the pointer if the shutdown was caused by an error */
if (err != ERR_OK)
{
- /* We're already closed by the error so we don't want to call lwip_close
*/
- DbgPrint("[IP, TCPFinEventHandler] MAKING Connection( 0x%x )->
SocketContext = pcb (0x%x) NULL\n", Connection, Connection->SocketContext);
-
+ /* We're got closed by the error so remove the PCB pointer */
Connection->SocketContext = NULL;
}
FlushAllQueues(Connection, status);
-
- DbgPrint("[IP, TCPFinEventHandler] Done\n");
}
VOID
@@ -171,9 +156,7 @@
PIRP Irp;
NTSTATUS Status;
KIRQL OldIrql;
-
- DbgPrint("[IP, TCPAcceptEventHandler] Called\n");
-
+
ReferenceObject(Connection);
while ((Entry = ExInterlockedRemoveHeadList(&Connection->ListenRequest,
&Connection->Lock)))
@@ -194,16 +177,9 @@
Bucket->Status = Status;
Bucket->Information = 0;
-
- DbgPrint("[IP, TCPAcceptEventHandler] Completing accept event %x\n",
Status);
-
+
if (Status == STATUS_SUCCESS)
{
- DbgPrint("[IP, TCPAcceptEventHandler] newpcb->state = %s,
listen_pcb->state = %s, newpcb = 0x%x\n",
- tcp_state_str[newpcb->state],
- tcp_state_str[((PTCP_PCB)Connection->SocketContext)->state],
- newpcb);
-
LockObject(Bucket->AssociatedEndpoint, &OldIrql);
/* sanity assert...this should never be in anything else but a CLOSED state
*/
@@ -217,13 +193,10 @@
LibTCPAccept(newpcb, (PTCP_PCB)Connection->SocketContext,
Bucket->AssociatedEndpoint);
- DbgPrint("[IP, TCPAcceptEventHandler] Trying to unlock
Bucket->AssociatedEndpoint\n");
UnlockObject(Bucket->AssociatedEndpoint, OldIrql);
}
DereferenceObject(Bucket->AssociatedEndpoint);
-
- DbgPrint("[IP, TCPAcceptEventHandler] Done!\n");
CompleteBucket(Connection, Bucket, FALSE);
}
@@ -241,8 +214,6 @@
NTSTATUS Status;
PMDL Mdl;
- DbgPrint("[IP, TCPSendEventHandler] Called\n");
-
ReferenceObject(Connection);
while ((Entry = ExInterlockedRemoveHeadList(&Connection->SendRequest,
&Connection->Lock)))
@@ -262,8 +233,6 @@
TI_DbgPrint(DEBUG_TCP,
("Writing %d bytes to %x\n", SendLen, SendBuffer));
- DbgPrint("[IP, TCPSendEventHandler] Sending out &d bytes on pcb =
0x%x\n",
- Connection->SocketContext);
TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection));
TI_DbgPrint
@@ -292,16 +261,12 @@
Bucket->Status = Status;
Bucket->Information = (Bucket->Status == STATUS_SUCCESS) ? SendLen :
0;
-
- DbgPrint("Completing send req %x\n", Status);
-
+
CompleteBucket(Connection, Bucket, FALSE);
}
}
DereferenceObject(Connection);
-
- DbgPrint("[IP, TCPSendEventHandler] Leaving\n");
}
u32_t
@@ -319,9 +284,7 @@
ASSERT(p);
ReferenceObject(Connection);
-
- DbgPrint("[IP, TCPRecvEventHandler] Called\n");
-
+
if ((Entry = ExInterlockedRemoveHeadList(&Connection->ReceiveRequest,
&Connection->Lock)))
{
Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
@@ -345,9 +308,6 @@
for (Received = 0; Received < RecvLen; Received += p->len, p = p->next)
{
- DbgPrint("[IP, TCPRecvEventHandler] 0x%x: Copying %d bytes to 0x%x from
0x%x\n",
- p, p->len, ((PUCHAR)RecvBuffer) + Received, p->payload);
-
RtlCopyMemory(RecvBuffer + Received, p->payload, p->len);
}
@@ -360,8 +320,6 @@
}
DereferenceObject(Connection);
-
- DbgPrint("[IP, TCPRecvEventHandler] Leaving\n");
return Received;
}
@@ -372,9 +330,7 @@
PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
PTDI_BUCKET Bucket;
PLIST_ENTRY Entry;
-
- DbgPrint("[IP, TCPConnectEventHandler] Called\n");
-
+
ReferenceObject(Connection);
while ((Entry = ExInterlockedRemoveHeadList(&Connection->ConnectRequest,
&Connection->Lock)))
@@ -384,13 +340,9 @@
Bucket->Status = TCPTranslateError(err);
Bucket->Information = 0;
-
- DbgPrint("[IP, TCPConnectEventHandler] Completing connection request!
(0x%x)\n", err);
-
- CompleteBucket(Connection, Bucket, FALSE);
- }
-
- DbgPrint("[IP, TCPConnectEventHandler] Done\n");
-
- DereferenceObject(Connection);
-}
+
+ CompleteBucket(Connection, Bucket, FALSE);
+ }
+
+ DereferenceObject(Connection);
+}
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/if.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/if.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/if.c [iso-8859-1] Tue Aug
2 19:20:40 2011
@@ -25,8 +25,6 @@
/* The caller frees the pbuf struct */
- DbgPrint("[IP, TCPSendDataCallback] Sending data out on %c%c\n",
netif->name[0], netif->name[1]);
-
if (((*(u8_t*)p->payload) & 0xF0) == 0x40)
{
Header = p->payload;
@@ -39,21 +37,18 @@
}
else
{
- DbgPrint("[IP, TCPSendDataCallback] FAIL EINVAL 1\n");
- return EINVAL;
+ return ERR_IF;
}
if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
{
- DbgPrint("[IP, TCPSendDataCallback] FAIL EINVAL 2\n");
- return EINVAL;
+ return ERR_RTE;
}
NdisStatus = AllocatePacketWithBuffer(&Packet.NdisPacket, NULL, p->tot_len);
if (NdisStatus != NDIS_STATUS_SUCCESS)
{
- DbgPrint("[IP, TCPSendDataCallback] FAIL ENOBUFS\n");
- return ENOBUFS;
+ return ERR_MEM;
}
GetDataPtr(Packet.NdisPacket, 0, (PCHAR*)&Packet.Header,
&Packet.ContigSize);
@@ -71,9 +66,8 @@
if (!NT_SUCCESS(IPSendDatagram(&Packet, NCE, TCPPacketSendComplete, NULL)))
{
- DbgPrint("[IP, TCPSendDataCallback] FAIL EINVAL 3\n");
FreeNdisPacket(Packet.NdisPacket);
- return EINVAL;
+ return ERR_IF;
}
return 0;
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Tue Aug
2 19:20:40 2011
@@ -29,8 +29,6 @@
KIRQL OldIrql;
TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n"));
-
- DbgPrint("CONNECTION ENDPOINT: Freeing 0x%x\n", Object);
TcpipAcquireSpinLock(&ConnectionEndpointListLock, &OldIrql);
RemoveEntryList(&Connection->ListEntry);
@@ -85,9 +83,6 @@
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Called: Connection %x, Family %d, Type
%d, "
"Proto %d, sizeof(CONNECTION_ENDPOINT) = %d\n",
Connection, Family, Type, Proto,
sizeof(CONNECTION_ENDPOINT)));
- DbgPrint("[IP, TCPSocket] Called: Connection 0x%x, Family %d, Type %d, "
- "Proto %d, sizeof(CONNECTION_ENDPOINT) = %d\n",
- Connection, Family, Type, Proto,
sizeof(CONNECTION_ENDPOINT));
Connection->SocketContext = LibTCPSocket(Connection);
if (Connection->SocketContext)
@@ -95,12 +90,9 @@
else
Status = STATUS_INSUFFICIENT_RESOURCES;
- DbgPrint("[IP, TCPSocket] Connection->SocketContext = 0x%x\n",
Connection->SocketContext);
-
UnlockObject(Connection, OldIrql);
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Leaving. Status = 0x%x\n",
Status));
- DbgPrint("[IP, TCPSocket] Leaving. Status = 0x%x\n", Status);
return Status;
}
@@ -111,8 +103,6 @@
PVOID Socket;
LockObject(Connection, &OldIrql);
-
- DbgPrint("[IP, TCPClose] Called for Connection( 0x%x )->SocketConext( 0x%x
)\n", Connection, Connection->SocketContext);
Socket = Connection->SocketContext;
@@ -124,12 +114,8 @@
{
FlushAllQueues(Connection, STATUS_CANCELLED);
- DbgPrint("[IP, TCPClose] Socket (pcb) = 0x%x\n", Socket);
-
LibTCPClose(Connection, FALSE);
}
-
- DbgPrint("[IP, TCPClose] Leaving\n");
UnlockObject(Connection, OldIrql);
@@ -147,15 +133,11 @@
* This is the low level interface for receiving TCP data
*/
{
- DbgPrint("[IP, TCPReceive] Called. Got packet from network stack\n");
-
TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to lwIP\n",
IPPacket->TotalSize,
IPPacket->HeaderSize));
LibIPInsertPacket(Interface->TCPContext, IPPacket->Header,
IPPacket->TotalSize);
-
- DbgPrint("[IP, TCPReceive] Leaving\n");
}
NTSTATUS TCPStartup(VOID)
@@ -217,7 +199,7 @@
case ERR_MEM: Status = STATUS_INSUFFICIENT_RESOURCES; break; //-1
case ERR_BUF: Status = STATUS_BUFFER_TOO_SMALL; break; //-2
case ERR_TIMEOUT: Status = STATUS_TIMEOUT; break; // -3
- case ERR_RTE: Status = STATUS_HOST_UNREACHABLE; break; //-4
+ case ERR_RTE: Status = STATUS_NETWORK_UNREACHABLE; break; //-4
case ERR_ABRT: Status = STATUS_LOCAL_DISCONNECT; break; //-5
case ERR_RST: Status = STATUS_REMOTE_DISCONNECT; break; //-6
case ERR_CLSD: Status = STATUS_FILE_CLOSED; break; //-7
@@ -302,8 +284,6 @@
&bindaddr,
Connection->AddressFile->Port));
- DbgPrint("LibTCPBind: 0x%x\n", Status);
-
if (NT_SUCCESS(Status))
{
/* Check if we had an unspecified port */
@@ -340,8 +320,6 @@
Status = TCPTranslateError(LibTCPConnect(Connection,
&connaddr,
RemotePort));
-
- DbgPrint("LibTCPConnect: 0x%x\n", Status);
}
}
@@ -382,11 +360,8 @@
else
{
/* We already got closed by the other side so just return success */
- DbgPrint("[IP, TCPDisconnect] Socket was alraedy clsoed on the other
side\n");
Status = STATUS_SUCCESS;
}
-
- DbgPrint("LibTCPShutdown: %x\n", Status);
UnlockObject(Connection, OldIrql);
@@ -413,9 +388,6 @@
TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Called for %d bytes (on socket
%x)\n",
ReceiveLength, Connection->SocketContext));
- DbgPrint("[IP, TCPReceiveData] Called for %d bytes (on
Connection->SocketContext = 0x%x)\n",
- ReceiveLength, Connection->SocketContext);
-
NdisQueryBuffer(Buffer, &DataBuffer, &DataLen);
Status = LibTCPGetDataFromConnectionQueue(Connection, DataBuffer, DataLen,
&Received);
@@ -450,9 +422,6 @@
{
(*BytesReceived) = Received;
}
-
- DbgPrint("[IP, TCPReceiveData] Leaving. Status = %s\n",
- Status == STATUS_PENDING? "STATUS_PENDING" :
"STATUS_SUCCESS");
return Status;
}
@@ -478,15 +447,12 @@
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection = %x\n",
Connection));
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection->SocketContext =
%x\n",
Connection->SocketContext));
- DbgPrint("[IP, TCPSendData] Called\n");
Status = TCPTranslateError(LibTCPSend(Connection,
BufferData,
SendLength,
FALSE));
- DbgPrint("[IP, TCPSendData] LibTCPSend: 0x%x\n", Status);
-
TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status,
SendLength));
/* Keep this request around ... there was no data yet */
@@ -519,8 +485,6 @@
TI_DbgPrint(DEBUG_TCP, ("[IP, TCPSendData] Leaving. Status = %x\n",
Status));
- DbgPrint("[IP, TCPSendData] Leaving. Status = %x\n", Status);
-
return Status;
}
@@ -577,8 +541,6 @@
UnlockObject(Connection, OldIrql);
AddressIP->Address[0].Address[0].in_addr = ipaddr.addr;
-
- DbgPrint("LibTCPGetXXXName: 0x%x\n", Status);
return Status;
}
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/core/tcp.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/core/tcp.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/core/tcp.c [iso-8859-1] Tue Aug 2
19:20:40 2011
@@ -324,6 +324,9 @@
tcp_err_fn errf;
#endif /* LWIP_CALLBACK_API */
void *errf_arg;
+
+ DbgPrint("tcp_abandon: called on pcb = 0x%x\n", pcb);
+ DbgPrint("tcp_abandon: pcb->state = %s\n", tcp_state_str[pcb->state]);
/* pcb->state LISTEN not allowed here */
LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
@@ -917,6 +920,7 @@
tcp_active_pcbs = pcb->next;
}
+ DbgPrint("tcp_slowtmr: removing pcb 0x%x\n", pcb);
TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT);
if (pcb_reset) {
tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip,
&pcb->remote_ip,
@@ -1430,6 +1434,7 @@
void
tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
{
+ DbgPrint("tcp_pcb_remove: Removing pcb = 0x%x\n", pcb);
TCP_RMV(pcblist, pcb);
tcp_pcb_purge(pcb);
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rosmem.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rosmem.c [iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rosmem.c [iso-8859-1] Tue Aug 2
19:20:40 2011
@@ -28,7 +28,6 @@
void
free(void *mem)
{
- //DbgPrint("ROSMEM: free 0x%x\n", mem);
ExFreePoolWithTag(mem, LWIP_TAG);
}
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Tue Aug 2
19:20:40 2011
@@ -41,11 +41,10 @@
while (!IsListEmpty(&Connection->PacketQueue))
{
- DbgPrint("[lwIP, LibTCPEmptyQueue] Removed packet off queue++++\n");
-
Entry = RemoveHeadList(&Connection->PacketQueue);
qp = CONTAINING_RECORD(Entry, QUEUE_ENTRY, ListEntry);
+ /* We're in the tcpip thread here so this is safe */
pbuf_free(qp->p);
ExFreePoolWithTag(qp, LWIP_TAG);
@@ -84,8 +83,6 @@
if (!IsListEmpty(&Connection->PacketQueue))
{
- DbgPrint("[lwIP, LibTCPGetDataFromConnectionQueue] Getting packet off the
queue\n");
-
qp = LibTCPDequeuePacket(Connection);
p = qp->p;
@@ -93,22 +90,18 @@
for ((*Received) = 0; (*Received) < RecvLen; (*Received) += p->len, p =
p->next)
{
- DbgPrint("[lwIP, LibTCPGetDataFromConnectionQueue] 0x%x: Copying %d
bytes to 0x%x from 0x%x\n",
- p, p->len, ((PUCHAR)RecvBuffer) + (*Received), p->payload);
-
RtlCopyMemory(RecvBuffer + (*Received), p->payload, p->len);
}
- // reenable this later
- pbuf_free(qp->p);
+ /* Use this special pbuf free callback function because we're outside tcpip
thread */
+ pbuf_free_callback(qp->p);
+
ExFreePoolWithTag(qp, LWIP_TAG);
Status = STATUS_SUCCESS;
}
else
{
- DbgPrint("[lwIP, LibTCPGetPacketFromQueue] Queue is EMPTY\n");
-
Status = STATUS_PENDING;
}
@@ -144,17 +137,10 @@
err_t
InternalSendEventHandler(void *arg, PTCP_PCB pcb, const u16_t space)
{
- DbgPrint("[lwIP, InternalSendEventHandler] SendEvent (0x%x, 0x%x, %d)\n",
- arg, pcb, (unsigned int)space);
-
- ASSERT(pcb->sent != 0);
-
/* Make sure the socket didn't get closed */
if (!arg) return ERR_OK;
TCPSendEventHandler(arg, space);
-
- DbgPrint("[lwIP, InternalSendEventHandler] Done\n");
return ERR_OK;
}
@@ -165,35 +151,23 @@
{
u32_t len;
- DbgPrint("[lwIP, InternalRecvEventHandler] RecvEvent (0x%x, pcb = 0x%x, pbuf =
0x%x, err = %d)\n",
- arg, pcb, p, (unsigned int)err);
-
- ASSERT(pcb->recv != NULL);
-
/* Make sure the socket didn't get closed */
if (!arg)
{
if (p)
pbuf_free(p);
- DbgPrint("[lwIP, InternalRecvEventHandler] Done ERR_OK 0 - socket got closed
on us\n");
-
return ERR_OK;
}
if (p)
{
- DbgPrint("[lwIP, InternalRecvEventHandler] RECV - p:0x%x p->payload:0x%x
p->len:%d p->tot_len:%d\n",
- p, p->payload, p->len, p->tot_len);
-
len = TCPRecvEventHandler(arg, p);
if (len == p->tot_len)
{
tcp_recved(pcb, len);
pbuf_free(p);
-
- DbgPrint("[lwIP, InternalRecvEventHandler] Done ERR_OK 1\n");
return ERR_OK;
}
@@ -204,20 +178,16 @@
tcp_recved(pcb, len);
/* Possible memory leak of pbuf here? */
- DbgPrint("[lwIP, InternalRecvEventHandler] Done ERR_OK 2\n");
return ERR_OK;
}
else
{
- /* We want lwIP to store the pbuf on its queue for later */
- DbgPrint("[lwIP, InternalRecvEventHandler] Done ERR_TIMEOUT queuing
pbuf\n");
-
LibTCPEnqueuePacket((PCONNECTION_ENDPOINT)arg, p);
tcp_recved(pcb, p->tot_len);
- return ERR_OK;//ERR_TIMEOUT;//
+ return ERR_OK;
}
}
else if (err == ERR_OK)
@@ -228,8 +198,6 @@
*/
TCPFinEventHandler(arg, ERR_OK);
}
-
- DbgPrint("[lwIP, InternalRecvEventHandler] Done ERR_OK 3\n");
return ERR_OK;
}
@@ -238,15 +206,9 @@
err_t
InternalAcceptEventHandler(void *arg, PTCP_PCB newpcb, const err_t err)
{
- DbgPrint("[lwIP, InternalAcceptEventHandler] AcceptEvent arg = 0x%x, newpcb =
0x%x, err = %d\n",
- arg, newpcb, (unsigned int)err);
-
/* Make sure the socket didn't get closed */
if (!arg)
return ERR_ABRT;
-
- DbgPrint("[lwIP, InternalAcceptEventHandler] newpcb->state = %s\n",
- tcp_state_str[newpcb->state]);
TCPAcceptEventHandler(arg, newpcb);
@@ -261,16 +223,11 @@
err_t
InternalConnectEventHandler(void *arg, PTCP_PCB pcb, const err_t err)
{
- DbgPrint("[lwIP, InternalConnectEventHandler] ConnectEvent (0x%x, pcb = 0x%x,
err = %d)\n",
- arg, pcb, (unsigned int)err);
-
/* Make sure the socket didn't get closed */
if (!arg)
return ERR_OK;
TCPConnectEventHandler(arg, err);
-
- DbgPrint("[lwIP, InternalConnectEventHandler] Done\n");
return ERR_OK;
}
@@ -307,12 +264,8 @@
struct socket_callback_msg *msg = arg;
ASSERT(msg);
-
- DbgPrint("[lwIP, LibTCPSocketCallback] Called\n");
msg->NewPcb = tcp_new();
-
- DbgPrint("[lwIP, LibTCPSocketCallback] Assigned new pcb = 0x%x\n",
msg->NewPcb);
if (msg->NewPcb)
{
@@ -328,8 +281,6 @@
{
struct socket_callback_msg *msg = ExAllocatePool(NonPagedPool, sizeof(struct
socket_callback_msg));
struct tcp_pcb *ret;
-
- DbgPrint("[lwIP, LibTCPSocket] Called\n");
if (msg)
{
@@ -343,16 +294,10 @@
else
ret = NULL;
- DbgPrint("[lwIP, LibTCPSocket] Connection( 0x%x )->SocketContext = pcb(
0x%x )\n", arg, ret);
-
- DbgPrint("[lwIP, LibTCPSocket] Done\n");
-
ExFreePool(msg);
return ret;
}
-
- DbgPrint("[lwIP, LibTCPSocket] Done\n");
return NULL;
}
@@ -379,10 +324,17 @@
ASSERT(msg);
+ if (!msg->Connection->SocketContext)
+ {
+ msg->Error = ERR_CLSD;
+ goto done;
+ }
+
msg->Error = tcp_bind((PTCP_PCB)msg->Connection->SocketContext,
msg->IpAddress,
ntohs(msg->Port));
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
@@ -391,11 +343,6 @@
{
struct bind_callback_msg *msg;
err_t ret;
-
- if (!Connection->SocketContext)
- return ERR_CLSD;
-
- DbgPrint("[lwIP, LibTCPBind] Called\n");
msg = ExAllocatePool(NonPagedPool, sizeof(struct bind_callback_msg));
if (msg)
@@ -412,10 +359,6 @@
else
ret = ERR_CLSD;
- DbgPrint("[lwIP, LibTCPBind] pcb = 0x%x\n",
Connection->SocketContext);
-
- DbgPrint("[lwIP, LibTCPBind] Done\n");
-
ExFreePool(msg);
return ret;
@@ -444,8 +387,12 @@
struct listen_callback_msg *msg = arg;
ASSERT(msg);
-
- DbgPrint("[lwIP, LibTCPListenCallback] Called\n");
+
+ if (!msg->Connection->SocketContext)
+ {
+ msg->NewPcb = NULL;
+ goto done;
+ }
msg->NewPcb =
tcp_listen_with_backlog((PTCP_PCB)msg->Connection->SocketContext, msg->Backlog);
@@ -453,9 +400,8 @@
{
tcp_accept(msg->NewPcb, InternalAcceptEventHandler);
}
-
- DbgPrint("[lwIP, LibTCPListenCallback] Done\n");
-
+
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
@@ -464,11 +410,6 @@
{
struct listen_callback_msg *msg;
PTCP_PCB ret;
-
- DbgPrint("[lwIP, LibTCPListen] Called on pcb = 0x%x\n",
Connection->SocketContext);
-
- if (!Connection->SocketContext)
- return NULL;
msg = ExAllocatePool(NonPagedPool, sizeof(struct listen_callback_msg));
if (msg)
@@ -483,11 +424,6 @@
ret = msg->NewPcb;
else
ret = NULL;
-
- DbgPrint("[lwIP, LibTCPListen] pcb = 0x%x, newpcb = 0x%x, sizeof(pcb) = %d
\n",
- Connection->SocketContext, ret, sizeof(struct tcp_pcb));
-
- DbgPrint("[lwIP, LibTCPListen] Done\n");
ExFreePool(msg);
@@ -519,6 +455,12 @@
ASSERT(msg);
+ if (!msg->Connection->SocketContext)
+ {
+ msg->Error = ERR_CLSD;
+ goto done;
+ }
+
if (tcp_sndbuf((PTCP_PCB)msg->Connection->SocketContext) <
msg->DataLength)
{
msg->Error = ERR_INPROGRESS;
@@ -533,6 +475,7 @@
tcp_output((PTCP_PCB)msg->Connection->SocketContext);
}
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
@@ -540,54 +483,29 @@
LibTCPSend(PCONNECTION_ENDPOINT Connection, void *const dataptr, const u16_t len, const
int safe)
{
err_t ret;
-
- if (!Connection->SocketContext)
- return ERR_CLSD;
-
- /*
- If we're being called from a handler it means we're in the conetxt of
teh tcpip
- main thread. Therefore we don't have to queue our request via a callback and
we
- can execute immediately.
- */
- if (safe)
- {
- if (tcp_sndbuf((PTCP_PCB)Connection->SocketContext) < len)
- {
- ret = ERR_INPROGRESS;
- }
- else
- {
- ret = tcp_write((PTCP_PCB)Connection->SocketContext, dataptr, len,
TCP_WRITE_FLAG_COPY);
- tcp_output((PTCP_PCB)Connection->SocketContext);
- }
-
+ struct send_callback_msg *msg;
+
+ msg = ExAllocatePool(NonPagedPool, sizeof(struct send_callback_msg));
+ if (msg)
+ {
+ KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
+ msg->Connection = Connection;
+ msg->Data = dataptr;
+ msg->DataLength = len;
+
+ if (safe)
+ LibTCPSendCallback(msg);
+ else
+ tcpip_callback_with_block(LibTCPSendCallback, msg, 1);
+
+ if (WaitForEventSafely(&msg->Event))
+ ret = msg->Error;
+ else
+ ret = ERR_CLSD;
+
+ ExFreePool(msg);
+
return ret;
- }
- else
- {
- struct send_callback_msg *msg;
-
- msg = ExAllocatePool(NonPagedPool, sizeof(struct send_callback_msg));
- if (msg)
- {
- KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Connection = Connection;
- msg->Data = dataptr;
- msg->DataLength = len;
-
- tcpip_callback_with_block(LibTCPSendCallback, msg, 1);
-
- if (WaitForEventSafely(&msg->Event))
- ret = msg->Error;
- else
- ret = ERR_CLSD;
-
- DbgPrint("[lwIP, LibTCPSend] pcb = 0x%x\n",
Connection->SocketContext);
-
- ExFreePool(msg);
-
- return ret;
- }
}
return ERR_MEM;
@@ -612,10 +530,14 @@
LibTCPConnectCallback(void *arg)
{
struct connect_callback_msg *msg = arg;
-
- DbgPrint("[lwIP, LibTCPConnectCallback] Called\n");
ASSERT(arg);
+
+ if (!msg->Connection->SocketContext)
+ {
+ msg->Error = ERR_CLSD;
+ goto done;
+ }
tcp_recv((PTCP_PCB)msg->Connection->SocketContext, InternalRecvEventHandler);
tcp_sent((PTCP_PCB)msg->Connection->SocketContext, InternalSendEventHandler);
@@ -626,9 +548,8 @@
msg->Error = Error == ERR_OK ? ERR_INPROGRESS : Error;
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
-
- DbgPrint("[lwIP, LibTCPConnectCallback] Done\n");
}
err_t
@@ -636,11 +557,6 @@
{
struct connect_callback_msg *msg;
err_t ret;
-
- DbgPrint("[lwIP, LibTCPConnect] Called\n");
-
- if (!Connection->SocketContext)
- return ERR_CLSD;
msg = ExAllocatePool(NonPagedPool, sizeof(struct connect_callback_msg));
if (msg)
@@ -660,10 +576,6 @@
ret = ERR_CLSD;
ExFreePool(msg);
-
- DbgPrint("[lwIP, LibTCPConnect] pcb = 0x%x\n",
Connection->SocketContext);
-
- DbgPrint("[lwIP, LibTCPConnect] Done\n");
return ret;
}
@@ -690,6 +602,12 @@
LibTCPShutdownCallback(void *arg)
{
struct shutdown_callback_msg *msg = arg;
+
+ if (!msg->Connection->SocketContext)
+ {
+ msg->Error = ERR_CLSD;
+ goto done;
+ }
/*
We check here if the pcb is in state ESTABLISHED or SYN_RECV because otherwise
@@ -706,6 +624,7 @@
else
msg->Error = ERR_OK;
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
@@ -714,19 +633,7 @@
{
struct shutdown_callback_msg *msg;
err_t ret;
-
- DbgPrint("[lwIP, LibTCPShutdown] Called on pcb = 0x%x, rx = %d, tx =
%d\n",
- Connection->SocketContext, shut_rx, shut_tx);
-
- if (!Connection->SocketContext)
- {
- DbgPrint("[lwIP, LibTCPShutdown] Done... NO pcb\n");
- return ERR_CLSD;
- }
-
- DbgPrint("[lwIP, LibTCPShutdown] pcb->state = %s\n",
- tcp_state_str[((PTCP_PCB)Connection->SocketContext)->state]);
-
+
msg = ExAllocatePool(NonPagedPool, sizeof(struct shutdown_callback_msg));
if (msg)
{
@@ -745,8 +652,6 @@
ExFreePool(msg);
- DbgPrint("[lwIP, LibTCPShutdown] Done\n");
-
return ret;
}
@@ -767,55 +672,29 @@
static
void
-CloseCallbacks(struct tcp_pcb *pcb)
-{
- tcp_arg(pcb, NULL);
- /*
- if this pcb is not in LISTEN state then it has
- valid recv, send and err callbacks to cancel
- */
- if (pcb->state != LISTEN)
- {
- tcp_recv(pcb, NULL);
- tcp_sent(pcb, NULL);
- tcp_err(pcb, NULL);
- }
-
- tcp_accept(pcb, NULL);
-}
-
-static
-void
LibTCPCloseCallback(void *arg)
{
struct close_callback_msg *msg = arg;
- DbgPrint("[lwIP, LibTCPCloseCallback] pcb = 0x%x\n",
(PTCP_PCB)msg->Connection->SocketContext);
-
if (!msg->Connection->SocketContext)
{
- DbgPrint("[lwIP, LibTCPCloseCallback] NULL pcb...bail, bail!!!\n");
-
msg->Error = ERR_OK;
- return;
- }
-
- CloseCallbacks((PTCP_PCB)msg->Connection->SocketContext);
+ goto done;
+ }
LibTCPEmptyQueue(msg->Connection);
if (((PTCP_PCB)msg->Connection->SocketContext)->state == LISTEN)
{
- DbgPrint("[lwIP, LibTCPCloseCallback] Closing a listener\n");
msg->Error = tcp_close((PTCP_PCB)msg->Connection->SocketContext);
}
else
{
- DbgPrint("[lwIP, LibTCPCloseCallback] Aborting a connection\n");
tcp_abort((PTCP_PCB)msg->Connection->SocketContext);
msg->Error = ERR_OK;
}
+done:
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
@@ -823,79 +702,36 @@
LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe)
{
err_t ret;
-
- DbgPrint("[lwIP, LibTCPClose] Called on pcb = 0x%x\n",
Connection->SocketContext);
-
- if (!Connection->SocketContext)
- {
- DbgPrint("[lwIP, LibTCPClose] Done... NO pcb\n");
- return ERR_CLSD;
- }
-
- DbgPrint("[lwIP, LibTCPClose] pcb->state = %s\n",
- tcp_state_str[((PTCP_PCB)Connection->SocketContext)->state]);
-
- /*
- If we're being called from a handler it means we're in the conetxt of
teh tcpip
- main thread. Therefore we don't have to queue our request via a callback and
we
- can execute immediately.
- */
- if (safe)
- {
- CloseCallbacks((PTCP_PCB)Connection->SocketContext);
-
- LibTCPEmptyQueue(Connection);
-
- if ( ((PTCP_PCB)Connection->SocketContext)->state == LISTEN )
- {
- DbgPrint("[lwIP, LibTCPClose] Closing a listener\n");
- ret = tcp_close((PTCP_PCB)Connection->SocketContext);
- }
- else
- {
- DbgPrint("[lwIP, LibTCPClose] Aborting a connection\n");
- tcp_abort((PTCP_PCB)Connection->SocketContext);
- ret = ERR_OK;
- }
-
+ struct close_callback_msg *msg;
+
+ msg = ExAllocatePool(NonPagedPool, sizeof(struct close_callback_msg));
+ if (msg)
+ {
+ KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
+
+ msg->Connection = Connection;
+
+ if (safe)
+ LibTCPCloseCallback(msg);
+ else
+ tcpip_callback_with_block(LibTCPCloseCallback, msg, 1);
+
+ if (WaitForEventSafely(&msg->Event))
+ ret = msg->Error;
+ else
+ ret = ERR_CLSD;
+
+ ExFreePool(msg);
+
return ret;
}
- else
- {
- struct close_callback_msg *msg;
-
- msg = ExAllocatePool(NonPagedPool, sizeof(struct close_callback_msg));
- if (msg)
- {
- KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
-
- msg->Connection = Connection;
-
- tcpip_callback_with_block(LibTCPCloseCallback, msg, 1);
-
- if (WaitForEventSafely(&msg->Event))
- ret = msg->Error;
- else
- ret = ERR_CLSD;
-
- ExFreePool(msg);
-
- DbgPrint("[lwIP, LibTCPClose] Done\n");
-
- return ret;
- }
- }
-
- DbgPrint("[lwIP, LibTCPClose] Failed to allocate memory\n");
-
+
return ERR_MEM;
}
void
LibTCPAccept(PTCP_PCB pcb, struct tcp_pcb *listen_pcb, void *arg)
{
- DbgPrint("[lwIP, LibTCPAccept] Called. (pcb, arg) = (0x%x, 0x%x)\n", pcb,
arg);
-
ASSERT(arg);
tcp_arg(pcb, NULL);
@@ -905,40 +741,28 @@
tcp_arg(pcb, arg);
tcp_accepted(listen_pcb);
-
- DbgPrint("[lwIP, LibTCPAccept] Done\n");
}
err_t
LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
{
- DbgPrint("[lwIP, LibTCPGetHostName] Called. pcb = (0x%x)\n", pcb);
-
if (!pcb)
return ERR_CLSD;
*ipaddr = pcb->local_ip;
*port = pcb->local_port;
- DbgPrint("[lwIP, LibTCPGetHostName] Got host port: %d\n", *port);
-
- DbgPrint("[lwIP, LibTCPGetHostName] Done\n");
-
return ERR_OK;
}
err_t
LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr * const ipaddr, u16_t * const port)
-{
- DbgPrint("[lwIP, LibTCPGetPeerName] pcb = (0x%x)\n", pcb);
-
+{
if (!pcb)
return ERR_CLSD;
*ipaddr = pcb->remote_ip;
*port = pcb->remote_port;
- DbgPrint("[lwIP, LibTCPGetPeerName] Got remote port: %d\n", *port);
-
return ERR_OK;
}
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/sys_arch.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drive…
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/sys_arch.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/sys_arch.c [iso-8859-1] Tue Aug 2
19:20:40 2011
@@ -94,10 +94,6 @@
LargeTimeout.QuadPart = Int32x32To64(timeout, -10000);
KeQuerySystemTime(&PreWaitTime);
-
- // FIXME: This is a hack to increase the throughput. Once this is done
- // the right way it should definately be removed.
- //timeout = 5;
Status = KeWaitForMultipleObjects(2,
WaitObjects,
@@ -107,17 +103,12 @@
FALSE,
timeout != 0 ? &LargeTimeout : NULL,
NULL);
-
- //DbgPrint("[+[+[+[ sys_arch_sem_wait ]+]+]+] timeout = %d\n", timeout);
-
if (Status == STATUS_WAIT_0)
{
KeQuerySystemTime(&PostWaitTime);
TimeDiff = PostWaitTime.QuadPart - PreWaitTime.QuadPart;
TimeDiff /= 10000;
- //DbgPrint("[+[+[+[ sys_arch_sem_wait ]+]+]+] TimeDiff = %llu\n",
TimeDiff);
-
return TimeDiff;
}
else if (Status == STATUS_WAIT_1)
@@ -130,8 +121,6 @@
return 0;
}
-
- //DbgPrint("[+[+[+[ sys_arch_sem_wait ]+]+]+] SYS_ARCH_TIMEOUT\n");
return SYS_ARCH_TIMEOUT;
}
@@ -196,9 +185,6 @@
PLIST_ENTRY Entry;
KIRQL OldIrql;
PVOID WaitObjects[] = {&mbox->Event, &TerminationEvent};
-
- //timeout = 0;
- //DbgPrint("[[[[[ sys_arch_mbox_fetch ]]]]] %d\n", timeout);
LargeTimeout.QuadPart = Int32x32To64(timeout, -10000);
@@ -213,8 +199,6 @@
timeout != 0 ? &LargeTimeout : NULL,
NULL);
- //DbgPrint("[ [ [ [ sys_arch_mbox_fetch ] ] ] ] timeout = %d\n", timeout);
-
if (Status == STATUS_WAIT_0)
{
KeAcquireSpinLock(&mbox->Lock, &OldIrql);
@@ -234,8 +218,6 @@
KeQuerySystemTime(&PostWaitTime);
TimeDiff = PostWaitTime.QuadPart - PreWaitTime.QuadPart;
TimeDiff /= 10000;
-
- //DbgPrint("[ [ [ [ sys_arch_mbox_fetch ] ] ] ] TimeDiff = %llu\n",
TimeDiff);
return TimeDiff;
}
@@ -249,8 +231,6 @@
return 0;
}
-
- //DbgPrint("[ [ [ [ sys_arch_mbox_fetch ] ] ] ] SYS_ARCH_TIMEOUT\n");
return SYS_ARCH_TIMEOUT;
}
@@ -276,7 +256,7 @@
NTAPI
LwipThreadMain(PVOID Context)
{
- thread_t Container = Context;
+ thread_t Container = (thread_t)Context;
KIRQL OldIrql;
ExInterlockedInsertHeadList(&ThreadListHead, &Container->ListEntry,
&ThreadListLock);
@@ -324,9 +304,8 @@
void
sys_init(void)
-{
+{
KeInitializeSpinLock(&ThreadListLock);
-
InitializeListHead(&ThreadListHead);
KeQuerySystemTime(&StartTime);