ReactOS  0.4.15-dev-3441-g67ad4e7
tcp.h File Reference
#include <pshpack1.h>
#include <poppack.h>
Include dependency graph for tcp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  TCPv4_HEADER
 
struct  TCPv4_PSEUDO_HEADER
 
struct  _SLEEPING_THREAD
 
struct  _CLIENT_DATA
 

Macros

#define TCPOPT_END_OF_LIST   0x0
 
#define TCPOPT_NO_OPERATION   0x1
 
#define TCPOPT_MAX_SEG_SIZE   0x2
 
#define TCPOPTLEN_MAX_SEG_SIZE   0x4
 
#define TCP_DATA_OFFSET(DataOffset)   (((DataOffset) & 0xF0) >> (4-2))
 
#define TCP_MIN_RETRANSMISSION_TIMEOUT   1*1000 /* 1 tick */
 
#define TCP_MAX_RETRANSMISSION_TIMEOUT   1*60*1000 /* 1 tick */
 
#define TCP_ALPHA_RETRANSMISSION_TIMEOUT(x)   (((x)*8)/10) /* 0.8 */
 
#define TCP_BETA_RETRANSMISSION_TIMEOUT(x)   (((x)*16)/10) /* 1.6 */
 
#define SEL_CONNECT   1
 
#define SEL_FIN   2
 
#define SEL_RST   4
 
#define SEL_ABRT   8
 
#define SEL_READ   16
 
#define SEL_WRITE   32
 
#define SEL_ACCEPT   64
 
#define SEL_OOB   128
 
#define SEL_ERROR   256
 
#define SEL_FINOUT   512
 
#define FREAD   0x0001
 
#define FWRITE   0x0002
 
#define SRF_URG   TCP_URG
 
#define SRF_ACK   TCP_ACK
 
#define SRF_PSH   TCP_PSH
 
#define SRF_RST   TCP_RST
 
#define SRF_SYN   TCP_SYN
 
#define SRF_FIN   TCP_FIN
 

Typedefs

typedef VOID(* PTCP_COMPLETION_ROUTINE) (PVOID Context, NTSTATUS Status, ULONG Count)
 
typedef struct TCPv4_HEADER TCPv4_HEADER
 
typedef struct TCPv4_HEADERPTCPv4_HEADER
 
typedef struct TCPv4_PSEUDO_HEADER TCPv4_PSEUDO_HEADER
 
typedef struct TCPv4_PSEUDO_HEADERPTCPv4_PSEUDO_HEADER
 
typedef struct _SLEEPING_THREAD SLEEPING_THREAD
 
typedef struct _SLEEPING_THREADPSLEEPING_THREAD
 
typedef struct _CLIENT_DATA CLIENT_DATA
 
typedef struct _CLIENT_DATAPCLIENT_DATA
 

Functions

NTSTATUS TCPCheckPeerForAccept (PVOID Context, PTDI_REQUEST_KERNEL Request)
 
NTSTATUS TCPListen (PCONNECTION_ENDPOINT Connection, UINT Backlog)
 
BOOLEAN TCPAbortListenForSocket (PCONNECTION_ENDPOINT Listener, PCONNECTION_ENDPOINT Connection)
 
