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