]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
Fix a missing doxygen parameter entry.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Dispatcher.c
CommitLineData
8a67d61d 1/** @file\r
2\r
3Copyright (c) 2005 - 2006, Intel Corporation\r
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
7http://opensource.org/licenses/bsd-license.php\r
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
12Module Name:\r
13\r
14 Tcp4Dispatcher.c\r
15\r
16Abstract:\r
17\r
18\r
19**/\r
20\r
21#include "Tcp4Main.h"\r
22\r
23#define TCP_COMP_VAL(Min, Max, Default, Val) \\r
24 ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default))\r
25\r
120db52c 26/**\r
27 Add or remove a route entry in the IP route table associated with this TCP instance.\r
28\r
29 @param Tcb Pointer to the TCP_CB of this TCP instance.\r
30 @param RouteInfo Pointer to the route info to be processed.\r
31\r
32 @retval EFI_SUCCESS The operation completed successfully.\r
33 @retval EFI_NOT_STARTED The driver instance has not been started.\r
34 @retval EFI_NO_MAPPING When using the default address, configuration(DHCP,\r
35 BOOTP, RARP, etc.) is not finished yet.\r
36 @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing table.\r
37 @retval EFI_NOT_FOUND This route is not in the routing table\r
38 (when RouteInfo->DeleteRoute is TRUE).\r
39 @retval EFI_ACCESS_DENIED The route is already defined in the routing table\r
40 (when RouteInfo->DeleteRoute is FALSE).\r
41**/\r
8a67d61d 42EFI_STATUS\r
43Tcp4Route (\r
44 IN TCP_CB *Tcb,\r
45 IN TCP4_ROUTE_INFO *RouteInfo\r
46 )\r
8a67d61d 47{\r
48 EFI_IP4_PROTOCOL *Ip;\r
49\r
50 Ip = Tcb->IpInfo->Ip;\r
51\r
120db52c 52 ASSERT (Ip != NULL);\r
8a67d61d 53\r
54 return Ip->Routes (\r
55 Ip,\r
56 RouteInfo->DeleteRoute,\r
57 RouteInfo->SubnetAddress,\r
58 RouteInfo->SubnetMask,\r
59 RouteInfo->GatewayAddress\r
60 );\r
120db52c 61 \r
8a67d61d 62}\r
63\r
64\r
65/**\r
66 Get the operational settings of this TCP instance.\r
67\r
68 @param Tcb Pointer to the TCP_CB of this TCP instance.\r
69 @param Mode Pointer to the buffer to store the operational\r
70 settings.\r
71\r
72 @retval EFI_SUCCESS The mode data is read.\r
73 @retval EFI_NOT_STARTED No configuration data is available because this\r
74 instance hasn't been started.\r
75\r
76**/\r
8a67d61d 77EFI_STATUS\r
78Tcp4GetMode (\r
79 IN TCP_CB *Tcb,\r
80 IN TCP4_MODE_DATA *Mode\r
81 )\r
82{\r
83 SOCKET *Sock;\r
84 EFI_TCP4_CONFIG_DATA *ConfigData;\r
85 EFI_TCP4_ACCESS_POINT *AccessPoint;\r
86 EFI_TCP4_OPTION *Option;\r
87 EFI_IP4_PROTOCOL *Ip;\r
88\r
89 Sock = Tcb->Sk;\r
90\r
91 if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) {\r
92 return EFI_NOT_STARTED;\r
93 }\r
94\r
85511ddf 95 if (Mode->Tcp4State != NULL) {\r
4eb65aff 96 *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State;\r
8a67d61d 97 }\r
98\r
85511ddf 99 if (Mode->Tcp4ConfigData != NULL) {\r
8a67d61d 100\r
101 ConfigData = Mode->Tcp4ConfigData;\r
102 AccessPoint = &(ConfigData->AccessPoint);\r
103 Option = ConfigData->ControlOption;\r
104\r
105 ConfigData->TypeOfService = Tcb->TOS;\r
106 ConfigData->TimeToLive = Tcb->TTL;\r
107\r
108 AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr;\r
109\r
e48e37fc 110 CopyMem (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
8a67d61d 111 AccessPoint->SubnetMask = Tcb->SubnetMask;\r
112 AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port);\r
113\r
e48e37fc 114 CopyMem (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
8a67d61d 115 AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port);\r
116 AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN);\r
117\r
118 if (Option != NULL) {\r
119 Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk);\r
120 Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk);\r
121 Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk);\r
122\r
123 Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ;\r
124 Option->DataRetries = Tcb->MaxRexmit;\r
125 Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ;\r
126 Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ;\r
127 Option->KeepAliveProbes = Tcb->MaxKeepAlive;\r
128 Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ;\r
129 Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ;\r
130\r
4eb65aff 131 Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE));\r
132 Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS));\r
ed66e1bc 133 Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS));\r
8a67d61d 134\r
135 Option->EnableSelectiveAck = FALSE;\r
136 Option->EnablePathMtuDiscovery = FALSE;\r
137 }\r
138 }\r
139\r
140 Ip = Tcb->IpInfo->Ip;\r
120db52c 141 ASSERT (Ip != NULL);\r
8a67d61d 142\r
143 return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData);\r
144}\r
145\r
146\r
147/**\r
148 If AP->StationPort isn't zero, check whether the access point\r
149 is registered, else generate a random station port for this\r
150 access point.\r
151\r
152 @param AP Pointer to the access point.\r
153\r
154 @retval EFI_SUCCESS The check is passed or the port is assigned.\r
155 @retval EFI_INVALID_PARAMETER The non-zero station port is already used.\r
156 @retval EFI_OUT_OF_RESOURCES No port can be allocated.\r
157\r
158**/\r
8a67d61d 159EFI_STATUS\r
160Tcp4Bind (\r
161 IN EFI_TCP4_ACCESS_POINT *AP\r
162 )\r
163{\r
164 BOOLEAN Cycle;\r
165\r
166 if (0 != AP->StationPort) {\r
167 //\r
168 // check if a same endpoint is bound\r
169 //\r
170 if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) {\r
171\r
172 return EFI_INVALID_PARAMETER;\r
173 }\r
174 } else {\r
175 //\r
176 // generate a random port\r
177 //\r
178 Cycle = FALSE;\r
179\r
180 if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) {\r
181 mTcp4RandomPort = TCP4_PORT_KNOWN;\r
182 }\r
183\r
184 mTcp4RandomPort++;\r
185\r
186 while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) {\r
187\r
188 mTcp4RandomPort++;\r
189\r
190 if (mTcp4RandomPort <= TCP4_PORT_KNOWN) {\r
191\r
192 if (Cycle) {\r
e48e37fc 193 DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated "\r
8a67d61d 194 "for this pcb\n"));\r
195\r
196 return EFI_OUT_OF_RESOURCES;\r
197 }\r
198\r
199 mTcp4RandomPort = TCP4_PORT_KNOWN + 1;\r
200\r
201 Cycle = TRUE;\r
202 }\r
203\r
204 }\r
205\r
206 AP->StationPort = mTcp4RandomPort;\r
207 }\r
208\r
209 return EFI_SUCCESS;\r
210}\r
211\r
212\r
213/**\r
85511ddf 214 Flush the Tcb add its associated protocols.\r
8a67d61d 215\r
216 @param Tcb Pointer to the TCP_CB to be flushed.\r
217\r
120db52c 218**/\r
8a67d61d 219VOID\r
220Tcp4FlushPcb (\r
221 IN TCP_CB *Tcb\r
222 )\r
223{\r
224 SOCKET *Sock;\r
225 TCP4_PROTO_DATA *TcpProto;\r
226\r
227 IpIoConfigIp (Tcb->IpInfo, NULL);\r
228\r
229 Sock = Tcb->Sk;\r
230 TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
231\r
232 if (SOCK_IS_CONFIGURED (Sock)) {\r
e48e37fc 233 RemoveEntryList (&Tcb->List);\r
8a67d61d 234\r
e5e12de7 235 //\r
236 // Uninstall the device path protocl.\r
237 //\r
238 gBS->UninstallProtocolInterface (\r
239 Sock->SockHandle,\r
240 &gEfiDevicePathProtocolGuid,\r
241 Sock->DevicePath\r
242 );\r
e48e37fc 243 gBS->FreePool (Sock->DevicePath);\r
e5e12de7 244\r
8a67d61d 245 TcpSetVariableData (TcpProto->TcpService);\r
246 }\r
247\r
248 NetbufFreeList (&Tcb->SndQue);\r
249 NetbufFreeList (&Tcb->RcvQue);\r
250}\r
251\r
120db52c 252/**\r
253 Attach a Tcb to the socket.\r
254\r
255 @param Sk Pointer to the socket of this TCP instance.\r
256 \r
257 @retval EFI_SUCCESS The operation is completed successfully.\r
258 @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.\r
259\r
260**/\r
8a67d61d 261EFI_STATUS\r
262Tcp4AttachPcb (\r
263 IN SOCKET *Sk\r
264 )\r
265{\r
266 TCP_CB *Tcb;\r
267 TCP4_PROTO_DATA *ProtoData;\r
268 IP_IO *IpIo;\r
269\r
e48e37fc 270 Tcb = AllocateZeroPool (sizeof (TCP_CB));\r
8a67d61d 271\r
272 if (Tcb == NULL) {\r
273\r
e48e37fc 274 DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n"));\r
8a67d61d 275\r
276 return EFI_OUT_OF_RESOURCES;\r
277 }\r
278\r
279 ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved;\r
280 IpIo = ProtoData->TcpService->IpIo;\r
281\r
282 //\r
283 // Create an IpInfo for this Tcb.\r
284 //\r
285 Tcb->IpInfo = IpIoAddIp (IpIo);\r
286 if (Tcb->IpInfo == NULL) {\r
287\r
e48e37fc 288 gBS->FreePool (Tcb);\r
8a67d61d 289 return EFI_OUT_OF_RESOURCES;\r
290 }\r
291\r
e48e37fc 292 InitializeListHead (&Tcb->List);\r
293 InitializeListHead (&Tcb->SndQue);\r
294 InitializeListHead (&Tcb->RcvQue);\r
8a67d61d 295\r
296 Tcb->State = TCP_CLOSED;\r
297 Tcb->Sk = Sk;\r
298 ProtoData->TcpPcb = Tcb;\r
299\r
300 return EFI_SUCCESS;\r
301}\r
302\r
120db52c 303/**\r
304 Detach the Tcb of the socket.\r
305\r
306 @param Sk Pointer to the socket of this TCP instance.\r
307 \r
308**/\r
8a67d61d 309VOID\r
310Tcp4DetachPcb (\r
311 IN SOCKET *Sk\r
312 )\r
313{\r
314 TCP4_PROTO_DATA *ProtoData;\r
315 TCP_CB *Tcb;\r
316\r
317 ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved;\r
318 Tcb = ProtoData->TcpPcb;\r
319\r
320 ASSERT (Tcb != NULL);\r
321\r
322 Tcp4FlushPcb (Tcb);\r
323\r
324 IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
325\r
e48e37fc 326 gBS->FreePool (Tcb);\r
8a67d61d 327\r
328 ProtoData->TcpPcb = NULL;\r
329}\r
330\r
331\r
332/**\r
333 Configure the Tcb using CfgData.\r
334\r
335 @param Sk Pointer to the socket of this TCP instance.\r
8a67d61d 336 @param CfgData Pointer to the TCP configuration data.\r
337\r
338 @retval EFI_SUCCESS The operation is completed successfully.\r
339 @retval EFI_INVALID_PARAMETER A same access point has been configured in\r
340 another TCP instance.\r
341 @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.\r
342\r
343**/\r
8a67d61d 344EFI_STATUS\r
345Tcp4ConfigurePcb (\r
346 IN SOCKET *Sk,\r
347 IN EFI_TCP4_CONFIG_DATA *CfgData\r
348 )\r
349{\r
8a67d61d 350 EFI_IP4_CONFIG_DATA IpCfgData;\r
351 EFI_STATUS Status;\r
352 EFI_TCP4_OPTION *Option;\r
353 TCP4_PROTO_DATA *TcpProto;\r
354 TCP_CB *Tcb;\r
355\r
120db52c 356 ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL));\r
8a67d61d 357\r
358 TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved;\r
359 Tcb = TcpProto->TcpPcb;\r
8a67d61d 360\r
361 ASSERT (Tcb != NULL);\r
362\r
363 //\r
364 // Add Ip for send pkt to the peer\r
365 //\r
687a2e5f 366 CopyMem (&IpCfgData, &mIpIoDefaultIpConfigData, sizeof (IpCfgData));\r
8a67d61d 367 IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP;\r
368 IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress;\r
369 IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress;\r
370 IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask;\r
371 IpCfgData.ReceiveTimeout = (UINT32) (-1);\r
372\r
373 //\r
374 // Configure the IP instance this Tcb consumes.\r
375 //\r
376 Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData);\r
377 if (EFI_ERROR (Status)) {\r
378 goto OnExit;\r
379 }\r
380\r
381 //\r
382 // Get the default address info if the instance is configured to use default address.\r
383 //\r
384 if (CfgData->AccessPoint.UseDefaultAddress) {\r
385 CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress;\r
386 CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask;\r
387 }\r
388\r
389 //\r
390 // check if we can bind this endpoint in CfgData\r
391 //\r
392 Status = Tcp4Bind (&(CfgData->AccessPoint));\r
393\r
394 if (EFI_ERROR (Status)) {\r
e48e37fc 395 DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed "\r
8a67d61d 396 "with %r\n", Status));\r
397\r
398 goto OnExit;\r
399 }\r
400\r
401 //\r
402 // Initalize the operating information in this Tcb\r
403 //\r
404 ASSERT (Tcb->State == TCP_CLOSED &&\r
e48e37fc 405 IsListEmpty (&Tcb->SndQue) &&\r
406 IsListEmpty (&Tcb->RcvQue));\r
8a67d61d 407\r
408 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);\r
409 Tcb->State = TCP_CLOSED;\r
410\r
411 Tcb->SndMss = 536;\r
412 Tcb->RcvMss = TcpGetRcvMss (Sk);\r
413\r
414 Tcb->SRtt = 0;\r
415 Tcb->Rto = 3 * TCP_TICK_HZ;\r
416\r
417 Tcb->CWnd = Tcb->SndMss;\r
418 Tcb->Ssthresh = 0xffffffff;\r
419\r
420 Tcb->CongestState = TCP_CONGEST_OPEN;\r
421\r
422 Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN;\r
423 Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD;\r
424 Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE;\r
425 Tcb->MaxRexmit = TCP_MAX_LOSS;\r
426 Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME;\r
427 Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME;\r
428 Tcb->ConnectTimeout = TCP_CONNECT_TIME;\r
429\r
430 //\r
431 // initialize Tcb in the light of CfgData\r
432 //\r
433 Tcb->TTL = CfgData->TimeToLive;\r
434 Tcb->TOS = CfgData->TypeOfService;\r
435\r
e5e12de7 436 Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;\r
437\r
e48e37fc 438 CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));\r
8a67d61d 439 Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort);\r
440 Tcb->SubnetMask = CfgData->AccessPoint.SubnetMask;\r
441\r
e5e12de7 442 if (CfgData->AccessPoint.ActiveFlag) {\r
e48e37fc 443 CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\r
e5e12de7 444 Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);\r
445 } else {\r
446 Tcb->RemoteEnd.Ip = 0;\r
447 Tcb->RemoteEnd.Port = 0;\r
448 }\r
8a67d61d 449\r
450 Option = CfgData->ControlOption;\r
451\r
452 if (Option != NULL) {\r
453 SET_RCV_BUFFSIZE (\r
454 Sk,\r
4eb65aff 455 (UINT32) (TCP_COMP_VAL (\r
456 TCP_RCV_BUF_SIZE_MIN,\r
457 TCP_RCV_BUF_SIZE,\r
458 TCP_RCV_BUF_SIZE,\r
459 Option->ReceiveBufferSize\r
460 )\r
461 )\r
8a67d61d 462 );\r
463 SET_SND_BUFFSIZE (\r
464 Sk,\r
4eb65aff 465 (UINT32) (TCP_COMP_VAL (\r
466 TCP_SND_BUF_SIZE_MIN,\r
467 TCP_SND_BUF_SIZE,\r
468 TCP_SND_BUF_SIZE,\r
469 Option->SendBufferSize\r
470 )\r
471 )\r
8a67d61d 472 );\r
473\r
474 SET_BACKLOG (\r
475 Sk,\r
4eb65aff 476 (UINT32) (TCP_COMP_VAL (\r
477 TCP_BACKLOG_MIN,\r
478 TCP_BACKLOG,\r
479 TCP_BACKLOG,\r
480 Option->MaxSynBackLog\r
481 )\r
482 )\r
8a67d61d 483 );\r
484\r
485 Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL (\r
486 TCP_MAX_LOSS_MIN,\r
487 TCP_MAX_LOSS,\r
488 TCP_MAX_LOSS,\r
489 Option->DataRetries\r
490 );\r
491 Tcb->FinWait2Timeout = TCP_COMP_VAL (\r
492 TCP_FIN_WAIT2_TIME,\r
493 TCP_FIN_WAIT2_TIME_MAX,\r
494 TCP_FIN_WAIT2_TIME,\r
4eb65aff 495 (UINT32) (Option->FinTimeout * TCP_TICK_HZ)\r
8a67d61d 496 );\r
497\r
498 if (Option->TimeWaitTimeout != 0) {\r
499 Tcb->TimeWaitTimeout = TCP_COMP_VAL (\r
500 TCP_TIME_WAIT_TIME,\r
501 TCP_TIME_WAIT_TIME_MAX,\r
502 TCP_TIME_WAIT_TIME,\r
4eb65aff 503 (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ)\r
8a67d61d 504 );\r
505 } else {\r
506 Tcb->TimeWaitTimeout = 0;\r
507 }\r
508\r
509 if (Option->KeepAliveProbes != 0) {\r
510 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);\r
511\r
512 Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL (\r
513 TCP_MAX_KEEPALIVE_MIN,\r
514 TCP_MAX_KEEPALIVE,\r
515 TCP_MAX_KEEPALIVE,\r
516 Option->KeepAliveProbes\r
517 );\r
518 Tcb->KeepAliveIdle = TCP_COMP_VAL (\r
519 TCP_KEEPALIVE_IDLE_MIN,\r
520 TCP_KEEPALIVE_IDLE_MAX,\r
521 TCP_KEEPALIVE_IDLE_MIN,\r
4eb65aff 522 (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ)\r
8a67d61d 523 );\r
524 Tcb->KeepAlivePeriod = TCP_COMP_VAL (\r
525 TCP_KEEPALIVE_PERIOD_MIN,\r
526 TCP_KEEPALIVE_PERIOD,\r
527 TCP_KEEPALIVE_PERIOD,\r
4eb65aff 528 (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ)\r
8a67d61d 529 );\r
530 }\r
531\r
532 Tcb->ConnectTimeout = TCP_COMP_VAL (\r
533 TCP_CONNECT_TIME_MIN,\r
534 TCP_CONNECT_TIME,\r
535 TCP_CONNECT_TIME,\r
4eb65aff 536 (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ)\r
8a67d61d 537 );\r
538\r
539 if (Option->EnableNagle == FALSE) {\r
540 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE);\r
541 }\r
542\r
543 if (Option->EnableTimeStamp == FALSE) {\r
544 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS);\r
545 }\r
546\r
547 if (Option->EnableWindowScaling == FALSE) {\r
548 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS);\r
549 }\r
550 }\r
551\r
e5e12de7 552 //\r
553 // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is\r
554 // determined, construct the IP device path and install it.\r
555 //\r
556 Status = TcpInstallDevicePath (Sk);\r
557 if (EFI_ERROR (Status)) {\r
558 goto OnExit;\r
559 }\r
560\r
8a67d61d 561 //\r
562 // update state of Tcb and socket\r
563 //\r
564 if (CfgData->AccessPoint.ActiveFlag == FALSE) {\r
565\r
566 TcpSetState (Tcb, TCP_LISTEN);\r
567 SockSetState (Sk, SO_LISTENING);\r
568\r
569 Sk->ConfigureState = SO_CONFIGURED_PASSIVE;\r
570 } else {\r
571\r
572 Sk->ConfigureState = SO_CONFIGURED_ACTIVE;\r
573 }\r
574\r
575 TcpInsertTcb (Tcb);\r
576\r
577OnExit:\r
578\r
579 return Status;\r
580}\r
581\r
582\r
583/**\r
584 The procotol handler provided to the socket layer, used to\r
585 dispatch the socket level requests by calling the corresponding\r
586 TCP layer functions.\r
587\r
588 @param Sock Pointer to the socket of this TCP instance.\r
589 @param Request The code of this operation request.\r
590 @param Data Pointer to the operation specific data passed in\r
591 together with the operation request.\r
592\r
593 @retval EFI_SUCCESS The socket request is completed successfully.\r
594 @retval other The error status returned by the corresponding TCP\r
595 layer function.\r
596\r
597**/\r
598EFI_STATUS\r
599Tcp4Dispatcher (\r
600 IN SOCKET *Sock,\r
601 IN SOCK_REQUEST Request,\r
602 IN VOID *Data OPTIONAL\r
603 )\r
604{\r
605 TCP_CB *Tcb;\r
606 TCP4_PROTO_DATA *ProtoData;\r
607 EFI_IP4_PROTOCOL *Ip;\r
608\r
609 ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
610 Tcb = ProtoData->TcpPcb;\r
611\r
612 switch (Request) {\r
613 case SOCK_POLL:\r
614 Ip = ProtoData->TcpService->IpIo->Ip;\r
615 Ip->Poll (Ip);\r
616 break;\r
617\r
618 case SOCK_CONSUMED:\r
619 //\r
620 // After user received data from socket buffer, socket will\r
621 // notify TCP using this message to give it a chance to send out\r
622 // window update information\r
623 //\r
120db52c 624 ASSERT (Tcb != NULL);\r
8a67d61d 625 TcpOnAppConsume (Tcb);\r
626 break;\r
627\r
628 case SOCK_SND:\r
629\r
120db52c 630 ASSERT (Tcb != NULL);\r
8a67d61d 631 TcpOnAppSend (Tcb);\r
632 break;\r
633\r
634 case SOCK_CLOSE:\r
635\r
636 TcpOnAppClose (Tcb);\r
637\r
638 break;\r
639\r
640 case SOCK_ABORT:\r
641\r
642 TcpOnAppAbort (Tcb);\r
643\r
644 break;\r
645\r
646 case SOCK_SNDPUSH:\r
647 Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk);\r
648 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH);\r
649\r
650 break;\r
651\r
652 case SOCK_SNDURG:\r
653 Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - 1;\r
654 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);\r
655\r
656 break;\r
657\r
658 case SOCK_CONNECT:\r
659\r
660 TcpOnAppConnect (Tcb);\r
661\r
662 break;\r
663\r
664 case SOCK_ATTACH:\r
665\r
666 return Tcp4AttachPcb (Sock);\r
667\r
668 break;\r
669\r
670 case SOCK_FLUSH:\r
671\r
672 Tcp4FlushPcb (Tcb);\r
673\r
674 break;\r
675\r
676 case SOCK_DETACH:\r
677\r
678 Tcp4DetachPcb (Sock);\r
679\r
680 break;\r
681\r
682 case SOCK_CONFIGURE:\r
683\r
684 return Tcp4ConfigurePcb (\r
685 Sock,\r
686 (EFI_TCP4_CONFIG_DATA *) Data\r
687 );\r
688\r
689 break;\r
690\r
691 case SOCK_MODE:\r
692\r
120db52c 693 ASSERT ((Data != NULL) && (Tcb != NULL));\r
8a67d61d 694\r
695 return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data);\r
696\r
697 break;\r
698\r
699 case SOCK_ROUTE:\r
700\r
120db52c 701 ASSERT ((Data != NULL) && (Tcb != NULL));\r
8a67d61d 702\r
703 return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);\r
704\r
b61439a7 705 default:\r
706 return EFI_UNSUPPORTED;\r
8a67d61d 707 }\r
708\r
709 return EFI_SUCCESS;\r
710\r
711}\r