]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
Update modules to show real dependencies on the BaseMemoryLib and MemoryAllocationLib
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Proto.h
CommitLineData
83cbd279 1/** @file\r
dab714aa 2 Tcp Protocol header file.\r
3\r
dfc1f033 4Copyright (c) 2005 - 2006, Intel Corporation<BR>\r
83cbd279 5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
dfc1f033 8http://opensource.org/licenses/bsd-license.php<BR>\r
83cbd279 9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
83cbd279 13**/\r
14\r
15#ifndef _TCP4_PROTO_H_\r
16#define _TCP4_PROTO_H_\r
17\r
18typedef struct _TCP_CB TCP_CB;\r
19\r
20#include "Tcp4Driver.h"\r
21#include "Socket.h"\r
22#include "Tcp4Option.h"\r
23\r
dfc1f033 24\r
25\r
26///\r
27/// Tcp states, Don't change their order, it is used as\r
28/// index to mTcpOutFlag and other macros\r
29///\r
85511ddf 30typedef enum {\r
83cbd279 31 TCP_CLOSED = 0,\r
32 TCP_LISTEN,\r
33 TCP_SYN_SENT,\r
34 TCP_SYN_RCVD,\r
35 TCP_ESTABLISHED,\r
36 TCP_FIN_WAIT_1,\r
37 TCP_FIN_WAIT_2,\r
38 TCP_CLOSING,\r
39 TCP_TIME_WAIT,\r
40 TCP_CLOSE_WAIT,\r
41 TCP_LAST_ACK\r
85511ddf 42} TCP_STATES;\r
83cbd279 43\r
dfc1f033 44///\r
45/// Flags in the TCP header\r
46///\r
85511ddf 47typedef enum {\r
83cbd279 48\r
49 TCP_FLG_FIN = 0x01,\r
50 TCP_FLG_SYN = 0x02,\r
51 TCP_FLG_RST = 0x04,\r
52 TCP_FLG_PSH = 0x08,\r
53 TCP_FLG_ACK = 0x10,\r
54 TCP_FLG_URG = 0x20,\r
dfc1f033 55 \r
56 //\r
57 // mask for all the flags\r
58 //\r
59 TCP_FLG_FLAG = 0x3F \r
85511ddf 60} TCP_HEADER_FLAG;\r
83cbd279 61\r
85511ddf 62typedef enum {\r
83cbd279 63\r
dfc1f033 64 TCP_CONNECT_REFUSED = -1, ///< TCP error status\r
65 TCP_CONNECT_RESET = -2, ///< TCP error status\r
66 TCP_CONNECT_CLOSED = -3, ///< TCP error status\r
83cbd279 67\r
68 //\r
69 // Current congestion status as suggested by RFC3782.\r
70 //\r
dfc1f033 71 TCP_CONGEST_RECOVER = 1, ///< During the NewReno fast recovery\r
72 TCP_CONGEST_LOSS = 2, ///< Retxmit because of retxmit time out\r
73 TCP_CONGEST_OPEN = 3, ///< TCP is opening its congestion window\r
83cbd279 74\r
75 //\r
76 // TCP control flags\r
77 //\r
dfc1f033 78 TCP_CTRL_NO_NAGLE = 0x0001, ///< Disable Nagle algorithm\r
79 TCP_CTRL_NO_KEEPALIVE = 0x0002, ///< Disable keepalive timer\r
80 TCP_CTRL_NO_WS = 0x0004, ///< Disable window scale option\r
81 TCP_CTRL_RCVD_WS = 0x0008, ///< Received a wnd scale option in syn\r
82 TCP_CTRL_NO_TS = 0x0010, ///< Disable Timestamp option\r
83 TCP_CTRL_RCVD_TS = 0x0020, ///< Received a Timestamp option in syn\r
84 TCP_CTRL_SND_TS = 0x0040, ///< Send Timestamp option to remote\r
85 TCP_CTRL_SND_URG = 0x0080, ///< In urgent send mode\r
86 TCP_CTRL_RCVD_URG = 0x0100, ///< In urgent receive mode\r
87 TCP_CTRL_SND_PSH = 0x0200, ///< In PUSH send mode\r
88 TCP_CTRL_FIN_SENT = 0x0400, ///< FIN is sent\r
89 TCP_CTRL_FIN_ACKED = 0x0800, ///< FIN is ACKed.\r
90 TCP_CTRL_TIMER_ON = 0x1000, ///< At least one of the timer is on\r
91 TCP_CTRL_RTT_ON = 0x2000, ///< The RTT measurement is on\r
92 TCP_CTRL_ACK_NOW = 0x4000, ///< Send the ACK now, don't delay\r
83cbd279 93\r
94 //\r
95 // Timer related values\r
96 //\r
dfc1f033 97 TCP_TIMER_CONNECT = 0, ///< Connection establishment timer\r
98 TCP_TIMER_REXMIT = 1, ///< Retransmit timer\r
99 TCP_TIMER_PROBE = 2, ///< Window probe timer\r
100 TCP_TIMER_KEEPALIVE = 3, ///< Keepalive timer\r
101 TCP_TIMER_FINWAIT2 = 4, ///< FIN_WAIT_2 timer\r
102 TCP_TIMER_2MSL = 5, ///< TIME_WAIT tiemr\r
103 TCP_TIMER_NUMBER = 6, ///< The total number of TCP timer.\r
104 TCP_TICK = 200, ///< Every TCP tick is 200ms\r
105 TCP_TICK_HZ = 5, ///< The frequence of TCP tick\r
106 TCP_RTT_SHIFT = 3, ///< SRTT & RTTVAR scaled by 8\r
107 TCP_RTO_MIN = TCP_TICK_HZ, ///< The minium value of RTO\r
108 TCP_RTO_MAX = (TCP_TICK_HZ * 60), ///< The maxium value of RTO\r
109 TCP_FOLD_RTT = 4, ///< Timeout threshod to fold RTT\r
83cbd279 110\r
111 //\r
dfc1f033 112 // Default values for some timers\r
83cbd279 113 //\r
dfc1f033 114 TCP_MAX_LOSS = 12, ///< Default max times to retxmit\r
115 TCP_KEEPALIVE_IDLE_MIN = (TCP_TICK_HZ * 60 * 60 * 2), ///< First keep alive\r
116 TCP_KEEPALIVE_PERIOD = (TCP_TICK_HZ * 60),\r
83cbd279 117 TCP_MAX_KEEPALIVE = 8,\r
dfc1f033 118 TCP_FIN_WAIT2_TIME = (2 * TCP_TICK_HZ),\r
119 TCP_TIME_WAIT_TIME = (2 * TCP_TICK_HZ),\r
120 TCP_PAWS_24DAY = (24 * 24 * 60 * 60 * TCP_TICK_HZ),\r
121 TCP_CONNECT_TIME = (75 * TCP_TICK_HZ),\r
83cbd279 122\r
123 //\r
124 // The header space to be reserved before TCP data to accomodate :\r
125 // 60byte IP head + 60byte TCP head + link layer head\r
126 //\r
127 TCP_MAX_HEAD = 192,\r
128\r
129 //\r
dfc1f033 130 // Value ranges for some control option\r
83cbd279 131 //\r
dfc1f033 132 TCP_RCV_BUF_SIZE = (2 * 1024 * 1024),\r
133 TCP_RCV_BUF_SIZE_MIN = (8 * 1024),\r
134 TCP_SND_BUF_SIZE = (2 * 1024 * 1024),\r
135 TCP_SND_BUF_SIZE_MIN = (8 * 1024),\r
83cbd279 136 TCP_BACKLOG = 10,\r
137 TCP_BACKLOG_MIN = 5,\r
138 TCP_MAX_LOSS_MIN = 6,\r
dfc1f033 139 TCP_CONNECT_TIME_MIN = (60 * TCP_TICK_HZ),\r
83cbd279 140 TCP_MAX_KEEPALIVE_MIN = 4,\r
dfc1f033 141 TCP_KEEPALIVE_IDLE_MAX = (TCP_TICK_HZ * 60 * 60 * 4),\r
142 TCP_KEEPALIVE_PERIOD_MIN= (TCP_TICK_HZ * 30),\r
143 TCP_FIN_WAIT2_TIME_MAX = (4 * TCP_TICK_HZ),\r
144 TCP_TIME_WAIT_TIME_MAX = (60 * TCP_TICK_HZ)\r
85511ddf 145} TCP_MISC_VALUES;\r
83cbd279 146\r
dfc1f033 147///\r
148/// TCP segmentation data\r
149///\r
83cbd279 150typedef struct _TCP_SEG {\r
dfc1f033 151 TCP_SEQNO Seq; ///< Starting sequence number\r
152 TCP_SEQNO End; ///< The sequence of the last byte + 1, include SYN/FIN. End-Seq = SEG.LEN\r
153 TCP_SEQNO Ack; ///< ACK field in the segment\r
154 UINT8 Flag; ///< TCP header flags\r
155 UINT16 Urg; ///< Valid if URG flag is set.\r
156 UINT32 Wnd; ///< TCP window size field\r
83cbd279 157} TCP_SEG;\r
158\r
dfc1f033 159///\r
160/// Network endpoint, IP+Port structure\r
161///\r
83cbd279 162typedef struct _TCP_PEER {\r
dfc1f033 163 UINT32 Ip; ///< IP address, network byte order\r
164 TCP_PORTNO Port; ///< Port number, network byte order\r
83cbd279 165} TCP_PEER;\r
166\r
dfc1f033 167///\r
168/// TCP control block, it includes various states\r
169///\r
83cbd279 170struct _TCP_CB {\r
dfc1f033 171 LIST_ENTRY List; ///< Back and forward link entry\r
172 TCP_CB *Parent; ///< The parent TCP_CB structure\r
83cbd279 173\r
dfc1f033 174 SOCKET *Sk; ///< The socket it controled.\r
175 TCP_PEER LocalEnd; ///< Local endpoint\r
176 TCP_PEER RemoteEnd;///< Remote endpoint\r
83cbd279 177\r
dfc1f033 178 LIST_ENTRY SndQue; ///< Retxmission queue\r
179 LIST_ENTRY RcvQue; ///< Reassemble queue\r
180 UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE\r
181 INT32 Error; ///< Soft error status, such as TCP_CONNECT_RESET\r
83cbd279 182\r
183 //\r
184 // RFC793 and RFC1122 defined variables\r
185 //\r
276dcc1b 186 UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN\r
dfc1f033 187 UINT8 DelayedAck; ///< Number of delayed ACKs\r
188 UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo\r
189 ///< header: Src IP, Dst IP, 0, Protocol,\r
190 ///< not include the TCP length.\r
191\r
192 TCP_SEQNO Iss; ///< Initial Sending Sequence\r
193 TCP_SEQNO SndUna; ///< First unacknowledged data\r
194 TCP_SEQNO SndNxt; ///< Next data sequence to send.\r
195 TCP_SEQNO SndPsh; ///< Send PUSH point\r
196 TCP_SEQNO SndUp; ///< Send urgent point\r
197 UINT32 SndWnd; ///< Window advertised by the remote peer\r
198 UINT32 SndWndMax; ///< Max send window advertised by the peer\r
199 TCP_SEQNO SndWl1; ///< Seq number used for last window update\r
200 TCP_SEQNO SndWl2; ///< Ack no of last window update\r
201 UINT16 SndMss; ///< Max send segment size\r
202 TCP_SEQNO RcvNxt; ///< Next sequence no to receive\r
203 UINT32 RcvWnd; ///< Window advertised by the local peer\r
204 TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window update.\r
205 ///< It is necessary because of delayed ACK\r
206\r
207 TCP_SEQNO RcvUp; ///< Urgent point;\r
208 TCP_SEQNO Irs; ///< Initial Receiving Sequence\r
209 UINT16 RcvMss; ///< Max receive segment size\r
210 UINT16 EnabledTimer; ///< Which timer is currently enabled\r
211 UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire\r
212 INT32 NextExpire; ///< Count down offset for the nearest timer\r
213 UINT32 Idle; ///< How long the connection is in idle\r
214 UINT32 ProbeTime; ///< The time out value for current window prober\r
83cbd279 215\r
216 //\r
217 // RFC1323 defined variables, about window scale,\r
218 // timestamp and PAWS\r
219 //\r
dfc1f033 220 UINT8 SndWndScale; ///< Wndscale received from the peer\r
221 UINT8 RcvWndScale; ///< Wndscale used to scale local buffer\r
222 UINT32 TsRecent; ///< TsRecent to echo to the remote peer\r
223 UINT32 TsRecentAge; ///< When this TsRecent is updated\r
83cbd279 224\r
225 //\r
226 // RFC2988 defined variables. about RTT measurement\r
227 //\r
dfc1f033 228 TCP_SEQNO RttSeq; ///< The seq of measured segment now\r
229 UINT32 RttMeasure; ///< Currently measured RTT in heart beats\r
230 UINT32 SRtt; ///< Smoothed RTT, scaled by 8\r
231 UINT32 RttVar; ///< RTT variance, scaled by 8\r
232 UINT32 Rto; ///< Current RTO, not scaled\r
83cbd279 233\r
234 //\r
235 // RFC2581, and 3782 variables.\r
236 // Congestion control + NewReno fast recovery.\r
237 //\r
dfc1f033 238 UINT32 CWnd; ///< Sender's congestion window\r
239 UINT32 Ssthresh; ///< Slow start threshold.\r
240 TCP_SEQNO Recover; ///< Recover point for NewReno\r
241 UINT16 DupAck; ///< Number of duplicate ACKs\r
242 UINT8 CongestState; ///< The current congestion state(RFC3782)\r
243 UINT8 LossTimes; ///< Number of retxmit timeouts in a row\r
244 TCP_SEQNO LossRecover; ///< Recover point for retxmit\r
83cbd279 245\r
246 //\r
247 // configuration parameters, for EFI_TCP4_PROTOCOL specification\r
248 //\r
dfc1f033 249 UINT32 KeepAliveIdle; ///< Idle time before sending first probe\r
250 UINT32 KeepAlivePeriod; ///< Interval for subsequent keep alive probe\r
251 UINT8 MaxKeepAlive; ///< Maxium keep alive probe times.\r
252 UINT8 KeepAliveProbes; ///< The number of keep alive probe.\r
253 UINT16 MaxRexmit; ///< The maxium number of retxmit before abort\r
254 UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out\r
255 UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out\r
256 UINT32 ConnectTimeout; ///< The connect establishment time out\r
83cbd279 257\r
258 //\r
259 // configuration for tcp provided by user\r
260 //\r
261 BOOLEAN UseDefaultAddr;\r
a78d176c 262 UINT8 Tos;\r
263 UINT8 Ttl;\r
83cbd279 264 EFI_IPv4_ADDRESS SubnetMask;\r
265\r
dfc1f033 266 IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to send pkt\r
83cbd279 267};\r
268\r
e48e37fc 269extern LIST_ENTRY mTcpRunQue;\r
270extern LIST_ENTRY mTcpListenQue;\r
83cbd279 271extern TCP_SEQNO mTcpGlobalIss;\r
272extern UINT32 mTcpTick;\r
273\r
dfc1f033 274///\r
275/// TCP_CONNECTED: both ends have synchronized their ISN.\r
276///\r
83cbd279 277#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD)\r
278\r
279#define TCP_FIN_RCVD(State) \\r
280 (((State) == TCP_CLOSE_WAIT) || \\r
281 ((State) == TCP_LAST_ACK) || \\r
282 ((State) == TCP_CLOSING) || \\r
283 ((State) == TCP_TIME_WAIT))\r
284\r
285#define TCP_LOCAL_CLOSED(State) \\r
286 (((State) == TCP_FIN_WAIT_1) || \\r
287 ((State) == TCP_FIN_WAIT_2) || \\r
288 ((State) == TCP_CLOSING) || \\r
289 ((State) == TCP_TIME_WAIT) || \\r
290 ((State) == TCP_LAST_ACK))\r
291\r
292//\r
293// Get the TCP_SEG point from a net buffer's ProtoData\r
294//\r
295#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData))\r
296\r
297//\r
298// macros to compare sequence no\r
299//\r
300#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0)\r
301#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0)\r
302#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0)\r
303#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0)\r
304\r
305//\r
306// TCP_SEQ_BETWEEN return whether b <= m <= e\r
307//\r
308#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b))\r
309\r
310//\r
311// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2\r
312//\r
313#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2)))\r
314\r
dab714aa 315//\r
316// Check whether Flag is on\r
317//\r
83cbd279 318#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0))\r
dab714aa 319\r
320//\r
321// Set and Clear operation on a Flag\r
322//\r
83cbd279 323#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag))\r
324#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag))\r
325\r
326//\r
dab714aa 327// Test whether two peers are equal\r
83cbd279 328//\r
329#define TCP_PEER_EQUAL(Pa, Pb) \\r
330 (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port))\r
331\r
332//\r
dab714aa 333// Test whether Pa matches Pb, or Pa is more specific\r
83cbd279 334// than pb. Zero means wildcard.\r
335//\r
336#define TCP_PEER_MATCH(Pa, Pb) \\r
337 ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \\r
338 (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port)))\r
339\r
340#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer)))\r
341#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer))))\r
342#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer)))))\r
343\r
344#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0)\r
345#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0)\r
346#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb)))\r
347\r
348#define TCP_MAX_WIN 0xFFFFU\r
349\r
350typedef\r
351VOID\r
352(*TCP_TIMER_HANDLER) (\r
dab714aa 353 IN OUT TCP_CB *Tcb\r
83cbd279 354 );\r
355\r
83cbd279 356#endif\r