mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 12:02:02 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
166
sdk/lib/drivers/ip/transport/tcp/accept.c
Normal file
166
sdk/lib/drivers/ip/transport/tcp/accept.c
Normal file
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS TCP/IP protocol driver
|
||||
* FILE: transport/tcp/accept.c
|
||||
* PURPOSE: Transmission Control Protocol Listen/Accept code
|
||||
* PROGRAMMERS: Art Yerkes (arty@users.sf.net)
|
||||
* REVISIONS:
|
||||
* arty 12/21/2004 Created
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#include "rosip.h"
|
||||
|
||||
extern NPAGED_LOOKASIDE_LIST TdiBucketLookasideList;
|
||||
|
||||
NTSTATUS TCPCheckPeerForAccept(PVOID Context,
|
||||
PTDI_REQUEST_KERNEL Request)
|
||||
{
|
||||
struct tcp_pcb *newpcb = (struct tcp_pcb*)Context;
|
||||
NTSTATUS Status;
|
||||
PTDI_CONNECTION_INFORMATION WhoIsConnecting;
|
||||
PTA_IP_ADDRESS RemoteAddress;
|
||||
struct ip_addr ipaddr;
|
||||
|
||||
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;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* This listen is on a socket we keep as internal. That socket has the same
|
||||
* lifetime as the address file */
|
||||
NTSTATUS TCPListen(PCONNECTION_ENDPOINT Connection, UINT Backlog)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
struct ip_addr AddressToBind;
|
||||
KIRQL OldIrql;
|
||||
TA_IP_ADDRESS LocalAddress;
|
||||
|
||||
ASSERT(Connection);
|
||||
|
||||
LockObject(Connection, &OldIrql);
|
||||
|
||||
ASSERT_KM_POINTER(Connection->AddressFile);
|
||||
|
||||
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Called\n"));
|
||||
|
||||
TI_DbgPrint(DEBUG_TCP, ("Connection->SocketContext %x\n",
|
||||
Connection->SocketContext));
|
||||
|
||||
AddressToBind.addr = Connection->AddressFile->Address.Address.IPv4Address;
|
||||
|
||||
Status = TCPTranslateError(LibTCPBind(Connection,
|
||||
&AddressToBind,
|
||||
Connection->AddressFile->Port));
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Check if we had an unspecified port */
|
||||
if (!Connection->AddressFile->Port)
|
||||
{
|
||||
/* We did, so we need to copy back the port */
|
||||
Status = TCPGetSockAddress(Connection, (PTRANSPORT_ADDRESS)&LocalAddress, FALSE);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Allocate the port in the port bitmap */
|
||||
Connection->AddressFile->Port = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
|
||||
|
||||
/* This should never fail */
|
||||
ASSERT(Connection->AddressFile->Port != 0xFFFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Connection->SocketContext = LibTCPListen(Connection, Backlog);
|
||||
if (!Connection->SocketContext)
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
UnlockObject(Connection, OldIrql);
|
||||
|
||||
TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Leaving. Status = %x\n", Status));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
BOOLEAN TCPAbortListenForSocket
|
||||
( PCONNECTION_ENDPOINT Listener,
|
||||
PCONNECTION_ENDPOINT Connection)
|
||||
{
|
||||
PLIST_ENTRY ListEntry;
|
||||
PTDI_BUCKET Bucket;
|
||||
KIRQL OldIrql;
|
||||
BOOLEAN Found = FALSE;
|
||||
|
||||
LockObject(Listener, &OldIrql);
|
||||
|
||||
ListEntry = Listener->ListenRequest.Flink;
|
||||
while (ListEntry != &Listener->ListenRequest)
|
||||
{
|
||||
Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
|
||||
|
||||
if (Bucket->AssociatedEndpoint == Connection)
|
||||
{
|
||||
DereferenceObject(Bucket->AssociatedEndpoint);
|
||||
RemoveEntryList( &Bucket->Entry );
|
||||
ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
UnlockObject(Listener, OldIrql);
|
||||
|
||||
return Found;
|
||||
}
|
||||
|
||||
NTSTATUS TCPAccept ( PTDI_REQUEST Request,
|
||||
PCONNECTION_ENDPOINT Listener,
|
||||
PCONNECTION_ENDPOINT Connection,
|
||||
PTCP_COMPLETION_ROUTINE Complete,
|
||||
PVOID Context )
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PTDI_BUCKET Bucket;
|
||||
KIRQL OldIrql;
|
||||
|
||||
LockObject(Listener, &OldIrql);
|
||||
|
||||
Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
|
||||
|
||||
if (Bucket)
|
||||
{
|
||||
Bucket->AssociatedEndpoint = Connection;
|
||||
ReferenceObject(Bucket->AssociatedEndpoint);
|
||||
|
||||
Bucket->Request.RequestNotifyObject = Complete;
|
||||
Bucket->Request.RequestContext = Context;
|
||||
InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
|
||||
Status = STATUS_PENDING;
|
||||
}
|
||||
else
|
||||
Status = STATUS_NO_MEMORY;
|
||||
|
||||
UnlockObject(Listener, OldIrql);
|
||||
|
||||
return Status;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue