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