4 Copyright (c) 2007, 2009, Intel Corporation.<BR>
5 All rights reserved. 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 VOID
*TokenContext
= NULL
;
19 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
28 This is a callback function when packets received/transmitted in Mtftp driver.
30 A callback function that is provided by the caller to intercept
31 the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
32 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
33 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
34 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
36 @param This Pointer to Mtftp protocol instance
37 @param Token Pointer to Mtftp token
38 @param PacketLen Length of Mtftp packet
39 @param Packet Pointer to Mtftp packet
41 @retval EFI_SUCCESS Operation sucess
42 @retval EFI_ABORTED Abort transfer process
48 IN EFI_MTFTP4_PROTOCOL
*This
,
49 IN EFI_MTFTP4_TOKEN
*Token
,
51 IN EFI_MTFTP4_PACKET
*Packet
54 PXEBC_PRIVATE_DATA
*Private
;
55 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
58 Private
= (PXEBC_PRIVATE_DATA
*) TokenContext
;
59 Callback
= Private
->PxeBcCallback
;
62 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
63 Private
->Mode
.TftpErrorReceived
= TRUE
;
64 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
65 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, 127);
68 if (Callback
!= NULL
) {
70 Status
= Callback
->Callback (
75 (EFI_PXE_BASE_CODE_PACKET
*) Packet
77 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
91 This function is to get size of a file by Tftp.
93 @param Private Pointer to PxeBc private data
94 @param Config Pointer to Mtftp configuration data
95 @param Filename Pointer to file name
96 @param BlockSize Pointer to block size
97 @param BufferSize Pointer to buffer size
99 @retval EFI_SUCCESS Get the size of file success
100 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
101 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
102 @retval Other Has not get the size of the file.
106 PxeBcTftpGetFileSize (
107 IN PXEBC_PRIVATE_DATA
*Private
,
108 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
111 IN OUT UINT64
*BufferSize
114 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
115 EFI_MTFTP4_OPTION ReqOpt
[2];
116 EFI_MTFTP4_PACKET
*Packet
;
117 EFI_MTFTP4_OPTION
*Option
;
124 Status
= EFI_DEVICE_ERROR
;
125 Mtftp4
= Private
->Mtftp4
;
130 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
132 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
133 if (EFI_ERROR (Status
)) {
138 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
139 UtoA10 (0, (CHAR8
*) OptBuf
);
140 ReqOpt
[0].ValueStr
= OptBuf
;
142 if (BlockSize
!= NULL
) {
143 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
144 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
145 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
);
149 Status
= Mtftp4
->GetInfo (
160 if (EFI_ERROR (Status
)) {
161 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
162 Private
->Mode
.TftpErrorReceived
= TRUE
;
163 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
165 Private
->Mode
.TftpError
.ErrorString
,
166 (CHAR8
*) Packet
->Error
.ErrorMessage
,
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
;
201 gBS
->FreePool (Option
);
205 if (Packet
!= NULL
) {
206 gBS
->FreePool (Packet
);
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 TokenContext
= 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 TokenContext
= 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
);