ReactOS 0.4.15-dev-8052-gc0e3179
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 <lwip_glue/lwip_glue.h>
25
27
28static
29IO_WORKITEM_ROUTINE
31
33VOID
38)
39{
42 PTDI_BUCKET Bucket;
43
44 /* We timed out waiting for pending sends so force it to shutdown */
45 TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
46
47 LockObject(Connection);
48
49 while (!IsListEmpty(&Connection->SendRequest))
50 {
51 Entry = RemoveHeadList(&Connection->SendRequest);
52
54
55 Bucket->Information = 0;
56 Bucket->Status = STATUS_FILE_CLOSED;
57
58 CompleteBucket(Connection, Bucket, FALSE);
59 }
60
61 while (!IsListEmpty(&Connection->ShutdownRequest))
62 {
63 Entry = RemoveHeadList( &Connection->ShutdownRequest );
64
66
67 Bucket->Status = STATUS_TIMEOUT;
68 Bucket->Information = 0;
69
70 CompleteBucket(Connection, Bucket, FALSE);
71 }
72
73 UnlockObject(Connection);
74
75 DereferenceObject(Connection);
76}
77
78VOID
84{
86
88}
89
91{
94
95 TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n"));
96
98 RemoveEntryList(&Connection->ListEntry);
100
101 ExDeleteResourceLite(&Connection->Resource);
103
104 ExFreePoolWithTag( Connection, CONN_ENDPT_TAG );
105}
106
108{
111
112 if (!Connection)
113 return Connection;
114
115 TI_DbgPrint(DEBUG_CPOINT, ("Connection point file object allocated at (0x%X).\n", Connection));
116
117 RtlZeroMemory(Connection, sizeof(CONNECTION_ENDPOINT));
118
119 /* Initialize spin lock that protects the connection endpoint file object */
122 InitializeListHead(&Connection->ListenRequest);
124 InitializeListHead(&Connection->SendRequest);
126 InitializeListHead(&Connection->PacketQueue);
127
128 /* Initialize disconnect timer */
130 KeInitializeDpc(&Connection->DisconnectDpc, DisconnectTimeoutDpc, Connection);
132 if (!Connection->DisconnectWorkItem)
133 {
134 ExDeleteResourceLite(&Connection->Resource);
135 ExFreePoolWithTag( Connection, CONN_ENDPT_TAG );
136 return NULL;
137 }
138
139 /* Save client context pointer */
140 Connection->ClientContext = ClientContext;
141
142 Connection->RefCount = 1;
143 Connection->Free = ConnectionFree;
144
145 /* Add connection endpoint to global list */
147 &Connection->ListEntry,
149
150 return Connection;
151}
152
154 UINT Family, UINT Type, UINT Proto )
155{
157
158 LockObject(Connection);
159
160 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Called: Connection %x, Family %d, Type %d, "
161 "Proto %d, sizeof(CONNECTION_ENDPOINT) = %d\n",
162 Connection, Family, Type, Proto, sizeof(CONNECTION_ENDPOINT)));
163
164 Connection->SocketContext = LibTCPSocket(Connection);
165 if (Connection->SocketContext)
167 else
169
170 UnlockObject(Connection);
171
172 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSocket] Leaving. Status = 0x%x\n", Status));
173
174 return Status;
175}
176
178{
179 LockObject(Connection);
180
181 FlushAllQueues(Connection, STATUS_CANCELLED);
182
183 UnlockObject(Connection);
184
185 LibTCPClose(Connection, FALSE, TRUE);
186
187 DereferenceObject(Connection);
188
189 return STATUS_SUCCESS;
190}
191
193/*
194 * FUNCTION: Receives and queues TCP data
195 * ARGUMENTS:
196 * IPPacket = Pointer to an IP packet that was received
197 * NOTES:
198 * This is the low level interface for receiving TCP data
199 */
200{
201 TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to lwIP\n",
202 IPPacket->TotalSize,
203 IPPacket->HeaderSize));
204
205 LibIPInsertPacket(Interface->TCPContext, IPPacket->Header, IPPacket->TotalSize);
206}
207
209/*
210 * FUNCTION: Initializes the TCP subsystem
211 * RETURNS:
212 * Status of operation
213 */
214{
216
217 Status = PortsStartup(&TCPPorts, 1, 0xffff);
218 if (!NT_SUCCESS(Status))
219 {
220 return Status;
221 }
222
224 NULL,
225 NULL,
226 0,
227 sizeof(TDI_BUCKET),
229 0);
230
231 /* Initialize our IP library */
233
234 /* Register this protocol with IP layer */
236
238
239 return STATUS_SUCCESS;
240}
241
242
244/*
245 * FUNCTION: Shuts down the TCP subsystem
246 * RETURNS:
247 * Status of operation
248 */
249{
250 if (!TCPInitialized)
251 return STATUS_SUCCESS;
252
254
256
257 /* Deregister this protocol with IP layer */
259
261
263
264 return STATUS_SUCCESS;
265}
266
268{
270
271 switch (err)
272 {
273 case ERR_OK: Status = STATUS_SUCCESS; return Status; //0
274 case ERR_MEM: Status = STATUS_INSUFFICIENT_RESOURCES; break; //-1
275 case ERR_BUF: Status = STATUS_BUFFER_TOO_SMALL; break; //-2
276 case ERR_TIMEOUT: Status = STATUS_TIMEOUT; break; // -3
277 case ERR_RTE: Status = STATUS_NETWORK_UNREACHABLE; break; //-4
278 case ERR_INPROGRESS: Status = STATUS_PENDING; return Status; //-5
279 case ERR_VAL: Status = STATUS_INVALID_PARAMETER; break; //-6
280 case ERR_WOULDBLOCK: Status = STATUS_CANT_WAIT; break; //-7
281 case ERR_USE: Status = STATUS_ADDRESS_ALREADY_EXISTS; break; //-8
282 case ERR_ISCONN: Status = STATUS_UNSUCCESSFUL; break; //-9 (FIXME)
283 case ERR_ABRT: Status = STATUS_LOCAL_DISCONNECT; break; //-10
284 case ERR_RST: Status = STATUS_REMOTE_DISCONNECT; break; //-11
285 case ERR_CLSD: Status = STATUS_FILE_CLOSED; break; //-12
286 case ERR_CONN: Status = STATUS_INVALID_CONNECTION; break; //-13
287 case ERR_ARG: Status = STATUS_INVALID_PARAMETER; break; //-14
288 case ERR_IF: Status = STATUS_UNEXPECTED_NETWORK_ERROR; break; //-15
289 default:
290 DbgPrint("Invalid error value: %d\n", err);
291 ASSERT(FALSE);
293 break;
294 }
295
296 TI_DbgPrint(DEBUG_TCP,("TCP operation failed: 0x%x (%d)\n", Status, err));
297
298 return Status;
299}
300
302( PCONNECTION_ENDPOINT Connection,
306 PVOID Context )
307{
309 struct ip_addr bindaddr, connaddr;
311 USHORT RemotePort;
313 PTDI_BUCKET Bucket;
315
316 TI_DbgPrint(DEBUG_TCP,("[IP, TCPConnect] Called\n"));
317
321 &RemotePort);
322
323 if (!NT_SUCCESS(Status))
324 {
325 TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n"));
326 return Status;
327 }
328
329 /* Freed in TCPSocketState */
331 ("Connecting to address %x:%x\n",
332 RemoteAddress.Address.IPv4Address,
333 RemotePort));
334
335 LockObject(Connection);
336
337 if (!Connection->AddressFile)
338 {
339 UnlockObject(Connection);
341 }
342
343 if (AddrIsUnspecified(&Connection->AddressFile->Address))
344 {
346 {
347 UnlockObject(Connection);
349 }
350
351 bindaddr.addr = NCE->Interface->Unicast.Address.IPv4Address;
352 }
353 else
354 {
355 bindaddr.addr = Connection->AddressFile->Address.Address.IPv4Address;
356 }
357
359 &bindaddr,
360 Connection->AddressFile->Port));
361
362 if (!NT_SUCCESS(Status))
363 {
364 UnlockObject(Connection);
365 return Status;
366 }
367
368 /* Copy bind address into connection */
369 Connection->AddressFile->Address.Address.IPv4Address = bindaddr.addr;
370 /* Check if we had an unspecified port */
371 if (!Connection->AddressFile->Port)
372 {
373 UINT AllocatedPort;
374
375 /* We did, so we need to copy back the port */
377 if (!NT_SUCCESS(Status))
378 {
379 UnlockObject(Connection);
380 return Status;
381 }
382
383 /* Allocate the port in the port bitmap */
384 AllocatedPort = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
385 /* This should never fail unless all ports are in use */
386 if (AllocatedPort == (UINT) -1)
387 {
388 DbgPrint("ERR: No more ports available.\n");
389 UnlockObject(Connection);
391 }
392 Connection->AddressFile->Port = AllocatedPort;
393 }
394
395 connaddr.addr = RemoteAddress.Address.IPv4Address;
396
397 Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
398 if (!Bucket)
399 {
400 UnlockObject(Connection);
401 return STATUS_NO_MEMORY;
402 }
403
406
407 InsertTailList( &Connection->ConnectRequest, &Bucket->Entry );
408
409 UnlockObject(Connection);
410
412 &connaddr,
413 RemotePort));
414 if (!NT_SUCCESS(Status))
415 {
416 LockObject(Connection);
417 RemoveEntryList(&Bucket->Entry);
418 UnlockObject(Connection);
419 ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
420 }
421 TI_DbgPrint(DEBUG_TCP,("[IP, TCPConnect] Leaving. Status = 0x%x\n", Status));
422
423 return Status;
424}
425
427( PCONNECTION_ENDPOINT Connection,
428 UINT Flags,
433 PVOID Context )
434{
436 PTDI_BUCKET Bucket;
437 LARGE_INTEGER ActualTimeout;
438
439 TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Called\n"));
440
441 LockObject(Connection);
442
443 if (Connection->SocketContext)
444 {
446 {
447 if (IsListEmpty(&Connection->SendRequest))
448 {
449 ReferenceObject(Connection);
450 UnlockObject(Connection);
451 Status = TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
452 LockObject(Connection);
453 DereferenceObject(Connection);
454 }
455 else if (Timeout && Timeout->QuadPart == 0)
456 {
458 ReferenceObject(Connection);
459 UnlockObject(Connection);
460 LibTCPShutdown(Connection, 0, 1);
461 LockObject(Connection);
462 DereferenceObject(Connection);
464 }
465 else
466 {
467 /* Use the timeout specified or 1 second if none was specified */
468 if (Timeout)
469 {
470 ActualTimeout = *Timeout;
471 }
472 else
473 {
474 ActualTimeout.QuadPart = -1000000;
475 }
476
477 /* We couldn't complete the request now because we need to wait for outstanding I/O */
478 Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
479 if (!Bucket)
480 {
481 UnlockObject(Connection);
482 return STATUS_NO_MEMORY;
483 }
484
487
488 InsertTailList(&Connection->ShutdownRequest, &Bucket->Entry);
489
490 ReferenceObject(Connection);
491 if (KeSetTimer(&Connection->DisconnectTimer, ActualTimeout, &Connection->DisconnectDpc))
492 {
493 /* Timer was already in the queue. */
494 DereferenceObject(Connection);
495 }
496
498 }
499 }
500
501 if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
502 {
506 ReferenceObject(Connection);
507 UnlockObject(Connection);
508 Status = TCPTranslateError(LibTCPShutdown(Connection, 1, 1));
509 DereferenceObject(Connection);
510 }
511 else
512 {
513 UnlockObject(Connection);
514 }
515 }
516 else
517 {
518 UnlockObject(Connection);
519 /* We already got closed by the other side so just return success */
521 }
522
523 TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Leaving. Status = 0x%x\n", Status));
524
525 return Status;
526}
527
529( PCONNECTION_ENDPOINT Connection,
531 ULONG ReceiveLength,
532 PULONG BytesReceived,
533 ULONG ReceiveFlags,
535 PVOID Context )
536{
537 PTDI_BUCKET Bucket;
538 PUCHAR DataBuffer;
539 UINT DataLen, Received;
541
542 TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Called for %d bytes (on socket %x)\n",
543 ReceiveLength, Connection->SocketContext));
544
545 NdisQueryBuffer(Buffer, &DataBuffer, &DataLen);
546
547 Status = LibTCPGetDataFromConnectionQueue(Connection, DataBuffer, DataLen, &Received);
548
549 if (Status == STATUS_PENDING)
550 {
551 Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
552 if (!Bucket)
553 {
554 TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Failed to allocate bucket\n"));
555
556 return STATUS_NO_MEMORY;
557 }
558
561
562 LockObject(Connection);
563 InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry );
564 UnlockObject(Connection);
565 TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Queued read irp\n"));
566
567 TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Leaving. Status = STATUS_PENDING\n"));
568
569 (*BytesReceived) = 0;
570 }
571 else
572 {
573 (*BytesReceived) = Received;
574 }
575
576 return Status;
577}
578
580( PCONNECTION_ENDPOINT Connection,
581 PCHAR BufferData,
582 ULONG SendLength,
583 PULONG BytesSent,
584 ULONG Flags,
586 PVOID Context )
587{
589 PTDI_BUCKET Bucket;
590
591 ReferenceObject(Connection);
592
593 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Called for %d bytes (on socket %x)\n",
594 SendLength, Connection->SocketContext));
595
596 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection = %x\n", Connection));
597 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection->SocketContext = %x\n",
598 Connection->SocketContext));
599
601 BufferData,
602 SendLength,
603 BytesSent,
604 FALSE));
605
606 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status, SendLength));
607
608 /* Keep this request around ... there was no data yet */
609 if (Status == STATUS_PENDING)
610 {
611 /* Freed in TCPSocketState */
612 Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
613 if (!Bucket)
614 {
615 DereferenceObject(Connection);
616 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Failed to allocate bucket\n"));
617 return STATUS_NO_MEMORY;
618 }
619
622
623 LockObject(Connection);
624 InsertTailList( &Connection->SendRequest, &Bucket->Entry );
625 TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Queued write irp\n"));
626 UnlockObject(Connection);
627 }
628
629
630 TI_DbgPrint(DEBUG_TCP, ("[IP, TCPSendData] Leaving. Status = %x\n", Status));
631 DereferenceObject(Connection);
632
633 return Status;
634}
635
636UINT TCPAllocatePort(const UINT HintPort)
637{
638 if (HintPort)
639 {
640 if (AllocatePort(&TCPPorts, HintPort))
641 return HintPort;
642 else
643 {
644 TI_DbgPrint(MID_TRACE,("We got a hint port but couldn't allocate it\n"));
645 return (UINT)-1;
646 }
647 }
648 else
649 return AllocatePortFromRange( &TCPPorts, 1024, 5000 );
650}
651
653{
655}
656
658( PCONNECTION_ENDPOINT Connection,
660 BOOLEAN GetRemote )
661{
663 struct ip_addr ipaddr;
665
666 AddressIP->TAAddressCount = 1;
667 AddressIP->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
668 AddressIP->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
669
670 LockObject(Connection);
671
672 if (GetRemote)
673 {
675 &ipaddr,
676 &AddressIP->Address[0].Address[0].sin_port));
677 }
678 else
679 {
681 &ipaddr,
682 &AddressIP->Address[0].Address[0].sin_port));
683 }
684
685 UnlockObject(Connection);
686
687 AddressIP->Address[0].Address[0].in_addr = ipaddr.addr;
688
689 RtlZeroMemory(&AddressIP->Address[0].Address[0].sin_zero,
690 sizeof(AddressIP->Address[0].Address[0].sin_zero));
691
692 return Status;
693}
694
696{
698 PLIST_ENTRY ListHead[5];
699 PTDI_BUCKET Bucket;
700 UINT i = 0;
702
703 ListHead[0] = &Endpoint->SendRequest;
704 ListHead[1] = &Endpoint->ReceiveRequest;
705 ListHead[2] = &Endpoint->ConnectRequest;
706 ListHead[3] = &Endpoint->ListenRequest;
707 ListHead[4] = &Endpoint->ShutdownRequest;
708
709 LockObject(Endpoint);
710
711 for( i = 0; i < 5; i++ )
712 {
713 for( Entry = ListHead[i]->Flink;
714 Entry != ListHead[i];
715 Entry = Entry->Flink )
716 {
718 if( Bucket->Request.RequestContext == Irp )
719 {
720 RemoveEntryList( &Bucket->Entry );
721 ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
722 Found = TRUE;
723 break;
724 }
725 }
726 }
727
728 UnlockObject(Endpoint);
729
730 return Found;
731}
732
735 PCONNECTION_ENDPOINT Connection,
736 BOOLEAN Set)
737{
738 if (!Connection)
739 return STATUS_UNSUCCESSFUL;
740
741 if (Connection->SocketContext == NULL)
742 return STATUS_UNSUCCESSFUL;
743
744 LibTCPSetNoDelay(Connection->SocketContext, Set);
745 return STATUS_SUCCESS;
746}
747
750 PCONNECTION_ENDPOINT Connection,
752{
753 if (!Connection)
754 return STATUS_UNSUCCESSFUL;
755
756 if (Connection->SocketContext == NULL)
757 return STATUS_UNSUCCESSFUL;
758
760 return STATUS_SUCCESS;
761}
762
763/* EOF */
unsigned char BOOLEAN
Type
Definition: Type.h:7
NTSTATUS AddrBuildAddress(PTRANSPORT_ADDRESS TdiAddress, PIP_ADDRESS Address, PUSHORT Port)
Definition: address.c:184
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
UINT Received
Definition: arping.c:40
LONG NTSTATUS
Definition: precomp.h:26
#define MID_TRACE
Definition: debug.h:15
return Found
Definition: dirsup.c:1270
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define DEBUG_TCP
Definition: debug.h:28
#define DEBUG_CPOINT
Definition: debug.h:33
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define IPPROTO_TCP
Definition: ip.h:196
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:386
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
VOID DeallocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:35
BOOLEAN AllocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:47
VOID PortsShutdown(PPORT_SET PortSet)
Definition: ports.c:31
NTSTATUS PortsStartup(PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
Definition: ports.c:13
ULONG AllocatePortFromRange(PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
Definition: ports.c:86
PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
Definition: router.c:300
#define CONN_ENDPT_TAG
Definition: tags.h:10
#define TDI_BUCKET_TAG
Definition: tags.h:31
PDEVICE_OBJECT TCPDeviceObject
Definition: main.c:20
void LibTCPGetSocketStatus(PTCP_PCB pcb, PULONG State)
Definition: tcp.c:879
void LibTCPSetNoDelay(PTCP_PCB pcb, BOOLEAN Set)
Definition: tcp.c:868
err_t LibTCPShutdown(PCONNECTION_ENDPOINT Connection, const int shut_rx, const int shut_tx)
Definition: tcp.c:717
struct tcp_pcb * LibTCPSocket(void *arg)
Definition: tcp.c:336
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:267
err_t LibTCPConnect(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
Definition: tcp.c:622
NTSTATUS LibTCPGetDataFromConnectionQueue(PCONNECTION_ENDPOINT Connection, PUCHAR RecvBuffer, UINT RecvLen, UINT *Received)
Definition: tcp.c:100
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: tcp.c:856
err_t LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe, const int callback)
Definition: tcp.c:798
err_t LibTCPSend(PCONNECTION_ENDPOINT Connection, void *const dataptr, const u16_t len, u32_t *sent, const int safe)
Definition: tcp.c:557
err_t LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: tcp.c:844
err_t LibTCPBind(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
Definition: tcp.c:415
NTSTATUS TCPGetSocketStatus(PCONNECTION_ENDPOINT Connection, PULONG State)
Definition: tcp.c:749
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS Address, BOOLEAN GetRemote)
Definition: tcp.c:658
static IO_WORKITEM_ROUTINE DisconnectWorker
Definition: tcp.c:30
VOID ConnectionFree(PVOID Object)
Definition: tcp.c:90
LONG TCP_IPIdentification
Definition: tcp.c:15
VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
Definition: tcp.c:192
NTSTATUS TCPSocket(PCONNECTION_ENDPOINT Connection, UINT Family, UINT Type, UINT Proto)
Definition: tcp.c:153
NTSTATUS TCPShutdown(VOID)
Definition: tcp.c:243
static BOOLEAN TCPInitialized
Definition: tcp.c:16
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:427
VOID TCPFreePort(const UINT Port)
Definition: tcp.c:652
NTSTATUS TCPSendData(PCONNECTION_ENDPOINT Connection, PCHAR BufferData, ULONG SendLength, PULONG BytesSent, ULONG Flags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:580
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
PORT_SET TCPPorts
Definition: tcp.c:17
NTSTATUS TCPConnect(PCONNECTION_ENDPOINT Connection, PTDI_CONNECTION_INFORMATION ConnInfo, PTDI_CONNECTION_INFORMATION ReturnInfo, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:302
PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint(PVOID ClientContext)
Definition: tcp.c:107
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:636
BOOLEAN TCPRemoveIRP(PCONNECTION_ENDPOINT Endpoint, PIRP Irp)
Definition: tcp.c:695
NTSTATUS TCPReceiveData(PCONNECTION_ENDPOINT Connection, PNDIS_BUFFER Buffer, ULONG ReceiveLength, PULONG BytesReceived, ULONG ReceiveFlags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
Definition: tcp.c:529
NTSTATUS TCPStartup(VOID)
Definition: tcp.c:208
NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set)
Definition: tcp.c:734
VOID NTAPI DisconnectTimeoutDpc(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: tcp.c:80
NTSTATUS TCPClose(PCONNECTION_ENDPOINT Connection)
Definition: tcp.c:177
#define ERR_ABRT
Definition: err.h:65
#define ERR_RST
Definition: err.h:66
#define ERR_ISCONN
Definition: err.h:61
#define ERR_MEM
Definition: err.h:53
#define ERR_USE
Definition: err.h:60
#define ERR_ARG
Definition: err.h:70
#define ERR_CONN
Definition: err.h:68
#define ERR_OK
Definition: err.h:52
#define ERR_RTE
Definition: err.h:56
#define ERR_WOULDBLOCK
Definition: err.h:59
#define ERR_VAL
Definition: err.h:58
#define ERR_INPROGRESS
Definition: err.h:57
#define ERR_BUF
Definition: err.h:54
#define ERR_TIMEOUT
Definition: err.h:55
s8_t err_t
Definition: err.h:47
#define ERR_CLSD
Definition: err.h:67
#define ERR_IF
Definition: err.h:72
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define ExDeleteResourceLite(res)
Definition: env_spec_w32.h:647
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
LIST_ENTRY ConnectionEndpointListHead
Definition: fileobjs.c:25
KSPIN_LOCK ConnectionEndpointListLock
Definition: fileobjs.c:26
pRequest Complete(RequestStatus)
Status
Definition: gdiplustypes.h:25
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
#define DbgPrint
Definition: hal.h:12
CPPORT Port[4]
Definition: headless.c:35
VOID FlushShutdownQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:95
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
VOID FlushReceiveQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:53
VOID(* PTCP_COMPLETION_ROUTINE)(PVOID Context, NTSTATUS Status, ULONG Count)
Definition: tcp.h:11
VOID FlushAllQueues(PCONNECTION_ENDPOINT Connection, NTSTATUS Status)
Definition: event.c:157
VOID FlushSendQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:74
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
void LibIPInsertPacket(void *ifarg, const void *const data, const u32_t size)
Definition: ip.c:10
void LibIPShutdown(void)
Definition: ip.c:40
void LibIPInitialize(void)
Definition: ip.c:33
VOID NTAPI ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside)
Definition: lookas.c:170
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:218
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define _Use_decl_annotations_
Definition: ms_sal.h:275
#define _In_
Definition: ms_sal.h:308
unsigned int UINT
Definition: ndis.h:50
MDL * PNDIS_BUFFER
Definition: ndis.h:343
#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length)
Definition: ndis.h:3029
_In_ PVOID ClientContext
Definition: netioddk.h:55
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:704
#define STATUS_CANT_WAIT
Definition: ntstatus.h:452
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:654
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:532
#define STATUS_REMOTE_DISCONNECT
Definition: ntstatus.h:552
#define STATUS_INVALID_CONNECTION
Definition: ntstatus.h:556
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_UNEXPECTED_NETWORK_ERROR
Definition: ntstatus.h:432
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:551
#define STATUS_TOO_MANY_ADDRESSES
Definition: ntstatus.h:653
static BOOL Set
Definition: pageheap.c:10
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
static ULONG Timeout
Definition: ping.c:61
static int Family
Definition: ping.c:62
#define err(...)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define _Unreferenced_parameter_
Definition: specstrings.h:396
base of all file and directory entries
Definition: entries.h:83
Definition: ip.h:23
union IP_ADDRESS::@1006 Address
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
Definition: neighbor.h:28
PIP_INTERFACE Interface
Definition: neighbor.h:33
USHORT Port
Definition: titypes.h:120
IP_ADDRESS Address
Definition: titypes.h:117
LIST_ENTRY PacketQueue
Definition: titypes.h:256
PIO_WORKITEM DisconnectWorkItem
Definition: titypes.h:261
LIST_ENTRY ConnectRequest
Definition: titypes.h:250
ERESOURCE Resource
Definition: titypes.h:245
LIST_ENTRY ListEntry
Definition: titypes.h:242
LIST_ENTRY SendRequest
Definition: titypes.h:253
LIST_ENTRY ListenRequest
Definition: titypes.h:251
LIST_ENTRY ShutdownRequest
Definition: titypes.h:254
PADDRESS_FILE AddressFile
Definition: titypes.h:247
OBJECT_FREE_ROUTINE Free
Definition: titypes.h:244
LIST_ENTRY ReceiveRequest
Definition: titypes.h:252
KTIMER DisconnectTimer
Definition: titypes.h:259
IP_ADDRESS Unicast
Definition: ip.h:159
Definition: ip.h:77
UINT HeaderSize
Definition: ip.h:84
PVOID Header
Definition: ip.h:83
UINT TotalSize
Definition: ip.h:86
Definition: ketypes.h:699
Definition: typedefs.h:120
struct _TA_ADDRESS_IP::_AddrIp Address[1]
LONG TAAddressCount
Definition: tdi.h:523
LIST_ENTRY Entry
Definition: titypes.h:230
NTSTATUS Status
Definition: titypes.h:233
ULONG Information
Definition: titypes.h:234
TDI_REQUEST Request
Definition: titypes.h:232
PVOID RequestContext
Definition: tdi.h:55
PVOID RequestNotifyObject
Definition: tdi.h:54
u32_t addr
Definition: ip_addr.h:45
#define TDI_DISCONNECT_RELEASE
Definition: tdi.h:144
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
#define TDI_DISCONNECT_ABORT
Definition: tdi.h:143
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define UnlockObject(Object)
Definition: titypes.h:44
#define ReferenceObject(Object)
Definition: titypes.h:14
#define LockObject(Object)
Definition: titypes.h:34
#define DereferenceObject(Object)
Definition: titypes.h:24
struct _CONNECTION_ENDPOINT * PCONNECTION_ENDPOINT
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
LONGLONG QuadPart
Definition: typedefs.h:114
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:171
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:172
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
@ DelayedWorkQueue
Definition: extypes.h:190
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:688
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:687
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:689