NTSTATUS TCPAccept (PTDI_REQUEST Request, PCONNECTION_ENDPOINT Listener, PCONNECTION_ENDPOINT Connection, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
 
PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint (PVOID ClientContext)
 
VOID TCPFreeConnectionEndpoint (PCONNECTION_ENDPOINT Connection)
 
NTSTATUS TCPSocket (PCONNECTION_ENDPOINT Connection, UINT Family, UINT Type, UINT Proto)
 
VOID HandleSignalledConnection (PCONNECTION_ENDPOINT Connection)
 
PTCP_SEGMENT TCPCreateSegment (PIP_PACKET IPPacket, PTCPv4_HEADER TCPHeader, ULONG SegmentLength)
 
VOID TCPFreeSegment (PTCP_SEGMENT Segment)
 
VOID TCPAddSegment (PCONNECTION_ENDPOINT Connection, PTCP_SEGMENT Segment, PULONG Acknowledged)
 
NTSTATUS TCPConnect (PCONNECTION_ENDPOINT Connection, PTDI_CONNECTION_INFORMATION ConnInfo, PTDI_CONNECTION_INFORMATION ReturnInfo, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
 
NTSTATUS TCPDisconnect (PCONNECTION_ENDPOINT Connection, UINT Flags, PLARGE_INTEGER Timeout, PTDI_CONNECTION_INFORMATION ConnInfo, PTDI_CONNECTION_INFORMATION ReturnInfo, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
 
NTSTATUS TCPReceiveData (PCONNECTION_ENDPOINT Connection, PNDIS_BUFFER Buffer, ULONG ReceiveLength, PULONG BytesReceived, ULONG ReceiveFlags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
 
NTSTATUS TCPSendData (PCONNECTION_ENDPOINT Connection, PCHAR Buffer, ULONG DataSize, PULONG DataUsed, ULONG Flags, PTCP_COMPLETION_ROUTINE Complete, PVOID Context)
 
NTSTATUS TCPClose (PCONNECTION_ENDPOINT Connection)
 
NTSTATUS TCPTranslateError (const INT8 err)
 
UINT TCPAllocatePort (const UINT HintPort)
 
VOID TCPFreePort (const UINT Port)
 
NTSTATUS TCPGetSockAddress (PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS TransportAddress, BOOLEAN RemoteAddress)
 
NTSTATUS TCPStartup (VOID)
 
NTSTATUS TCPShutdown (VOID)
 
BOOLEAN TCPRemoveIRP (PCONNECTION_ENDPOINT Connection, PIRP Irp)
 
NTSTATUS TCPSetNoDelay (PCONNECTION_ENDPOINT Connection, BOOLEAN Set)
 
VOID TCPUpdateInterfaceLinkStatus (PIP_INTERFACE IF)
 
VOID TCPUpdateInterfaceIPInformation (PIP_INTERFACE IF)
 
VOID FlushListenQueue (PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
 
VOID FlushConnectQueue (PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
 
VOID FlushReceiveQueue (PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
 
VOID FlushSendQueue (PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
 
VOID FlushShutdownQueue (PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
 
VOID FlushAllQueues (PCONNECTION_ENDPOINT Connection, NTSTATUS Status)
 
VOID CompleteBucket (PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
 
void LibTCPDumpPcb (PVOID SocketContext)
 
NTSTATUS TCPGetSocketStatus (PCONNECTION_ENDPOINT Connection, PULONG State)
 

Variables

LONG TCP_IPIdentification
 
CLIENT_DATA ClientInfo
 

Macro Definition Documentation

◆ FREAD

#define FREAD   0x0001

Definition at line 84 of file tcp.h.

◆ FWRITE

#define FWRITE   0x0002

Definition at line 85 of file tcp.h.

◆ SEL_ABRT

#define SEL_ABRT   8

Definition at line 76 of file tcp.h.

◆ SEL_ACCEPT

#define SEL_ACCEPT   64

Definition at line 79 of file tcp.h.

◆ SEL_CONNECT

#define SEL_CONNECT   1

Definition at line 73 of file tcp.h.

◆ SEL_ERROR

#define SEL_ERROR   256

Definition at line 81 of file tcp.h.

◆ SEL_FIN

#define SEL_FIN   2

Definition at line 74 of file tcp.h.

◆ SEL_FINOUT

#define SEL_FINOUT   512

Definition at line 82 of file tcp.h.

◆ SEL_OOB

#define SEL_OOB   128

Definition at line 80 of file tcp.h.

◆ SEL_READ

#define SEL_READ   16

Definition at line 77 of file tcp.h.

◆ SEL_RST

#define SEL_RST   4

Definition at line 75 of file tcp.h.

◆ SEL_WRITE

#define SEL_WRITE   32

Definition at line 78 of file tcp.h.

◆ SRF_ACK

#define SRF_ACK   TCP_ACK

Definition at line 90 of file tcp.h.

◆ SRF_FIN

#define SRF_FIN   TCP_FIN

Definition at line 94 of file tcp.h.

◆ SRF_PSH

#define SRF_PSH   TCP_PSH

Definition at line 91 of file tcp.h.

◆ SRF_RST

#define SRF_RST   TCP_RST

Definition at line 92 of file tcp.h.

◆ SRF_SYN

#define SRF_SYN   TCP_SYN

Definition at line 93 of file tcp.h.

◆ SRF_URG

#define SRF_URG   TCP_URG

Definition at line 89 of file tcp.h.

◆ TCP_ALPHA_RETRANSMISSION_TIMEOUT

#define TCP_ALPHA_RETRANSMISSION_TIMEOUT (   x)    (((x)*8)/10) /* 0.8 */

Definition at line 68 of file tcp.h.

◆ TCP_BETA_RETRANSMISSION_TIMEOUT

#define TCP_BETA_RETRANSMISSION_TIMEOUT (   x)    (((x)*16)/10) /* 1.6 */

Definition at line 71 of file tcp.h.

◆ TCP_DATA_OFFSET

#define TCP_DATA_OFFSET (   DataOffset)    (((DataOffset) & 0xF0) >> (4-2))

Definition at line 34 of file tcp.h.

◆ TCP_MAX_RETRANSMISSION_TIMEOUT

#define TCP_MAX_RETRANSMISSION_TIMEOUT   1*60*1000 /* 1 tick */

Definition at line 65 of file tcp.h.

◆ TCP_MIN_RETRANSMISSION_TIMEOUT

#define TCP_MIN_RETRANSMISSION_TIMEOUT   1*1000 /* 1 tick */

Definition at line 62 of file tcp.h.

◆ TCPOPT_END_OF_LIST

#define TCPOPT_END_OF_LIST   0x0

Definition at line 27 of file tcp.h.

◆ TCPOPT_MAX_SEG_SIZE

#define TCPOPT_MAX_SEG_SIZE   0x2

Definition at line 29 of file tcp.h.

◆ TCPOPT_NO_OPERATION

#define TCPOPT_NO_OPERATION   0x1

Definition at line 28 of file tcp.h.

◆ TCPOPTLEN_MAX_SEG_SIZE

#define TCPOPTLEN_MAX_SEG_SIZE   0x4

Definition at line 31 of file tcp.h.

Typedef Documentation

◆ CLIENT_DATA

◆ PCLIENT_DATA

◆ PSLEEPING_THREAD

◆ PTCP_COMPLETION_ROUTINE

typedef VOID(* PTCP_COMPLETION_ROUTINE) (PVOID Context, NTSTATUS Status, ULONG Count)

Definition at line 11 of file tcp.h.

◆ PTCPv4_HEADER

◆ PTCPv4_PSEUDO_HEADER

◆ SLEEPING_THREAD

◆ TCPv4_HEADER

◆ TCPv4_PSEUDO_HEADER

Function Documentation

◆ CompleteBucket()

VOID CompleteBucket ( PCONNECTION_ENDPOINT  Connection,
PTDI_BUCKET  Bucket,
const BOOLEAN  Synchronous 
)

Definition at line 38 of file event.c.

39 {
40  ReferenceObject(Connection);
41  Bucket->AssociatedEndpoint = Connection;
42  if (Synchronous)
43  {
44  BucketCompletionWorker(Bucket);
45  }
46  else
47  {
49  }
50 }
static VOID BucketCompletionWorker(PVOID Context)
Definition: event.c:23
BOOLEAN ChewCreate(VOID(*Worker)(PVOID), PVOID WorkerContext)
Definition: workqueue.c:65
#define ReferenceObject(Object)
Definition: titypes.h:14
struct _CONNECTION_ENDPOINT * AssociatedEndpoint
Definition: titypes.h:231

Referenced by DisconnectWorker(), FlushConnectQueue(), FlushListenQueue(), FlushReceiveQueue(), FlushSendQueue(), FlushShutdownQueue(), TCPAcceptEventHandler(), TCPConnectEventHandler(), TCPRecvEventHandler(), and TCPSendEventHandler().

◆ FlushAllQueues()

VOID FlushAllQueues ( PCONNECTION_ENDPOINT  Connection,
NTSTATUS  Status 
)

Definition at line 157 of file event.c.

158 {
159  // flush receive queue
160  FlushReceiveQueue(Connection, Status);
161 
162  /* We completed the reads successfully but we need to return failure now */
163  if (Status == STATUS_SUCCESS)
164  {
166  }
167 
168  // flush listen queue
169  FlushListenQueue(Connection, Status);
170 
171  // flush send queue
172  FlushSendQueue(Connection, Status);
173 
174  // flush connect queue
175  FlushConnectQueue(Connection, Status);
176 
177  // flush shutdown queue
178  FlushShutdownQueue(Connection, Status);
179 }
VOID FlushListenQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:136
Status
Definition: gdiplustypes.h:24
VOID FlushReceiveQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:53
VOID FlushShutdownQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:95
VOID FlushConnectQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:116
VOID FlushSendQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:74
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:532

Referenced by TCPClose(), and TCPFinEventHandler().

◆ FlushConnectQueue()

VOID FlushConnectQueue ( PCONNECTION_ENDPOINT  Connection,
const NTSTATUS  Status 
)

Definition at line 116 of file event.c.

117 {
118  PTDI_BUCKET Bucket;
120 
121  ASSERT_TCPIP_OBJECT_LOCKED(Connection);
122 
123  while (!IsListEmpty(&Connection->ConnectRequest))
124  {
125  Entry = RemoveHeadList(&Connection->ConnectRequest);
126  Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
127 
128  Bucket->Status = Status;
129  Bucket->Information = 0;
130 
131  CompleteBucket(Connection, Bucket, FALSE);
132  }
133 }
#define ASSERT_TCPIP_OBJECT_LOCKED(Object)
Definition: titypes.h:51
struct _Entry Entry
Definition: kefuncs.h:627
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define FALSE
Definition: types.h:117
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
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
Status
Definition: gdiplustypes.h:24
Definition: typedefs.h:119
LIST_ENTRY ConnectRequest
Definition: titypes.h:250
NTSTATUS Status
Definition: titypes.h:233
base of all file and directory entries
Definition: entries.h:82
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
ULONG Information
Definition: titypes.h:234

Referenced by FlushAllQueues().

◆ FlushListenQueue()

VOID FlushListenQueue ( PCONNECTION_ENDPOINT  Connection,
const NTSTATUS  Status 
)

Definition at line 136 of file event.c.

137 {
138  PTDI_BUCKET Bucket;
140 
141  ASSERT_TCPIP_OBJECT_LOCKED(Connection);
142 
143  while (!IsListEmpty(&Connection->ListenRequest))
144  {
145  Entry = RemoveHeadList(&Connection->ListenRequest);
146  Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
147 
148  Bucket->Status = Status;
149  Bucket->Information = 0;
150 
152  CompleteBucket(Connection, Bucket, FALSE);
153  }
154 }
#define ASSERT_TCPIP_OBJECT_LOCKED(Object)
Definition: titypes.h:51
struct _Entry Entry
Definition: kefuncs.h:627
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define DereferenceObject(Object)
Definition: titypes.h:24
#define FALSE
Definition: types.h:117
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
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
Status
Definition: gdiplustypes.h:24
Definition: typedefs.h:119
struct _CONNECTION_ENDPOINT * AssociatedEndpoint
Definition: titypes.h:231
LIST_ENTRY ListenRequest
Definition: titypes.h:251
NTSTATUS Status
Definition: titypes.h:233
base of all file and directory entries
Definition: entries.h:82
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
ULONG Information
Definition: titypes.h:234

Referenced by FlushAllQueues().

◆ FlushReceiveQueue()

VOID FlushReceiveQueue ( PCONNECTION_ENDPOINT  Connection,
const NTSTATUS  Status 
)

Definition at line 53 of file event.c.

54 {
55  PTDI_BUCKET Bucket;
57 
58  ASSERT_TCPIP_OBJECT_LOCKED(Connection);
59 
60  while (!IsListEmpty(&Connection->ReceiveRequest))
61  {
62  Entry = RemoveHeadList(&Connection->ReceiveRequest);
63 
65 
66  Bucket->Information = 0;
67  Bucket->Status = Status;
68 
69  CompleteBucket(Connection, Bucket, FALSE);
70  }
71 }
#define ASSERT_TCPIP_OBJECT_LOCKED(Object)
Definition: titypes.h:51
struct _Entry Entry
Definition: kefuncs.h:627
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define FALSE
Definition: types.h:117
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
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
Status
Definition: gdiplustypes.h:24
LIST_ENTRY ReceiveRequest
Definition: titypes.h:252
Definition: typedefs.h:119
NTSTATUS Status
Definition: titypes.h:233
base of all file and directory entries
Definition: entries.h:82
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
ULONG Information
Definition: titypes.h:234

Referenced by FlushAllQueues(), and TCPDisconnect().

◆ FlushSendQueue()

VOID FlushSendQueue ( PCONNECTION_ENDPOINT  Connection,
const NTSTATUS  Status 
)

Definition at line 74 of file event.c.

75 {
76  PTDI_BUCKET Bucket;
78 
79  ASSERT_TCPIP_OBJECT_LOCKED(Connection);
80 
81  while (!IsListEmpty(&Connection->SendRequest))
82  {
83  Entry = RemoveHeadList(&Connection->SendRequest);
84 
86 
87  Bucket->Information = 0;
88  Bucket->Status = Status;
89 
90  CompleteBucket(Connection, Bucket, FALSE);
91  }
92 }
#define ASSERT_TCPIP_OBJECT_LOCKED(Object)
Definition: titypes.h:51
struct _Entry Entry
Definition: kefuncs.h:627
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define FALSE
Definition: types.h:117
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
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
Status
Definition: gdiplustypes.h:24
Definition: typedefs.h:119
LIST_ENTRY SendRequest
Definition: titypes.h:253
NTSTATUS Status
Definition: titypes.h:233
base of all file and directory entries
Definition: entries.h:82
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
ULONG Information
Definition: titypes.h:234

Referenced by FlushAllQueues(), and TCPDisconnect().

◆ FlushShutdownQueue()

VOID FlushShutdownQueue ( PCONNECTION_ENDPOINT  Connection,
const NTSTATUS  Status 
)

Definition at line 95 of file event.c.

96 {
97  PTDI_BUCKET Bucket;
99 
100  ASSERT_TCPIP_OBJECT_LOCKED(Connection);
101 
102  while (!IsListEmpty(&Connection->ShutdownRequest))
103  {
104  Entry = RemoveHeadList(&Connection->ShutdownRequest);
105 
107 
108  Bucket->Information = 0;
109  Bucket->Status = Status;
110 
111  CompleteBucket(Connection, Bucket, FALSE);
112  }
113 }
#define ASSERT_TCPIP_OBJECT_LOCKED(Object)
Definition: titypes.h:51
struct _Entry Entry
Definition: kefuncs.h:627
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define FALSE
Definition: types.h:117
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
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
Status
Definition: gdiplustypes.h:24
LIST_ENTRY ShutdownRequest
Definition: titypes.h:254
Definition: typedefs.h:119
NTSTATUS Status
Definition: titypes.h:233
base of all file and directory entries
Definition: entries.h:82
VOID CompleteBucket(PCONNECTION_ENDPOINT Connection, PTDI_BUCKET Bucket, const BOOLEAN Synchronous)
Definition: event.c:38
ULONG Information
Definition: titypes.h:234

Referenced by FlushAllQueues(), TCPDisconnect(), and TCPSendEventHandler().

◆ HandleSignalledConnection()

VOID HandleSignalledConnection ( PCONNECTION_ENDPOINT  Connection)

◆ LibTCPDumpPcb()

void LibTCPDumpPcb ( PVOID  SocketContext)

Definition at line 39 of file rostcp.c.

40 {
41  struct tcp_pcb *pcb = (struct tcp_pcb*)SocketContext;
42  unsigned int addr = ntohl(pcb->remote_ip.addr);
43 
44  DbgPrint("\tState: %s\n", tcp_state_str[pcb->state]);
45  DbgPrint("\tRemote: (%d.%d.%d.%d, %d)\n",
46  (addr >> 24) & 0xFF,
47  (addr >> 16) & 0xFF,
48  (addr >> 8) & 0xFF,
49  addr & 0xFF,
50  pcb->remote_port);
51 }
static const char *const tcp_state_str[]
Definition: rostcp.c:9
#define DbgPrint
Definition: hal.h:12
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID SocketContext
Definition: wsk.h:182
GLenum const GLvoid * addr
Definition: glext.h:9621
#define ntohl(x)
Definition: module.h:203

Referenced by LogActiveObjects().

◆ TCPAbortListenForSocket()

BOOLEAN TCPAbortListenForSocket ( PCONNECTION_ENDPOINT  Listener,
PCONNECTION_ENDPOINT  Connection 
)

Definition at line 103 of file accept.c.

105 {
106  PLIST_ENTRY ListEntry;
107  PTDI_BUCKET Bucket;
108  BOOLEAN Found = FALSE;
109 
110  LockObject(Listener);
111 
112  ListEntry = Listener->ListenRequest.Flink;
113  while (ListEntry != &Listener->ListenRequest)
114  {
115  Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
116 
117  if (Bucket->AssociatedEndpoint == Connection)
118  {
120  RemoveEntryList( &Bucket->Entry );
121  ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
122  Found = TRUE;
123  break;
124  }
125 
126  ListEntry = ListEntry->Flink;
127  }
128 
129  UnlockObject(Listener);
130 
131  return Found;
132 }
#define TRUE
Definition: types.h:120
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
#define DereferenceObject(Object)
Definition: titypes.h:24
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
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
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
Definition: typedefs.h:119
LIST_ENTRY Entry
Definition: titypes.h:230
#define UnlockObject(Object)
Definition: titypes.h:44
struct _CONNECTION_ENDPOINT * AssociatedEndpoint
Definition: titypes.h:231
LIST_ENTRY ListenRequest
Definition: titypes.h:251
base of all file and directory entries
Definition: entries.h:82
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispCancelListenRequest().

◆ TCPAccept()

NTSTATUS TCPAccept ( PTDI_REQUEST  Request,
PCONNECTION_ENDPOINT  Listener,
PCONNECTION_ENDPOINT  Connection,
PTCP_COMPLETION_ROUTINE  Complete,
PVOID  Context 
)

Definition at line 134 of file accept.c.

139 {
141  PTDI_BUCKET Bucket;
142 
143  LockObject(Listener);
144 
145  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
146 
147  if (Bucket)
148  {
149  Bucket->AssociatedEndpoint = Connection;
151 
153  Bucket->Request.RequestContext = Context;
154  InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
156  }
157  else
159 
160  UnlockObject(Listener);
161 
162  return Status;
163 }
PVOID RequestContext
Definition: tdi.h:55
LONG NTSTATUS
Definition: precomp.h:26
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
#define InsertTailList(ListHead, Entry)
pRequest Complete(RequestStatus)
PVOID RequestNotifyObject
Definition: tdi.h:54
Status
Definition: gdiplustypes.h:24
#define STATUS_PENDING
Definition: ntstatus.h:82
#define ReferenceObject(Object)
Definition: titypes.h:14
LIST_ENTRY Entry
Definition: titypes.h:230
#define UnlockObject(Object)
Definition: titypes.h:44
struct _CONNECTION_ENDPOINT * AssociatedEndpoint
Definition: titypes.h:231
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
LIST_ENTRY ListenRequest
Definition: titypes.h:251
struct tagContext Context
Definition: acpixf.h:1034
TDI_REQUEST Request
Definition: titypes.h:232
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiListen().

◆ TCPAddSegment()

VOID TCPAddSegment ( PCONNECTION_ENDPOINT  Connection,
PTCP_SEGMENT  Segment,
PULONG  Acknowledged 
)

◆ TCPAllocateConnectionEndpoint()

PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint ( PVOID  ClientContext)

Definition at line 107 of file tcp.c.

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 */
120  ExInitializeResourceLite(&Connection->Resource);
121  InitializeListHead(&Connection->ConnectRequest);
122  InitializeListHead(&Connection->ListenRequest);
123  InitializeListHead(&Connection->ReceiveRequest);
124  InitializeListHead(&Connection->SendRequest);
125  InitializeListHead(&Connection->ShutdownRequest);
126  InitializeListHead(&Connection->PacketQueue);
127 
128  /* Initialize disconnect timer */
129  KeInitializeTimer(&Connection->DisconnectTimer);
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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
LIST_ENTRY ConnectionEndpointListHead
Definition: fileobjs.c:25
struct _CONNECTION_ENDPOINT * PCONNECTION_ENDPOINT
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1456
PDEVICE_OBJECT TCPDeviceObject
Definition: main.c:16
ERESOURCE Resource
Definition: titypes.h:245
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
LIST_ENTRY PacketQueue
Definition: titypes.h:256
VOID ConnectionFree(PVOID Object)
Definition: tcp.c:90
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
VOID NTAPI DisconnectTimeoutDpc(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: tcp.c:80
OBJECT_FREE_ROUTINE Free
Definition: titypes.h:244
#define CONN_ENDPT_TAG
Definition: tags.h:10
_In_ PVOID ClientContext
Definition: netioddk.h:55
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
LIST_ENTRY ShutdownRequest
Definition: titypes.h:254
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
KTIMER DisconnectTimer
Definition: titypes.h:259
LIST_ENTRY ReceiveRequest
Definition: titypes.h:252
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
LIST_ENTRY ConnectRequest
Definition: titypes.h:250
LIST_ENTRY ListenRequest
Definition: titypes.h:251
#define NULL
Definition: types.h:112
LIST_ENTRY SendRequest
Definition: titypes.h:253
PIO_WORKITEM DisconnectWorkItem
Definition: titypes.h:261
#define DEBUG_CPOINT
Definition: debug.h:33
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
KSPIN_LOCK ConnectionEndpointListLock
Definition: fileobjs.c:26
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
LIST_ENTRY ListEntry
Definition: titypes.h:242

Referenced by DispTdiListen(), FileOpenConnection(), and TCPSocketObject::TCPSocketObject().

◆ TCPAllocatePort()

UINT TCPAllocatePort ( const UINT  HintPort)

Definition at line 623 of file tcp.c.

624 {
625  if (HintPort)
626  {
627  if (AllocatePort(&TCPPorts, HintPort))
628  return HintPort;
629  else
630  {
631  TI_DbgPrint(MID_TRACE,("We got a hint port but couldn't allocate it\n"));
632  return (UINT)-1;
633  }
634  }
635  else
636  return AllocatePortFromRange( &TCPPorts, 1024, 5000 );
637 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
PORT_SET TCPPorts
Definition: tcp.c:17
#define MID_TRACE
Definition: debug.h:15
BOOLEAN AllocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:47
ULONG AllocatePortFromRange(PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
Definition: ports.c:86
unsigned int UINT
Definition: ndis.h:50

Referenced by FileOpenAddress(), TCPConnect(), and TCPListen().

◆ TCPCheckPeerForAccept()

NTSTATUS TCPCheckPeerForAccept ( PVOID  Context,
PTDI_REQUEST_KERNEL  Request 
)

Definition at line 17 of file accept.c.

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 }
#define DbgPrint
Definition: hal.h:12
LONG NTSTATUS
Definition: precomp.h:26
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:859
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
Status
Definition: gdiplustypes.h:24
struct _TDI_CONNECTION_INFORMATION * PTDI_CONNECTION_INFORMATION
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
NTSTATUS TCPTranslateError(const INT8 err)
Definition: tcp.c:267
#define TDI_QUERY_ACCEPT
Definition: tdi.h:132
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:170

Referenced by TCPAcceptEventHandler().

◆ TCPClose()

NTSTATUS TCPClose ( PCONNECTION_ENDPOINT  Connection)

Definition at line 177 of file tcp.c.

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 }
#define TRUE
Definition: types.h:120
#define DereferenceObject(Object)
Definition: titypes.h:24
VOID FlushAllQueues(PCONNECTION_ENDPOINT Connection, NTSTATUS Status)
Definition: event.c:157
#define FALSE
Definition: types.h:117
err_t LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe, const int callback)
Definition: rostcp.c:801
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define UnlockObject(Object)
Definition: titypes.h:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define LockObject(Object)
Definition: titypes.h:34

Referenced by FileCloseAddress(), FileCloseConnection(), main(), and TCPSocketObject::~TCPSocketObject().

◆ TCPConnect()

NTSTATUS TCPConnect ( PCONNECTION_ENDPOINT  Connection,
PTDI_CONNECTION_INFORMATION  ConnInfo,
PTDI_CONNECTION_INFORMATION  ReturnInfo,
PTCP_COMPLETION_ROUTINE  Complete,
PVOID  Context 
)

Definition at line 302 of file tcp.c.

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 
319  ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress,
320  &RemoteAddress,
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 
358  Status = TCPTranslateError(LibTCPBind(Connection,
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  /* We did, so we need to copy back the port */
375  if (!NT_SUCCESS(Status))
376  {
377  UnlockObject(Connection);
378  return Status;
379  }
380 
381  /* Allocate the port in the port bitmap */
382  Connection->AddressFile->Port = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
383 
384  /* This should never fail */
385  ASSERT(Connection->AddressFile->Port != 0xFFFF);
386  }
387 
388  connaddr.addr = RemoteAddress.Address.IPv4Address;
389 
390  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
391  if (!Bucket)
392  {
393  UnlockObject(Connection);
394  return STATUS_NO_MEMORY;
395  }
396 
398  Bucket->Request.RequestContext = Context;
399 
400  InsertTailList( &Connection->ConnectRequest, &Bucket->Entry );
401 
402  UnlockObject(Connection);
403 
405  &connaddr,
406  RemotePort));
407 
408  TI_DbgPrint(DEBUG_TCP,("[IP, TCPConnect] Leaving. Status = 0x%x\n", Status));
409 
410  return Status;
411 }
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
#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:418
PVOID RequestContext
Definition: tdi.h:55
Definition: neighbor.h:28
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
Definition: router.c:300
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:267
#define InsertTailList(ListHead, Entry)
#define DEBUG_TCP
Definition: debug.h:28
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:623
Definition: ip.h:23
PADDRESS_FILE AddressFile
Definition: titypes.h:247
#define FALSE
Definition: types.h:117
pRequest Complete(RequestStatus)
PVOID RequestNotifyObject
Definition: tdi.h:54
IP_ADDRESS Unicast
Definition: ip.h:159
union IP_ADDRESS::@975 Address
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
void * PVOID
Definition: retypes.h:9
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
LIST_ENTRY Entry
Definition: titypes.h:230
PIP_INTERFACE Interface
Definition: neighbor.h:33
#define UnlockObject(Object)
Definition: titypes.h:44
unsigned short USHORT
Definition: pedump.c:61
IP_ADDRESS Address
Definition: titypes.h:117
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
LIST_ENTRY ConnectRequest
Definition: titypes.h:250
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS Address, BOOLEAN GetRemote)
Definition: tcp.c:645
struct tagContext Context
Definition: acpixf.h:1034
TDI_REQUEST Request
Definition: titypes.h:232
USHORT Port
Definition: titypes.h:120
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:704
NTSTATUS AddrBuildAddress(PTRANSPORT_ADDRESS TdiAddress, PIP_ADDRESS Address, PUSHORT Port)
Definition: address.c:184
err_t LibTCPConnect(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
Definition: rostcp.c:625
_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
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiConnect(), and TCPSocketObject::TCPSocketObject().

◆ TCPCreateSegment()

PTCP_SEGMENT TCPCreateSegment ( PIP_PACKET  IPPacket,
PTCPv4_HEADER  TCPHeader,
ULONG  SegmentLength 
)

◆ TCPDisconnect()

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 at line 414 of file tcp.c.

421 {
423  PTDI_BUCKET Bucket;
424  LARGE_INTEGER ActualTimeout;
425 
426  TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Called\n"));
427 
428  LockObject(Connection);
429 
430  if (Connection->SocketContext)
431  {
433  {
434  if (IsListEmpty(&Connection->SendRequest))
435  {
436  ReferenceObject(Connection);
437  UnlockObject(Connection);
438  Status = TCPTranslateError(LibTCPShutdown(Connection, 0, 1));
439  LockObject(Connection);
440  DereferenceObject(Connection);
441  }
442  else if (Timeout && Timeout->QuadPart == 0)
443  {
444  FlushSendQueue(Connection, STATUS_FILE_CLOSED);
445  ReferenceObject(Connection);
446  UnlockObject(Connection);
447  LibTCPShutdown(Connection, 0, 1);
448  LockObject(Connection);
449  DereferenceObject(Connection);
451  }
452  else
453  {
454  /* Use the timeout specified or 1 second if none was specified */
455  if (Timeout)
456  {
457  ActualTimeout = *Timeout;
458  }
459  else
460  {
461  ActualTimeout.QuadPart = -1000000;
462  }
463 
464  /* We couldn't complete the request now because we need to wait for outstanding I/O */
465  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
466  if (!Bucket)
467  {
468  UnlockObject(Connection);
469  return STATUS_NO_MEMORY;
470  }
471 
473  Bucket->Request.RequestContext = Context;
474 
475  InsertTailList(&Connection->ShutdownRequest, &Bucket->Entry);
476 
477  ReferenceObject(Connection);
478  if (KeSetTimer(&Connection->DisconnectTimer, ActualTimeout, &Connection->DisconnectDpc))
479  {
480  /* Timer was already in the queue. */
481  DereferenceObject(Connection);
482  }
483 
485  }
486  }
487 
488  if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
489  {
491  FlushSendQueue(Connection, STATUS_FILE_CLOSED);
493  ReferenceObject(Connection);
494  UnlockObject(Connection);
495  Status = TCPTranslateError(LibTCPShutdown(Connection, 1, 1));
496  DereferenceObject(Connection);
497  }
498  else
499  {
500  UnlockObject(Connection);
501  }
502  }
503  else
504  {
505  UnlockObject(Connection);
506  /* We already got closed by the other side so just return success */
508  }
509 
510  TI_DbgPrint(DEBUG_TCP,("[IP, TCPDisconnect] Leaving. Status = 0x%x\n", Status));
511 
512  return Status;
513 }
#define TDI_DISCONNECT_RELEASE
Definition: tdi.h:144
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
PVOID RequestContext
Definition: tdi.h:55
err_t LibTCPShutdown(PCONNECTION_ENDPOINT Connection, const int shut_rx, const int shut_tx)
Definition: rostcp.c:720
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:267
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define DEBUG_TCP
Definition: debug.h:28
#define DereferenceObject(Object)
Definition: titypes.h:24
VOID FlushReceiveQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:53
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
pRequest Complete(RequestStatus)
PVOID RequestNotifyObject
Definition: tdi.h:54
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
void * PVOID
Definition: retypes.h:9
Status
Definition: gdiplustypes.h:24
VOID FlushShutdownQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:95
VOID FlushSendQueue(PCONNECTION_ENDPOINT Connection, const NTSTATUS Status)
Definition: event.c:74
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define STATUS_PENDING
Definition: ntstatus.h:82
LIST_ENTRY ShutdownRequest
Definition: titypes.h:254
KTIMER DisconnectTimer
Definition: titypes.h:259
#define ReferenceObject(Object)
Definition: titypes.h:14
LIST_ENTRY Entry
Definition: titypes.h:230
static ULONG Timeout
Definition: ping.c:61
#define UnlockObject(Object)
Definition: titypes.h:44
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
LIST_ENTRY SendRequest
Definition: titypes.h:253
struct tagContext Context
Definition: acpixf.h:1034
TDI_REQUEST Request
Definition: titypes.h:232
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TDI_DISCONNECT_ABORT
Definition: tdi.h:143
LONGLONG QuadPart
Definition: typedefs.h:114
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:532
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiDisconnect().

◆ TCPFreeConnectionEndpoint()

VOID TCPFreeConnectionEndpoint ( PCONNECTION_ENDPOINT  Connection)

◆ TCPFreePort()

VOID TCPFreePort ( const UINT  Port)

Definition at line 639 of file tcp.c.

640 {
642 }
CPPORT Port[4]
Definition: headless.c:35
PORT_SET TCPPorts
Definition: tcp.c:17
VOID DeallocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:35

Referenced by AddrFileFree().

◆ TCPFreeSegment()

VOID TCPFreeSegment ( PTCP_SEGMENT  Segment)

◆ TCPGetSockAddress()

NTSTATUS TCPGetSockAddress ( PCONNECTION_ENDPOINT  Connection,
PTRANSPORT_ADDRESS  TransportAddress,
BOOLEAN  RemoteAddress 
)

Definition at line 645 of file tcp.c.

648 {
650  struct ip_addr ipaddr;
652 
653  AddressIP->TAAddressCount = 1;
654  AddressIP->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
655  AddressIP->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
656 
657  LockObject(Connection);
658 
659  if (GetRemote)
660  {
662  &ipaddr,
663  &AddressIP->Address[0].Address[0].sin_port));
664  }
665  else
666  {
668  &ipaddr,
669  &AddressIP->Address[0].Address[0].sin_port));
670  }
671 
672  UnlockObject(Connection);
673 
674  AddressIP->Address[0].Address[0].in_addr = ipaddr.addr;
675 
676  RtlZeroMemory(&AddressIP->Address[0].Address[0].sin_zero,
677  sizeof(AddressIP->Address[0].Address[0].sin_zero));
678 
679  return Status;
680 }
LONG TAAddressCount
Definition: tdi.h:523
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
LONG NTSTATUS
Definition: precomp.h:26
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:859
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:267
static WCHAR Address[46]
Definition: ping.c:68
struct _TA_ADDRESS_IP::_AddrIp Address[1]
Status
Definition: gdiplustypes.h:24
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
#define UnlockObject(Object)
Definition: titypes.h:44
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
err_t LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
Definition: rostcp.c:847
#define LockObject(Object)
Definition: titypes.h:34

Referenced by InfoTdiQueryGetConnectionTcpTable(), TCPConnect(), and TCPListen().

◆ TCPGetSocketStatus()

NTSTATUS TCPGetSocketStatus ( PCONNECTION_ENDPOINT  Connection,
PULONG  State 
)

Definition at line 736 of file tcp.c.

739 {
740  if (!Connection)
741  return STATUS_UNSUCCESSFUL;
742 
743  if (Connection->SocketContext == NULL)
744  return STATUS_UNSUCCESSFUL;
745 
747  return STATUS_SUCCESS;
748 }
void LibTCPGetSocketStatus(PTCP_PCB pcb, PULONG State)
Definition: rostcp.c:882
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by InfoTdiQueryGetConnectionTcpTable().

◆ TCPListen()

NTSTATUS TCPListen ( PCONNECTION_ENDPOINT  Connection,
UINT  Backlog 
)

Definition at line 47 of file accept.c.

48 {
50  struct ip_addr AddressToBind;
52 
53  ASSERT(Connection);
54 
55  LockObject(Connection);
56 
57  ASSERT_KM_POINTER(Connection->AddressFile);
58 
59  TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Called\n"));
60 
61  TI_DbgPrint(DEBUG_TCP, ("Connection->SocketContext %x\n",
62  Connection->SocketContext));
63 
64  AddressToBind.addr = Connection->AddressFile->Address.Address.IPv4Address;
65 
66  Status = TCPTranslateError(LibTCPBind(Connection,
67  &AddressToBind,
68  Connection->AddressFile->Port));
69 
70  if (NT_SUCCESS(Status))
71  {
72  /* Check if we had an unspecified port */
73  if (!Connection->AddressFile->Port)
74  {
75  /* We did, so we need to copy back the port */
77  if (NT_SUCCESS(Status))
78  {
79  /* Allocate the port in the port bitmap */
80  Connection->AddressFile->Port = TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
81 
82  /* This should never fail */
83  ASSERT(Connection->AddressFile->Port != 0xFFFF);
84  }
85  }
86  }
87 
88  if (NT_SUCCESS(Status))
89  {
90  Connection->SocketContext = LibTCPListen(Connection, Backlog);
91  if (!Connection->SocketContext)
93  }
94 
95  UnlockObject(Connection);
96 
97  TI_DbgPrint(DEBUG_TCP,("[IP, TCPListen] Leaving. Status = %x\n", Status));
98 
99  return Status;
100 }
#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:418
LONG NTSTATUS
Definition: precomp.h:26
#define DEBUG_TCP
Definition: debug.h:28
PADDRESS_FILE AddressFile
Definition: titypes.h:247
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS TransportAddress, BOOLEAN RemoteAddress)
Definition: tcp.c:645
#define FALSE
Definition: types.h:117
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:623
union IP_ADDRESS::@975 Address
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ASSERT_KM_POINTER(_x)
Definition: debug.h:74
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS TCPTranslateError(const INT8 err)
Definition: tcp.c:267
#define UnlockObject(Object)
Definition: titypes.h:44
IP_ADDRESS Address
Definition: titypes.h:117
USHORT Port
Definition: titypes.h:120
#define STATUS_SUCCESS
Definition: shellext.h:65
PTCP_PCB LibTCPListen(PCONNECTION_ENDPOINT Connection, const u8_t backlog)
Definition: rostcp.c:472
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:170
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiListen().

◆ TCPReceiveData()

NTSTATUS TCPReceiveData ( PCONNECTION_ENDPOINT  Connection,
PNDIS_BUFFER  Buffer,
ULONG  ReceiveLength,
PULONG  BytesReceived,
ULONG  ReceiveFlags,
PTCP_COMPLETION_ROUTINE  Complete,
PVOID  Context 
)

Definition at line 516 of file tcp.c.

523 {
524  PTDI_BUCKET Bucket;
525  PUCHAR DataBuffer;
526  UINT DataLen, Received;
528 
529  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Called for %d bytes (on socket %x)\n",
530  ReceiveLength, Connection->SocketContext));
531 
532  NdisQueryBuffer(Buffer, &DataBuffer, &DataLen);
533 
534  Status = LibTCPGetDataFromConnectionQueue(Connection, DataBuffer, DataLen, &Received);
535 
536  if (Status == STATUS_PENDING)
537  {
538  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
539  if (!Bucket)
540  {
541  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Failed to allocate bucket\n"));
542 
543  return STATUS_NO_MEMORY;
544  }
545 
547  Bucket->Request.RequestContext = Context;
548 
549  LockObject(Connection);
550  InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry );
551  UnlockObject(Connection);
552  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Queued read irp\n"));
553 
554  TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Leaving. Status = STATUS_PENDING\n"));
555 
556  (*BytesReceived) = 0;
557  }
558  else
559  {
560  (*BytesReceived) = Received;
561  }
562 
563  return Status;
564 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
PVOID RequestContext
Definition: tdi.h:55
unsigned char * PUCHAR
Definition: retypes.h:3
LONG NTSTATUS
Definition: precomp.h:26
#define InsertTailList(ListHead, Entry)
#define DEBUG_TCP
Definition: debug.h:28
pRequest Complete(RequestStatus)
PVOID RequestNotifyObject
Definition: tdi.h:54
Definition: bufpool.h:45
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
Status
Definition: gdiplustypes.h:24
#define STATUS_PENDING
Definition: ntstatus.h:82
LIST_ENTRY ReceiveRequest
Definition: titypes.h:252
LIST_ENTRY Entry
Definition: titypes.h:230
#define UnlockObject(Object)
Definition: titypes.h:44
NTSTATUS LibTCPGetDataFromConnectionQueue(PCONNECTION_ENDPOINT Connection, PUCHAR RecvBuffer, UINT RecvLen, UINT *Received)
Definition: rostcp.c:103
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
unsigned int UINT
Definition: ndis.h:50
VOID EXPORT NdisQueryBuffer(IN PNDIS_BUFFER Buffer, OUT PVOID *VirtualAddress OPTIONAL, OUT PUINT Length)
Definition: buffer.c:955
struct tagContext Context
Definition: acpixf.h:1034
TDI_REQUEST Request
Definition: titypes.h:232
UINT Received
Definition: arping.c:40
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiReceive().

◆ TCPRemoveIRP()

BOOLEAN TCPRemoveIRP ( PCONNECTION_ENDPOINT  Connection,
PIRP  Irp 
)

Definition at line 682 of file tcp.c.

683 {
685  PLIST_ENTRY ListHead[5];
686  PTDI_BUCKET Bucket;
687  UINT i = 0;
688  BOOLEAN Found = FALSE;
689 
690  ListHead[0] = &Endpoint->SendRequest;
691  ListHead[1] = &Endpoint->ReceiveRequest;
692  ListHead[2] = &Endpoint->ConnectRequest;
693  ListHead[3] = &Endpoint->ListenRequest;
694  ListHead[4] = &Endpoint->ShutdownRequest;
695 
696  LockObject(Endpoint);
697 
698  for( i = 0; i < 5; i++ )
699  {
700  for( Entry = ListHead[i]->Flink;
701  Entry != ListHead[i];
702  Entry = Entry->Flink )
703  {
704  Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
705  if( Bucket->Request.RequestContext == Irp )
706  {
707  RemoveEntryList( &Bucket->Entry );
708  ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket);
709  Found = TRUE;
710  break;
711  }
712  }
713  }
714 
715  UnlockObject(Endpoint);
716 
717  return Found;
718 }
PVOID RequestContext
Definition: tdi.h:55
struct _Entry Entry
Definition: kefuncs.h:627
#define TRUE
Definition: types.h:120
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
unsigned char BOOLEAN
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
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
Definition: typedefs.h:119
LIST_ENTRY Entry
Definition: titypes.h:230
#define UnlockObject(Object)
Definition: titypes.h:44
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
unsigned int UINT
Definition: ndis.h:50
TDI_REQUEST Request
Definition: titypes.h:232
base of all file and directory entries
Definition: entries.h:82
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispCancelRequest().

