2004-12-25 21:30:20 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS TCP/IP protocol driver
|
2005-01-13 06:46:22 +00:00
|
|
|
* FILE: transport/tcp/accept.c
|
2004-12-25 21:30:20 +00:00
|
|
|
* PURPOSE: Transmission Control Protocol Listen/Accept code
|
|
|
|
* PROGRAMMERS: Art Yerkes (arty@users.sf.net)
|
|
|
|
* REVISIONS:
|
|
|
|
* arty 12/21/2004 Created
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
|
2010-09-21 06:11:24 +00:00
|
|
|
#include "rosip.h"
|
|
|
|
|
|
|
|
NTSTATUS TCPCheckPeerForAccept(PVOID Context,
|
2011-05-24 18:05:51 +00:00
|
|
|
PTDI_REQUEST_KERNEL Request)
|
|
|
|
{
|
2010-09-21 06:11:24 +00:00
|
|
|
struct tcp_pcb *newpcb = Context;
|
2004-12-25 21:30:20 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
PTDI_CONNECTION_INFORMATION WhoIsConnecting;
|
2010-09-21 06:11:24 +00:00
|
|
|
PTA_IP_ADDRESS RemoteAddress;
|
|
|
|
struct ip_addr ipaddr;
|
2011-05-24 18:05:51 +00:00
|
|
|
|
|
|
|
DbgPrint("[IP, TCPCheckPeerForAccept] Called\n");
|
2010-09-21 06:11:24 +00:00
|
|
|
|
|
|
|
if (Request->RequestFlags & TDI_QUERY_ACCEPT)
|
|
|
|
DbgPrint("TDI_QUERY_ACCEPT NOT SUPPORTED!!!\n");
|
|
|
|
|
|
|
|
WhoIsConnecting = (PTDI_CONNECTION_INFORMATION)Request->ReturnConnectionInformation;
|
|
|
|
RemoteAddress = (PTA_IP_ADDRESS)WhoIsConnecting->RemoteAddress;
|
|
|
|
|
|
|
|
RemoteAddress->TAAddressCount = 1;
|
|
|
|
RemoteAddress->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
|
|
|
|
RemoteAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
|
|
|
|
|
|
|
|
Status = TCPTranslateError(LibTCPGetPeerName(newpcb,
|
|
|
|
&ipaddr,
|
|
|
|
&RemoteAddress->Address[0].Address[0].sin_port));
|
|
|
|
|
|
|
|
RemoteAddress->Address[0].Address[0].in_addr = ipaddr.addr;
|
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
DbgPrint("[IP, TCPCheckPeerForAccept] Leaving. Status %x\n", Status);
|
2004-12-25 21:30:20 +00:00
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This listen is on a socket we keep as internal. That socket has the same
|
|
|
|
* lifetime as the address file */
|
2011-05-24 18:05:51 +00:00
|
|
|
NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog )
|
|
|
|
{
|
2004-12-25 21:30:20 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2010-09-21 06:11:24 +00:00
|
|
|
struct ip_addr AddressToBind;
|
2009-11-14 18:38:02 +00:00
|
|
|
KIRQL OldIrql;
|
2004-12-25 21:30:20 +00:00
|
|
|
|
|
|
|
ASSERT(Connection);
|
|
|
|
ASSERT_KM_POINTER(Connection->AddressFile);
|
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
LockObject(Connection, &OldIrql);
|
2009-11-14 18:38:02 +00:00
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Called\n"));
|
2011-06-01 13:27:35 +00:00
|
|
|
DbgPrint("[IP, TCPListen] Called\n");
|
2009-08-13 23:42:21 +00:00
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
TI_DbgPrint(DEBUG_TCP, ("Connection->SocketContext %x\n",
|
|
|
|
Connection->SocketContext));
|
2010-09-21 06:11:24 +00:00
|
|
|
|
|
|
|
AddressToBind.addr = Connection->AddressFile->Address.Address.IPv4Address;
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2010-09-21 06:11:24 +00:00
|
|
|
Status = TCPTranslateError(LibTCPBind(Connection->SocketContext,
|
|
|
|
&AddressToBind,
|
|
|
|
Connection->AddressFile->Port));
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2008-10-25 23:44:41 +00:00
|
|
|
if (NT_SUCCESS(Status))
|
2010-09-21 06:11:24 +00:00
|
|
|
{
|
|
|
|
Connection->SocketContext = LibTCPListen(Connection->SocketContext, Backlog);
|
|
|
|
if (!Connection->SocketContext)
|
|
|
|
Status = STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
UnlockObject(Connection, OldIrql);
|
2004-12-25 21:30:20 +00:00
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Leaving. Status = %x\n", Status));
|
2011-06-01 13:27:35 +00:00
|
|
|
DbgPrint("[IP, TCPListen] Leaving. Status = %x\n", Status);
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2004-12-25 21:30:20 +00:00
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
2009-11-22 02:32:47 +00:00
|
|
|
BOOLEAN TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
|
2011-05-27 19:37:28 +00:00
|
|
|
PCONNECTION_ENDPOINT Connection )
|
|
|
|
{
|
2004-12-25 21:30:20 +00:00
|
|
|
PLIST_ENTRY ListEntry;
|
|
|
|
PTDI_BUCKET Bucket;
|
2009-07-02 07:16:50 +00:00
|
|
|
KIRQL OldIrql;
|
2009-11-22 02:32:47 +00:00
|
|
|
BOOLEAN Found = FALSE;
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2011-06-01 13:27:35 +00:00
|
|
|
DbgPrint("[IP, TCPAbortListenForSocket] Called\n");
|
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
LockObject(Listener, &OldIrql);
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2005-03-13 21:47:04 +00:00
|
|
|
ListEntry = Listener->ListenRequest.Flink;
|
2011-05-27 19:37:28 +00:00
|
|
|
while ( ListEntry != &Listener->ListenRequest )
|
|
|
|
{
|
|
|
|
Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
|
|
|
|
|
|
|
|
if( Bucket->AssociatedEndpoint == Connection )
|
|
|
|
{
|
|
|
|
DereferenceObject(Bucket->AssociatedEndpoint);
|
|
|
|
RemoveEntryList( &Bucket->Entry );
|
|
|
|
ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG );
|
|
|
|
Found = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ListEntry = ListEntry->Flink;
|
2004-12-25 21:30:20 +00:00
|
|
|
}
|
2005-05-08 02:16:32 +00:00
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
UnlockObject(Listener, OldIrql);
|
2009-11-22 02:32:47 +00:00
|
|
|
|
2011-06-01 13:27:35 +00:00
|
|
|
DbgPrint("[IP, TCPAbortListenForSocket] Leaving. Status = %s\n",
|
|
|
|
Found == TRUE ? "TRUE" : "FALSE");
|
|
|
|
|
2009-11-22 02:32:47 +00:00
|
|
|
return Found;
|
2004-12-25 21:30:20 +00:00
|
|
|
}
|
|
|
|
|
2009-06-27 07:38:02 +00:00
|
|
|
NTSTATUS TCPAccept ( PTDI_REQUEST Request,
|
|
|
|
PCONNECTION_ENDPOINT Listener,
|
|
|
|
PCONNECTION_ENDPOINT Connection,
|
|
|
|
PTCP_COMPLETION_ROUTINE Complete,
|
|
|
|
PVOID Context )
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PTDI_BUCKET Bucket;
|
2009-11-14 18:38:02 +00:00
|
|
|
KIRQL OldIrql;
|
2004-12-25 21:30:20 +00:00
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
DbgPrint("[IP, TCPAccept] Called\n");
|
2004-12-25 21:30:20 +00:00
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
LockObject(Listener, &OldIrql);
|
2009-11-14 18:38:02 +00:00
|
|
|
|
2010-09-21 06:11:24 +00:00
|
|
|
Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket),
|
|
|
|
TDI_BUCKET_TAG );
|
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
if( Bucket )
|
|
|
|
{
|
2010-09-21 06:11:24 +00:00
|
|
|
Bucket->AssociatedEndpoint = Connection;
|
2011-05-27 19:37:28 +00:00
|
|
|
ReferenceObject(Bucket->AssociatedEndpoint);
|
|
|
|
|
2010-09-21 06:11:24 +00:00
|
|
|
Bucket->Request.RequestNotifyObject = Complete;
|
|
|
|
Bucket->Request.RequestContext = Context;
|
|
|
|
InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
|
|
|
|
Status = STATUS_PENDING;
|
2011-05-24 18:05:51 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-21 06:11:24 +00:00
|
|
|
Status = STATUS_NO_MEMORY;
|
2004-12-25 21:30:20 +00:00
|
|
|
|
2009-12-31 23:33:24 +00:00
|
|
|
UnlockObject(Listener, OldIrql);
|
|
|
|
|
2011-05-24 18:05:51 +00:00
|
|
|
DbgPrint("[IP, TCPAccept] Leaving. Status = %x\n", Status);
|
2009-06-27 07:38:02 +00:00
|
|
|
return Status;
|
2004-12-25 21:30:20 +00:00
|
|
|
}
|