ReactOS  0.4.13-dev-455-g28ed234
tcp.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/tcp.c
5  * PURPOSE: Transmission Control Protocol
6  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7  * Art Yerkes (arty@users.sf.net)
8  * REVISIONS:
9  * CSH 01/08-2000 Created
10  * arty 12/21/2004 Added accept
11  */
12 
13 #include "precomp.h"
14 
18 
19 #include "lwip/pbuf.h"
20 #include "lwip/ip.h"
21 #include "lwip/init.h"
22 #include "lwip/arch.h"
23 
24 #include "rosip.h"
25 
27 
28 VOID NTAPI
33 {
36  PTDI_BUCKET Bucket;
37 
38  LockObjectAtDpcLevel(Connection);
39 
40  /* We timed out waiting for pending sends so force it to shutdown */
41  TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
42 
43  while (!IsListEmpty(&Connection->SendRequest))
44  {
45  Entry = RemoveHeadList(&Connection->SendRequest);
46 
48 
49  Bucket->Information = 0;
50  Bucket->Status = STATUS_FILE_CLOSED;
51 
52  CompleteBucket(Connection, Bucket, FALSE);
53  }
54 
55  while (!IsListEmpty(&Connection->ShutdownRequest))
56  {
57  Entry = RemoveHeadList( &Connection->ShutdownRequest );
58 
60 
61  Bucket->Status = STATUS_TIMEOUT;
62  Bucket->Information = 0;
63 
64  CompleteBucket(Connection, Bucket, FALSE);
65  }
66 
67  UnlockObjectFromDpcLevel(Connection);
68 
69  DereferenceObject(Connection);
70 }
71 
73 {
75  KIRQL OldIrql;
76 
77  TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n"));
78 
80  RemoveEntryList(&Connection->ListEntry);
82 
83  ExFreePoolWithTag( Connection, CONN_ENDPT_TAG );
84 }
85 
87 {
90 
91  if (!Connection)
92  return Connection;
93 
94  TI_DbgPrint(DEBUG_CPOINT, ("Connection point file object allocated at (0x%X).\n", Connection));
95 
96  RtlZeroMemory(Connection, sizeof(CONNECTION_ENDPOINT));
97 
98  /* Initialize spin lock that protects the connection endpoint file object */
99  KeInitializeSpinLock(&Connection->Lock);
100  InitializeListHead(&Connection->ConnectRequest);
101  InitializeListHead(&Connection->ListenRequest);
102  InitializeListHead(&Connection->ReceiveRequest);
103  InitializeListHead(&Connection->SendRequest);
104  InitializeListHead(&Connection->ShutdownRequest);
105  InitializeListHead(&Connection->PacketQueue);
106 
107  /* Initialize disconnect timer */
108  KeInitializeTimer(&Connection->DisconnectTimer);
109  KeInitializeDpc(&Connection->DisconnectDpc, DisconnectTimeoutDpc, Connection);
110 
111  /* Save client context pointer */
112  Connection->ClientContext = ClientContext;
113 
114  Connection->RefCount = 1;
115  Connection->Free = ConnectionFree;
116 
117  /* Add connection endpoint to global list */
119  &Connection->ListEntry,
121 
122  return Connection;
123 }
124 
126  UINT Family, UINT Type, UINT Proto )
127 {
129  KIRQL OldIrql;
130 
131  LockObject(Connection, &OldIrql);
132 
133  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Called: Connection %x, Family %d, Type %d, "
134  "Proto %d, sizeof(CONNECTION_ENDPOINT) = %d\n",
135  Connection, Family, Type, Proto, sizeof(CONNECTION_ENDPOINT)));
136 
137  Connection->SocketContext = LibTCPSocket(Connection);
138  if (Connection->SocketContext)
140  else
142 
143  UnlockObject(Connection, OldIrql);
144 
145  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Leaving. Status = 0x%x\n", Status));
146 
147  return Status;
148 }
149 
151 {
152  KIRQL OldIrql;
153 
154  LockObject(Connection, &OldIrql);
155 
156  FlushAllQueues(Connection, STATUS_CANCELLED);
157 
158  LibTCPClose(Connection, FALSE, TRUE);
159 
160  UnlockObject(Connection, OldIrql);
161 
162  DereferenceObject(Connection);
163 
164  return STATUS_SUCCESS;
165 }
166 
168 /*
169  * FUNCTION: Receives and queues TCP data
170  * ARGUMENTS:
171  * IPPacket = Pointer to an IP packet that was received
172  * NOTES:
173  * This is the low level interface for receiving TCP data
174  */
175 {
176  TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to lwIP\n",
177  IPPacket->TotalSize,
178  IPPacket->HeaderSize));
179 
180  LibIPInsertPacket(Interface->TCPContext, IPPacket->Header, IPPacket->TotalSize);
181 }
182 
184 /*
185  * FUNCTION: Initializes the TCP subsystem
186  * RETURNS:
187  * Status of operation
188  */
189 {
191 
192  Status = PortsStartup( &TCPPorts, 1, 0xfffe );
193  if (!NT_SUCCESS(Status))
194  {
195  return Status;
196  }
197 
199  NULL,
200  NULL,
201  0,
202  sizeof(TDI_BUCKET),
204  0);
205 
206  /* Initialize our IP library */
207  LibIPInitialize();
208 
209  /* Register this protocol with IP layer */
211 
213 
214  return STATUS_SUCCESS;
215 }
216 
217 
219 /*
220  * FUNCTION: Shuts down the TCP subsystem
221  * RETURNS:
222  * Status of operation
223  */
224 {
225  if (!TCPInitialized)
226  return STATUS_SUCCESS;
227 
229 
230  LibIPShutdown();
231 
232  /* Deregister this protocol with IP layer */
234 
236 
238 
239  return STATUS_SUCCESS;
240 }
241 
243 {
245 
246  switch (err)
247  {
248  case ERR_OK: Status = STATUS_SUCCESS; return Status; //0
249  case ERR_MEM: Status = STATUS_INSUFFICIENT_RESOURCES; break; //-1
250  case ERR_BUF: Status = STATUS_BUFFER_TOO_SMALL; break; //-2
251  case ERR_TIMEOUT: Status = STATUS_TIMEOUT; break; // -3
252  case ERR_RTE: Status = STATUS_NETWORK_UNREACHABLE; break; //-4
253  case ERR_INPROGRESS: Status = STATUS_PENDING; return Status; //-5
254  case ERR_VAL: Status = STATUS_INVALID_PARAMETER; break; //-6
255  case ERR_WOULDBLOCK: Status = STATUS_CANT_WAIT; break; //-7
256  case ERR_USE: Status = STATUS_ADDRESS_ALREADY_EXISTS; break; //-8
257  case ERR_ISCONN: Status = STATUS_UNSUCCESSFUL; break; //-9 (FIXME)
258  case ERR_ABRT: Status = STATUS_LOCAL_DISCONNECT; break; //-10
259  case ERR_RST: Status = STATUS_REMOTE_DISCONNECT; break; //-11
260  case ERR_CLSD: Status = STATUS_FILE_CLOSED; break; //-12
261  case ERR_CONN: Status = STATUS_INVALID_CONNECTION; break; //-13
262  case ERR_ARG: Status = STATUS_INVALID_PARAMETER; break; //-14
263  case ERR_IF: Status = STATUS_UNEXPECTED_NETWORK_ERROR; break; //-15
264  default:
265  DbgPrint("Invalid error value: %d\n", err);
266  ASSERT(FALSE);
268  break;
269  }
270 
271  TI_DbgPrint(DEBUG_TCP,("TCP operation failed: 0x%x (%d)\n", Status, err));
272 
273  return Status;
274 }
275 
277 ( PCONNECTION_ENDPOINT Connection,
279  PTDI_CONNECTION_INFORMATION ReturnInfo,
280  PTCP_COMPLETION_ROUTINE Complete,
281  PVOID Context )
282 {
284  struct ip_addr bindaddr, connaddr;
286  USHORT RemotePort;
288  PTDI_BUCKET Bucket;
290  KIRQL OldIrql;
291 
292  TI_DbgPrint(DEBUG_TCP,("[IP, TCPConnect] Called\n"));
293 
295  ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress,
296  &RemoteAddress,
297  &RemotePort);
298 
299  if (!NT_SUCCESS(Status))
300  {
301  TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n"));
302  return Status;
303  }
304 
305  /* Freed in TCPSocketState */
307  ("Connecting to address %x:%x\n",
308  RemoteAddress.Address.IPv4Address,
309  RemotePort));
310 
311  LockObject(Connection, &OldIrql);
312 
313  if (!Connection->AddressFile)
314  {
315  UnlockObject(Connection, OldIrql);
317  }
318 
319  if (AddrIsUnspecified(&Connection->AddressFile->Address))
320  {
322  {
323  UnlockObject(Connection, OldIrql);
325  }
326 
327  bindaddr.addr = NCE->Interface->Unicast.Address.IPv4Address;
328  }
329  else
330  {
331  bindaddr.addr = Connection->AddressFile->Address.Address.IPv4Address;
332  }
333 
334  Status = TCPTranslateError(LibTCPBind(Connection,
335  &bindaddr,
336  Connection->AddressFile->Port));
337 
338  if (NT_SUCCESS(Status))
339  {
340  /* Copy bind address into connection */
341  Connection->AddressFile->Address.Address.IPv4Address = bindaddr.addr;
342  /* Check if we had an unspecified port */
343  if (!Connection->AddressFile->Port)
344  {
345  /* We did, so we need to copy back the port */
347  if (NT_SUCCESS(Status))
348  {
349  /* Allocate the port in the port bitmap */
350  Connection->AddressFile->Port = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
351 
352  /* This should never fail */
353  ASSERT(Connection->AddressFile->Port != 0xFFFF);
354  }
355  }
356 
357  if (NT_SUCCESS(Status))
358  {
359  connaddr.addr = RemoteAddress.Address.IPv4Address;
360 
361  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
362  if (!Bucket)
363  {
364  UnlockObject(Connection, OldIrql);
365  return STATUS_NO_MEMORY;
366  }
367 
368  Bucket->Request.RequestNotifyObject = (PVOID)Complete;
369  Bucket->Request.RequestContext = Context;
370 
371  InsertTailList( &Connection->ConnectRequest, &Bucket->Entry );
372 
374  &connaddr,
375  RemotePort));
376  }
377  }
378 
379  UnlockObject(Connection, OldIrql);
380 
381  TI_DbgPrint(DEBUG_TCP,("[IP, TCPConnect] Leaving. Status = 0x%x\n", Status));
382 
383  return Status;
384 }
385 
387 ( PCONNECTION_ENDPOINT Connection,
388  UINT Flags,
391  PTDI_CONNECTION_INFORMATION ReturnInfo,
392  PTCP_COMPLETION_ROUTINE Complete,
393  PVOID Context )
394 {
396  PTDI_BUCKET Bucket;
397  KIRQL OldIrql;
398  LARGE_INTEGER ActualTimeout;
399 
400  TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Called\n"));
401 
402  LockObject(Connection, &OldIrql);
403 
404  if (Connection->SocketContext)
405  {
407  {
408  if (IsListEmpty(&Connection->SendRequest))
409  {
410  Status = TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
411  }
412  else if (Timeout && Timeout->QuadPart == 0)
413  {
415  TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
417  }
418  else
419  {
420  /* Use the timeout specified or 1 second if none was specified */
421  if (Timeout)
422  {
423  ActualTimeout = *Timeout;
424  }
425  else
426  {
427  ActualTimeout.QuadPart = -1000000;
428  }
429 
430  /* We couldn't complete the request now because we need to wait for outstanding I/O */
431  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
432  if (!Bucket)
433  {
434  UnlockObject(Connection, OldIrql);
435  return STATUS_NO_MEMORY;
436  }
437 
438  Bucket->Request.RequestNotifyObject = (PVOID)Complete;
439  Bucket->Request.RequestContext = Context;
440 
441  InsertTailList(&Connection->ShutdownRequest, &Bucket->Entry);
442 
443  ReferenceObject(Connection);
444  if (KeCancelTimer(&Connection->DisconnectTimer))
445  {
446  DereferenceObject(Connection);
447  }
448  KeSetTimer(&Connection->DisconnectTimer, ActualTimeout, &Connection->DisconnectDpc);
449 
451  }
452  }
453 
454  if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
455  {
459  Status = TCPTranslateError(LibTCPShutdown(Connection, 1, 1));
460  }
461  }
462  else
463  {
464  /* We already got closed by the other side so just return success */
466  }
467 
468  UnlockObject(Connection, OldIrql);
469 
470  TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Leaving. Status = 0x%x\n", Status));
471 
472  return Status;
473 }
474 
476 ( PCONNECTION_ENDPOINT Connection,
478  ULONG ReceiveLength,
479  PULONG BytesReceived,
480  ULONG ReceiveFlags,
481  PTCP_COMPLETION_ROUTINE Complete,
482  PVOID Context )
483 {
484  PTDI_BUCKET Bucket;
485  PUCHAR DataBuffer;
486  UINT DataLen, Received;
488 
489  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Called for %d bytes (on socket %x)\n",
490  ReceiveLength, Connection->SocketContext));
491 
492  NdisQueryBuffer(Buffer, &DataBuffer, &DataLen);
493 
494  Status = LibTCPGetDataFromConnectionQueue(Connection, DataBuffer, DataLen, &Received);
495 
496  if (Status == STATUS_PENDING)
497  {
498  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
499  if (!Bucket)
500  {
501  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Failed to allocate bucket\n"));
502 
503  return STATUS_NO_MEMORY;
504  }
505 
506  Bucket->Request.RequestNotifyObject = Complete;
507  Bucket->Request.RequestContext = Context;
508 
509  ExInterlockedInsertTailList( &Connection->ReceiveRequest, &Bucket->Entry, &Connection->Lock );
510  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Queued read irp\n"));
511 
512  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Leaving. Status = STATUS_PENDING\n"));
513 
514  (*BytesReceived) = 0;
515  }
516  else
517  {
518  (*BytesReceived) = Received;
519  }
520 
521  return Status;
522 }
523 
525 ( PCONNECTION_ENDPOINT Connection,
526  PCHAR BufferData,
527  ULONG SendLength,
528  PULONG BytesSent,
529  ULONG Flags,
530  PTCP_COMPLETION_ROUTINE Complete,
531  PVOID Context )
532 {
534  PTDI_BUCKET Bucket;
535  KIRQL OldIrql;
536 
537  LockObject(Connection, &OldIrql);
538 
539  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Called for %d bytes (on socket %x)\n",
540  SendLength, Connection->SocketContext));
541 
542  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection = %x\n", Connection));
543  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection->SocketContext = %x\n",
544  Connection->SocketContext));
545 
546  Status = TCPTranslateError(LibTCPSend(Connection,
547  BufferData,
548  SendLength,
549  BytesSent,
550  FALSE));
551 
552  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status, SendLength));
553 
554  /* Keep this request around ... there was no data yet */
555  if (Status == STATUS_PENDING)
556  {
557  /* Freed in TCPSocketState */
558  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
559  if (!Bucket)
560  {
561  UnlockObject(Connection, OldIrql);
562  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Failed to allocate bucket\n"));
563  return STATUS_NO_MEMORY;
564  }
565 
566  Bucket->Request.RequestNotifyObject = Complete;
567  Bucket->Request.RequestContext = Context;
568 
569  InsertTailList( &Connection->SendRequest, &Bucket->Entry );
570  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Queued write irp\n"));
571  }
572 
573  UnlockObject(Connection, OldIrql);
574 
575  TI_DbgPrint(DEBUG_TCP, ("[IP, TCPSendData] Leaving. Status = %x\n", Status));
576 
577  return Status;
578 }
579 
580 UINT TCPAllocatePort(const UINT HintPort)
581 {
582  if (HintPort)
583  {
584  if (AllocatePort(&TCPPorts, HintPort))
585  return HintPort;
586  else
587  {
588  TI_DbgPrint(MID_TRACE,("We got a hint port but couldn't allocate it\n"));
589  return (UINT)-1;
590  }
591  }
592  else
593  return AllocatePortFromRange( &TCPPorts, 1024, 5000 );
594 }
595 
597 {
599 }
600 
602 ( PCONNECTION_ENDPOINT Connection,
604  BOOLEAN GetRemote )
605 {
607  struct ip_addr ipaddr;
609  KIRQL OldIrql;
610 
611  AddressIP->TAAddressCount = 1;
612  AddressIP->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
613  AddressIP->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
614 
615  LockObject(Connection, &OldIrql);
616 
617  if (GetRemote)
618  {
620  &ipaddr,
621  &AddressIP->Address[0].Address[0].sin_port));
622  }
623  else
624  {
626  &ipaddr,
627  &AddressIP->Address[0].Address[0].sin_port));
628  }
629 
630  UnlockObject(Connection, OldIrql);
631 
632  AddressIP->Address[0].Address[0].in_addr = ipaddr.addr;
633 
634  RtlZeroMemory(&AddressIP->Address[0].Address[0].sin_zero,
635  sizeof(AddressIP->Address[0].Address[0].sin_zero));
636 
637  return Status;
638 }
639 
641 {
643  PLIST_ENTRY ListHead[5];
644  KIRQL OldIrql;
645  PTDI_BUCKET Bucket;
646  UINT i = 0;
647  BOOLEAN Found = FALSE;
648 
649  ListHead[0] = &Endpoint->SendRequest;
650  ListHead[1] = &Endpoint->ReceiveRequest;
651  ListHead[2] = &Endpoint->ConnectRequest;
652  ListHead[3] = &Endpoint->ListenRequest;
653  ListHead[4] = &Endpoint->ShutdownRequest;
654 
655  LockObject(Endpoint, &OldIrql);
656 
657  for( i = 0; i < 5; i++ )
658  {
659  for( Entry = ListHead[i]->Flink;
660  Entry != ListHead[i];
661  Entry = Entry->Flink )
662  {
663  Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
664  if( Bucket->Request.RequestContext == Irp )
665  {
666  RemoveEntryList( &Bucket->Entry );
667  ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
668  Found = TRUE;
669  break;
670  }
671  }
672  }
673 
674  UnlockObject(Endpoint, OldIrql);
675 
676  return Found;
677 }
678 
679 NTSTATUS
681  PCONNECTION_ENDPOINT Connection,
682  BOOLEAN Set)
683 {
684  if (!Connection)
685  return STATUS_UNSUCCESSFUL;
686 
687  if (Connection->SocketContext == NULL)
688  return STATUS_UNSUCCESSFUL;
689 
690  LibTCPSetNoDelay(Connection->SocketContext, Set);
691  return STATUS_SUCCESS;
692 }
693 
694 NTSTATUS
696  PCONNECTION_ENDPOINT Connection,
697  PULONG State)
698 {
699  if (!Connection)
700  return STATUS_UNSUCCESSFUL;
701 
702  if (Connection->SocketContext == NULL)
703  return STATUS_UNSUCCESSFUL;
704 
706  return STATUS_SUCCESS;
707 }
708 
709 /* EOF */
#define TDI_DISCONNECT_RELEASE
Definition: tdi.h:144
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
signed char * PCHAR
Definition: retypes.h:7
#define ERR_CONN
Definition: err.h:68
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
LONG TAAddressCount
Definition: tdi.h:523
#define STATUS_INVALID_CONNECTION
Definition: ntstatus.h:542
CPPORT Port[4]
Definition: headless.c:34
VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
Definition: tcp.c:167
#define ERR_ARG
Definition: err.h:70
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
PORT_SET TCPPorts
Definition: tcp.c:17
#define TRUE
Definition: types.h:120
#define ERR_ISCONN
Definition: err.h:61
NTSTATUS TCPStartup(VOID)
Definition: tcp.c:183
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
#define MID_TRACE
Definition: debug.h:15
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
PVOID RequestContext
Definition: tdi.h:55
NTSTATUS PortsStartup(PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
Definition: ports.c:13
err_t LibTCPShutdown(PCONNECTION_ENDPOINT Connection, const int shut_rx, const int shut_tx)
Definition: rostcp.c:683
KSPIN_LOCK Lock
Definition: titypes.h:265
Type
Definition: Type.h:6
#define ERR_RTE
Definition: err.h:56
struct _Entry Entry
Definition: kefuncs.h:640
NTSTATUS TCPDisconnect(PCONNECTION_ENDPOINT Connection, UINT Flags, PLARGE_INTEGER Timeout, PTDI_CONNECTION_INFORMATION ConnInfo, PTDI_CONNECTION_INFORMATION ReturnInfo, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:387
#define DbgPrint
Definition: loader.c:25
#define ERR_CLSD
Definition: err.h:67
Definition: neighbor.h:28
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LIST_ENTRY ConnectionEndpointListHead
Definition: fileobjs.c:25
#define ERR_USE
Definition: err.h:60
MDL * PNDIS_BUFFER
Definition: ndis.h:343
PTCP_PCB LibTCPSocket(void *arg)
Definition: rostcp.c:342
unsigned char * PUCHAR
Definition: retypes.h:3
void LibTCPGetSocketStatus(PTCP_PCB pcb, PULONG State)
Definition: rostcp.c:845
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
err_t LibTCPSend(PCONNECTION_ENDPOINT Connection, void *const dataptr, const u16_t len, u32_t *sent, const int safe)
Definition: rostcp.c:536
LONG NTSTATUS
Definition: precomp.h:26
VOID TCPFreePort(const UINT Port)
Definition: tcp.c:596
struct _CONNECTION_ENDPOINT * PCONNECTION_ENDPOINT
void LibIPInsertPacket(void *ifarg, const void *const data, const u32_t size)
Definition: rosip.c:12
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:822
#define LockObjectAtDpcLevel(Object)
Definition: titypes.h:44
PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint(PVOID ClientContext)
Definition: tcp.c:86
PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
Definition: router.c:300
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:242
BOOLEAN TCPRemoveIRP(PCONNECTION_ENDPOINT Endpoint, PIRP Irp)
Definition: tcp.c:640
#define InsertTailList(ListHead, Entry)
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:390
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
LIST_ENTRY PacketQueue
Definition: titypes.h:277
VOID DeallocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:35
void LibIPInitialize(void)
Definition: rosip.c:35
static BOOL Set
Definition: pageheap.c:10
#define DEBUG_TCP
Definition: debug.h:28
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:640
#define DereferenceObject(Object)
Definition: titypes.h:24
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:64
#define ERR_TIMEOUT
Definition: err.h:55
#define LockObject(Object, Irql)
Definition: titypes.h:34
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:580
Definition: ip.h:23
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
PADDRESS_FILE AddressFile
Definition: titypes.h:268
UCHAR KIRQL
Definition: env_spec_w32.h:591
VOID FlushAllQueues(PCONNECTION_ENDPOINT Connection, NTSTATUS Status)
Definition: event.c:218
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID ConnectionFree(PVOID Object)
Definition: tcp.c:72
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
static int Family
Definition: ping.c:62
#define STATUS_REMOTE_DISCONNECT
Definition: ntstatus.h:538
long LONG
Definition: pedump.c:60
union IP_ADDRESS::@970 Address
NTSTATUS TCPGetSocketStatus(PCONNECTION_ENDPOINT Connection, PULONG State)
Definition: tcp.c:695
static BOOLEAN TCPInitialized
Definition: tcp.c:16
#define ERR_VAL
Definition: err.h:58
PVOID RequestNotifyObject
Definition: tdi.h:54
#define TDI_BUCKET_TAG
Definition: tags.h:31
#define UnlockObject(Object, OldIrql)
Definition: titypes.h:54
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:251
PVOID Header
Definition: ip.h:83
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
IP_ADDRESS Unicast
Definition: ip.h:159
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
s8_t err_t
Definition: err.h:47
BOOLEAN AllocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:47
NTSTATUS TCPSocket(PCONNECTION_ENDPOINT Connection, UINT Family, UINT Type, UINT Proto)
Definition: tcp.c:125
Definition: bufpool.h:45
VOID FlushReceiveQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked)
Definition: event.c:53
struct _TA_ADDRESS_IP::_AddrIp Address[1]
VOID NTAPI DisconnectTimeoutDpc(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: tcp.c:29
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
err_t LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe, const int callback)
Definition: rostcp.c:764
return Found
Definition: dirsup.c:1270
void * PVOID
Definition: retypes.h:9
OBJECT_FREE_ROUTINE Free
Definition: titypes.h:264
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
#define ERR_OK
Definition: err.h:52
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:675
NTSTATUS TCPShutdown(VOID)
Definition: tcp.c:218
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
_In_ LARGE_INTEGER _In_opt_ PKDPC Dpc
Definition: kefuncs.h:524
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206
VOID NTAPI ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
Definition: lookas.c:222
#define CONN_ENDPT_TAG
Definition: tags.h:10
LONG TCP_IPIdentification
Definition: tcp.c:15
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_PENDING
Definition: ntstatus.h:82
_In_ PVOID ClientContext
Definition: netioddk.h:55
UINT TotalSize
Definition: ip.h:86
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
VOID FlushShutdownQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked)
Definition: event.c:137
LIST_ENTRY ShutdownRequest
Definition: titypes.h:275
ULONG AllocatePortFromRange(PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
Definition: ports.c:86
static IUnknown Object
Definition: main.c:512
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
void LibTCPSetNoDelay(PTCP_PCB pcb, BOOLEAN Set)
Definition: rostcp.c:834
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define UnlockObjectFromDpcLevel(Object)
Definition: titypes.h:63
#define ERR_RST
Definition: err.h:66
UINT HeaderSize
Definition: ip.h:84
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: ketypes.h:687
KTIMER DisconnectTimer
Definition: titypes.h:280
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
LIST_ENTRY ReceiveRequest
Definition: titypes.h:273
NTSTATUS TCPClose(PCONNECTION_ENDPOINT Connection)
Definition: tcp.c:150
#define ReferenceObject(Object)
Definition: titypes.h:14
Definition: typedefs.h:117
LIST_ENTRY Entry
Definition: titypes.h:250
#define err(...)
Status
Definition: gdiplustypes.h:24
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:675
VOID FlushSendQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status, const BOOLEAN interlocked)
Definition: event.c:95
PIP_INTERFACE Interface
Definition: neighbor.h:33
static ULONG Timeout
Definition: ping.c:61
unsigned short USHORT
Definition: pedump.c:61
IP_ADDRESS Address
Definition: titypes.h:136
NTSTATUS LibTCPGetDataFromConnectionQueue(PCONNECTION_ENDPOINT Connection, PUCHAR RecvBuffer, UINT RecvLen, UINT *Received)
Definition: rostcp.c:101
#define ERR_MEM
Definition: fontsub.h:52
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define ERR_BUF
Definition: err.h:54
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
LIST_ENTRY ConnectRequest
Definition: titypes.h:271
void LibIPShutdown(void)
Definition: rosip.c:42
LIST_ENTRY ListenRequest
Definition: titypes.h:272
unsigned int * PULONG
Definition: retypes.h:1
unsigned int UINT
Definition: ndis.h:50
LIST_ENTRY SendRequest
Definition: titypes.h:274
VOID PortsShutdown(PPORT_SET PortSet)
Definition: ports.c:31
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:537
#define ERR_INPROGRESS
Definition: err.h:57
#define ERR_WOULDBLOCK
Definition: err.h:59
VOID EXPORT NdisQueryBuffer(IN PNDIS_BUFFER Buffer, OUT PVOID *VirtualAddress OPTIONAL, OUT PUINT Length)
Definition: buffer.c:953
#define STATUS_UNEXPECTED_NETWORK_ERROR
Definition: ntstatus.h:418
NTSTATUS Status
Definition: titypes.h:253
#define DEBUG_CPOINT
Definition: debug.h:33
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS Address, BOOLEAN GetRemote)
Definition: tcp.c:602
struct tagContext Context
Definition: acpixf.h:1012
NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set)
Definition: tcp.c:680
unsigned int ULONG
Definition: retypes.h:1
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
NTSTATUS TCPReceiveData(PCONNECTION_ENDPOINT Connection, PNDIS_BUFFER Buffer, ULONG ReceiveLength, PULONG BytesReceived, ULONG ReceiveFlags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:476
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ERR_ABRT
Definition: err.h:65
TDI_REQUEST Request
Definition: titypes.h:252
Definition: ip.h:77
USHORT Port
Definition: titypes.h:139
#define ERR_IF
Definition: err.h:72
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:711
KSPIN_LOCK ConnectionEndpointListLock
Definition: fileobjs.c:26
return STATUS_SUCCESS
Definition: btrfs.c:2777
u32_t addr
Definition: ip_addr.h:45
VOID NTAPI ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside)
Definition: lookas.c:174
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:690
NTSTATUS AddrBuildAddress(PTRANSPORT_ADDRESS TdiAddress, PIP_ADDRESS Address, PUSHORT Port)
Definition: address.c:184
UINT Received
Definition: arping.c:40
err_t LibTCPConnect(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
Definition: rostcp.c:601
#define TDI_DISCONNECT_ABORT
Definition: tdi.h:143
err_t LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:810
LIST_ENTRY ListEntry
Definition: titypes.h:262
base of all file and directory entries
Definition: entries.h:82
NTSTATUS TCPConnect(PCONNECTION_ENDPOINT Connection, PTDI_CONNECTION_INFORMATION ConnInfo, PTDI_CONNECTION_INFORMATION ReturnInfo, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:277
LONGLONG QuadPart
Definition: typedefs.h:112
ULONG Information
Definition: titypes.h:254
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:170
NTSTATUS TCPSendData(PCONNECTION_ENDPOINT Connection, PCHAR BufferData, ULONG SendLength, PULONG BytesSent, ULONG Flags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:525
#define STATUS_CANT_WAIT
Definition: ntstatus.h:438
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:518
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:170
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:675