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