◆ TCPSendData()

NTSTATUS TCPSendData ( PCONNECTION_ENDPOINT  Connection,
PCHAR  Buffer,
ULONG  DataSize,
PULONG  DataUsed,
ULONG  Flags,
PTCP_COMPLETION_ROUTINE  Complete,
PVOID  Context 
)

Definition at line 567 of file tcp.c.

574 {
576  PTDI_BUCKET Bucket;
577 
578  ReferenceObject(Connection);
579 
580  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Called for %d bytes (on socket %x)\n",
581  SendLength, Connection->SocketContext));
582 
583  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection = %x\n", Connection));
584  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Connection->SocketContext = %x\n",
585  Connection->SocketContext));
586 
587  Status = TCPTranslateError(LibTCPSend(Connection,
588  BufferData,
589  SendLength,
590  BytesSent,
591  FALSE));
592 
593  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Send: %x, %d\n", Status, SendLength));
594 
595  /* Keep this request around ... there was no data yet */
596  if (Status == STATUS_PENDING)
597  {
598  /* Freed in TCPSocketState */
599  Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList);
600  if (!Bucket)
601  {
602  DereferenceObject(Connection);
603  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Failed to allocate bucket\n"));
604  return STATUS_NO_MEMORY;
605  }
606 
608  Bucket->Request.RequestContext = Context;
609 
610  LockObject(Connection);
611  InsertTailList( &Connection->SendRequest, &Bucket->Entry );
612  TI_DbgPrint(DEBUG_TCP,("[IP, TCPSendData] Queued write irp\n"));
613  UnlockObject(Connection);
614  }
615 
616 
617  TI_DbgPrint(DEBUG_TCP, ("[IP, TCPSendData] Leaving. Status = %x\n", Status));
618  DereferenceObject(Connection);
619 
620  return Status;
621 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
PVOID RequestContext
Definition: tdi.h:55
err_t LibTCPSend(PCONNECTION_ENDPOINT Connection, void *const dataptr, const u16_t len, u32_t *sent, const int safe)
Definition: rostcp.c:560
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS TCPTranslateError(const err_t err)
Definition: tcp.c:267
#define InsertTailList(ListHead, Entry)
#define DEBUG_TCP
Definition: debug.h:28
#define DereferenceObject(Object)
Definition: titypes.h:24
#define FALSE
Definition: types.h:117
pRequest Complete(RequestStatus)
PVOID RequestNotifyObject
Definition: tdi.h:54
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
Status
Definition: gdiplustypes.h:24
#define STATUS_PENDING
Definition: ntstatus.h:82
#define ReferenceObject(Object)
Definition: titypes.h:14
LIST_ENTRY Entry
Definition: titypes.h:230
#define UnlockObject(Object)
Definition: titypes.h:44
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
LIST_ENTRY SendRequest
Definition: titypes.h:253
struct tagContext Context
Definition: acpixf.h:1034
TDI_REQUEST Request
Definition: titypes.h:232
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiSend(), TCPSocketObject::recv(), and TCPSocketObject::send().

