4 Copyright (c) 2007, 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
47 IN EFI_MTFTP4_PROTOCOL
*This
,
48 IN EFI_MTFTP4_TOKEN
*Token
,
50 IN EFI_MTFTP4_PACKET
*Packet
53 PXEBC_PRIVATE_DATA
*Private
;
54 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
57 Private
= (PXEBC_PRIVATE_DATA
*) TokenContext
;
58 Callback
= Private
->PxeBcCallback
;
61 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
62 Private
->Mode
.TftpErrorReceived
= TRUE
;
63 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
64 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, 127);
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 (Packet
->OpCode
== EFI_MTFTP4_OPCODE_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
,
174 Status
= Mtftp4
->ParseOptions (
182 if (EFI_ERROR (Status
)) {
187 Status
= EFI_NOT_FOUND
;
189 while (OptCnt
!= 0) {
191 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
193 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
194 Status
= EFI_SUCCESS
;
200 gBS
->FreePool (Option
);
204 if (Packet
!= NULL
) {
205 gBS
->FreePool (Packet
);
208 Mtftp4
->Configure (Mtftp4
, NULL
);
215 This function is to get data of a file by Tftp.
217 @param Private Pointer to PxeBc private data
218 @param Config Pointer to Mtftp configuration data
219 @param Filename Pointer to file name
220 @param BlockSize Pointer to block size
221 @param BufferPtr Pointer to buffer
222 @param BufferSize Pointer to buffer size
223 @param DontUseBuffer Indicate whether with a receive buffer
225 @retval EFI_SUCCESS Read the data success from the special file.
226 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
227 @retval other Read data from file failed.
232 IN PXEBC_PRIVATE_DATA
*Private
,
233 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
237 IN OUT UINT64
*BufferSize
,
238 IN BOOLEAN DontUseBuffer
241 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
242 EFI_MTFTP4_TOKEN Token
;
243 EFI_MTFTP4_OPTION ReqOpt
[1];
248 Status
= EFI_DEVICE_ERROR
;
249 Mtftp4
= Private
->Mtftp4
;
251 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
253 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
254 if (EFI_ERROR (Status
)) {
259 if (BlockSize
!= NULL
) {
261 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
262 ReqOpt
[0].ValueStr
= OptBuf
;
263 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
268 Token
.OverrideData
= NULL
;
269 Token
.Filename
= Filename
;
270 Token
.ModeStr
= NULL
;
271 Token
.OptionCount
= OptCnt
;
272 Token
.OptionList
= ReqOpt
;
273 TokenContext
= Private
;
276 Token
.BufferSize
= 0;
279 Token
.BufferSize
= *BufferSize
;
280 Token
.Buffer
= BufferPtr
;
283 Token
.CheckPacket
= PxeBcCheckPacket
;
284 Token
.TimeoutCallback
= NULL
;
285 Token
.PacketNeeded
= NULL
;
287 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
289 *BufferSize
= Token
.BufferSize
;
291 Mtftp4
->Configure (Mtftp4
, NULL
);
298 This function is put data of a file by Tftp.
300 @param Private Pointer to PxeBc private data
301 @param Config Pointer to Mtftp configuration data
302 @param Filename Pointer to file name
303 @param Overwrite Indicate whether with overwrite attribute
304 @param BlockSize Pointer to block size
305 @param BufferPtr Pointer to buffer
306 @param BufferSize Pointer to buffer size
308 @retval EFI_SUCCESS Write the data success into the special file.
309 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
310 @retval other Write data into file failed.
315 IN PXEBC_PRIVATE_DATA
*Private
,
316 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
318 IN BOOLEAN Overwrite
,
321 IN OUT UINT64
*BufferSize
324 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
325 EFI_MTFTP4_TOKEN Token
;
326 EFI_MTFTP4_OPTION ReqOpt
[1];
331 Status
= EFI_DEVICE_ERROR
;
332 Mtftp4
= Private
->Mtftp4
;
334 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
336 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
337 if (EFI_ERROR (Status
)) {
342 if (BlockSize
!= NULL
) {
344 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
345 ReqOpt
[0].ValueStr
= OptBuf
;
346 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
351 Token
.OverrideData
= NULL
;
352 Token
.Filename
= Filename
;
353 Token
.ModeStr
= NULL
;
354 Token
.OptionCount
= OptCnt
;
355 Token
.OptionList
= ReqOpt
;
356 Token
.BufferSize
= *BufferSize
;
357 Token
.Buffer
= BufferPtr
;
358 Token
.CheckPacket
= PxeBcCheckPacket
;
359 Token
.TimeoutCallback
= NULL
;
360 Token
.PacketNeeded
= NULL
;
362 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
363 *BufferSize
= Token
.BufferSize
;
365 Mtftp4
->Configure (Mtftp4
, NULL
);
372 This function is to get data(file) from a directory(may be a server) by Tftp.
374 @param Private Pointer to PxeBc private data.
375 @param Config Pointer to Mtftp configuration data.
376 @param Filename Pointer to file name.
377 @param BlockSize Pointer to block size.
378 @param BufferPtr Pointer to buffer.
379 @param BufferSize Pointer to buffer size.
380 @param DontUseBuffer Indicate whether with a receive buffer.
382 @retval EFI_SUCCES Get the data from the file included in directory success.
383 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
384 @retval other Operation failed.
388 PxeBcTftpReadDirectory (
389 IN PXEBC_PRIVATE_DATA
*Private
,
390 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
394 IN OUT UINT64
*BufferSize
,
395 IN BOOLEAN DontUseBuffer
398 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
399 EFI_MTFTP4_TOKEN Token
;
400 EFI_MTFTP4_OPTION ReqOpt
[1];
405 Status
= EFI_DEVICE_ERROR
;
406 Mtftp4
= Private
->Mtftp4
;
408 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
410 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
411 if (EFI_ERROR (Status
)) {
416 if (BlockSize
!= NULL
) {
418 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
419 ReqOpt
[0].ValueStr
= OptBuf
;
420 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
425 Token
.OverrideData
= NULL
;
426 Token
.Filename
= Filename
;
427 Token
.ModeStr
= NULL
;
428 Token
.OptionCount
= OptCnt
;
429 Token
.OptionList
= ReqOpt
;
430 TokenContext
= Private
;
433 Token
.BufferSize
= 0;
436 Token
.BufferSize
= *BufferSize
;
437 Token
.Buffer
= BufferPtr
;
440 Token
.CheckPacket
= PxeBcCheckPacket
;
441 Token
.TimeoutCallback
= NULL
;
442 Token
.PacketNeeded
= NULL
;
444 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
446 *BufferSize
= Token
.BufferSize
;
448 Mtftp4
->Configure (Mtftp4
, NULL
);