2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: transport/tcp/accept.c
5 * PURPOSE: Transmission Control Protocol Listen/Accept code
6 * PROGRAMMERS: Art Yerkes (arty@users.sf.net)
8 * arty 12/21/2004 Created
15 NTSTATUS
TCPCheckPeerForAccept(PVOID Context
,
16 PTDI_REQUEST_KERNEL Request
) {
17 struct tcp_pcb
*newpcb
= Context
;
19 PTDI_CONNECTION_INFORMATION WhoIsConnecting
;
20 PTA_IP_ADDRESS RemoteAddress
;
21 struct ip_addr ipaddr
;
23 if (Request
->RequestFlags
& TDI_QUERY_ACCEPT
)
24 DbgPrint("TDI_QUERY_ACCEPT NOT SUPPORTED!!!\n");
26 WhoIsConnecting
= (PTDI_CONNECTION_INFORMATION
)Request
->ReturnConnectionInformation
;
27 RemoteAddress
= (PTA_IP_ADDRESS
)WhoIsConnecting
->RemoteAddress
;
29 RemoteAddress
->TAAddressCount
= 1;
30 RemoteAddress
->Address
[0].AddressLength
= TDI_ADDRESS_LENGTH_IP
;
31 RemoteAddress
->Address
[0].AddressType
= TDI_ADDRESS_TYPE_IP
;
33 Status
= TCPTranslateError(LibTCPGetPeerName(newpcb
,
35 &RemoteAddress
->Address
[0].Address
[0].sin_port
));
37 RemoteAddress
->Address
[0].Address
[0].in_addr
= ipaddr
.addr
;
39 TI_DbgPrint(DEBUG_TCP
,("Status %x\n", Status
));
44 /* This listen is on a socket we keep as internal. That socket has the same
45 * lifetime as the address file */
46 NTSTATUS
TCPListen( PCONNECTION_ENDPOINT Connection
, UINT Backlog
) {
47 NTSTATUS Status
= STATUS_SUCCESS
;
48 struct ip_addr AddressToBind
;
52 ASSERT_KM_POINTER(Connection
->AddressFile
);
54 LockObject(Connection
, &OldIrql
);
56 TI_DbgPrint(DEBUG_TCP
,("TCPListen started\n"));
58 TI_DbgPrint(DEBUG_TCP
,("Connection->SocketContext %x\n",
59 Connection
->SocketContext
));
61 AddressToBind
.addr
= Connection
->AddressFile
->Address
.Address
.IPv4Address
;
63 Status
= TCPTranslateError(LibTCPBind(Connection
->SocketContext
,
65 Connection
->AddressFile
->Port
));
67 if (NT_SUCCESS(Status
))
69 Connection
->SocketContext
= LibTCPListen(Connection
->SocketContext
, Backlog
);
70 if (!Connection
->SocketContext
)
71 Status
= STATUS_UNSUCCESSFUL
;
74 UnlockObject(Connection
, OldIrql
);
76 TI_DbgPrint(DEBUG_TCP
,("TCPListen finished %x\n", Status
));
81 BOOLEAN
TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener
,
82 PCONNECTION_ENDPOINT Connection
) {
83 PLIST_ENTRY ListEntry
;
86 BOOLEAN Found
= FALSE
;
88 LockObject(Listener
, &OldIrql
);
90 ListEntry
= Listener
->ListenRequest
.Flink
;
91 while ( ListEntry
!= &Listener
->ListenRequest
) {
92 Bucket
= CONTAINING_RECORD(ListEntry
, TDI_BUCKET
, Entry
);
94 if( Bucket
->AssociatedEndpoint
== Connection
) {
95 RemoveEntryList( &Bucket
->Entry
);
96 ExFreePoolWithTag( Bucket
, TDI_BUCKET_TAG
);
101 ListEntry
= ListEntry
->Flink
;
104 UnlockObject(Listener
, OldIrql
);
109 NTSTATUS
TCPAccept ( PTDI_REQUEST Request
,
110 PCONNECTION_ENDPOINT Listener
,
111 PCONNECTION_ENDPOINT Connection
,
112 PTCP_COMPLETION_ROUTINE Complete
,
119 TI_DbgPrint(DEBUG_TCP
,("TCPAccept started\n"));
121 LockObject(Listener
, &OldIrql
);
123 Bucket
= ExAllocatePoolWithTag( NonPagedPool
, sizeof(*Bucket
),
127 Bucket
->AssociatedEndpoint
= Connection
;
128 Bucket
->Request
.RequestNotifyObject
= Complete
;
129 Bucket
->Request
.RequestContext
= Context
;
130 InsertTailList( &Listener
->ListenRequest
, &Bucket
->Entry
);
131 Status
= STATUS_PENDING
;
133 Status
= STATUS_NO_MEMORY
;
135 UnlockObject(Listener
, OldIrql
);
137 TI_DbgPrint(DEBUG_TCP
,("TCPAccept finished %x\n", Status
));