◆ TCPSetNoDelay()

NTSTATUS TCPSetNoDelay ( PCONNECTION_ENDPOINT  Connection,
BOOLEAN  Set 
)

Definition at line 721 of file tcp.c.

724 {
725  if (!Connection)
726  return STATUS_UNSUCCESSFUL;
727 
728  if (Connection->SocketContext == NULL)
729  return STATUS_UNSUCCESSFUL;
730 
731  LibTCPSetNoDelay(Connection->SocketContext, Set);
732  return STATUS_SUCCESS;
733 }
static BOOL Set
Definition: pageheap.c:10
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
void LibTCPSetNoDelay(PTCP_PCB pcb, BOOLEAN Set)
Definition: rostcp.c:871
#define NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by SetConnectionInfo().

◆ TCPShutdown()

NTSTATUS TCPShutdown ( VOID  )

Definition at line 243 of file tcp.c.

249 {
250  if (!TCPInitialized)
251  return STATUS_SUCCESS;
252 
254 
255  LibIPShutdown();
256 
257  /* Deregister this protocol with IP layer */
259 
261 
263 
264  return STATUS_SUCCESS;
265 }
PORT_SET TCPPorts
Definition: tcp.c:17
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:390
#define FALSE
Definition: types.h:117
static BOOLEAN TCPInitialized
Definition: tcp.c:16
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
void LibIPShutdown(void)
Definition: rosip.c:42
#define NULL
Definition: types.h:112
VOID PortsShutdown(PPORT_SET PortSet)
Definition: ports.c:31
#define STATUS_SUCCESS
Definition: shellext.h:65
VOID NTAPI ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside)
Definition: lookas.c:170

