2 Functions implementation related with Mtftp for UefiPxeBc Driver.
4 Copyright (c) 2007 - 2010, 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 (CHAR8
*) Packet
->Error
.ErrorMessage
,
70 PXE_MTFTP_ERROR_STRING_LENGTH
74 if (Callback
!= NULL
) {
76 // Callback to user if has when received any tftp packet.
78 Status
= Callback
->Callback (
83 (EFI_PXE_BASE_CODE_PACKET
*) Packet
85 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
87 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
92 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
103 This function is to get the size of a file using Tftp.
105 @param[in] Private Pointer to PxeBc private data.
106 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
107 @param[in] Filename Pointer to boot file name.
108 @param[in] BlockSize Pointer to required block size.
109 @param[in, out] BufferSize Pointer to buffer size.
111 @retval EFI_SUCCESS Sucessfully obtained the size of file.
112 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
113 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
114 @retval Others Has not obtained the size of the file.
118 PxeBcMtftp6GetFileSize (
119 IN PXEBC_PRIVATE_DATA
*Private
,
120 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
123 IN OUT UINT64
*BufferSize
126 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
127 EFI_MTFTP6_OPTION ReqOpt
[2];
128 EFI_MTFTP6_PACKET
*Packet
;
129 EFI_MTFTP6_OPTION
*Option
;
136 Status
= EFI_DEVICE_ERROR
;
137 Mtftp6
= Private
->Mtftp6
;
142 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
144 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
145 if (EFI_ERROR (Status
)) {
150 // Build the required options for get info.
152 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
153 PxeBcUintnToAscDec (0, OptBuf
);
154 ReqOpt
[0].ValueStr
= OptBuf
;
156 if (BlockSize
!= NULL
) {
157 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
158 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
159 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
);
163 Status
= Mtftp6
->GetInfo (
173 if (EFI_ERROR (Status
)) {
174 if (Status
== EFI_TFTP_ERROR
) {
176 // Store the tftp error message into mode data and set the received flag.
178 Private
->Mode
.TftpErrorReceived
= TRUE
;
179 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
181 Private
->Mode
.TftpError
.ErrorString
,
182 (CHAR8
*) Packet
->Error
.ErrorMessage
,
183 PXE_MTFTP_ERROR_STRING_LENGTH
190 // Parse the options in the reply packet.
193 Status
= Mtftp6
->ParseOptions (
200 if (EFI_ERROR (Status
)) {
205 // Parse out the value of "tsize" option.
207 Status
= EFI_NOT_FOUND
;
208 while (OptCnt
!= 0) {
209 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
210 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
211 Status
= EFI_SUCCESS
;
218 if (Packet
!= NULL
) {
221 Mtftp6
->Configure (Mtftp6
, NULL
);
228 This function is to get data of a file using Tftp.
230 @param[in] Private Pointer to PxeBc private data.
231 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
232 @param[in] Filename Pointer to boot file name.
233 @param[in] BlockSize Pointer to required block size.
234 @param[in] BufferPtr Pointer to buffer.
235 @param[in, out] BufferSize Pointer to buffer size.
236 @param[in] DontUseBuffer Indicates whether with a receive buffer.
238 @retval EFI_SUCCESS Successfully read the data from the special file.
239 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
240 @retval Others Read data from file failed.
244 PxeBcMtftp6ReadFile (
245 IN PXEBC_PRIVATE_DATA
*Private
,
246 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
250 IN OUT UINT64
*BufferSize
,
251 IN BOOLEAN DontUseBuffer
254 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
255 EFI_MTFTP6_TOKEN Token
;
256 EFI_MTFTP6_OPTION ReqOpt
[1];
261 Status
= EFI_DEVICE_ERROR
;
262 Mtftp6
= Private
->Mtftp6
;
264 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
266 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
267 if (EFI_ERROR (Status
)) {
271 if (BlockSize
!= NULL
) {
272 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
273 ReqOpt
[0].ValueStr
= OptBuf
;
274 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
279 Token
.OverrideData
= NULL
;
280 Token
.Filename
= Filename
;
281 Token
.ModeStr
= NULL
;
282 Token
.OptionCount
= OptCnt
;
283 Token
.OptionList
= ReqOpt
;
284 Token
.Context
= Private
;
287 Token
.BufferSize
= 0;
290 Token
.BufferSize
= *BufferSize
;
291 Token
.Buffer
= BufferPtr
;
294 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
295 Token
.TimeoutCallback
= NULL
;
296 Token
.PacketNeeded
= NULL
;
298 Status
= Mtftp6
->ReadFile (Mtftp6
, &Token
);
300 // Get the real size of received buffer.
302 *BufferSize
= Token
.BufferSize
;
304 Mtftp6
->Configure (Mtftp6
, NULL
);
311 This function is used to write the data of a file using Tftp.
313 @param[in] Private Pointer to PxeBc private data.
314 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
315 @param[in] Filename Pointer to boot file name.
316 @param[in] Overwrite Indicate whether with overwrite attribute.
317 @param[in] BlockSize Pointer to required block size.
318 @param[in] BufferPtr Pointer to buffer.
319 @param[in, out] BufferSize Pointer to buffer size.
321 @retval EFI_SUCCESS Successfully wrote the data into a special file.
322 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
323 @retval other Write data into file failed.
327 PxeBcMtftp6WriteFile (
328 IN PXEBC_PRIVATE_DATA
*Private
,
329 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
331 IN BOOLEAN Overwrite
,
334 IN OUT UINT64
*BufferSize
337 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
338 EFI_MTFTP6_TOKEN Token
;
339 EFI_MTFTP6_OPTION ReqOpt
[1];
344 Status
= EFI_DEVICE_ERROR
;
345 Mtftp6
= Private
->Mtftp6
;
347 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
349 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
350 if (EFI_ERROR (Status
)) {
354 if (BlockSize
!= NULL
) {
355 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
356 ReqOpt
[0].ValueStr
= OptBuf
;
357 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
362 Token
.OverrideData
= NULL
;
363 Token
.Filename
= Filename
;
364 Token
.ModeStr
= NULL
;
365 Token
.OptionCount
= OptCnt
;
366 Token
.OptionList
= ReqOpt
;
367 Token
.BufferSize
= *BufferSize
;
368 Token
.Buffer
= BufferPtr
;
369 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
370 Token
.TimeoutCallback
= NULL
;
371 Token
.PacketNeeded
= NULL
;
373 Status
= Mtftp6
->WriteFile (Mtftp6
, &Token
);
375 // Get the real size of transmitted buffer.
377 *BufferSize
= Token
.BufferSize
;
379 Mtftp6
->Configure (Mtftp6
, NULL
);
386 This function is to read the data (file) from a directory using Tftp.
388 @param[in] Private Pointer to PxeBc private data.
389 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
390 @param[in] Filename Pointer to boot file name.
391 @param[in] BlockSize Pointer to required block size.
392 @param[in] BufferPtr Pointer to buffer.
393 @param[in, out] BufferSize Pointer to buffer size.
394 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
396 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.
397 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
398 @retval Others Operation failed.
402 PxeBcMtftp6ReadDirectory (
403 IN PXEBC_PRIVATE_DATA
*Private
,
404 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
408 IN OUT UINT64
*BufferSize
,
409 IN BOOLEAN DontUseBuffer
412 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
413 EFI_MTFTP6_TOKEN Token
;
414 EFI_MTFTP6_OPTION ReqOpt
[1];
419 Status
= EFI_DEVICE_ERROR
;
420 Mtftp6
= Private
->Mtftp6
;
422 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
424 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
425 if (EFI_ERROR (Status
)) {
429 if (BlockSize
!= NULL
) {
430 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
431 ReqOpt
[0].ValueStr
= OptBuf
;
432 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
437 Token
.OverrideData
= NULL
;
438 Token
.Filename
= Filename
;
439 Token
.ModeStr
= NULL
;
440 Token
.OptionCount
= OptCnt
;
441 Token
.OptionList
= ReqOpt
;
442 Token
.Context
= Private
;
445 Token
.BufferSize
= 0;
448 Token
.BufferSize
= *BufferSize
;
449 Token
.Buffer
= BufferPtr
;
452 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
453 Token
.TimeoutCallback
= NULL
;
454 Token
.PacketNeeded
= NULL
;
456 Status
= Mtftp6
->ReadDirectory (Mtftp6
, &Token
);
458 // Get the real size of received buffer.
460 *BufferSize
= Token
.BufferSize
;
462 Mtftp6
->Configure (Mtftp6
, NULL
);
469 This is a callback function when packets are received or transmitted in Mtftp driver.
471 A callback function that is provided by the caller to intercept
472 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
473 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
474 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
475 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
477 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.
478 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.
479 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.
480 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.
482 @retval EFI_SUCCESS The current operation succeeeded.
483 @retval EFI_ABORTED Abort the current transfer process.
488 PxeBcMtftp4CheckPacket (
489 IN EFI_MTFTP4_PROTOCOL
*This
,
490 IN EFI_MTFTP4_TOKEN
*Token
,
492 IN EFI_MTFTP4_PACKET
*Packet
495 PXEBC_PRIVATE_DATA
*Private
;
496 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
499 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
500 Callback
= Private
->PxeBcCallback
;
501 Status
= EFI_SUCCESS
;
503 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
505 // Store the tftp error message into mode data and set the received flag.
507 Private
->Mode
.TftpErrorReceived
= TRUE
;
508 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
510 Private
->Mode
.TftpError
.ErrorString
,
511 (CHAR8
*) Packet
->Error
.ErrorMessage
,
512 PXE_MTFTP_ERROR_STRING_LENGTH
516 if (Callback
!= NULL
) {
518 // Callback to user if has when received any tftp packet.
520 Status
= Callback
->Callback (
525 (EFI_PXE_BASE_CODE_PACKET
*) Packet
527 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
529 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
531 Status
= EFI_ABORTED
;
534 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
536 Status
= EFI_SUCCESS
;
545 This function is to get size of a file using Tftp.
547 @param[in] Private Pointer to PxeBc private data.
548 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
549 @param[in] Filename Pointer to boot file name.
550 @param[in] BlockSize Pointer to required block size.
551 @param[in, out] BufferSize Pointer to buffer size.
553 @retval EFI_SUCCESS Successfully obtained the size of file.
554 @retval EFI_NOT_FOUND Parse the tftp options failed.
555 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
556 @retval Others Did not obtain the size of the file.
560 PxeBcMtftp4GetFileSize (
561 IN PXEBC_PRIVATE_DATA
*Private
,
562 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
565 IN OUT UINT64
*BufferSize
568 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
569 EFI_MTFTP4_OPTION ReqOpt
[2];
570 EFI_MTFTP4_PACKET
*Packet
;
571 EFI_MTFTP4_OPTION
*Option
;
578 Status
= EFI_DEVICE_ERROR
;
579 Mtftp4
= Private
->Mtftp4
;
584 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
586 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
587 if (EFI_ERROR (Status
)) {
592 // Build the required options for get info.
594 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
595 PxeBcUintnToAscDec (0, OptBuf
);
596 ReqOpt
[0].ValueStr
= OptBuf
;
598 if (BlockSize
!= NULL
) {
599 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
600 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
601 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
);
605 Status
= Mtftp4
->GetInfo (
615 if (EFI_ERROR (Status
)) {
616 if (Status
== EFI_TFTP_ERROR
) {
618 // Store the tftp error message into mode data and set the received flag.
620 Private
->Mode
.TftpErrorReceived
= TRUE
;
621 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
623 Private
->Mode
.TftpError
.ErrorString
,
624 (CHAR8
*) Packet
->Error
.ErrorMessage
,
625 PXE_MTFTP_ERROR_STRING_LENGTH
632 // Parse the options in the reply packet.
635 Status
= Mtftp4
->ParseOptions (
642 if (EFI_ERROR (Status
)) {
647 // Parse out the value of "tsize" option.
649 Status
= EFI_NOT_FOUND
;
650 while (OptCnt
!= 0) {
651 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
652 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
653 Status
= EFI_SUCCESS
;
660 if (Packet
!= NULL
) {
663 Mtftp4
->Configure (Mtftp4
, NULL
);
670 This function is to read the data of a file using Tftp.
672 @param[in] Private Pointer to PxeBc private data.
673 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
674 @param[in] Filename Pointer to boot file name.
675 @param[in] BlockSize Pointer to required block size.
676 @param[in] BufferPtr Pointer to buffer.
677 @param[in, out] BufferSize Pointer to buffer size.
678 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
680 @retval EFI_SUCCESS Successfully read the data from the special file.
681 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
682 @retval Others Read data from file failed.
686 PxeBcMtftp4ReadFile (
687 IN PXEBC_PRIVATE_DATA
*Private
,
688 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
692 IN OUT UINT64
*BufferSize
,
693 IN BOOLEAN DontUseBuffer
696 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
697 EFI_MTFTP4_TOKEN Token
;
698 EFI_MTFTP4_OPTION ReqOpt
[1];
703 Status
= EFI_DEVICE_ERROR
;
704 Mtftp4
= Private
->Mtftp4
;
706 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
708 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
709 if (EFI_ERROR (Status
)) {
713 if (BlockSize
!= NULL
) {
714 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
715 ReqOpt
[0].ValueStr
= OptBuf
;
716 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
721 Token
.OverrideData
= NULL
;
722 Token
.Filename
= Filename
;
723 Token
.ModeStr
= NULL
;
724 Token
.OptionCount
= OptCnt
;
725 Token
.OptionList
= ReqOpt
;
726 Token
.Context
= Private
;
729 Token
.BufferSize
= 0;
732 Token
.BufferSize
= *BufferSize
;
733 Token
.Buffer
= BufferPtr
;
736 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
737 Token
.TimeoutCallback
= NULL
;
738 Token
.PacketNeeded
= NULL
;
740 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
742 // Get the real size of received buffer.
744 *BufferSize
= Token
.BufferSize
;
746 Mtftp4
->Configure (Mtftp4
, NULL
);
753 This function is to write the data of a file using Tftp.
755 @param[in] Private Pointer to PxeBc private data.
756 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
757 @param[in] Filename Pointer to boot file name.
758 @param[in] Overwrite Indicates whether to use the overwrite attribute.
759 @param[in] BlockSize Pointer to required block size.
760 @param[in] BufferPtr Pointer to buffer.
761 @param[in, out] BufferSize Pointer to buffer size.
763 @retval EFI_SUCCESS Successfully write the data into the special file.
764 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
765 @retval other Write data into file failed.
769 PxeBcMtftp4WriteFile (
770 IN PXEBC_PRIVATE_DATA
*Private
,
771 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
773 IN BOOLEAN Overwrite
,
776 IN OUT UINT64
*BufferSize
779 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
780 EFI_MTFTP4_TOKEN Token
;
781 EFI_MTFTP4_OPTION ReqOpt
[1];
786 Status
= EFI_DEVICE_ERROR
;
787 Mtftp4
= Private
->Mtftp4
;
789 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
791 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
792 if (EFI_ERROR (Status
)) {
796 if (BlockSize
!= NULL
) {
797 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
798 ReqOpt
[0].ValueStr
= OptBuf
;
799 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
804 Token
.OverrideData
= NULL
;
805 Token
.Filename
= Filename
;
806 Token
.ModeStr
= NULL
;
807 Token
.OptionCount
= OptCnt
;
808 Token
.OptionList
= ReqOpt
;
809 Token
.BufferSize
= *BufferSize
;
810 Token
.Buffer
= BufferPtr
;
811 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
812 Token
.TimeoutCallback
= NULL
;
813 Token
.PacketNeeded
= NULL
;
815 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
817 // Get the real size of transmitted buffer.
819 *BufferSize
= Token
.BufferSize
;
821 Mtftp4
->Configure (Mtftp4
, NULL
);
828 This function is to get data (file) from a directory using Tftp.
830 @param[in] Private Pointer to PxeBc private data.
831 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
832 @param[in] Filename Pointer to boot file name.
833 @param[in] BlockSize Pointer to required block size.
834 @param[in] BufferPtr Pointer to buffer.
835 @param[in, out] BufferSize Pointer to buffer size.
836 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
838 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
839 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
840 @retval Others Operation failed.
844 PxeBcMtftp4ReadDirectory (
845 IN PXEBC_PRIVATE_DATA
*Private
,
846 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
850 IN OUT UINT64
*BufferSize
,
851 IN BOOLEAN DontUseBuffer
854 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
855 EFI_MTFTP4_TOKEN Token
;
856 EFI_MTFTP4_OPTION ReqOpt
[1];
861 Status
= EFI_DEVICE_ERROR
;
862 Mtftp4
= Private
->Mtftp4
;
864 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
866 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
867 if (EFI_ERROR (Status
)) {
871 if (BlockSize
!= NULL
) {
872 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
873 ReqOpt
[0].ValueStr
= OptBuf
;
874 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
879 Token
.OverrideData
= NULL
;
880 Token
.Filename
= Filename
;
881 Token
.ModeStr
= NULL
;
882 Token
.OptionCount
= OptCnt
;
883 Token
.OptionList
= ReqOpt
;
884 Token
.Context
= Private
;
887 Token
.BufferSize
= 0;
890 Token
.BufferSize
= *BufferSize
;
891 Token
.Buffer
= BufferPtr
;
894 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
895 Token
.TimeoutCallback
= NULL
;
896 Token
.PacketNeeded
= NULL
;
898 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
900 // Get the real size of received buffer.
902 *BufferSize
= Token
.BufferSize
;
904 Mtftp4
->Configure (Mtftp4
, NULL
);
911 This function is wrapper to get the file size using TFTP.
913 @param[in] Private Pointer to PxeBc private data.
914 @param[in] Config Pointer to configure data.
915 @param[in] Filename Pointer to boot file name.
916 @param[in] BlockSize Pointer to required block size.
917 @param[in, out] BufferSize Pointer to buffer size.
919 @retval EFI_SUCCESS Successfully obtained the size of file.
920 @retval EFI_NOT_FOUND Parse the tftp options failed.
921 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
922 @retval Others Did not obtain the size of the file.
926 PxeBcTftpGetFileSize (
927 IN PXEBC_PRIVATE_DATA
*Private
,
931 IN OUT UINT64
*BufferSize
934 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
935 return PxeBcMtftp6GetFileSize (
937 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
943 return PxeBcMtftp4GetFileSize (
945 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
955 This function is a wrapper to get file using TFTP.
957 @param[in] Private Pointer to PxeBc private data.
958 @param[in] Config Pointer to config data.
959 @param[in] Filename Pointer to boot file name.
960 @param[in] BlockSize Pointer to required block size.
961 @param[in] BufferPtr Pointer to buffer.
962 @param[in, out] BufferSize Pointer to buffer size.
963 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
965 @retval EFI_SUCCESS Sucessfully read the data from the special file.
966 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
967 @retval Others Read data from file failed.
972 IN PXEBC_PRIVATE_DATA
*Private
,
977 IN OUT UINT64
*BufferSize
,
978 IN BOOLEAN DontUseBuffer
981 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
982 return PxeBcMtftp6ReadFile (
984 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
992 return PxeBcMtftp4ReadFile (
994 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1006 This function is a wrapper to write file using TFTP.
1008 @param[in] Private Pointer to PxeBc private data.
1009 @param[in] Config Pointer to config data.
1010 @param[in] Filename Pointer to boot file name.
1011 @param[in] Overwrite Indicate whether with overwrite attribute.
1012 @param[in] BlockSize Pointer to required block size.
1013 @param[in] BufferPtr Pointer to buffer.
1014 @param[in, out] BufferSize Pointer to buffer size.
1016 @retval EFI_SUCCESS Successfully wrote the data into a special file.
1017 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1018 @retval other Write data into file failed.
1022 PxeBcTftpWriteFile (
1023 IN PXEBC_PRIVATE_DATA
*Private
,
1026 IN BOOLEAN Overwrite
,
1027 IN UINTN
*BlockSize
,
1028 IN UINT8
*BufferPtr
,
1029 IN OUT UINT64
*BufferSize
1032 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1033 return PxeBcMtftp6WriteFile (
1035 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1043 return PxeBcMtftp4WriteFile (
1045 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1057 This function is a wrapper to get the data (file) from a directory using TFTP.
1059 @param[in] Private Pointer to PxeBc private data.
1060 @param[in] Config Pointer to config data.
1061 @param[in] Filename Pointer to boot file name.
1062 @param[in] BlockSize Pointer to required block size.
1063 @param[in] BufferPtr Pointer to buffer.
1064 @param[in, out] BufferSize Pointer to buffer size.
1065 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.
1067 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
1068 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1069 @retval Others Operation failed.
1073 PxeBcTftpReadDirectory (
1074 IN PXEBC_PRIVATE_DATA
*Private
,
1077 IN UINTN
*BlockSize
,
1078 IN UINT8
*BufferPtr
,
1079 IN OUT UINT64
*BufferSize
,
1080 IN BOOLEAN DontUseBuffer
1083 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1084 return PxeBcMtftp6ReadDirectory (
1086 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1094 return PxeBcMtftp4ReadDirectory (
1096 (EFI_MTFTP4_CONFIG_DATA
*) Config
,