Oskit can now be linked from userland. This is part one of my plan.
[reactos.git] / reactos / drivers / net / tcpip / include / tcp.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: include/tcp.h
5 * PURPOSE: Transmission Control Protocol definitions
6 */
7 #ifndef __TCP_H
8 #define __TCP_H
9
10 typedef VOID
11 (*PTCP_COMPLETION_ROUTINE)( PVOID Context, NTSTATUS Status, ULONG Count );
12
13 /* TCPv4 header structure */
14 typedef struct TCPv4_HEADER {
15 USHORT SourcePort; /* Source port */
16 USHORT DestinationPort; /* Destination port */
17 ULONG SequenceNumber; /* Sequence number */
18 ULONG AckNumber; /* Acknowledgement number */
19 UCHAR DataOffset; /* Data offset; 32-bit words (leftmost 4 bits) */
20 UCHAR Flags; /* Control bits (rightmost 6 bits) */
21 USHORT Window; /* Maximum acceptable receive window */
22 USHORT Checksum; /* Checksum of segment */
23 USHORT Urgent; /* Pointer to urgent data */
24 } __attribute__((packed)) TCPv4_HEADER, *PTCPv4_HEADER;
25
26 /* TCPv4 header flags */
27 #define TCP_URG 0x20
28 #define TCP_ACK 0x10
29 #define TCP_PSH 0x08
30 #define TCP_RST 0x04
31 #define TCP_SYN 0x02
32 #define TCP_FIN 0x01
33
34
35 #define TCPOPT_END_OF_LIST 0x0
36 #define TCPOPT_NO_OPERATION 0x1
37 #define TCPOPT_MAX_SEG_SIZE 0x2
38
39 #define TCPOPTLEN_MAX_SEG_SIZE 0x4
40
41 /* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */
42 #define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2))
43
44
45 /* TCPv4 pseudo header */
46 typedef struct TCPv4_PSEUDO_HEADER {
47 ULONG SourceAddress; /* Source address */
48 ULONG DestinationAddress; /* Destination address */
49 UCHAR Zero; /* Reserved */
50 UCHAR Protocol; /* Protocol */
51 USHORT TCPLength; /* Size of TCP segment */
52 } __attribute__((packed)) TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER;
53
54 typedef struct _SLEEPING_THREAD {
55 LIST_ENTRY Entry;
56 PVOID SleepToken;
57 KEVENT Event;
58 } SLEEPING_THREAD, *PSLEEPING_THREAD;
59
60 /* Retransmission timeout constants */
61
62 /* Lower bound for retransmission timeout in TCP timer ticks */
63 #define TCP_MIN_RETRANSMISSION_TIMEOUT 1*1000 /* 1 tick */
64
65 /* Upper bound for retransmission timeout in TCP timer ticks */
66 #define TCP_MAX_RETRANSMISSION_TIMEOUT 1*60*1000 /* 1 tick */
67
68 /* Smoothing factor */
69 #define TCP_ALPHA_RETRANSMISSION_TIMEOUT(x)(((x)*8)/10) /* 0.8 */
70
71 /* Delay variance factor */
72 #define TCP_BETA_RETRANSMISSION_TIMEOUT(x)(((x)*16)/10) /* 1.6 */
73
74
75 /* Datagram/segment send request flags */
76
77 #define SRF_URG TCP_URG
78 #define SRF_ACK TCP_ACK
79 #define SRF_PSH TCP_PSH
80 #define SRF_RST TCP_RST
81 #define SRF_SYN TCP_SYN
82 #define SRF_FIN TCP_FIN
83
84 PTCP_SEGMENT TCPCreateSegment(
85 PIP_PACKET IPPacket,
86 PTCPv4_HEADER TCPHeader,
87 ULONG SegmentLength);
88
89 VOID TCPFreeSegment(
90 PTCP_SEGMENT Segment);
91
92 VOID TCPAddSegment(
93 PCONNECTION_ENDPOINT Connection,
94 PTCP_SEGMENT Segment,
95 PULONG Acknowledged);
96
97 NTSTATUS TCPConnect(
98 PTDI_REQUEST Request,
99 PTDI_CONNECTION_INFORMATION ConnInfo,
100 PTDI_CONNECTION_INFORMATION ReturnInfo);
101
102 NTSTATUS TCPListen(
103 PTDI_REQUEST Request,
104 UINT Backlog );
105
106 NTSTATUS TCPReceiveData(
107 PTDI_REQUEST Request,
108 PNDIS_BUFFER Buffer,
109 ULONG ReceiveLength,
110 ULONG ReceiveFlags,
111 PULONG BytesReceived);
112
113 NTSTATUS TCPSendData(
114 PTDI_REQUEST Request,
115 PNDIS_BUFFER Buffer,
116 ULONG DataSize,
117 ULONG Flags,
118 PULONG DataUsed);
119
120 NTSTATUS TCPClose
121 ( PTDI_REQUEST Request );
122
123 PVOID TCPPrepareInterface( PIP_INTERFACE IF );
124
125 NTSTATUS TCPTranslateError( int OskitError );
126
127 VOID TCPTimeout();
128
129 NTSTATUS TCPStartup(
130 VOID);
131
132 NTSTATUS TCPShutdown(
133 VOID);
134
135 #endif /* __TCP_H */