Referenced by TiUnload().

◆ TCPSocket()

NTSTATUS TCPSocket ( PCONNECTION_ENDPOINT  Connection,
UINT  Family,
UINT  Type,
UINT  Proto 
)

Definition at line 153 of file tcp.c.

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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
PTCP_PCB LibTCPSocket(void *arg)
Definition: rostcp.c:339
LONG NTSTATUS
Definition: precomp.h:26
#define DEBUG_TCP
Definition: debug.h:28
static int Family
Definition: ping.c:62
Status
Definition: gdiplustypes.h:24
Type
Definition: Type.h:6
#define UnlockObject(Object)
Definition: titypes.h:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define LockObject(Object)
Definition: titypes.h:34

Referenced by DispTdiListen(), FileOpenConnection(), and TCPSocketObject::TCPSocketObject().

◆ TCPStartup()

NTSTATUS TCPStartup ( VOID  )

Definition at line 208 of file tcp.c.

214 {
216 
217  Status = PortsStartup( &TCPPorts, 1, 0xfffe );
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 */
232  LibIPInitialize();
233 
234  /* Register this protocol with IP layer */
236 
238 
239  return STATUS_SUCCESS;
240 }
VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
Definition: tcp.c:192
PORT_SET TCPPorts
Definition: tcp.c:17
NTSTATUS PortsStartup(PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
Definition: ports.c:13
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:390
void LibIPInitialize(void)
Definition: rosip.c:35
static BOOLEAN TCPInitialized
Definition: tcp.c:16
#define TDI_BUCKET_TAG
Definition: tags.h:31
NPAGED_LOOKASIDE_LIST TdiBucketLookasideList
Definition: tcp.c:26
Status
Definition: gdiplustypes.h:24
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 NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by DriverEntry().

◆ TCPTranslateError()

NTSTATUS TCPTranslateError ( const INT8  err)

Definition at line 267 of file tcp.c.

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 }
#define ERR_CONN
Definition: err.h:68
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define STATUS_INVALID_CONNECTION
Definition: ntstatus.h:556
#define ERR_ARG
Definition: err.h:70
#define ERR_ISCONN
Definition: err.h:61
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define DbgPrint
Definition: hal.h:12
#define ERR_RTE
Definition: err.h:56
#define ERR_CLSD
Definition: err.h:67
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define ERR_USE
Definition: err.h:60
LONG NTSTATUS
Definition: precomp.h:26
#define DEBUG_TCP
Definition: debug.h:28
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:654
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define ERR_TIMEOUT
Definition: err.h:55
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
#define FALSE
Definition: types.h:117
#define STATUS_REMOTE_DISCONNECT
Definition: ntstatus.h:552
#define ERR_VAL
Definition: err.h:58
#define ERR_OK
Definition: err.h:52
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ERR_RST
Definition: err.h:66
#define err(...)
#define ERR_MEM
Definition: fontsub.h:52
#define ERR_BUF
Definition: err.h:54
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:551
#define ERR_INPROGRESS
Definition: err.h:57
#define ERR_WOULDBLOCK
Definition: err.h:59
#define STATUS_UNEXPECTED_NETWORK_ERROR
Definition: ntstatus.h:432
#define ERR_ABRT
Definition: err.h:65
#define ERR_IF
Definition: err.h:72
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:704
#define STATUS_CANT_WAIT
Definition: ntstatus.h:452
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:532

