Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Mtftp6Dxe/Mtftp6Wrq.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Mtftp6Dxe/Mtftp6Wrq.c
r85718 r99404 9 9 10 10 #include "Mtftp6Impl.h" 11 12 13 11 14 12 /** … … 25 23 EFI_STATUS 26 24 Mtftp6WrqSendBlock ( 27 IN MTFTP6_INSTANCE 28 IN UINT16 25 IN MTFTP6_INSTANCE *Instance, 26 IN UINT16 BlockNum 29 27 ) 30 28 { 31 EFI_MTFTP6_PACKET 32 EFI_MTFTP6_TOKEN 33 NET_BUF 34 EFI_STATUS 35 UINT16 36 UINT8 37 UINT64 29 EFI_MTFTP6_PACKET *Packet; 30 EFI_MTFTP6_TOKEN *Token; 31 NET_BUF *UdpPacket; 32 EFI_STATUS Status; 33 UINT16 DataLen; 34 UINT8 *DataBuf; 35 UINT64 Start; 38 36 39 37 // … … 46 44 } 47 45 48 Packet = (EFI_MTFTP6_PACKET *) 49 50 51 52 46 Packet = (EFI_MTFTP6_PACKET *)NetbufAllocSpace ( 47 UdpPacket, 48 MTFTP6_DATA_HEAD_LEN, 49 FALSE 50 ); 53 51 ASSERT (Packet != NULL); 54 52 … … 66 64 67 65 if (Token->BufferSize < Start + Instance->BlkSize) { 68 DataLen = (UINT16) 66 DataLen = (UINT16)(Token->BufferSize - Start); 69 67 Instance->LastBlk = BlockNum; 70 68 Mtftp6SetLastBlockNum (&Instance->BlkList, BlockNum); … … 73 71 if (DataLen > 0) { 74 72 NetbufAllocSpace (UdpPacket, DataLen, FALSE); 75 CopyMem (Packet->Data.Data, (UINT8 *) Token->Buffer + Start, DataLen); 76 } 77 73 CopyMem (Packet->Data.Data, (UINT8 *)Token->Buffer + Start, DataLen); 74 } 78 75 } else { 79 76 // … … 81 78 // 82 79 DataBuf = NULL; 83 Status = Token->PacketNeeded (&Instance->Mtftp6, Token, &DataLen, (VOID *)&DataBuf);80 Status = Token->PacketNeeded (&Instance->Mtftp6, Token, &DataLen, (VOID *)&DataBuf); 84 81 85 82 if (EFI_ERROR (Status) || (DataLen > Instance->BlkSize)) { … … 87 84 gBS->FreePool (DataBuf); 88 85 } 86 89 87 // 90 88 // The received packet has already been freed. … … 93 91 Instance, 94 92 EFI_MTFTP6_ERRORCODE_REQUEST_DENIED, 95 (UINT8 *) 93 (UINT8 *)"User aborted the transfer" 96 94 ); 97 95 … … 118 116 return Mtftp6TransmitPacket (Instance, UdpPacket); 119 117 } 120 121 118 122 119 /** … … 139 136 EFI_STATUS 140 137 Mtftp6WrqHandleAck ( 141 IN MTFTP6_INSTANCE 142 IN EFI_MTFTP6_PACKET 143 IN UINT32 144 OUT NET_BUF 145 OUT BOOLEAN 138 IN MTFTP6_INSTANCE *Instance, 139 IN EFI_MTFTP6_PACKET *Packet, 140 IN UINT32 Len, 141 OUT NET_BUF **UdpPacket, 142 OUT BOOLEAN *IsCompleted 146 143 ) 147 144 { 148 UINT16 149 INTN 150 UINT64 145 UINT16 AckNum; 146 INTN Expected; 147 UINT64 BlockCounter; 151 148 152 149 *IsCompleted = FALSE; … … 183 180 *IsCompleted = TRUE; 184 181 return EFI_SUCCESS; 185 186 182 } else { 187 183 // … … 197 193 Instance, 198 194 EFI_MTFTP6_ERRORCODE_REQUEST_DENIED, 199 (UINT8 *) 195 (UINT8 *)"Block number rolls back, not supported, try blksize option" 200 196 ); 201 197 … … 211 207 *UdpPacket = NULL; 212 208 213 return Mtftp6WrqSendBlock (Instance, (UINT16) 209 return Mtftp6WrqSendBlock (Instance, (UINT16)Expected); 214 210 } 215 216 211 217 212 /** … … 232 227 BOOLEAN 233 228 Mtftp6WrqOackValid ( 234 IN MTFTP6_EXT_OPTION_INFO 235 IN MTFTP6_EXT_OPTION_INFO 229 IN MTFTP6_EXT_OPTION_INFO *ReplyInfo, 230 IN MTFTP6_EXT_OPTION_INFO *RequestInfo 236 231 ) 237 232 { … … 249 244 if ((((ReplyInfo->BitMap & MTFTP6_OPT_BLKSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) || 250 245 (((ReplyInfo->BitMap & MTFTP6_OPT_TIMEOUT_BIT) != 0) && (ReplyInfo->Timeout != RequestInfo->Timeout)) 251 ) {252 246 ) 247 { 253 248 return FALSE; 254 249 } … … 256 251 return TRUE; 257 252 } 258 259 253 260 254 /** … … 275 269 EFI_STATUS 276 270 Mtftp6WrqHandleOack ( 277 IN MTFTP6_INSTANCE 278 IN EFI_MTFTP6_PACKET 279 IN UINT32 280 OUT NET_BUF 281 OUT BOOLEAN 271 IN MTFTP6_INSTANCE *Instance, 272 IN EFI_MTFTP6_PACKET *Packet, 273 IN UINT32 Len, 274 OUT NET_BUF **UdpPacket, 275 OUT BOOLEAN *IsCompleted 282 276 ) 283 277 { 284 EFI_MTFTP6_OPTION 285 UINT32 286 MTFTP6_EXT_OPTION_INFO 287 EFI_MTFTP6_PACKET 288 EFI_STATUS 289 INTN 278 EFI_MTFTP6_OPTION *Options; 279 UINT32 Count; 280 MTFTP6_EXT_OPTION_INFO ExtInfo; 281 EFI_MTFTP6_PACKET Dummy; 282 EFI_STATUS Status; 283 INTN Expected; 290 284 291 285 *IsCompleted = FALSE; 292 Options = NULL;286 Options = NULL; 293 287 294 288 // … … 311 305 return Status; 312 306 } 307 313 308 ASSERT (Options != NULL); 314 309 315 310 Status = Mtftp6ParseExtensionOption (Options, Count, FALSE, Instance->Operation, &ExtInfo); 316 311 317 if (EFI_ERROR (Status) || !Mtftp6WrqOackValid (&ExtInfo, &Instance->ExtInfo)) {312 if (EFI_ERROR (Status) || !Mtftp6WrqOackValid (&ExtInfo, &Instance->ExtInfo)) { 318 313 // 319 314 // Don't send a MTFTP error packet when out of resource, it can … … 333 328 Instance, 334 329 EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION, 335 (UINT8 *) 330 (UINT8 *)"Malformatted OACK packet" 336 331 ); 337 332 } … … 364 359 } 365 360 366 367 361 /** 368 362 The packet process callback for Mtftp6 upload. … … 377 371 EFIAPI 378 372 Mtftp6WrqInput ( 379 IN NET_BUF 380 IN UDP_END_POINT 381 IN EFI_STATUS 382 IN VOID 373 IN NET_BUF *UdpPacket, 374 IN UDP_END_POINT *UdpEpt, 375 IN EFI_STATUS IoStatus, 376 IN VOID *Context 383 377 ) 384 378 { 385 MTFTP6_INSTANCE 386 EFI_MTFTP6_PACKET 387 BOOLEAN 388 EFI_STATUS 389 UINT32 390 UINT32 391 UINT16 392 393 Instance = (MTFTP6_INSTANCE *) 379 MTFTP6_INSTANCE *Instance; 380 EFI_MTFTP6_PACKET *Packet; 381 BOOLEAN IsCompleted; 382 EFI_STATUS Status; 383 UINT32 TotalNum; 384 UINT32 Len; 385 UINT16 Opcode; 386 387 Instance = (MTFTP6_INSTANCE *)Context; 394 388 395 389 NET_CHECK_SIGNATURE (Instance, MTFTP6_INSTANCE_SIGNATURE); … … 440 434 } 441 435 442 NetbufCopy (UdpPacket, 0, Len, (UINT8 *) Packet); 443 436 NetbufCopy (UdpPacket, 0, Len, (UINT8 *)Packet); 444 437 } else { 445 Packet = (EFI_MTFTP6_PACKET *) 438 Packet = (EFI_MTFTP6_PACKET *)NetbufGetByte (UdpPacket, 0, NULL); 446 439 ASSERT (Packet != NULL); 447 440 } … … 453 446 // if CheckPacket returns an EFI_ERROR code. 454 447 // 455 if ( Instance->Token->CheckPacket != NULL&&456 ( Opcode == EFI_MTFTP6_OPCODE_OACK || Opcode == EFI_MTFTP6_OPCODE_ERROR)457 ) {458 448 if ((Instance->Token->CheckPacket != NULL) && 449 ((Opcode == EFI_MTFTP6_OPCODE_OACK) || (Opcode == EFI_MTFTP6_OPCODE_ERROR)) 450 ) 451 { 459 452 Status = Instance->Token->CheckPacket ( 460 453 &Instance->Mtftp6, 461 454 Instance->Token, 462 (UINT16) 455 (UINT16)Len, 463 456 Packet 464 457 ); … … 481 474 Instance, 482 475 EFI_MTFTP6_ERRORCODE_REQUEST_DENIED, 483 (UINT8 *) 476 (UINT8 *)"User aborted the transfer" 484 477 ); 485 478 } … … 494 487 // 495 488 switch (Opcode) { 496 case EFI_MTFTP6_OPCODE_ACK: 497 if (Len != MTFTP6_OPCODE_LEN + MTFTP6_BLKNO_LEN) { 498 goto ON_EXIT; 499 } 500 // 501 // Handle the Ack packet of Wrq. 502 // 503 Status = Mtftp6WrqHandleAck (Instance, Packet, Len, &UdpPacket, &IsCompleted); 504 break; 505 506 case EFI_MTFTP6_OPCODE_OACK: 507 if (Len <= MTFTP6_OPCODE_LEN) { 508 goto ON_EXIT; 509 } 510 // 511 // Handle the Oack packet of Wrq. 512 // 513 Status = Mtftp6WrqHandleOack (Instance, Packet, Len, &UdpPacket, &IsCompleted); 514 break; 515 516 default: 517 // 518 // Drop and return eror if received error message. 519 // 520 Status = EFI_TFTP_ERROR; 521 break; 489 case EFI_MTFTP6_OPCODE_ACK: 490 if (Len != MTFTP6_OPCODE_LEN + MTFTP6_BLKNO_LEN) { 491 goto ON_EXIT; 492 } 493 494 // 495 // Handle the Ack packet of Wrq. 496 // 497 Status = Mtftp6WrqHandleAck (Instance, Packet, Len, &UdpPacket, &IsCompleted); 498 break; 499 500 case EFI_MTFTP6_OPCODE_OACK: 501 if (Len <= MTFTP6_OPCODE_LEN) { 502 goto ON_EXIT; 503 } 504 505 // 506 // Handle the Oack packet of Wrq. 507 // 508 Status = Mtftp6WrqHandleOack (Instance, Packet, Len, &UdpPacket, &IsCompleted); 509 break; 510 511 default: 512 // 513 // Drop and return eror if received error message. 514 // 515 Status = EFI_TFTP_ERROR; 516 break; 522 517 } 523 518 … … 527 522 // restart the receive, otherwise end the session. 528 523 // 529 if ( Packet != NULL && TotalNum > 1) {524 if ((Packet != NULL) && (TotalNum > 1)) { 530 525 FreePool (Packet); 531 526 } … … 543 538 ); 544 539 } 540 545 541 // 546 542 // Clean up the current session if failed to continue. … … 550 546 } 551 547 } 552 553 548 554 549 /** … … 565 560 EFI_STATUS 566 561 Mtftp6WrqStart ( 567 IN MTFTP6_INSTANCE 568 IN UINT16 562 IN MTFTP6_INSTANCE *Instance, 563 IN UINT16 Operation 569 564 ) 570 565 { 571 EFI_STATUS 566 EFI_STATUS Status; 572 567 573 568 // … … 596 591 ); 597 592 } 598
Note:
See TracChangeset
for help on using the changeset viewer.