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