Referenced by TCPCheckPeerForAccept(), TCPConnectEventHandler(), TCPFinEventHandler(), TCPListen(), and TCPSendEventHandler().

◆ TCPUpdateInterfaceIPInformation()

VOID TCPUpdateInterfaceIPInformation ( PIP_INTERFACE  IF)

Definition at line 145 of file if.c.

146 {
147  struct ip_addr ipaddr;
148  struct ip_addr netmask;
149  struct ip_addr gw;
150 
151  gw.addr = 0;
152 
154  ADE_UNICAST,
155  (PULONG)&ipaddr.addr);
156 
158  ADE_ADDRMASK,
159  (PULONG)&netmask.addr);
160 
161  netif_set_addr(IF->TCPContext, &ipaddr, &netmask, &gw);
162 
163  if (ipaddr.addr != 0)
164  {
167  }
168  else
169  {
171  }
172 }
PVOID TCPContext
Definition: ip.h:169
void netif_set_default(struct netif *netif)
Definition: netif.c:430
void netif_set_up(struct netif *netif)
Definition: netif.c:453
#define ADE_ADDRMASK
Definition: ip.h:112
void netif_set_down(struct netif *netif)
Definition: netif.c:490
NTSTATUS GetInterfaceIPv4Address(PIP_INTERFACE Interface, ULONG Type, PULONG Address)
Definition: interface.c:19
unsigned int * PULONG
Definition: retypes.h:1
#define ADE_UNICAST
Definition: ip.h:110
u32_t addr
Definition: ip_addr.h:45
void netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw)
Definition: netif.c:221

Referenced by IPAddInterfaceRoute(), ReconfigureAdapter(), and TCPInterfaceInit().

◆ TCPUpdateInterfaceLinkStatus()

VOID TCPUpdateInterfaceLinkStatus ( PIP_INTERFACE  IF)

Definition at line 81 of file if.c.

82 {
83 #if 0
84  ULONG OperationalStatus;
85 
86  GetInterfaceConnectionStatus(IF, &OperationalStatus);
87 
88  if (OperationalStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
90  else
92 #endif
93 }
PVOID TCPContext
Definition: ip.h:169
void netif_set_link_down(struct netif *netif)
Definition: netif.c:574
VOID GetInterfaceConnectionStatus(PIP_INTERFACE Interface, PULONG OperStatus)
Definition: interface.c:254
void netif_set_link_up(struct netif *netif)
Definition: netif.c:535
unsigned int ULONG
Definition: retypes.h:1
#define MIB_IF_OPER_STATUS_OPERATIONAL
Definition: ipifcons.h:251

Referenced by ReconfigureAdapter(), and TCPInterfaceInit().

Variable Documentation

◆ ClientInfo

◆ TCP_IPIdentification

LONG TCP_IPIdentification

Definition at line 24 of file tcptest.cpp.