4 Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "PxeBcImpl.h"
17 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
26 This is a callback function when packets received/transmitted in Mtftp driver.
28 A callback function that is provided by the caller to intercept
29 the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
30 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
31 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
32 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
34 @param This Pointer to Mtftp protocol instance
35 @param Token Pointer to Mtftp token
36 @param PacketLen Length of Mtftp packet
37 @param Packet Pointer to Mtftp packet
39 @retval EFI_SUCCESS Operation sucess
40 @retval EFI_ABORTED Abort transfer process
46 IN EFI_MTFTP4_PROTOCOL
*This
,
47 IN EFI_MTFTP4_TOKEN
*Token
,
49 IN EFI_MTFTP4_PACKET
*Packet
52 PXEBC_PRIVATE_DATA
*Private
;
53 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
56 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
57 Callback
= Private
->PxeBcCallback
;
60 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
61 Private
->Mode
.TftpErrorReceived
= TRUE
;
62 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
63 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, PXE_MTFTP_ERROR_STRING_LENGTH
);
64 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
67 if (Callback
!= NULL
) {
69 Status
= Callback
->Callback (
74 (EFI_PXE_BASE_CODE_PACKET
*) Packet
76 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
90 This function is to get size of a file by Tftp.
92 @param Private Pointer to PxeBc private data
93 @param Config Pointer to Mtftp configuration data
94 @param Filename Pointer to file name
95 @param BlockSize Pointer to block size
96 @param BufferSize Pointer to buffer size
98 @retval EFI_SUCCESS Get the size of file success
99 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
100 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
101 @retval Other Has not get the size of the file.
105 PxeBcTftpGetFileSize (
106 IN PXEBC_PRIVATE_DATA
*Private
,
107 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
110 IN OUT UINT64
*BufferSize
113 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
114 EFI_MTFTP4_OPTION ReqOpt
[2];
115 EFI_MTFTP4_PACKET
*Packet
;
116 EFI_MTFTP4_OPTION
*Option
;
123 Status
= EFI_DEVICE_ERROR
;
124 Mtftp4
= Private
->Mtftp4
;
129 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
131 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
132 if (EFI_ERROR (Status
)) {
137 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
138 UtoA10 (0, (CHAR8
*) OptBuf
);
139 ReqOpt
[0].ValueStr
= OptBuf
;
141 if (BlockSize
!= NULL
) {
142 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
143 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
144 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
);
148 Status
= Mtftp4
->GetInfo (
159 if (EFI_ERROR (Status
)) {
160 if (Status
== EFI_TFTP_ERROR
) {
161 Private
->Mode
.TftpErrorReceived
= TRUE
;
162 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
164 Private
->Mode
.TftpError
.ErrorString
,
165 (CHAR8
*) Packet
->Error
.ErrorMessage
,
166 PXE_MTFTP_ERROR_STRING_LENGTH
168 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
175 Status
= Mtftp4
->ParseOptions (
183 if (EFI_ERROR (Status
)) {
188 Status
= EFI_NOT_FOUND
;
190 while (OptCnt
!= 0) {
192 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
194 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
195 Status
= EFI_SUCCESS
;
205 if (Packet
!= NULL
) {
209 Mtftp4
->Configure (Mtftp4
, NULL
);
216 This function is to get data of a file by Tftp.
218 @param Private Pointer to PxeBc private data
219 @param Config Pointer to Mtftp configuration data
220 @param Filename Pointer to file name
221 @param BlockSize Pointer to block size
222 @param BufferPtr Pointer to buffer
223 @param BufferSize Pointer to buffer size
224 @param DontUseBuffer Indicate whether with a receive buffer
226 @retval EFI_SUCCESS Read the data success from the special file.
227 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
228 @retval other Read data from file failed.
233 IN PXEBC_PRIVATE_DATA
*Private
,
234 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
238 IN OUT UINT64
*BufferSize
,
239 IN BOOLEAN DontUseBuffer
242 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
243 EFI_MTFTP4_TOKEN Token
;
244 EFI_MTFTP4_OPTION ReqOpt
[1];
249 Status
= EFI_DEVICE_ERROR
;
250 Mtftp4
= Private
->Mtftp4
;
252 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
254 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
255 if (EFI_ERROR (Status
)) {
260 if (BlockSize
!= NULL
) {
262 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
263 ReqOpt
[0].ValueStr
= OptBuf
;
264 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
269 Token
.OverrideData
= NULL
;
270 Token
.Filename
= Filename
;
271 Token
.ModeStr
= NULL
;
272 Token
.OptionCount
= OptCnt
;
273 Token
.OptionList
= ReqOpt
;
274 Token
.Context
= Private
;
277 Token
.BufferSize
= 0;
280 Token
.BufferSize
= *BufferSize
;
281 Token
.Buffer
= BufferPtr
;
284 Token
.CheckPacket
= PxeBcCheckPacket
;
285 Token
.TimeoutCallback
= NULL
;
286 Token
.PacketNeeded
= NULL
;
288 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
290 *BufferSize
= Token
.BufferSize
;
292 Mtftp4
->Configure (Mtftp4
, NULL
);
299 This function is put data of a file by Tftp.
301 @param Private Pointer to PxeBc private data
302 @param Config Pointer to Mtftp configuration data
303 @param Filename Pointer to file name
304 @param Overwrite Indicate whether with overwrite attribute
305 @param BlockSize Pointer to block size
306 @param BufferPtr Pointer to buffer
307 @param BufferSize Pointer to buffer size
309 @retval EFI_SUCCESS Write the data success into the special file.
310 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
311 @retval other Write data into file failed.
316 IN PXEBC_PRIVATE_DATA
*Private
,
317 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
319 IN BOOLEAN Overwrite
,
322 IN OUT UINT64
*BufferSize
325 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
326 EFI_MTFTP4_TOKEN Token
;
327 EFI_MTFTP4_OPTION ReqOpt
[1];
332 Status
= EFI_DEVICE_ERROR
;
333 Mtftp4
= Private
->Mtftp4
;
335 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
337 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
338 if (EFI_ERROR (Status
)) {
343 if (BlockSize
!= NULL
) {
345 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
346 ReqOpt
[0].ValueStr
= OptBuf
;
347 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
352 Token
.OverrideData
= NULL
;
353 Token
.Filename
= Filename
;
354 Token
.ModeStr
= NULL
;
355 Token
.OptionCount
= OptCnt
;
356 Token
.OptionList
= ReqOpt
;
357 Token
.BufferSize
= *BufferSize
;
358 Token
.Buffer
= BufferPtr
;
359 Token
.CheckPacket
= PxeBcCheckPacket
;
360 Token
.TimeoutCallback
= NULL
;
361 Token
.PacketNeeded
= NULL
;
363 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
364 *BufferSize
= Token
.BufferSize
;
366 Mtftp4
->Configure (Mtftp4
, NULL
);
373 This function is to get data(file) from a directory(may be a server) by Tftp.
375 @param Private Pointer to PxeBc private data.
376 @param Config Pointer to Mtftp configuration data.
377 @param Filename Pointer to file name.
378 @param BlockSize Pointer to block size.
379 @param BufferPtr Pointer to buffer.
380 @param BufferSize Pointer to buffer size.
381 @param DontUseBuffer Indicate whether with a receive buffer.
383 @retval EFI_SUCCES Get the data from the file included in directory success.
384 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
385 @retval other Operation failed.
389 PxeBcTftpReadDirectory (
390 IN PXEBC_PRIVATE_DATA
*Private
,
391 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
395 IN OUT UINT64
*BufferSize
,
396 IN BOOLEAN DontUseBuffer
399 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
400 EFI_MTFTP4_TOKEN Token
;
401 EFI_MTFTP4_OPTION ReqOpt
[1];
406 Status
= EFI_DEVICE_ERROR
;
407 Mtftp4
= Private
->Mtftp4
;
409 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
411 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
412 if (EFI_ERROR (Status
)) {
417 if (BlockSize
!= NULL
) {
419 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
420 ReqOpt
[0].ValueStr
= OptBuf
;
421 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
426 Token
.OverrideData
= NULL
;
427 Token
.Filename
= Filename
;
428 Token
.ModeStr
= NULL
;
429 Token
.OptionCount
= OptCnt
;
430 Token
.OptionList
= ReqOpt
;
431 Token
.Context
= Private
;
434 Token
.BufferSize
= 0;
437 Token
.BufferSize
= *BufferSize
;
438 Token
.Buffer
= BufferPtr
;
441 Token
.CheckPacket
= PxeBcCheckPacket
;
442 Token
.TimeoutCallback
= NULL
;
443 Token
.PacketNeeded
= NULL
;
445 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
447 *BufferSize
= Token
.BufferSize
;
449 Mtftp4
->Configure (Mtftp4
, NULL
);