]>
Commit | Line | Data |
---|---|---|
1 | /** @file\r | |
2 | I/O interfaces between TCP and IpIo.\r | |
3 | \r | |
4 | Copyright (c) 2005 - 2009, Intel Corporation<BR>\r | |
5 | All rights reserved. This program and the accompanying materials\r | |
6 | are licensed and made available under the terms and conditions of the BSD License\r | |
7 | which accompanies this distribution. The full text of the license may be found at\r | |
8 | http://opensource.org/licenses/bsd-license.php<BR>\r | |
9 | \r | |
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
12 | \r | |
13 | **/\r | |
14 | \r | |
15 | #include "Tcp4Main.h"\r | |
16 | \r | |
17 | \r | |
18 | /**\r | |
19 | Packet receive callback function provided to IP_IO, used to call\r | |
20 | the proper function to handle the packet received by IP.\r | |
21 | \r | |
22 | @param Status Status of the received packet.\r | |
23 | @param IcmpErr ICMP error number.\r | |
24 | @param NetSession Pointer to the net session of this packet.\r | |
25 | @param Pkt Pointer to the recieved packet.\r | |
26 | @param Context Pointer to the context configured in IpIoOpen(), not used\r | |
27 | now.\r | |
28 | \r | |
29 | **/\r | |
30 | VOID\r | |
31 | EFIAPI\r | |
32 | Tcp4RxCallback (\r | |
33 | IN EFI_STATUS Status,\r | |
34 | IN UINT8 IcmpErr,\r | |
35 | IN EFI_NET_SESSION_DATA *NetSession,\r | |
36 | IN NET_BUF *Pkt,\r | |
37 | IN VOID *Context OPTIONAL\r | |
38 | )\r | |
39 | {\r | |
40 | if (EFI_SUCCESS == Status) {\r | |
41 | TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);\r | |
42 | } else {\r | |
43 | TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);\r | |
44 | }\r | |
45 | }\r | |
46 | \r | |
47 | \r | |
48 | /**\r | |
49 | Send the segment to IP via IpIo function.\r | |
50 | \r | |
51 | @param Tcb Pointer to the TCP_CB of this TCP instance.\r | |
52 | @param Nbuf Pointer to the TCP segment to be sent.\r | |
53 | @param Src Source address of the TCP segment.\r | |
54 | @param Dest Destination address of the TCP segment.\r | |
55 | \r | |
56 | @retval 0 The segment was sent out successfully.\r | |
57 | @retval -1 The segment was failed to send.\r | |
58 | \r | |
59 | **/\r | |
60 | INTN\r | |
61 | TcpSendIpPacket (\r | |
62 | IN TCP_CB *Tcb,\r | |
63 | IN NET_BUF *Nbuf,\r | |
64 | IN UINT32 Src,\r | |
65 | IN UINT32 Dest\r | |
66 | )\r | |
67 | {\r | |
68 | EFI_STATUS Status;\r | |
69 | IP_IO *IpIo;\r | |
70 | IP_IO_OVERRIDE Override;\r | |
71 | SOCKET *Sock;\r | |
72 | VOID *IpSender;\r | |
73 | TCP4_PROTO_DATA *TcpProto;\r | |
74 | EFI_IP_ADDRESS Source;\r | |
75 | EFI_IP_ADDRESS Destination;\r | |
76 | \r | |
77 | Source.Addr[0] = Src;\r | |
78 | Destination.Addr[0] = Dest;\r | |
79 | \r | |
80 | if (NULL == Tcb) {\r | |
81 | \r | |
82 | IpIo = NULL;\r | |
83 | IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source);\r | |
84 | \r | |
85 | if (IpSender == NULL) {\r | |
86 | DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n"));\r | |
87 | return -1;\r | |
88 | }\r | |
89 | } else {\r | |
90 | \r | |
91 | Sock = Tcb->Sk;\r | |
92 | TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r | |
93 | IpIo = TcpProto->TcpService->IpIo;\r | |
94 | IpSender = Tcb->IpInfo;\r | |
95 | }\r | |
96 | \r | |
97 | Override.Ip4OverrideData.TypeOfService = 0;\r | |
98 | Override.Ip4OverrideData.TimeToLive = 255;\r | |
99 | Override.Ip4OverrideData.DoNotFragment = FALSE;\r | |
100 | Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP;\r | |
101 | ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r | |
102 | CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS));\r | |
103 | \r | |
104 | Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override);\r | |
105 | \r | |
106 | if (EFI_ERROR (Status)) {\r | |
107 | DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status));\r | |
108 | return -1;\r | |
109 | }\r | |
110 | \r | |
111 | return 0;\r | |
112 | }\r |