ReactOS  0.4.14-dev-614-gbfd8a84
accept.c
Go to the documentation of this file.
1 /*
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)
7  * REVISIONS:
8  * arty 12/21/2004 Created
9  */
10 
11 #include "precomp.h"
12 
13 #include "rosip.h"
14 
16 
19 {
20  struct tcp_pcb *newpcb = (struct tcp_pcb*)Context;
22  PTDI_CONNECTION_INFORMATION WhoIsConnecting;
24  struct ip_addr ipaddr;
25 
26  if (Request->RequestFlags & TDI_QUERY_ACCEPT)
27  DbgPrint("TDI_QUERY_ACCEPT NOT SUPPORTED!!!\n");
28 
29  WhoIsConnecting = (PTDI_CONNECTION_INFORMATION)Request->ReturnConnectionInformation;
30  RemoteAddress = (PTA_IP_ADDRESS)WhoIsConnecting->RemoteAddress;
31 
32  RemoteAddress->TAAddressCount = 1;
33  RemoteAddress->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
34  RemoteAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
35 
37  &ipaddr,
38  &RemoteAddress->Address[0].Address[0].sin_port));
39 
40  RemoteAddress->Address[0].Address[0].in_addr = ipaddr.addr;
41 
42  return Status;
43 }
44 
45 /* This listen is on a socket we keep as internal. That socket has the same
46  * lifetime as the address file */
48 {
50  struct ip_addr AddressToBind;
51  KIRQL OldIrql;
53 
54  ASSERT(Connection);
55 
56  LockObject(Connection, &OldIrql);
57 
58  ASSERT_KM_POINTER(Connection->AddressFile);
59 
60  TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Called\n"));
61 
62  TI_DbgPrint(DEBUG_TCP, ("Connection->SocketContext %x\n",
63  Connection->SocketContext));
64 
65  AddressToBind.addr = Connection->AddressFile->Address.Address.IPv4Address;
66 
67  Status = TCPTranslateError(LibTCPBind(Connection,
68  &AddressToBind,
69  Connection->AddressFile->Port));
70 
71  if (NT_SUCCESS(Status))
72  {
73  /* Check if we had an unspecified port */
74  if (!Connection->AddressFile->Port)
75  {
76  /* We did, so we need to copy back the port */
78  if (NT_SUCCESS(Status))
79  {
80  /* Allocate the port in the port bitmap */
81  Connection->AddressFile->Port = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
82 
83  /* This should never fail */
84  ASSERT(Connection->AddressFile->Port != 0xFFFF);
85  }
86  }
87  }
88 
89  if (NT_SUCCESS(Status))
90  {
91  Connection->SocketContext = LibTCPListen(Connection, Backlog);
92  if (!Connection->SocketContext)
94  }
95 
96  UnlockObject(Connection, OldIrql);
97 
98  TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Leaving. Status = %x\n", Status));
99 
100  return Status;
101 }
102 
105  PCONNECTION_ENDPOINT Connection)
106 {
107  PLIST_ENTRY ListEntry;
108  PTDI_BUCKET Bucket;
109  KIRQL OldIrql;
110  BOOLEAN Found = FALSE;
111 
112  LockObject(Listener, &OldIrql);
113 
114  ListEntry = Listener->ListenRequest.Flink;
115  while (ListEntry != &Listener->ListenRequest)
116  {
117  Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
118 
119  if (Bucket->AssociatedEndpoint == Connection)
120  {
122  RemoveEntryList( &Bucket->Entry );
123  ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
124  Found = TRUE;
125  break;
126  }
127 
128  ListEntry = ListEntry->Flink;
129  }
130 
131  UnlockObject(Listener, OldIrql);
132 
133  return Found;
134 }
135 
137  PCONNECTION_ENDPOINT Listener,
138  PCONNECTION_ENDPOINT Connection,
139  PTCP_COMPLETION_ROUTINE Complete,
140  PVOID Context )
141 {
143  PTDI_BUCKET Bucket;
144  KIRQL OldIrql;
145 
146  LockObject(Listener, &OldIrql);
147 
148  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
149 
150  if (Bucket)
151  {
152  Bucket->AssociatedEndpoint = Connection;
154 
155  Bucket->Request.RequestNotifyObject = Complete;
156  Bucket->Request.RequestContext = Context;
157  InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
159  }
160  else
162 
163  UnlockObject(Listener, OldIrql);
164 
165  return Status;
166 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
err_t LibTCPBind(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
Definition: rostcp.c:394
#define TRUE
Definition: types.h:120
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
PVOID RequestContext
Definition: tdi.h:55
#define DbgPrint
Definition: loader.c:25
LONG NTSTATUS
Definition: precomp.h:26
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:822
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
#define InsertTailList(ListHead, Entry)
NTSTATUS TCPAccept(PTDI_REQUEST Request, PCONNECTION_ENDPOINT Listener, PCONNECTION_ENDPOINT Connection, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: accept.c:136
#define DEBUG_TCP
Definition: debug.h:28
#define DereferenceObject(Object)
Definition: titypes.h:24
#define LockObject(Object, Irql)
Definition: titypes.h:34
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
PADDRESS_FILE AddressFile
Definition: titypes.h:268
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS TransportAddress, BOOLEAN RemoteAddress)
Definition: tcp.c:602
BOOLEAN TCPAbortListenForSocket(PCONNECTION_ENDPOINT Listener, PCONNECTION_ENDPOINT Connection)
Definition: accept.c:104
PVOID RequestNotifyObject
Definition: tdi.h:54
#define UnlockObject(Object, OldIrql)
Definition: titypes.h:54
unsigned char BOOLEAN
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:580
return Found
Definition: dirsup.c:1270
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
VOID(* PTCP_COMPLETION_ROUTINE)(PVOID Context, NTSTATUS Status, ULONG Count)
Definition: tcp.h:11
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_PENDING
Definition: ntstatus.h:82
struct _TDI_CONNECTION_INFORMATION * PTDI_CONNECTION_INFORMATION
#define ASSERT_KM_POINTER(_x)
Definition: debug.h:74
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
#define ReferenceObject(Object)
Definition: titypes.h:14
Definition: typedefs.h:117
LIST_ENTRY Entry
Definition: titypes.h:250
NTSTATUS TCPCheckPeerForAccept(PVOID Context, PTDI_REQUEST_KERNEL Request)
Definition: accept.c:17
Status
Definition: gdiplustypes.h:24
NTSTATUS TCPTranslateError(const INT8 err)
Definition: tcp.c:242
#define TDI_QUERY_ACCEPT
Definition: tdi.h:132
IP_ADDRESS Address
Definition: titypes.h:136
struct _CONNECTION_ENDPOINT * AssociatedEndpoint
Definition: titypes.h:251
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
LIST_ENTRY ListenRequest
Definition: titypes.h:272
unsigned int UINT
Definition: ndis.h:50
NTSTATUS TCPListen(PCONNECTION_ENDPOINT Connection, UINT Backlog)
Definition: accept.c:47
struct tagContext Context
Definition: acpixf.h:1030
TDI_REQUEST Request
Definition: titypes.h:252
USHORT Port
Definition: titypes.h:139
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
return STATUS_SUCCESS
Definition: btrfs.c:2938
u32_t addr
Definition: ip_addr.h:45
union IP_ADDRESS::@990 Address
base of all file and directory entries
Definition: entries.h:82
PTCP_PCB LibTCPListen(PCONNECTION_ENDPOINT Connection, const u8_t backlog)
Definition: rostcp.c:448
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:170
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:170