]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcMtftp.c
CommitLineData
dc361cc5 1/** @file\r
f737cfb9 2 PxeBc MTFTP functions.\r
d1102dba
LG
3\r
4Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
dc361cc5 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
dc361cc5 13**/\r
14\r
15#include "PxeBcImpl.h"\r
16\r
0adb8a3c 17CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
dc361cc5 18 "blksize",\r
19 "timeout",\r
20 "tsize",\r
21 "multicast"\r
22};\r
23\r
24\r
25/**\r
26 This is a callback function when packets received/transmitted in Mtftp driver.\r
27\r
d1102dba 28 A callback function that is provided by the caller to intercept\r
f737cfb9 29 the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the\r
d1102dba
LG
30 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept\r
31 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to\r
f737cfb9 32 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
d1102dba 33\r
dc361cc5 34 @param This Pointer to Mtftp protocol instance\r
35 @param Token Pointer to Mtftp token\r
36 @param PacketLen Length of Mtftp packet\r
37 @param Packet Pointer to Mtftp packet\r
38\r
f737cfb9 39 @retval EFI_SUCCESS Operation sucess\r
d1102dba 40 @retval EFI_ABORTED Abort transfer process\r
dc361cc5 41\r
42**/\r
43EFI_STATUS\r
6d3ea23f 44EFIAPI\r
dc361cc5 45PxeBcCheckPacket (\r
46 IN EFI_MTFTP4_PROTOCOL *This,\r
47 IN EFI_MTFTP4_TOKEN *Token,\r
48 IN UINT16 PacketLen,\r
49 IN EFI_MTFTP4_PACKET *Packet\r
50 )\r
51{\r
52 PXEBC_PRIVATE_DATA *Private;\r
53 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
54 EFI_STATUS Status;\r
55\r
ea886bef 56 Private = (PXEBC_PRIVATE_DATA *) Token->Context;\r
dc361cc5 57 Callback = Private->PxeBcCallback;\r
58 Status = EFI_SUCCESS;\r
59\r
982a9eae 60 if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
61 Private->Mode.TftpErrorReceived = TRUE;\r
62 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
206b5f51 63 AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1);\r
a361d391 64 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
982a9eae 65 }\r
66\r
dc361cc5 67 if (Callback != NULL) {\r
68\r
69 Status = Callback->Callback (\r
70 Callback,\r
71 Private->Function,\r
72 TRUE,\r
73 PacketLen,\r
74 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
75 );\r
76 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
77\r
78 Status = EFI_ABORTED;\r
79 } else {\r
80\r
81 Status = EFI_SUCCESS;\r
82 }\r
83 }\r
84\r
85 return Status;\r
86}\r
87\r
88\r
89/**\r
90 This function is to get size of a file by Tftp.\r
d1102dba 91\r
dc361cc5 92 @param Private Pointer to PxeBc private data\r
93 @param Config Pointer to Mtftp configuration data\r
94 @param Filename Pointer to file name\r
95 @param BlockSize Pointer to block size\r
96 @param BufferSize Pointer to buffer size\r
97\r
f737cfb9 98 @retval EFI_SUCCESS Get the size of file success\r
99 @retval EFI_NOT_FOUND Parse the tftp ptions failed.\r
100 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
101 @retval Other Has not get the size of the file.\r
d1102dba 102\r
dc361cc5 103**/\r
104EFI_STATUS\r
105PxeBcTftpGetFileSize (\r
106 IN PXEBC_PRIVATE_DATA *Private,\r
107 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
108 IN UINT8 *Filename,\r
109 IN UINTN *BlockSize,\r
110 IN OUT UINT64 *BufferSize\r
111 )\r
112{\r
113 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
114 EFI_MTFTP4_OPTION ReqOpt[2];\r
115 EFI_MTFTP4_PACKET *Packet;\r
116 EFI_MTFTP4_OPTION *Option;\r
117 UINT32 PktLen;\r
118 UINT8 OptBuf[128];\r
119 UINT32 OptCnt;\r
120 EFI_STATUS Status;\r
121\r
122 *BufferSize = 0;\r
123 Status = EFI_DEVICE_ERROR;\r
124 Mtftp4 = Private->Mtftp4;\r
125 Packet = NULL;\r
126 Option = NULL;\r
127 PktLen = 0;\r
128 OptCnt = 1;\r
129 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
130\r
131 Status = Mtftp4->Configure (Mtftp4, Config);\r
132 if (EFI_ERROR (Status)) {\r
133\r
134 return Status;\r
135 }\r
136\r
9c87ebc0 137 ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
206b5f51 138 UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
dc361cc5 139 ReqOpt[0].ValueStr = OptBuf;\r
140\r
141 if (BlockSize != NULL) {\r
9c87ebc0 142 ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 143 ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;\r
206b5f51 144 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));\r
dc361cc5 145 OptCnt++;\r
146 }\r
147\r
148 Status = Mtftp4->GetInfo (\r
149 Mtftp4,\r
35d74819 150 NULL,\r
dc361cc5 151 Filename,\r
152 NULL,\r
153 (UINT8) OptCnt,\r
154 ReqOpt,\r
155 &PktLen,\r
156 &Packet\r
157 );\r
158\r
159 if (EFI_ERROR (Status)) {\r
169a3461 160 if (Status == EFI_TFTP_ERROR) {\r
982a9eae 161 Private->Mode.TftpErrorReceived = TRUE;\r
162 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
206b5f51
ZL
163 AsciiStrnCpyS (\r
164 Private->Mode.TftpError.ErrorString,\r
165 PXE_MTFTP_ERROR_STRING_LENGTH,\r
166 (CHAR8 *) Packet->Error.ErrorMessage,\r
167 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
f737cfb9 168 );\r
a361d391 169 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
982a9eae 170 }\r
dc361cc5 171 goto ON_ERROR;\r
172 }\r
173\r
174 OptCnt = 0;\r
175\r
176 Status = Mtftp4->ParseOptions (\r
177 Mtftp4,\r
178 PktLen,\r
179 Packet,\r
180 (UINT32 *) &OptCnt,\r
181 &Option\r
182 );\r
183\r
184 if (EFI_ERROR (Status)) {\r
185\r
186 goto ON_ERROR;\r
187 }\r
188\r
189 Status = EFI_NOT_FOUND;\r
190\r
191 while (OptCnt != 0) {\r
192\r
193 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
194\r
195 *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);\r
196 Status = EFI_SUCCESS;\r
197 }\r
198\r
199 OptCnt--;\r
200 }\r
201\r
766c7483 202 FreePool (Option);\r
dc361cc5 203\r
204ON_ERROR:\r
205\r
206 if (Packet != NULL) {\r
766c7483 207 FreePool (Packet);\r
dc361cc5 208 }\r
209\r
210 Mtftp4->Configure (Mtftp4, NULL);\r
211\r
212 return Status;\r
213}\r
214\r
215\r
216/**\r
217 This function is to get data of a file by Tftp.\r
218\r
219 @param Private Pointer to PxeBc private data\r
220 @param Config Pointer to Mtftp configuration data\r
221 @param Filename Pointer to file name\r
222 @param BlockSize Pointer to block size\r
223 @param BufferPtr Pointer to buffer\r
224 @param BufferSize Pointer to buffer size\r
225 @param DontUseBuffer Indicate whether with a receive buffer\r
226\r
f737cfb9 227 @retval EFI_SUCCESS Read the data success from the special file.\r
228 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
229 @retval other Read data from file failed.\r
d1102dba 230\r
dc361cc5 231**/\r
232EFI_STATUS\r
233PxeBcTftpReadFile (\r
234 IN PXEBC_PRIVATE_DATA *Private,\r
235 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
236 IN UINT8 *Filename,\r
237 IN UINTN *BlockSize,\r
238 IN UINT8 *BufferPtr,\r
239 IN OUT UINT64 *BufferSize,\r
240 IN BOOLEAN DontUseBuffer\r
241 )\r
242{\r
243 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
244 EFI_MTFTP4_TOKEN Token;\r
245 EFI_MTFTP4_OPTION ReqOpt[1];\r
246 UINT32 OptCnt;\r
247 UINT8 OptBuf[128];\r
248 EFI_STATUS Status;\r
249\r
250 Status = EFI_DEVICE_ERROR;\r
251 Mtftp4 = Private->Mtftp4;\r
252 OptCnt = 0;\r
253 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
254\r
255 Status = Mtftp4->Configure (Mtftp4, Config);\r
256 if (EFI_ERROR (Status)) {\r
257\r
258 return Status;\r
259 }\r
260\r
261 if (BlockSize != NULL) {\r
262\r
8792362f 263 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 264 ReqOpt[0].ValueStr = OptBuf;\r
206b5f51 265 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
dc361cc5 266 OptCnt++;\r
267 }\r
268\r
269 Token.Event = NULL;\r
270 Token.OverrideData = NULL;\r
271 Token.Filename = Filename;\r
272 Token.ModeStr = NULL;\r
273 Token.OptionCount = OptCnt;\r
274 Token.OptionList = ReqOpt;\r
ea886bef 275 Token.Context = Private;\r
dc361cc5 276\r
277 if (DontUseBuffer) {\r
278 Token.BufferSize = 0;\r
279 Token.Buffer = NULL;\r
280 } else {\r
281 Token.BufferSize = *BufferSize;\r
282 Token.Buffer = BufferPtr;\r
283 }\r
284\r
285 Token.CheckPacket = PxeBcCheckPacket;\r
286 Token.TimeoutCallback = NULL;\r
287 Token.PacketNeeded = NULL;\r
288\r
289 Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
290\r
291 *BufferSize = Token.BufferSize;\r
292\r
293 Mtftp4->Configure (Mtftp4, NULL);\r
294\r
295 return Status;\r
296}\r
297\r
298\r
299/**\r
300 This function is put data of a file by Tftp.\r
301\r
302 @param Private Pointer to PxeBc private data\r
303 @param Config Pointer to Mtftp configuration data\r
304 @param Filename Pointer to file name\r
305 @param Overwrite Indicate whether with overwrite attribute\r
306 @param BlockSize Pointer to block size\r
307 @param BufferPtr Pointer to buffer\r
308 @param BufferSize Pointer to buffer size\r
309\r
f737cfb9 310 @retval EFI_SUCCESS Write the data success into the special file.\r
311 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
312 @retval other Write data into file failed.\r
d1102dba 313\r
dc361cc5 314**/\r
315EFI_STATUS\r
316PxeBcTftpWriteFile (\r
317 IN PXEBC_PRIVATE_DATA *Private,\r
318 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
319 IN UINT8 *Filename,\r
320 IN BOOLEAN Overwrite,\r
321 IN UINTN *BlockSize,\r
322 IN UINT8 *BufferPtr,\r
323 IN OUT UINT64 *BufferSize\r
324 )\r
325{\r
326 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
327 EFI_MTFTP4_TOKEN Token;\r
328 EFI_MTFTP4_OPTION ReqOpt[1];\r
329 UINT32 OptCnt;\r
330 UINT8 OptBuf[128];\r
331 EFI_STATUS Status;\r
332\r
333 Status = EFI_DEVICE_ERROR;\r
334 Mtftp4 = Private->Mtftp4;\r
335 OptCnt = 0;\r
336 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
337\r
338 Status = Mtftp4->Configure (Mtftp4, Config);\r
339 if (EFI_ERROR (Status)) {\r
340\r
341 return Status;\r
342 }\r
343\r
344 if (BlockSize != NULL) {\r
345\r
8792362f 346 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 347 ReqOpt[0].ValueStr = OptBuf;\r
206b5f51 348 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
dc361cc5 349 OptCnt++;\r
350 }\r
351\r
352 Token.Event = NULL;\r
353 Token.OverrideData = NULL;\r
354 Token.Filename = Filename;\r
355 Token.ModeStr = NULL;\r
356 Token.OptionCount = OptCnt;\r
357 Token.OptionList = ReqOpt;\r
358 Token.BufferSize = *BufferSize;\r
359 Token.Buffer = BufferPtr;\r
360 Token.CheckPacket = PxeBcCheckPacket;\r
361 Token.TimeoutCallback = NULL;\r
362 Token.PacketNeeded = NULL;\r
363\r
364 Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
365 *BufferSize = Token.BufferSize;\r
366\r
367 Mtftp4->Configure (Mtftp4, NULL);\r
368\r
369 return Status;\r
370}\r
371\r
372\r
373/**\r
f737cfb9 374 This function is to get data(file) from a directory(may be a server) by Tftp.\r
375\r
376 @param Private Pointer to PxeBc private data.\r
377 @param Config Pointer to Mtftp configuration data.\r
378 @param Filename Pointer to file name.\r
379 @param BlockSize Pointer to block size.\r
380 @param BufferPtr Pointer to buffer.\r
381 @param BufferSize Pointer to buffer size.\r
382 @param DontUseBuffer Indicate whether with a receive buffer.\r
383\r
d1102dba 384 @retval EFI_SUCCES Get the data from the file included in directory success.\r
f737cfb9 385 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
386 @retval other Operation failed.\r
d1102dba 387\r
dc361cc5 388**/\r
dc361cc5 389EFI_STATUS\r
390PxeBcTftpReadDirectory (\r
391 IN PXEBC_PRIVATE_DATA *Private,\r
392 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
393 IN UINT8 *Filename,\r
394 IN UINTN *BlockSize,\r
395 IN UINT8 *BufferPtr,\r
396 IN OUT UINT64 *BufferSize,\r
397 IN BOOLEAN DontUseBuffer\r
398 )\r
399{\r
400 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
401 EFI_MTFTP4_TOKEN Token;\r
402 EFI_MTFTP4_OPTION ReqOpt[1];\r
403 UINT32 OptCnt;\r
404 UINT8 OptBuf[128];\r
405 EFI_STATUS Status;\r
406\r
407 Status = EFI_DEVICE_ERROR;\r
408 Mtftp4 = Private->Mtftp4;\r
409 OptCnt = 0;\r
410 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
411\r
412 Status = Mtftp4->Configure (Mtftp4, Config);\r
413 if (EFI_ERROR (Status)) {\r
414\r
415 return Status;\r
416 }\r
417\r
418 if (BlockSize != NULL) {\r
419\r
8792362f 420 ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
dc361cc5 421 ReqOpt[0].ValueStr = OptBuf;\r
206b5f51 422 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
dc361cc5 423 OptCnt++;\r
424 }\r
425\r
426 Token.Event = NULL;\r
427 Token.OverrideData = NULL;\r
428 Token.Filename = Filename;\r
429 Token.ModeStr = NULL;\r
430 Token.OptionCount = OptCnt;\r
431 Token.OptionList = ReqOpt;\r
ea886bef 432 Token.Context = Private;\r
dc361cc5 433\r
434 if (DontUseBuffer) {\r
435 Token.BufferSize = 0;\r
436 Token.Buffer = NULL;\r
437 } else {\r
438 Token.BufferSize = *BufferSize;\r
439 Token.Buffer = BufferPtr;\r
440 }\r
441\r
442 Token.CheckPacket = PxeBcCheckPacket;\r
443 Token.TimeoutCallback = NULL;\r
444 Token.PacketNeeded = NULL;\r
445\r
446 Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
447\r
448 *BufferSize = Token.BufferSize;\r
449\r
450 Mtftp4->Configure (Mtftp4, NULL);\r
451\r
452 return Status;\r
453}\r
454\r