]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
Fix various 'EFIAPI' inconsistencies found while building MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcMtftp.c
CommitLineData
dc361cc5 1/** @file\r
f737cfb9 2 PxeBc MTFTP functions.\r
3 \r
6d3ea23f 4Copyright (c) 2007, 2009, Intel Corporation.<BR>\r
dc361cc5 5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
dc361cc5 13**/\r
14\r
15#include "PxeBcImpl.h"\r
16\r
17VOID *TokenContext = NULL;\r
18\r
9c87ebc0 19CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
dc361cc5 20 "blksize",\r
21 "timeout",\r
22 "tsize",\r
23 "multicast"\r
24};\r
25\r
26\r
27/**\r
28 This is a callback function when packets received/transmitted in Mtftp driver.\r
29\r
f737cfb9 30 A callback function that is provided by the caller to intercept \r
31 the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the\r
32 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept \r
33 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to \r
34 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
35 \r
dc361cc5 36 @param This Pointer to Mtftp protocol instance\r
37 @param Token Pointer to Mtftp token\r
38 @param PacketLen Length of Mtftp packet\r
39 @param Packet Pointer to Mtftp packet\r
40\r
f737cfb9 41 @retval EFI_SUCCESS Operation sucess\r
42 @retval EFI_ABORTED Abort transfer process \r
dc361cc5 43\r
44**/\r
45EFI_STATUS\r
6d3ea23f 46EFIAPI\r
dc361cc5 47PxeBcCheckPacket (\r
48 IN EFI_MTFTP4_PROTOCOL *This,\r
49 IN EFI_MTFTP4_TOKEN *Token,\r
50 IN UINT16 PacketLen,\r
51 IN EFI_MTFTP4_PACKET *Packet\r
52 )\r
53{\r
54 PXEBC_PRIVATE_DATA *Private;\r
55 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
56 EFI_STATUS Status;\r
57\r
58 Private = (PXEBC_PRIVATE_DATA *) TokenContext;\r
59 Callback = Private->PxeBcCallback;\r
60 Status = EFI_SUCCESS;\r
61\r
982a9eae 62 if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
63 Private->Mode.TftpErrorReceived = TRUE;\r
64 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
65 AsciiStrnCpy (Private->Mode.TftpError.ErrorString, (CHAR8 *) Packet->Error.ErrorMessage, 127);\r
66 }\r
67\r
dc361cc5 68 if (Callback != NULL) {\r
69\r
70 Status = Callback->Callback (\r
71 Callback,\r
72 Private->Function,\r
73 TRUE,\r
74 PacketLen,\r
75 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
76 );\r
77 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
78\r
79 Status = EFI_ABORTED;\r
80 } else {\r
81\r
82 Status = EFI_SUCCESS;\r
83 }\r
84 }\r
85\r
86 return Status;\r
87}\r
88\r
89\r
90/**\r
91 This function is to get size of a file by Tftp.\r
f737cfb9 92 \r
dc361cc5 93 @param Private Pointer to PxeBc private data\r
94 @param Config Pointer to Mtftp configuration data\r
95 @param Filename Pointer to file name\r
96 @param BlockSize Pointer to block size\r
97 @param BufferSize Pointer to buffer size\r
98\r
f737cfb9 99 @retval EFI_SUCCESS Get the size of file success\r
100 @retval EFI_NOT_FOUND Parse the tftp ptions failed.\r
101 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
102 @retval Other Has not get the size of the file.\r
103 \r
dc361cc5 104**/\r
105EFI_STATUS\r
106PxeBcTftpGetFileSize (\r
107 IN PXEBC_PRIVATE_DATA *Private,\r
108 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
109 IN UINT8 *Filename,\r
110 IN UINTN *BlockSize,\r
111 IN OUT UINT64 *BufferSize\r
112 )\r
113{\r
114 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
115 EFI_MTFTP4_OPTION ReqOpt[2];\r
116 EFI_MTFTP4_PACKET *Packet;\r
117 EFI_MTFTP4_OPTION *Option;\r
118 UINT32 PktLen;\r
119 UINT8 OptBuf[128];\r
120 UINT32 OptCnt;\r
121 EFI_STATUS Status;\r
122\r
123 *BufferSize = 0;\r
124 Status = EFI_DEVICE_ERROR;\r
125 Mtftp4 = Private->Mtftp4;\r
126 Packet = NULL;\r
127 Option = NULL;\r
128 PktLen = 0;\r
129 OptCnt = 1;\r
130 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
131\r
132 Status = Mtftp4->Configure (Mtftp4, Config);\r
133 if (EFI_ERROR (Status)) {\r
134\r
135 return Status;\r
136 }\r
137\r
9c87ebc0 138 ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
dc361cc5 139 UtoA10 (0, (CHAR8 *) OptBuf);\r
140 ReqOpt[0].ValueStr = OptBuf;\r
141\r
142 if (BlockSize != NULL) {\r
9c87ebc0 143 ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 144 ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;\r
145 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr);\r
146 OptCnt++;\r
147 }\r
148\r
149 Status = Mtftp4->GetInfo (\r
150 Mtftp4,\r
151 FALSE,\r
152 Filename,\r
153 NULL,\r
154 (UINT8) OptCnt,\r
155 ReqOpt,\r
156 &PktLen,\r
157 &Packet\r
158 );\r
159\r
160 if (EFI_ERROR (Status)) {\r
982a9eae 161 if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
162 Private->Mode.TftpErrorReceived = TRUE;\r
163 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
f737cfb9 164 AsciiStrnCpy (\r
165 Private->Mode.TftpError.ErrorString, \r
166 (CHAR8 *) Packet->Error.ErrorMessage, \r
167 127\r
168 );\r
982a9eae 169 }\r
dc361cc5 170 goto ON_ERROR;\r
171 }\r
172\r
173 OptCnt = 0;\r
174\r
175 Status = Mtftp4->ParseOptions (\r
176 Mtftp4,\r
177 PktLen,\r
178 Packet,\r
179 (UINT32 *) &OptCnt,\r
180 &Option\r
181 );\r
182\r
183 if (EFI_ERROR (Status)) {\r
184\r
185 goto ON_ERROR;\r
186 }\r
187\r
188 Status = EFI_NOT_FOUND;\r
189\r
190 while (OptCnt != 0) {\r
191\r
192 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
193\r
194 *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);\r
195 Status = EFI_SUCCESS;\r
196 }\r
197\r
198 OptCnt--;\r
199 }\r
200\r
e48e37fc 201 gBS->FreePool (Option);\r
dc361cc5 202\r
203ON_ERROR:\r
204\r
205 if (Packet != NULL) {\r
e48e37fc 206 gBS->FreePool (Packet);\r
dc361cc5 207 }\r
208\r
209 Mtftp4->Configure (Mtftp4, NULL);\r
210\r
211 return Status;\r
212}\r
213\r
214\r
215/**\r
216 This function is to get data of a file by Tftp.\r
217\r
218 @param Private Pointer to PxeBc private data\r
219 @param Config Pointer to Mtftp configuration data\r
220 @param Filename Pointer to file name\r
221 @param BlockSize Pointer to block size\r
222 @param BufferPtr Pointer to buffer\r
223 @param BufferSize Pointer to buffer size\r
224 @param DontUseBuffer Indicate whether with a receive buffer\r
225\r
f737cfb9 226 @retval EFI_SUCCESS Read the data success from the special file.\r
227 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
228 @retval other Read data from file failed.\r
229 \r
dc361cc5 230**/\r
231EFI_STATUS\r
232PxeBcTftpReadFile (\r
233 IN PXEBC_PRIVATE_DATA *Private,\r
234 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
235 IN UINT8 *Filename,\r
236 IN UINTN *BlockSize,\r
237 IN UINT8 *BufferPtr,\r
238 IN OUT UINT64 *BufferSize,\r
239 IN BOOLEAN DontUseBuffer\r
240 )\r
241{\r
242 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
243 EFI_MTFTP4_TOKEN Token;\r
244 EFI_MTFTP4_OPTION ReqOpt[1];\r
245 UINT32 OptCnt;\r
246 UINT8 OptBuf[128];\r
247 EFI_STATUS Status;\r
248\r
249 Status = EFI_DEVICE_ERROR;\r
250 Mtftp4 = Private->Mtftp4;\r
251 OptCnt = 0;\r
252 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
253\r
254 Status = Mtftp4->Configure (Mtftp4, Config);\r
255 if (EFI_ERROR (Status)) {\r
256\r
257 return Status;\r
258 }\r
259\r
260 if (BlockSize != NULL) {\r
261\r
8792362f 262 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 263 ReqOpt[0].ValueStr = OptBuf;\r
264 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
265 OptCnt++;\r
266 }\r
267\r
268 Token.Event = NULL;\r
269 Token.OverrideData = NULL;\r
270 Token.Filename = Filename;\r
271 Token.ModeStr = NULL;\r
272 Token.OptionCount = OptCnt;\r
273 Token.OptionList = ReqOpt;\r
274 TokenContext = Private;\r
275\r
276 if (DontUseBuffer) {\r
277 Token.BufferSize = 0;\r
278 Token.Buffer = NULL;\r
279 } else {\r
280 Token.BufferSize = *BufferSize;\r
281 Token.Buffer = BufferPtr;\r
282 }\r
283\r
284 Token.CheckPacket = PxeBcCheckPacket;\r
285 Token.TimeoutCallback = NULL;\r
286 Token.PacketNeeded = NULL;\r
287\r
288 Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
289\r
290 *BufferSize = Token.BufferSize;\r
291\r
292 Mtftp4->Configure (Mtftp4, NULL);\r
293\r
294 return Status;\r
295}\r
296\r
297\r
298/**\r
299 This function is put data of a file by Tftp.\r
300\r
301 @param Private Pointer to PxeBc private data\r
302 @param Config Pointer to Mtftp configuration data\r
303 @param Filename Pointer to file name\r
304 @param Overwrite Indicate whether with overwrite attribute\r
305 @param BlockSize Pointer to block size\r
306 @param BufferPtr Pointer to buffer\r
307 @param BufferSize Pointer to buffer size\r
308\r
f737cfb9 309 @retval EFI_SUCCESS Write the data success into the special file.\r
310 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
311 @retval other Write data into file failed.\r
312 \r
dc361cc5 313**/\r
314EFI_STATUS\r
315PxeBcTftpWriteFile (\r
316 IN PXEBC_PRIVATE_DATA *Private,\r
317 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
318 IN UINT8 *Filename,\r
319 IN BOOLEAN Overwrite,\r
320 IN UINTN *BlockSize,\r
321 IN UINT8 *BufferPtr,\r
322 IN OUT UINT64 *BufferSize\r
323 )\r
324{\r
325 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
326 EFI_MTFTP4_TOKEN Token;\r
327 EFI_MTFTP4_OPTION ReqOpt[1];\r
328 UINT32 OptCnt;\r
329 UINT8 OptBuf[128];\r
330 EFI_STATUS Status;\r
331\r
332 Status = EFI_DEVICE_ERROR;\r
333 Mtftp4 = Private->Mtftp4;\r
334 OptCnt = 0;\r
335 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
336\r
337 Status = Mtftp4->Configure (Mtftp4, Config);\r
338 if (EFI_ERROR (Status)) {\r
339\r
340 return Status;\r
341 }\r
342\r
343 if (BlockSize != NULL) {\r
344\r
8792362f 345 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 346 ReqOpt[0].ValueStr = OptBuf;\r
347 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
348 OptCnt++;\r
349 }\r
350\r
351 Token.Event = NULL;\r
352 Token.OverrideData = NULL;\r
353 Token.Filename = Filename;\r
354 Token.ModeStr = NULL;\r
355 Token.OptionCount = OptCnt;\r
356 Token.OptionList = ReqOpt;\r
357 Token.BufferSize = *BufferSize;\r
358 Token.Buffer = BufferPtr;\r
359 Token.CheckPacket = PxeBcCheckPacket;\r
360 Token.TimeoutCallback = NULL;\r
361 Token.PacketNeeded = NULL;\r
362\r
363 Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
364 *BufferSize = Token.BufferSize;\r
365\r
366 Mtftp4->Configure (Mtftp4, NULL);\r
367\r
368 return Status;\r
369}\r
370\r
371\r
372/**\r
f737cfb9 373 This function is to get data(file) from a directory(may be a server) by Tftp.\r
374\r
375 @param Private Pointer to PxeBc private data.\r
376 @param Config Pointer to Mtftp configuration data.\r
377 @param Filename Pointer to file name.\r
378 @param BlockSize Pointer to block size.\r
379 @param BufferPtr Pointer to buffer.\r
380 @param BufferSize Pointer to buffer size.\r
381 @param DontUseBuffer Indicate whether with a receive buffer.\r
382\r
383 @retval EFI_SUCCES Get the data from the file included in directory success. \r
384 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
385 @retval other Operation failed.\r
386 \r
dc361cc5 387**/\r
dc361cc5 388EFI_STATUS\r
389PxeBcTftpReadDirectory (\r
390 IN PXEBC_PRIVATE_DATA *Private,\r
391 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
392 IN UINT8 *Filename,\r
393 IN UINTN *BlockSize,\r
394 IN UINT8 *BufferPtr,\r
395 IN OUT UINT64 *BufferSize,\r
396 IN BOOLEAN DontUseBuffer\r
397 )\r
398{\r
399 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
400 EFI_MTFTP4_TOKEN Token;\r
401 EFI_MTFTP4_OPTION ReqOpt[1];\r
402 UINT32 OptCnt;\r
403 UINT8 OptBuf[128];\r
404 EFI_STATUS Status;\r
405\r
406 Status = EFI_DEVICE_ERROR;\r
407 Mtftp4 = Private->Mtftp4;\r
408 OptCnt = 0;\r
409 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
410\r
411 Status = Mtftp4->Configure (Mtftp4, Config);\r
412 if (EFI_ERROR (Status)) {\r
413\r
414 return Status;\r
415 }\r
416\r
417 if (BlockSize != NULL) {\r
418\r
8792362f 419 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 420 ReqOpt[0].ValueStr = OptBuf;\r
421 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
422 OptCnt++;\r
423 }\r
424\r
425 Token.Event = NULL;\r
426 Token.OverrideData = NULL;\r
427 Token.Filename = Filename;\r
428 Token.ModeStr = NULL;\r
429 Token.OptionCount = OptCnt;\r
430 Token.OptionList = ReqOpt;\r
431 TokenContext = Private;\r
432\r
433 if (DontUseBuffer) {\r
434 Token.BufferSize = 0;\r
435 Token.Buffer = NULL;\r
436 } else {\r
437 Token.BufferSize = *BufferSize;\r
438 Token.Buffer = BufferPtr;\r
439 }\r
440\r
441 Token.CheckPacket = PxeBcCheckPacket;\r
442 Token.TimeoutCallback = NULL;\r
443 Token.PacketNeeded = NULL;\r
444\r
445 Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
446\r
447 *BufferSize = Token.BufferSize;\r
448\r
449 Mtftp4->Configure (Mtftp4, NULL);\r
450\r
451 return Status;\r
452}\r
453\r