]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcMtftp.c
MdeModulePkg/Tcp4Dxe: Remove the trailing white space in one line.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcMtftp.c
CommitLineData
a3bcde70
HT
1/** @file\r
2 Functions implementation related with Mtftp for UefiPxeBc Driver.\r
3\r
c960bdc2 4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
a3bcde70
HT
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "PxeBcImpl.h"\r
17\r
18CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
19 "blksize",\r
20 "timeout",\r
21 "tsize",\r
160b082e
JW
22 "multicast",\r
23 "windowsize"\r
a3bcde70
HT
24};\r
25\r
26\r
27/**\r
28 This is a callback function when packets are received or transmitted in Mtftp driver.\r
29\r
30 A callback function that is provided by the caller to intercept\r
31 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP6_OPCODE_DATA8 packets processed in the\r
32 EFI_MTFTP6_PROTOCOL.ReadFile() function, and alternatively to intercept\r
33 EFI_MTFTP6_OPCODE_OACK or EFI_MTFTP6_OPCODE_ERROR packets during a call to\r
34 EFI_MTFTP6_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
35\r
36 @param[in] This Pointer to EFI_MTFTP6_PROTOCOL.\r
37 @param[in] Token Pointer to EFI_MTFTP6_TOKEN.\r
38 @param[in] PacketLen Length of EFI_MTFTP6_PACKET.\r
39 @param[in] Packet Pointer to EFI_MTFTP6_PACKET to be checked.\r
40\r
41 @retval EFI_SUCCESS The current operation succeeded.\r
42 @retval EFI_ABORTED Abort the current transfer process.\r
43\r
44**/\r
45EFI_STATUS\r
46EFIAPI\r
47PxeBcMtftp6CheckPacket (\r
48 IN EFI_MTFTP6_PROTOCOL *This,\r
49 IN EFI_MTFTP6_TOKEN *Token,\r
50 IN UINT16 PacketLen,\r
51 IN EFI_MTFTP6_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 *) Token->Context;\r
59 Callback = Private->PxeBcCallback;\r
60 Status = EFI_SUCCESS;\r
61\r
62 if (Packet->OpCode == EFI_MTFTP6_OPCODE_ERROR) {\r
63 //\r
64 // Store the tftp error message into mode data and set the received flag.\r
65 //\r
66 Private->Mode.TftpErrorReceived = TRUE;\r
67 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
c960bdc2 68 AsciiStrnCpyS (\r
a3bcde70 69 Private->Mode.TftpError.ErrorString,\r
c960bdc2 70 PXE_MTFTP_ERROR_STRING_LENGTH,\r
a3bcde70 71 (CHAR8 *) Packet->Error.ErrorMessage,\r
c960bdc2 72 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
a3bcde70 73 );\r
a361d391 74 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
a3bcde70
HT
75 }\r
76\r
77 if (Callback != NULL) {\r
78 //\r
79 // Callback to user if has when received any tftp packet.\r
80 //\r
81 Status = Callback->Callback (\r
82 Callback,\r
83 Private->Function,\r
84 TRUE,\r
85 PacketLen,\r
86 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
87 );\r
88 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
89 //\r
90 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
91 //\r
92 Status = EFI_ABORTED;\r
93 } else {\r
94 //\r
95 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
96 //\r
97 Status = EFI_SUCCESS;\r
98 }\r
99 }\r
100\r
101 return Status;\r
102}\r
103\r
104\r
105/**\r
106 This function is to get the size of a file using Tftp.\r
107\r
108 @param[in] Private Pointer to PxeBc private data.\r
109 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
110 @param[in] Filename Pointer to boot file name.\r
111 @param[in] BlockSize Pointer to required block size.\r
112 @param[in, out] BufferSize Pointer to buffer size.\r
113\r
114 @retval EFI_SUCCESS Sucessfully obtained the size of file.\r
115 @retval EFI_NOT_FOUND Parse the tftp ptions failed.\r
116 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
117 @retval Others Has not obtained the size of the file.\r
118\r
119**/\r
120EFI_STATUS\r
121PxeBcMtftp6GetFileSize (\r
122 IN PXEBC_PRIVATE_DATA *Private,\r
123 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
124 IN UINT8 *Filename,\r
125 IN UINTN *BlockSize,\r
160b082e 126 IN UINTN *WindowSize,\r
a3bcde70
HT
127 IN OUT UINT64 *BufferSize\r
128 )\r
129{\r
130 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
160b082e 131 EFI_MTFTP6_OPTION ReqOpt[3];\r
a3bcde70
HT
132 EFI_MTFTP6_PACKET *Packet;\r
133 EFI_MTFTP6_OPTION *Option;\r
134 UINT32 PktLen;\r
160b082e
JW
135 UINT8 OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
136 UINTN OptBufSize;\r
a3bcde70
HT
137 UINT32 OptCnt;\r
138 EFI_STATUS Status;\r
139\r
140 *BufferSize = 0;\r
141 Status = EFI_DEVICE_ERROR;\r
142 Mtftp6 = Private->Mtftp6;\r
143 Packet = NULL;\r
144 Option = NULL;\r
145 PktLen = 0;\r
160b082e 146 OptBufSize = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
a3bcde70
HT
147 OptCnt = 1;\r
148 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
149\r
150 Status = Mtftp6->Configure (Mtftp6, Config);\r
151 if (EFI_ERROR (Status)) {\r
152 return Status;\r
153 }\r
154\r
155 //\r
156 // Build the required options for get info.\r
157 //\r
158 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
160b082e 159 PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
a3bcde70
HT
160 ReqOpt[0].ValueStr = OptBuf;\r
161\r
162 if (BlockSize != NULL) {\r
160b082e
JW
163 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
164 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
165 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
166 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
167 OptCnt++;\r
168 }\r
169\r
170 if (WindowSize != NULL) {\r
171 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
172 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
173 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
174 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
a3bcde70
HT
175 OptCnt++;\r
176 }\r
177\r
178 Status = Mtftp6->GetInfo (\r
179 Mtftp6,\r
4e07e87f 180 NULL,\r
a3bcde70
HT
181 Filename,\r
182 NULL,\r
183 (UINT8) OptCnt,\r
184 ReqOpt,\r
185 &PktLen,\r
186 &Packet\r
187 );\r
188 if (EFI_ERROR (Status)) {\r
189 if (Status == EFI_TFTP_ERROR) {\r
190 //\r
191 // Store the tftp error message into mode data and set the received flag.\r
192 //\r
193 Private->Mode.TftpErrorReceived = TRUE;\r
194 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
c960bdc2 195 AsciiStrnCpyS (\r
a3bcde70 196 Private->Mode.TftpError.ErrorString,\r
c960bdc2 197 PXE_MTFTP_ERROR_STRING_LENGTH,\r
a3bcde70 198 (CHAR8 *) Packet->Error.ErrorMessage,\r
c960bdc2 199 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
a3bcde70 200 );\r
a361d391 201 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
a3bcde70
HT
202 }\r
203 goto ON_ERROR;\r
204 }\r
205\r
206 //\r
207 // Parse the options in the reply packet.\r
208 //\r
209 OptCnt = 0;\r
210 Status = Mtftp6->ParseOptions (\r
211 Mtftp6,\r
212 PktLen,\r
213 Packet,\r
214 (UINT32 *) &OptCnt,\r
215 &Option\r
216 );\r
217 if (EFI_ERROR (Status)) {\r
218 goto ON_ERROR;\r
219 }\r
220\r
221 //\r
222 // Parse out the value of "tsize" option.\r
223 //\r
224 Status = EFI_NOT_FOUND;\r
225 while (OptCnt != 0) {\r
226 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
227 *BufferSize = AsciiStrDecimalToUint64 ((CHAR8 *) (Option[OptCnt - 1].ValueStr));\r
228 Status = EFI_SUCCESS;\r
229 }\r
230 OptCnt--;\r
231 }\r
232 FreePool (Option);\r
233\r
234ON_ERROR:\r
235 if (Packet != NULL) {\r
236 FreePool (Packet);\r
237 }\r
238 Mtftp6->Configure (Mtftp6, NULL);\r
239\r
240 return Status;\r
241}\r
242\r
243\r
244/**\r
245 This function is to get data of a file using Tftp.\r
246\r
247 @param[in] Private Pointer to PxeBc private data.\r
248 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
249 @param[in] Filename Pointer to boot file name.\r
250 @param[in] BlockSize Pointer to required block size.\r
251 @param[in] BufferPtr Pointer to buffer.\r
252 @param[in, out] BufferSize Pointer to buffer size.\r
253 @param[in] DontUseBuffer Indicates whether with a receive buffer.\r
254\r
255 @retval EFI_SUCCESS Successfully read the data from the special file.\r
256 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
257 @retval Others Read data from file failed.\r
258\r
259**/\r
260EFI_STATUS\r
261PxeBcMtftp6ReadFile (\r
262 IN PXEBC_PRIVATE_DATA *Private,\r
263 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
264 IN UINT8 *Filename,\r
265 IN UINTN *BlockSize,\r
160b082e 266 IN UINTN *WindowSize,\r
a3bcde70
HT
267 IN UINT8 *BufferPtr,\r
268 IN OUT UINT64 *BufferSize,\r
269 IN BOOLEAN DontUseBuffer\r
270 )\r
271{\r
272 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
273 EFI_MTFTP6_TOKEN Token;\r
160b082e 274 EFI_MTFTP6_OPTION ReqOpt[2];\r
a3bcde70 275 UINT32 OptCnt;\r
160b082e
JW
276 UINT8 BlksizeBuf[10];\r
277 UINT8 WindowsizeBuf[10];\r
a3bcde70
HT
278 EFI_STATUS Status;\r
279\r
280 Status = EFI_DEVICE_ERROR;\r
281 Mtftp6 = Private->Mtftp6;\r
282 OptCnt = 0;\r
283 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
284\r
285 Status = Mtftp6->Configure (Mtftp6, Config);\r
286 if (EFI_ERROR (Status)) {\r
287 return Status;\r
288 }\r
289\r
290 if (BlockSize != NULL) {\r
160b082e
JW
291 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
292 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
293 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
a3bcde70
HT
294 OptCnt++;\r
295 }\r
296\r
160b082e
JW
297 if (WindowSize != NULL) {\r
298 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
299 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
300 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
301 OptCnt++;\r
302 }\r
303\r
304\r
a3bcde70
HT
305 Token.Event = NULL;\r
306 Token.OverrideData = NULL;\r
307 Token.Filename = Filename;\r
308 Token.ModeStr = NULL;\r
309 Token.OptionCount = OptCnt;\r
310 Token.OptionList = ReqOpt;\r
311 Token.Context = Private;\r
312\r
313 if (DontUseBuffer) {\r
314 Token.BufferSize = 0;\r
315 Token.Buffer = NULL;\r
316 } else {\r
317 Token.BufferSize = *BufferSize;\r
318 Token.Buffer = BufferPtr;\r
319 }\r
320\r
321 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
322 Token.TimeoutCallback = NULL;\r
323 Token.PacketNeeded = NULL;\r
324\r
325 Status = Mtftp6->ReadFile (Mtftp6, &Token);\r
326 //\r
327 // Get the real size of received buffer.\r
328 //\r
329 *BufferSize = Token.BufferSize;\r
330\r
331 Mtftp6->Configure (Mtftp6, NULL);\r
332\r
333 return Status;\r
334}\r
335\r
336\r
337/**\r
338 This function is used to write the data of a file using Tftp.\r
339\r
340 @param[in] Private Pointer to PxeBc private data.\r
341 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
342 @param[in] Filename Pointer to boot file name.\r
343 @param[in] Overwrite Indicate whether with overwrite attribute.\r
344 @param[in] BlockSize Pointer to required block size.\r
345 @param[in] BufferPtr Pointer to buffer.\r
346 @param[in, out] BufferSize Pointer to buffer size.\r
347\r
348 @retval EFI_SUCCESS Successfully wrote the data into a special file.\r
349 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
350 @retval other Write data into file failed.\r
351\r
352**/\r
353EFI_STATUS\r
354PxeBcMtftp6WriteFile (\r
355 IN PXEBC_PRIVATE_DATA *Private,\r
356 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
357 IN UINT8 *Filename,\r
358 IN BOOLEAN Overwrite,\r
359 IN UINTN *BlockSize,\r
360 IN UINT8 *BufferPtr,\r
361 IN OUT UINT64 *BufferSize\r
362 )\r
363{\r
364 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
365 EFI_MTFTP6_TOKEN Token;\r
366 EFI_MTFTP6_OPTION ReqOpt[1];\r
367 UINT32 OptCnt;\r
368 UINT8 OptBuf[128];\r
369 EFI_STATUS Status;\r
370\r
371 Status = EFI_DEVICE_ERROR;\r
372 Mtftp6 = Private->Mtftp6;\r
373 OptCnt = 0;\r
374 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
375\r
376 Status = Mtftp6->Configure (Mtftp6, Config);\r
377 if (EFI_ERROR (Status)) {\r
378 return Status;\r
379 }\r
380\r
381 if (BlockSize != NULL) {\r
382 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
383 ReqOpt[0].ValueStr = OptBuf;\r
c960bdc2 384 PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
a3bcde70
HT
385 OptCnt++;\r
386 }\r
387\r
388 Token.Event = NULL;\r
389 Token.OverrideData = NULL;\r
390 Token.Filename = Filename;\r
391 Token.ModeStr = NULL;\r
392 Token.OptionCount = OptCnt;\r
393 Token.OptionList = ReqOpt;\r
394 Token.BufferSize = *BufferSize;\r
395 Token.Buffer = BufferPtr;\r
396 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
397 Token.TimeoutCallback = NULL;\r
398 Token.PacketNeeded = NULL;\r
399\r
400 Status = Mtftp6->WriteFile (Mtftp6, &Token);\r
401 //\r
402 // Get the real size of transmitted buffer.\r
403 //\r
404 *BufferSize = Token.BufferSize;\r
405\r
406 Mtftp6->Configure (Mtftp6, NULL);\r
407\r
408 return Status;\r
409}\r
410\r
411\r
412/**\r
413 This function is to read the data (file) from a directory using Tftp.\r
414\r
415 @param[in] Private Pointer to PxeBc private data.\r
416 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
417 @param[in] Filename Pointer to boot file name.\r
418 @param[in] BlockSize Pointer to required block size.\r
419 @param[in] BufferPtr Pointer to buffer.\r
420 @param[in, out] BufferSize Pointer to buffer size.\r
421 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
422\r
423 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.\r
424 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
425 @retval Others Operation failed.\r
426\r
427**/\r
428EFI_STATUS\r
429PxeBcMtftp6ReadDirectory (\r
430 IN PXEBC_PRIVATE_DATA *Private,\r
431 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
432 IN UINT8 *Filename,\r
433 IN UINTN *BlockSize,\r
160b082e 434 IN UINTN *WindowSize,\r
a3bcde70
HT
435 IN UINT8 *BufferPtr,\r
436 IN OUT UINT64 *BufferSize,\r
437 IN BOOLEAN DontUseBuffer\r
438 )\r
439{\r
440 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
441 EFI_MTFTP6_TOKEN Token;\r
160b082e 442 EFI_MTFTP6_OPTION ReqOpt[2];\r
a3bcde70 443 UINT32 OptCnt;\r
160b082e
JW
444 UINT8 BlksizeBuf[10];\r
445 UINT8 WindowsizeBuf[10];\r
a3bcde70
HT
446 EFI_STATUS Status;\r
447\r
448 Status = EFI_DEVICE_ERROR;\r
449 Mtftp6 = Private->Mtftp6;\r
450 OptCnt = 0;\r
451 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
452\r
453 Status = Mtftp6->Configure (Mtftp6, Config);\r
454 if (EFI_ERROR (Status)) {\r
455 return Status;\r
456 }\r
457\r
458 if (BlockSize != NULL) {\r
160b082e
JW
459 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
460 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
461 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
462 OptCnt++;\r
463 }\r
464\r
465 if (WindowSize != NULL) {\r
466 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
467 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
468 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
a3bcde70
HT
469 OptCnt++;\r
470 }\r
471\r
472 Token.Event = NULL;\r
473 Token.OverrideData = NULL;\r
474 Token.Filename = Filename;\r
475 Token.ModeStr = NULL;\r
476 Token.OptionCount = OptCnt;\r
477 Token.OptionList = ReqOpt;\r
478 Token.Context = Private;\r
479\r
480 if (DontUseBuffer) {\r
481 Token.BufferSize = 0;\r
482 Token.Buffer = NULL;\r
483 } else {\r
484 Token.BufferSize = *BufferSize;\r
485 Token.Buffer = BufferPtr;\r
486 }\r
487\r
488 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
489 Token.TimeoutCallback = NULL;\r
490 Token.PacketNeeded = NULL;\r
491\r
492 Status = Mtftp6->ReadDirectory (Mtftp6, &Token);\r
493 //\r
494 // Get the real size of received buffer.\r
495 //\r
496 *BufferSize = Token.BufferSize;\r
497\r
498 Mtftp6->Configure (Mtftp6, NULL);\r
499\r
500 return Status;\r
501}\r
502\r
503\r
504/**\r
505 This is a callback function when packets are received or transmitted in Mtftp driver.\r
506\r
507 A callback function that is provided by the caller to intercept\r
508 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the\r
509 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept\r
510 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to\r
511 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
512\r
513 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.\r
514 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.\r
515 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.\r
516 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.\r
517\r
518 @retval EFI_SUCCESS The current operation succeeeded.\r
519 @retval EFI_ABORTED Abort the current transfer process.\r
520\r
521**/\r
522EFI_STATUS\r
523EFIAPI\r
524PxeBcMtftp4CheckPacket (\r
525 IN EFI_MTFTP4_PROTOCOL *This,\r
526 IN EFI_MTFTP4_TOKEN *Token,\r
527 IN UINT16 PacketLen,\r
528 IN EFI_MTFTP4_PACKET *Packet\r
529 )\r
530{\r
531 PXEBC_PRIVATE_DATA *Private;\r
532 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
533 EFI_STATUS Status;\r
534\r
535 Private = (PXEBC_PRIVATE_DATA *) Token->Context;\r
536 Callback = Private->PxeBcCallback;\r
537 Status = EFI_SUCCESS;\r
538\r
539 if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
540 //\r
541 // Store the tftp error message into mode data and set the received flag.\r
542 //\r
543 Private->Mode.TftpErrorReceived = TRUE;\r
544 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
c960bdc2 545 AsciiStrnCpyS (\r
a3bcde70 546 Private->Mode.TftpError.ErrorString,\r
c960bdc2 547 PXE_MTFTP_ERROR_STRING_LENGTH,\r
a3bcde70 548 (CHAR8 *) Packet->Error.ErrorMessage,\r
c960bdc2 549 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
a3bcde70 550 );\r
a361d391 551 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
a3bcde70
HT
552 }\r
553\r
554 if (Callback != NULL) {\r
555 //\r
556 // Callback to user if has when received any tftp packet.\r
557 //\r
558 Status = Callback->Callback (\r
559 Callback,\r
560 Private->Function,\r
561 TRUE,\r
562 PacketLen,\r
563 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
564 );\r
565 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
566 //\r
567 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
568 //\r
569 Status = EFI_ABORTED;\r
570 } else {\r
571 //\r
572 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
573 //\r
574 Status = EFI_SUCCESS;\r
575 }\r
576 }\r
577\r
578 return Status;\r
579}\r
580\r
581\r
582/**\r
583 This function is to get size of a file using Tftp.\r
584\r
585 @param[in] Private Pointer to PxeBc private data.\r
586 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
587 @param[in] Filename Pointer to boot file name.\r
588 @param[in] BlockSize Pointer to required block size.\r
589 @param[in, out] BufferSize Pointer to buffer size.\r
590\r
591 @retval EFI_SUCCESS Successfully obtained the size of file.\r
592 @retval EFI_NOT_FOUND Parse the tftp options failed.\r
593 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
594 @retval Others Did not obtain the size of the file.\r
595\r
596**/\r
597EFI_STATUS\r
598PxeBcMtftp4GetFileSize (\r
599 IN PXEBC_PRIVATE_DATA *Private,\r
600 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
601 IN UINT8 *Filename,\r
602 IN UINTN *BlockSize,\r
160b082e 603 IN UINTN *WindowSize,\r
a3bcde70
HT
604 IN OUT UINT64 *BufferSize\r
605 )\r
606{\r
607 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
160b082e 608 EFI_MTFTP4_OPTION ReqOpt[3];\r
a3bcde70
HT
609 EFI_MTFTP4_PACKET *Packet;\r
610 EFI_MTFTP4_OPTION *Option;\r
611 UINT32 PktLen;\r
160b082e
JW
612 UINT8 OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
613 UINTN OptBufSize;\r
a3bcde70
HT
614 UINT32 OptCnt;\r
615 EFI_STATUS Status;\r
616\r
617 *BufferSize = 0;\r
618 Status = EFI_DEVICE_ERROR;\r
619 Mtftp4 = Private->Mtftp4;\r
620 Packet = NULL;\r
621 Option = NULL;\r
622 PktLen = 0;\r
160b082e 623 OptBufSize = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
a3bcde70
HT
624 OptCnt = 1;\r
625 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
626\r
627 Status = Mtftp4->Configure (Mtftp4, Config);\r
628 if (EFI_ERROR (Status)) {\r
629 return Status;\r
630 }\r
631\r
632 //\r
633 // Build the required options for get info.\r
634 //\r
635 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
160b082e 636 PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
a3bcde70
HT
637 ReqOpt[0].ValueStr = OptBuf;\r
638\r
639 if (BlockSize != NULL) {\r
160b082e
JW
640 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
641 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
642 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
643 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
644 OptCnt++;\r
645 }\r
646\r
647 if (WindowSize != NULL) {\r
648 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
649 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
650 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
651 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
a3bcde70
HT
652 OptCnt++;\r
653 }\r
654\r
655 Status = Mtftp4->GetInfo (\r
656 Mtftp4,\r
4e07e87f 657 NULL,\r
a3bcde70
HT
658 Filename,\r
659 NULL,\r
660 (UINT8) OptCnt,\r
661 ReqOpt,\r
662 &PktLen,\r
663 &Packet\r
664 );\r
665 if (EFI_ERROR (Status)) {\r
666 if (Status == EFI_TFTP_ERROR) {\r
667 //\r
668 // Store the tftp error message into mode data and set the received flag.\r
669 //\r
670 Private->Mode.TftpErrorReceived = TRUE;\r
671 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
c960bdc2 672 AsciiStrnCpyS (\r
a3bcde70 673 Private->Mode.TftpError.ErrorString,\r
c960bdc2 674 PXE_MTFTP_ERROR_STRING_LENGTH,\r
a3bcde70 675 (CHAR8 *) Packet->Error.ErrorMessage,\r
c960bdc2 676 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
a3bcde70 677 );\r
a361d391 678 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
a3bcde70
HT
679 }\r
680 goto ON_ERROR;\r
681 }\r
682\r
683 //\r
684 // Parse the options in the reply packet.\r
685 //\r
686 OptCnt = 0;\r
687 Status = Mtftp4->ParseOptions (\r
688 Mtftp4,\r
689 PktLen,\r
690 Packet,\r
691 (UINT32 *) &OptCnt,\r
692 &Option\r
693 );\r
694 if (EFI_ERROR (Status)) {\r
695 goto ON_ERROR;\r
696 }\r
697\r
698 //\r
699 // Parse out the value of "tsize" option.\r
700 //\r
701 Status = EFI_NOT_FOUND;\r
702 while (OptCnt != 0) {\r
703 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
704 *BufferSize = AsciiStrDecimalToUint64 ((CHAR8 *) (Option[OptCnt - 1].ValueStr));\r
705 Status = EFI_SUCCESS;\r
706 }\r
707 OptCnt--;\r
708 }\r
709 FreePool (Option);\r
710\r
711ON_ERROR:\r
712 if (Packet != NULL) {\r
713 FreePool (Packet);\r
714 }\r
715 Mtftp4->Configure (Mtftp4, NULL);\r
716\r
717 return Status;\r
718}\r
719\r
720\r
721/**\r
722 This function is to read the data of a file using Tftp.\r
723\r
724 @param[in] Private Pointer to PxeBc private data.\r
725 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
726 @param[in] Filename Pointer to boot file name.\r
727 @param[in] BlockSize Pointer to required block size.\r
728 @param[in] BufferPtr Pointer to buffer.\r
729 @param[in, out] BufferSize Pointer to buffer size.\r
730 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
731\r
732 @retval EFI_SUCCESS Successfully read the data from the special file.\r
733 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
734 @retval Others Read data from file failed.\r
735\r
736**/\r
737EFI_STATUS\r
738PxeBcMtftp4ReadFile (\r
739 IN PXEBC_PRIVATE_DATA *Private,\r
740 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
741 IN UINT8 *Filename,\r
742 IN UINTN *BlockSize,\r
160b082e 743 IN UINTN *WindowSize,\r
a3bcde70
HT
744 IN UINT8 *BufferPtr,\r
745 IN OUT UINT64 *BufferSize,\r
746 IN BOOLEAN DontUseBuffer\r
747 )\r
748{\r
749 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
750 EFI_MTFTP4_TOKEN Token;\r
160b082e 751 EFI_MTFTP4_OPTION ReqOpt[2];\r
a3bcde70 752 UINT32 OptCnt;\r
160b082e
JW
753 UINT8 BlksizeBuf[10];\r
754 UINT8 WindowsizeBuf[10];\r
a3bcde70
HT
755 EFI_STATUS Status;\r
756\r
757 Status = EFI_DEVICE_ERROR;\r
758 Mtftp4 = Private->Mtftp4;\r
759 OptCnt = 0;\r
760 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
761\r
762 Status = Mtftp4->Configure (Mtftp4, Config);\r
763 if (EFI_ERROR (Status)) {\r
764 return Status;\r
765 }\r
766\r
767 if (BlockSize != NULL) {\r
160b082e
JW
768 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
769 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
770 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
771 OptCnt++;\r
772 }\r
773\r
774 if (WindowSize != NULL) {\r
775 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
776 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
777 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
a3bcde70
HT
778 OptCnt++;\r
779 }\r
780\r
781 Token.Event = NULL;\r
782 Token.OverrideData = NULL;\r
783 Token.Filename = Filename;\r
784 Token.ModeStr = NULL;\r
785 Token.OptionCount = OptCnt;\r
786 Token.OptionList = ReqOpt;\r
787 Token.Context = Private;\r
788\r
789 if (DontUseBuffer) {\r
790 Token.BufferSize = 0;\r
791 Token.Buffer = NULL;\r
792 } else {\r
793 Token.BufferSize = *BufferSize;\r
794 Token.Buffer = BufferPtr;\r
795 }\r
796\r
797 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
798 Token.TimeoutCallback = NULL;\r
799 Token.PacketNeeded = NULL;\r
800\r
801 Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
802 //\r
803 // Get the real size of received buffer.\r
804 //\r
805 *BufferSize = Token.BufferSize;\r
806\r
807 Mtftp4->Configure (Mtftp4, NULL);\r
808\r
809 return Status;\r
810}\r
811\r
812\r
813/**\r
814 This function is to write the data of a file using Tftp.\r
815\r
816 @param[in] Private Pointer to PxeBc private data.\r
817 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
818 @param[in] Filename Pointer to boot file name.\r
819 @param[in] Overwrite Indicates whether to use the overwrite attribute.\r
820 @param[in] BlockSize Pointer to required block size.\r
821 @param[in] BufferPtr Pointer to buffer.\r
822 @param[in, out] BufferSize Pointer to buffer size.\r
823\r
824 @retval EFI_SUCCESS Successfully write the data into the special file.\r
825 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
826 @retval other Write data into file failed.\r
827\r
828**/\r
829EFI_STATUS\r
830PxeBcMtftp4WriteFile (\r
831 IN PXEBC_PRIVATE_DATA *Private,\r
832 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
833 IN UINT8 *Filename,\r
834 IN BOOLEAN Overwrite,\r
835 IN UINTN *BlockSize,\r
836 IN UINT8 *BufferPtr,\r
837 IN OUT UINT64 *BufferSize\r
838 )\r
839{\r
840 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
841 EFI_MTFTP4_TOKEN Token;\r
842 EFI_MTFTP4_OPTION ReqOpt[1];\r
843 UINT32 OptCnt;\r
844 UINT8 OptBuf[128];\r
845 EFI_STATUS Status;\r
846\r
847 Status = EFI_DEVICE_ERROR;\r
848 Mtftp4 = Private->Mtftp4;\r
849 OptCnt = 0;\r
850 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
851\r
852 Status = Mtftp4->Configure (Mtftp4, Config);\r
853 if (EFI_ERROR (Status)) {\r
854 return Status;\r
855 }\r
856\r
857 if (BlockSize != NULL) {\r
858 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
859 ReqOpt[0].ValueStr = OptBuf;\r
c960bdc2 860 PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
a3bcde70
HT
861 OptCnt++;\r
862 }\r
863\r
864 Token.Event = NULL;\r
865 Token.OverrideData = NULL;\r
866 Token.Filename = Filename;\r
867 Token.ModeStr = NULL;\r
868 Token.OptionCount = OptCnt;\r
869 Token.OptionList = ReqOpt;\r
870 Token.BufferSize = *BufferSize;\r
871 Token.Buffer = BufferPtr;\r
872 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
873 Token.TimeoutCallback = NULL;\r
874 Token.PacketNeeded = NULL;\r
875\r
876 Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
877 //\r
878 // Get the real size of transmitted buffer.\r
879 //\r
880 *BufferSize = Token.BufferSize;\r
881\r
882 Mtftp4->Configure (Mtftp4, NULL);\r
883\r
884 return Status;\r
885}\r
886\r
887\r
888/**\r
889 This function is to get data (file) from a directory using Tftp.\r
890\r
891 @param[in] Private Pointer to PxeBc private data.\r
892 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
893 @param[in] Filename Pointer to boot file name.\r
894 @param[in] BlockSize Pointer to required block size.\r
895 @param[in] BufferPtr Pointer to buffer.\r
896 @param[in, out] BufferSize Pointer to buffer size.\r
897 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
898\r
899 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.\r
900 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
901 @retval Others Operation failed.\r
902\r
903**/\r
904EFI_STATUS\r
905PxeBcMtftp4ReadDirectory (\r
906 IN PXEBC_PRIVATE_DATA *Private,\r
907 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
908 IN UINT8 *Filename,\r
909 IN UINTN *BlockSize,\r
160b082e 910 IN UINTN *WindowSize,\r
a3bcde70
HT
911 IN UINT8 *BufferPtr,\r
912 IN OUT UINT64 *BufferSize,\r
913 IN BOOLEAN DontUseBuffer\r
914 )\r
915{\r
916 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
917 EFI_MTFTP4_TOKEN Token;\r
160b082e 918 EFI_MTFTP4_OPTION ReqOpt[2];\r
a3bcde70 919 UINT32 OptCnt;\r
160b082e
JW
920 UINT8 BlksizeBuf[10];\r
921 UINT8 WindowsizeBuf[10];\r
a3bcde70
HT
922 EFI_STATUS Status;\r
923\r
924 Status = EFI_DEVICE_ERROR;\r
925 Mtftp4 = Private->Mtftp4;\r
926 OptCnt = 0;\r
927 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
928\r
929 Status = Mtftp4->Configure (Mtftp4, Config);\r
930 if (EFI_ERROR (Status)) {\r
931 return Status;\r
932 }\r
933\r
934 if (BlockSize != NULL) {\r
160b082e
JW
935 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
936 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
937 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
938 OptCnt++;\r
939 }\r
940\r
941 if (WindowSize != NULL) {\r
942 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
943 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
944 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
a3bcde70
HT
945 OptCnt++;\r
946 }\r
947\r
948 Token.Event = NULL;\r
949 Token.OverrideData = NULL;\r
950 Token.Filename = Filename;\r
951 Token.ModeStr = NULL;\r
952 Token.OptionCount = OptCnt;\r
953 Token.OptionList = ReqOpt;\r
954 Token.Context = Private;\r
955\r
956 if (DontUseBuffer) {\r
957 Token.BufferSize = 0;\r
958 Token.Buffer = NULL;\r
959 } else {\r
960 Token.BufferSize = *BufferSize;\r
961 Token.Buffer = BufferPtr;\r
962 }\r
963\r
964 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
965 Token.TimeoutCallback = NULL;\r
966 Token.PacketNeeded = NULL;\r
967\r
968 Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
969 //\r
970 // Get the real size of received buffer.\r
971 //\r
972 *BufferSize = Token.BufferSize;\r
973\r
974 Mtftp4->Configure (Mtftp4, NULL);\r
975\r
976 return Status;\r
977}\r
978\r
979\r
980/**\r
981 This function is wrapper to get the file size using TFTP.\r
982\r
983 @param[in] Private Pointer to PxeBc private data.\r
984 @param[in] Config Pointer to configure data.\r
985 @param[in] Filename Pointer to boot file name.\r
986 @param[in] BlockSize Pointer to required block size.\r
987 @param[in, out] BufferSize Pointer to buffer size.\r
988\r
989 @retval EFI_SUCCESS Successfully obtained the size of file.\r
990 @retval EFI_NOT_FOUND Parse the tftp options failed.\r
991 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
992 @retval Others Did not obtain the size of the file.\r
993\r
994**/\r
995EFI_STATUS\r
996PxeBcTftpGetFileSize (\r
997 IN PXEBC_PRIVATE_DATA *Private,\r
998 IN VOID *Config,\r
999 IN UINT8 *Filename,\r
1000 IN UINTN *BlockSize,\r
160b082e 1001 IN UINTN *WindowSize,\r
a3bcde70
HT
1002 IN OUT UINT64 *BufferSize\r
1003 )\r
1004{\r
1005 if (Private->PxeBc.Mode->UsingIpv6) {\r
1006 return PxeBcMtftp6GetFileSize (\r
1007 Private,\r
1008 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1009 Filename,\r
1010 BlockSize,\r
160b082e 1011 WindowSize,\r
a3bcde70
HT
1012 BufferSize\r
1013 );\r
1014 } else {\r
1015 return PxeBcMtftp4GetFileSize (\r
1016 Private,\r
1017 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1018 Filename,\r
1019 BlockSize,\r
160b082e 1020 WindowSize,\r
a3bcde70
HT
1021 BufferSize\r
1022 );\r
1023 }\r
1024}\r
1025\r
1026\r
1027/**\r
1028 This function is a wrapper to get file using TFTP.\r
1029\r
1030 @param[in] Private Pointer to PxeBc private data.\r
1031 @param[in] Config Pointer to config data.\r
1032 @param[in] Filename Pointer to boot file name.\r
1033 @param[in] BlockSize Pointer to required block size.\r
1034 @param[in] BufferPtr Pointer to buffer.\r
1035 @param[in, out] BufferSize Pointer to buffer size.\r
1036 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
1037\r
1038 @retval EFI_SUCCESS Sucessfully read the data from the special file.\r
1039 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1040 @retval Others Read data from file failed.\r
1041\r
1042**/\r
1043EFI_STATUS\r
1044PxeBcTftpReadFile (\r
1045 IN PXEBC_PRIVATE_DATA *Private,\r
1046 IN VOID *Config,\r
1047 IN UINT8 *Filename,\r
1048 IN UINTN *BlockSize,\r
160b082e 1049 IN UINTN *WindowSize,\r
a3bcde70
HT
1050 IN UINT8 *BufferPtr,\r
1051 IN OUT UINT64 *BufferSize,\r
1052 IN BOOLEAN DontUseBuffer\r
1053 )\r
1054{\r
1055 if (Private->PxeBc.Mode->UsingIpv6) {\r
1056 return PxeBcMtftp6ReadFile (\r
1057 Private,\r
1058 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1059 Filename,\r
1060 BlockSize,\r
160b082e 1061 WindowSize,\r
a3bcde70
HT
1062 BufferPtr,\r
1063 BufferSize,\r
1064 DontUseBuffer\r
1065 );\r
1066 } else {\r
1067 return PxeBcMtftp4ReadFile (\r
1068 Private,\r
1069 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1070 Filename,\r
1071 BlockSize,\r
160b082e 1072 WindowSize,\r
a3bcde70
HT
1073 BufferPtr,\r
1074 BufferSize,\r
1075 DontUseBuffer\r
1076 );\r
1077 }\r
1078}\r
1079\r
1080\r
1081/**\r
1082 This function is a wrapper to write file using TFTP.\r
1083\r
1084 @param[in] Private Pointer to PxeBc private data.\r
1085 @param[in] Config Pointer to config data.\r
1086 @param[in] Filename Pointer to boot file name.\r
1087 @param[in] Overwrite Indicate whether with overwrite attribute.\r
1088 @param[in] BlockSize Pointer to required block size.\r
1089 @param[in] BufferPtr Pointer to buffer.\r
1090 @param[in, out] BufferSize Pointer to buffer size.\r
1091\r
1092 @retval EFI_SUCCESS Successfully wrote the data into a special file.\r
1093 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1094 @retval other Write data into file failed.\r
1095\r
1096**/\r
1097EFI_STATUS\r
1098PxeBcTftpWriteFile (\r
1099 IN PXEBC_PRIVATE_DATA *Private,\r
1100 IN VOID *Config,\r
1101 IN UINT8 *Filename,\r
1102 IN BOOLEAN Overwrite,\r
1103 IN UINTN *BlockSize,\r
1104 IN UINT8 *BufferPtr,\r
1105 IN OUT UINT64 *BufferSize\r
1106 )\r
1107{\r
1108 if (Private->PxeBc.Mode->UsingIpv6) {\r
1109 return PxeBcMtftp6WriteFile (\r
1110 Private,\r
1111 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1112 Filename,\r
1113 Overwrite,\r
1114 BlockSize,\r
1115 BufferPtr,\r
1116 BufferSize\r
1117 );\r
1118 } else {\r
1119 return PxeBcMtftp4WriteFile (\r
1120 Private,\r
1121 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1122 Filename,\r
1123 Overwrite,\r
1124 BlockSize,\r
1125 BufferPtr,\r
1126 BufferSize\r
1127 );\r
1128 }\r
1129}\r
1130\r
1131\r
1132/**\r
1133 This function is a wrapper to get the data (file) from a directory using TFTP.\r
1134\r
1135 @param[in] Private Pointer to PxeBc private data.\r
1136 @param[in] Config Pointer to config data.\r
1137 @param[in] Filename Pointer to boot file name.\r
1138 @param[in] BlockSize Pointer to required block size.\r
1139 @param[in] BufferPtr Pointer to buffer.\r
1140 @param[in, out] BufferSize Pointer to buffer size.\r
1141 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.\r
1142\r
1143 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.\r
1144 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1145 @retval Others Operation failed.\r
1146\r
1147**/\r
1148EFI_STATUS\r
1149PxeBcTftpReadDirectory (\r
1150 IN PXEBC_PRIVATE_DATA *Private,\r
1151 IN VOID *Config,\r
1152 IN UINT8 *Filename,\r
1153 IN UINTN *BlockSize,\r
160b082e 1154 IN UINTN *WindowSize,\r
a3bcde70
HT
1155 IN UINT8 *BufferPtr,\r
1156 IN OUT UINT64 *BufferSize,\r
1157 IN BOOLEAN DontUseBuffer\r
1158 )\r
1159{\r
1160 if (Private->PxeBc.Mode->UsingIpv6) {\r
1161 return PxeBcMtftp6ReadDirectory (\r
1162 Private,\r
1163 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1164 Filename,\r
1165 BlockSize,\r
160b082e 1166 WindowSize,\r
a3bcde70
HT
1167 BufferPtr,\r
1168 BufferSize,\r
1169 DontUseBuffer\r
1170 );\r
1171 } else {\r
1172 return PxeBcMtftp4ReadDirectory (\r
1173 Private,\r
1174 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1175 Filename,\r
1176 BlockSize,\r
160b082e 1177 WindowSize,\r
a3bcde70
HT
1178 BufferPtr,\r
1179 BufferSize,\r
1180 DontUseBuffer\r
1181 );\r
1182 }\r
1183}\r
1184\r