2 Functions implementation related with Mtftp for UefiPxeBc Driver.
4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "PxeBcImpl.h"
18 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
27 This is a callback function when packets are received or transmitted in Mtftp driver.
29 A callback function that is provided by the caller to intercept
30 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP6_OPCODE_DATA8 packets processed in the
31 EFI_MTFTP6_PROTOCOL.ReadFile() function, and alternatively to intercept
32 EFI_MTFTP6_OPCODE_OACK or EFI_MTFTP6_OPCODE_ERROR packets during a call to
33 EFI_MTFTP6_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
35 @param[in] This Pointer to EFI_MTFTP6_PROTOCOL.
36 @param[in] Token Pointer to EFI_MTFTP6_TOKEN.
37 @param[in] PacketLen Length of EFI_MTFTP6_PACKET.
38 @param[in] Packet Pointer to EFI_MTFTP6_PACKET to be checked.
40 @retval EFI_SUCCESS The current operation succeeded.
41 @retval EFI_ABORTED Abort the current transfer process.
46 PxeBcMtftp6CheckPacket (
47 IN EFI_MTFTP6_PROTOCOL
*This
,
48 IN EFI_MTFTP6_TOKEN
*Token
,
50 IN EFI_MTFTP6_PACKET
*Packet
53 PXEBC_PRIVATE_DATA
*Private
;
54 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
57 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
58 Callback
= Private
->PxeBcCallback
;
61 if (Packet
->OpCode
== EFI_MTFTP6_OPCODE_ERROR
) {
63 // Store the tftp error message into mode data and set the received flag.
65 Private
->Mode
.TftpErrorReceived
= TRUE
;
66 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
68 Private
->Mode
.TftpError
.ErrorString
,
69 PXE_MTFTP_ERROR_STRING_LENGTH
,
70 (CHAR8
*) Packet
->Error
.ErrorMessage
,
71 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
73 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
76 if (Callback
!= NULL
) {
78 // Callback to user if has when received any tftp packet.
80 Status
= Callback
->Callback (
85 (EFI_PXE_BASE_CODE_PACKET
*) Packet
87 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
89 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
94 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
105 This function is to get the size of a file using Tftp.
107 @param[in] Private Pointer to PxeBc private data.
108 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
109 @param[in] Filename Pointer to boot file name.
110 @param[in] BlockSize Pointer to required block size.
111 @param[in, out] BufferSize Pointer to buffer size.
113 @retval EFI_SUCCESS Sucessfully obtained the size of file.
114 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
115 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
116 @retval Others Has not obtained the size of the file.
120 PxeBcMtftp6GetFileSize (
121 IN PXEBC_PRIVATE_DATA
*Private
,
122 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
125 IN OUT UINT64
*BufferSize
128 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
129 EFI_MTFTP6_OPTION ReqOpt
[2];
130 EFI_MTFTP6_PACKET
*Packet
;
131 EFI_MTFTP6_OPTION
*Option
;
138 Status
= EFI_DEVICE_ERROR
;
139 Mtftp6
= Private
->Mtftp6
;
144 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
146 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
147 if (EFI_ERROR (Status
)) {
152 // Build the required options for get info.
154 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
155 PxeBcUintnToAscDec (0, OptBuf
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
156 ReqOpt
[0].ValueStr
= OptBuf
;
158 if (BlockSize
!= NULL
) {
159 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
160 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
161 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
- (AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1));
165 Status
= Mtftp6
->GetInfo (
175 if (EFI_ERROR (Status
)) {
176 if (Status
== EFI_TFTP_ERROR
) {
178 // Store the tftp error message into mode data and set the received flag.
180 Private
->Mode
.TftpErrorReceived
= TRUE
;
181 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
183 Private
->Mode
.TftpError
.ErrorString
,
184 PXE_MTFTP_ERROR_STRING_LENGTH
,
185 (CHAR8
*) Packet
->Error
.ErrorMessage
,
186 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
188 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
194 // Parse the options in the reply packet.
197 Status
= Mtftp6
->ParseOptions (
204 if (EFI_ERROR (Status
)) {
209 // Parse out the value of "tsize" option.
211 Status
= EFI_NOT_FOUND
;
212 while (OptCnt
!= 0) {
213 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
214 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
215 Status
= EFI_SUCCESS
;
222 if (Packet
!= NULL
) {
225 Mtftp6
->Configure (Mtftp6
, NULL
);
232 This function is to get data of a file using Tftp.
234 @param[in] Private Pointer to PxeBc private data.
235 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
236 @param[in] Filename Pointer to boot file name.
237 @param[in] BlockSize Pointer to required block size.
238 @param[in] BufferPtr Pointer to buffer.
239 @param[in, out] BufferSize Pointer to buffer size.
240 @param[in] DontUseBuffer Indicates whether with a receive buffer.
242 @retval EFI_SUCCESS Successfully read the data from the special file.
243 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
244 @retval Others Read data from file failed.
248 PxeBcMtftp6ReadFile (
249 IN PXEBC_PRIVATE_DATA
*Private
,
250 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
254 IN OUT UINT64
*BufferSize
,
255 IN BOOLEAN DontUseBuffer
258 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
259 EFI_MTFTP6_TOKEN Token
;
260 EFI_MTFTP6_OPTION ReqOpt
[1];
265 Status
= EFI_DEVICE_ERROR
;
266 Mtftp6
= Private
->Mtftp6
;
268 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
270 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
271 if (EFI_ERROR (Status
)) {
275 if (BlockSize
!= NULL
) {
276 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
277 ReqOpt
[0].ValueStr
= OptBuf
;
278 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
283 Token
.OverrideData
= NULL
;
284 Token
.Filename
= Filename
;
285 Token
.ModeStr
= NULL
;
286 Token
.OptionCount
= OptCnt
;
287 Token
.OptionList
= ReqOpt
;
288 Token
.Context
= Private
;
291 Token
.BufferSize
= 0;
294 Token
.BufferSize
= *BufferSize
;
295 Token
.Buffer
= BufferPtr
;
298 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
299 Token
.TimeoutCallback
= NULL
;
300 Token
.PacketNeeded
= NULL
;
302 Status
= Mtftp6
->ReadFile (Mtftp6
, &Token
);
304 // Get the real size of received buffer.
306 *BufferSize
= Token
.BufferSize
;
308 Mtftp6
->Configure (Mtftp6
, NULL
);
315 This function is used to write the data of a file using Tftp.
317 @param[in] Private Pointer to PxeBc private data.
318 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
319 @param[in] Filename Pointer to boot file name.
320 @param[in] Overwrite Indicate whether with overwrite attribute.
321 @param[in] BlockSize Pointer to required block size.
322 @param[in] BufferPtr Pointer to buffer.
323 @param[in, out] BufferSize Pointer to buffer size.
325 @retval EFI_SUCCESS Successfully wrote the data into a special file.
326 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
327 @retval other Write data into file failed.
331 PxeBcMtftp6WriteFile (
332 IN PXEBC_PRIVATE_DATA
*Private
,
333 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
335 IN BOOLEAN Overwrite
,
338 IN OUT UINT64
*BufferSize
341 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
342 EFI_MTFTP6_TOKEN Token
;
343 EFI_MTFTP6_OPTION ReqOpt
[1];
348 Status
= EFI_DEVICE_ERROR
;
349 Mtftp6
= Private
->Mtftp6
;
351 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
353 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
354 if (EFI_ERROR (Status
)) {
358 if (BlockSize
!= NULL
) {
359 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
360 ReqOpt
[0].ValueStr
= OptBuf
;
361 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
366 Token
.OverrideData
= NULL
;
367 Token
.Filename
= Filename
;
368 Token
.ModeStr
= NULL
;
369 Token
.OptionCount
= OptCnt
;
370 Token
.OptionList
= ReqOpt
;
371 Token
.BufferSize
= *BufferSize
;
372 Token
.Buffer
= BufferPtr
;
373 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
374 Token
.TimeoutCallback
= NULL
;
375 Token
.PacketNeeded
= NULL
;
377 Status
= Mtftp6
->WriteFile (Mtftp6
, &Token
);
379 // Get the real size of transmitted buffer.
381 *BufferSize
= Token
.BufferSize
;
383 Mtftp6
->Configure (Mtftp6
, NULL
);
390 This function is to read the data (file) from a directory using Tftp.
392 @param[in] Private Pointer to PxeBc private data.
393 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
394 @param[in] Filename Pointer to boot file name.
395 @param[in] BlockSize Pointer to required block size.
396 @param[in] BufferPtr Pointer to buffer.
397 @param[in, out] BufferSize Pointer to buffer size.
398 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
400 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.
401 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
402 @retval Others Operation failed.
406 PxeBcMtftp6ReadDirectory (
407 IN PXEBC_PRIVATE_DATA
*Private
,
408 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
412 IN OUT UINT64
*BufferSize
,
413 IN BOOLEAN DontUseBuffer
416 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
417 EFI_MTFTP6_TOKEN Token
;
418 EFI_MTFTP6_OPTION ReqOpt
[1];
423 Status
= EFI_DEVICE_ERROR
;
424 Mtftp6
= Private
->Mtftp6
;
426 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
428 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
429 if (EFI_ERROR (Status
)) {
433 if (BlockSize
!= NULL
) {
434 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
435 ReqOpt
[0].ValueStr
= OptBuf
;
436 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
441 Token
.OverrideData
= NULL
;
442 Token
.Filename
= Filename
;
443 Token
.ModeStr
= NULL
;
444 Token
.OptionCount
= OptCnt
;
445 Token
.OptionList
= ReqOpt
;
446 Token
.Context
= Private
;
449 Token
.BufferSize
= 0;
452 Token
.BufferSize
= *BufferSize
;
453 Token
.Buffer
= BufferPtr
;
456 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
457 Token
.TimeoutCallback
= NULL
;
458 Token
.PacketNeeded
= NULL
;
460 Status
= Mtftp6
->ReadDirectory (Mtftp6
, &Token
);
462 // Get the real size of received buffer.
464 *BufferSize
= Token
.BufferSize
;
466 Mtftp6
->Configure (Mtftp6
, NULL
);
473 This is a callback function when packets are received or transmitted in Mtftp driver.
475 A callback function that is provided by the caller to intercept
476 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
477 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
478 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
479 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
481 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.
482 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.
483 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.
484 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.
486 @retval EFI_SUCCESS The current operation succeeeded.
487 @retval EFI_ABORTED Abort the current transfer process.
492 PxeBcMtftp4CheckPacket (
493 IN EFI_MTFTP4_PROTOCOL
*This
,
494 IN EFI_MTFTP4_TOKEN
*Token
,
496 IN EFI_MTFTP4_PACKET
*Packet
499 PXEBC_PRIVATE_DATA
*Private
;
500 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
503 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
504 Callback
= Private
->PxeBcCallback
;
505 Status
= EFI_SUCCESS
;
507 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
509 // Store the tftp error message into mode data and set the received flag.
511 Private
->Mode
.TftpErrorReceived
= TRUE
;
512 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
514 Private
->Mode
.TftpError
.ErrorString
,
515 PXE_MTFTP_ERROR_STRING_LENGTH
,
516 (CHAR8
*) Packet
->Error
.ErrorMessage
,
517 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
519 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
522 if (Callback
!= NULL
) {
524 // Callback to user if has when received any tftp packet.
526 Status
= Callback
->Callback (
531 (EFI_PXE_BASE_CODE_PACKET
*) Packet
533 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
535 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
537 Status
= EFI_ABORTED
;
540 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
542 Status
= EFI_SUCCESS
;
551 This function is to get size of a file using Tftp.
553 @param[in] Private Pointer to PxeBc private data.
554 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
555 @param[in] Filename Pointer to boot file name.
556 @param[in] BlockSize Pointer to required block size.
557 @param[in, out] BufferSize Pointer to buffer size.
559 @retval EFI_SUCCESS Successfully obtained the size of file.
560 @retval EFI_NOT_FOUND Parse the tftp options failed.
561 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
562 @retval Others Did not obtain the size of the file.
566 PxeBcMtftp4GetFileSize (
567 IN PXEBC_PRIVATE_DATA
*Private
,
568 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
571 IN OUT UINT64
*BufferSize
574 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
575 EFI_MTFTP4_OPTION ReqOpt
[2];
576 EFI_MTFTP4_PACKET
*Packet
;
577 EFI_MTFTP4_OPTION
*Option
;
584 Status
= EFI_DEVICE_ERROR
;
585 Mtftp4
= Private
->Mtftp4
;
590 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
592 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
593 if (EFI_ERROR (Status
)) {
598 // Build the required options for get info.
600 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
601 PxeBcUintnToAscDec (0, OptBuf
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
602 ReqOpt
[0].ValueStr
= OptBuf
;
604 if (BlockSize
!= NULL
) {
605 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
606 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
607 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
- (AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1));
611 Status
= Mtftp4
->GetInfo (
621 if (EFI_ERROR (Status
)) {
622 if (Status
== EFI_TFTP_ERROR
) {
624 // Store the tftp error message into mode data and set the received flag.
626 Private
->Mode
.TftpErrorReceived
= TRUE
;
627 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
629 Private
->Mode
.TftpError
.ErrorString
,
630 PXE_MTFTP_ERROR_STRING_LENGTH
,
631 (CHAR8
*) Packet
->Error
.ErrorMessage
,
632 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
634 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
640 // Parse the options in the reply packet.
643 Status
= Mtftp4
->ParseOptions (
650 if (EFI_ERROR (Status
)) {
655 // Parse out the value of "tsize" option.
657 Status
= EFI_NOT_FOUND
;
658 while (OptCnt
!= 0) {
659 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
660 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
661 Status
= EFI_SUCCESS
;
668 if (Packet
!= NULL
) {
671 Mtftp4
->Configure (Mtftp4
, NULL
);
678 This function is to read the data of a file using Tftp.
680 @param[in] Private Pointer to PxeBc private data.
681 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
682 @param[in] Filename Pointer to boot file name.
683 @param[in] BlockSize Pointer to required block size.
684 @param[in] BufferPtr Pointer to buffer.
685 @param[in, out] BufferSize Pointer to buffer size.
686 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
688 @retval EFI_SUCCESS Successfully read the data from the special file.
689 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
690 @retval Others Read data from file failed.
694 PxeBcMtftp4ReadFile (
695 IN PXEBC_PRIVATE_DATA
*Private
,
696 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
700 IN OUT UINT64
*BufferSize
,
701 IN BOOLEAN DontUseBuffer
704 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
705 EFI_MTFTP4_TOKEN Token
;
706 EFI_MTFTP4_OPTION ReqOpt
[1];
711 Status
= EFI_DEVICE_ERROR
;
712 Mtftp4
= Private
->Mtftp4
;
714 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
716 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
717 if (EFI_ERROR (Status
)) {
721 if (BlockSize
!= NULL
) {
722 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
723 ReqOpt
[0].ValueStr
= OptBuf
;
724 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
729 Token
.OverrideData
= NULL
;
730 Token
.Filename
= Filename
;
731 Token
.ModeStr
= NULL
;
732 Token
.OptionCount
= OptCnt
;
733 Token
.OptionList
= ReqOpt
;
734 Token
.Context
= Private
;
737 Token
.BufferSize
= 0;
740 Token
.BufferSize
= *BufferSize
;
741 Token
.Buffer
= BufferPtr
;
744 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
745 Token
.TimeoutCallback
= NULL
;
746 Token
.PacketNeeded
= NULL
;
748 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
750 // Get the real size of received buffer.
752 *BufferSize
= Token
.BufferSize
;
754 Mtftp4
->Configure (Mtftp4
, NULL
);
761 This function is to write the data of a file using Tftp.
763 @param[in] Private Pointer to PxeBc private data.
764 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
765 @param[in] Filename Pointer to boot file name.
766 @param[in] Overwrite Indicates whether to use the overwrite attribute.
767 @param[in] BlockSize Pointer to required block size.
768 @param[in] BufferPtr Pointer to buffer.
769 @param[in, out] BufferSize Pointer to buffer size.
771 @retval EFI_SUCCESS Successfully write the data into the special file.
772 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
773 @retval other Write data into file failed.
777 PxeBcMtftp4WriteFile (
778 IN PXEBC_PRIVATE_DATA
*Private
,
779 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
781 IN BOOLEAN Overwrite
,
784 IN OUT UINT64
*BufferSize
787 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
788 EFI_MTFTP4_TOKEN Token
;
789 EFI_MTFTP4_OPTION ReqOpt
[1];
794 Status
= EFI_DEVICE_ERROR
;
795 Mtftp4
= Private
->Mtftp4
;
797 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
799 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
800 if (EFI_ERROR (Status
)) {
804 if (BlockSize
!= NULL
) {
805 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
806 ReqOpt
[0].ValueStr
= OptBuf
;
807 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
812 Token
.OverrideData
= NULL
;
813 Token
.Filename
= Filename
;
814 Token
.ModeStr
= NULL
;
815 Token
.OptionCount
= OptCnt
;
816 Token
.OptionList
= ReqOpt
;
817 Token
.BufferSize
= *BufferSize
;
818 Token
.Buffer
= BufferPtr
;
819 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
820 Token
.TimeoutCallback
= NULL
;
821 Token
.PacketNeeded
= NULL
;
823 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
825 // Get the real size of transmitted buffer.
827 *BufferSize
= Token
.BufferSize
;
829 Mtftp4
->Configure (Mtftp4
, NULL
);
836 This function is to get data (file) from a directory using Tftp.
838 @param[in] Private Pointer to PxeBc private data.
839 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
840 @param[in] Filename Pointer to boot file name.
841 @param[in] BlockSize Pointer to required block size.
842 @param[in] BufferPtr Pointer to buffer.
843 @param[in, out] BufferSize Pointer to buffer size.
844 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
846 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
847 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
848 @retval Others Operation failed.
852 PxeBcMtftp4ReadDirectory (
853 IN PXEBC_PRIVATE_DATA
*Private
,
854 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
858 IN OUT UINT64
*BufferSize
,
859 IN BOOLEAN DontUseBuffer
862 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
863 EFI_MTFTP4_TOKEN Token
;
864 EFI_MTFTP4_OPTION ReqOpt
[1];
869 Status
= EFI_DEVICE_ERROR
;
870 Mtftp4
= Private
->Mtftp4
;
872 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
874 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
875 if (EFI_ERROR (Status
)) {
879 if (BlockSize
!= NULL
) {
880 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
881 ReqOpt
[0].ValueStr
= OptBuf
;
882 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
887 Token
.OverrideData
= NULL
;
888 Token
.Filename
= Filename
;
889 Token
.ModeStr
= NULL
;
890 Token
.OptionCount
= OptCnt
;
891 Token
.OptionList
= ReqOpt
;
892 Token
.Context
= Private
;
895 Token
.BufferSize
= 0;
898 Token
.BufferSize
= *BufferSize
;
899 Token
.Buffer
= BufferPtr
;
902 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
903 Token
.TimeoutCallback
= NULL
;
904 Token
.PacketNeeded
= NULL
;
906 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
908 // Get the real size of received buffer.
910 *BufferSize
= Token
.BufferSize
;
912 Mtftp4
->Configure (Mtftp4
, NULL
);
919 This function is wrapper to get the file size using TFTP.
921 @param[in] Private Pointer to PxeBc private data.
922 @param[in] Config Pointer to configure data.
923 @param[in] Filename Pointer to boot file name.
924 @param[in] BlockSize Pointer to required block size.
925 @param[in, out] BufferSize Pointer to buffer size.
927 @retval EFI_SUCCESS Successfully obtained the size of file.
928 @retval EFI_NOT_FOUND Parse the tftp options failed.
929 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
930 @retval Others Did not obtain the size of the file.
934 PxeBcTftpGetFileSize (
935 IN PXEBC_PRIVATE_DATA
*Private
,
939 IN OUT UINT64
*BufferSize
942 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
943 return PxeBcMtftp6GetFileSize (
945 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
951 return PxeBcMtftp4GetFileSize (
953 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
963 This function is a wrapper to get file using TFTP.
965 @param[in] Private Pointer to PxeBc private data.
966 @param[in] Config Pointer to config data.
967 @param[in] Filename Pointer to boot file name.
968 @param[in] BlockSize Pointer to required block size.
969 @param[in] BufferPtr Pointer to buffer.
970 @param[in, out] BufferSize Pointer to buffer size.
971 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
973 @retval EFI_SUCCESS Sucessfully read the data from the special file.
974 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
975 @retval Others Read data from file failed.
980 IN PXEBC_PRIVATE_DATA
*Private
,
985 IN OUT UINT64
*BufferSize
,
986 IN BOOLEAN DontUseBuffer
989 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
990 return PxeBcMtftp6ReadFile (
992 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1000 return PxeBcMtftp4ReadFile (
1002 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1014 This function is a wrapper to write file using TFTP.
1016 @param[in] Private Pointer to PxeBc private data.
1017 @param[in] Config Pointer to config data.
1018 @param[in] Filename Pointer to boot file name.
1019 @param[in] Overwrite Indicate whether with overwrite attribute.
1020 @param[in] BlockSize Pointer to required block size.
1021 @param[in] BufferPtr Pointer to buffer.
1022 @param[in, out] BufferSize Pointer to buffer size.
1024 @retval EFI_SUCCESS Successfully wrote the data into a special file.
1025 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1026 @retval other Write data into file failed.
1030 PxeBcTftpWriteFile (
1031 IN PXEBC_PRIVATE_DATA
*Private
,
1034 IN BOOLEAN Overwrite
,
1035 IN UINTN
*BlockSize
,
1036 IN UINT8
*BufferPtr
,
1037 IN OUT UINT64
*BufferSize
1040 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1041 return PxeBcMtftp6WriteFile (
1043 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1051 return PxeBcMtftp4WriteFile (
1053 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1065 This function is a wrapper to get the data (file) from a directory using TFTP.
1067 @param[in] Private Pointer to PxeBc private data.
1068 @param[in] Config Pointer to config data.
1069 @param[in] Filename Pointer to boot file name.
1070 @param[in] BlockSize Pointer to required block size.
1071 @param[in] BufferPtr Pointer to buffer.
1072 @param[in, out] BufferSize Pointer to buffer size.
1073 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.
1075 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
1076 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1077 @retval Others Operation failed.
1081 PxeBcTftpReadDirectory (
1082 IN PXEBC_PRIVATE_DATA
*Private
,
1085 IN UINTN
*BlockSize
,
1086 IN UINT8
*BufferPtr
,
1087 IN OUT UINT64
*BufferSize
,
1088 IN BOOLEAN DontUseBuffer
1091 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1092 return PxeBcMtftp6ReadDirectory (
1094 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1102 return PxeBcMtftp4ReadDirectory (
1104 (EFI_MTFTP4_CONFIG_DATA
*) Config
,