Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Mtftp6Dxe/Mtftp6Rrq.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/Mtftp6Rrq.c
r85718 r99404 9 9 10 10 #include "Mtftp6Impl.h" 11 12 11 13 12 /** … … 24 23 EFI_STATUS 25 24 Mtftp6RrqSendAck ( 26 IN MTFTP6_INSTANCE 27 IN UINT16 25 IN MTFTP6_INSTANCE *Instance, 26 IN UINT16 BlockNum 28 27 ) 29 28 { 30 EFI_MTFTP6_PACKET 31 NET_BUF 32 EFI_STATUS 29 EFI_MTFTP6_PACKET *Ack; 30 NET_BUF *Packet; 31 EFI_STATUS Status; 33 32 34 33 Status = EFI_SUCCESS; … … 43 42 } 44 43 45 Ack = (EFI_MTFTP6_PACKET *) 46 47 48 49 44 Ack = (EFI_MTFTP6_PACKET *)NetbufAllocSpace ( 45 Packet, 46 sizeof (EFI_MTFTP6_ACK_HEADER), 47 FALSE 48 ); 50 49 ASSERT (Ack != NULL); 51 50 52 Ack->Ack.OpCode 53 Ack->Ack.Block[0] 51 Ack->Ack.OpCode = HTONS (EFI_MTFTP6_OPCODE_ACK); 52 Ack->Ack.Block[0] = HTONS (BlockNum); 54 53 55 54 // 56 55 // Reset current retry count of the instance. 57 56 // 58 Instance->CurRetry = 0;57 Instance->CurRetry = 0; 59 58 Instance->LastPacket = Packet; 60 59 … … 66 65 return Status; 67 66 } 68 69 67 70 68 /** … … 86 84 EFI_STATUS 87 85 Mtftp6RrqSaveBlock ( 88 IN MTFTP6_INSTANCE 89 IN EFI_MTFTP6_PACKET 90 IN UINT32 91 OUT NET_BUF 86 IN MTFTP6_INSTANCE *Instance, 87 IN EFI_MTFTP6_PACKET *Packet, 88 IN UINT32 Len, 89 OUT NET_BUF **UdpPacket 92 90 ) 93 91 { 94 EFI_MTFTP6_TOKEN 95 EFI_STATUS 96 UINT16 97 UINT64 98 UINT32 99 UINT64 100 BOOLEAN 92 EFI_MTFTP6_TOKEN *Token; 93 EFI_STATUS Status; 94 UINT16 Block; 95 UINT64 Start; 96 UINT32 DataLen; 97 UINT64 BlockCounter; 98 BOOLEAN Completed; 101 99 102 100 Completed = FALSE; … … 109 107 // 110 108 if (DataLen < Instance->BlkSize) { 111 Completed = TRUE;109 Completed = TRUE; 112 110 Instance->LastBlk = Block; 113 111 Mtftp6SetLastBlockNum (&Instance->BlkList, Block); … … 133 131 // Callback to the check packet routine with the received packet. 134 132 // 135 Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16) 133 Status = Token->CheckPacket (&Instance->Mtftp6, Token, (UINT16)Len, Packet); 136 134 137 135 if (EFI_ERROR (Status)) { … … 148 146 Instance, 149 147 EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION, 150 (UINT8 *) 148 (UINT8 *)"User aborted download" 151 149 ); 152 150 … … 156 154 157 155 if (Token->Buffer != NULL) { 158 159 156 Start = MultU64x32 (BlockCounter - 1, Instance->BlkSize); 160 157 if (Start + DataLen <= Token->BufferSize) { 161 CopyMem ((UINT8 *) 158 CopyMem ((UINT8 *)Token->Buffer + Start, Packet->Data.Data, DataLen); 162 159 // 163 160 // Update the file size when received the last block … … 186 183 Instance, 187 184 EFI_MTFTP6_ERRORCODE_DISK_FULL, 188 (UINT8 *) 185 (UINT8 *)"User provided memory block is too small" 189 186 ); 190 187 … … 195 192 return EFI_SUCCESS; 196 193 } 197 198 194 199 195 /** … … 215 211 EFI_STATUS 216 212 Mtftp6RrqHandleData ( 217 IN MTFTP6_INSTANCE 218 IN EFI_MTFTP6_PACKET 219 IN UINT32 220 OUT NET_BUF 221 OUT BOOLEAN 213 IN MTFTP6_INSTANCE *Instance, 214 IN EFI_MTFTP6_PACKET *Packet, 215 IN UINT32 Len, 216 OUT NET_BUF **UdpPacket, 217 OUT BOOLEAN *IsCompleted 222 218 ) 223 219 { 224 EFI_STATUS 225 UINT16 226 INTN 220 EFI_STATUS Status; 221 UINT16 BlockNum; 222 INTN Expected; 227 223 228 224 *IsCompleted = FALSE; … … 249 245 // If Expected is 0, (UINT16) (Expected - 1) is also the expected Ack number (65535). 250 246 // 251 return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1));247 return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1)); 252 248 } 253 249 … … 261 257 // Record the total received and saved block number. 262 258 // 263 Instance->TotalBlock 259 Instance->TotalBlock++; 264 260 265 261 // … … 278 274 Expected = Mtftp6GetNextBlockNum (&Instance->BlkList); 279 275 280 if (Instance->IsMaster || Expected < 0) {276 if (Instance->IsMaster || (Expected < 0)) { 281 277 if (Expected < 0) { 282 278 // … … 288 284 BlockNum = Instance->LastBlk; 289 285 *IsCompleted = TRUE; 290 291 286 } else { 292 BlockNum = (UINT16) (Expected - 1); 293 } 287 BlockNum = (UINT16)(Expected - 1); 288 } 289 294 290 // 295 291 // Free the received packet before send new packet in ReceiveNotify, … … 299 295 *UdpPacket = NULL; 300 296 301 if ( Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock) || Expected < 0) {297 if ((Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock)) || (Expected < 0)) { 302 298 Status = Mtftp6RrqSendAck (Instance, BlockNum); 303 299 } … … 306 302 return Status; 307 303 } 308 309 304 310 305 /** … … 326 321 BOOLEAN 327 322 Mtftp6RrqOackValid ( 328 IN MTFTP6_INSTANCE 329 IN MTFTP6_EXT_OPTION_INFO 330 IN MTFTP6_EXT_OPTION_INFO 323 IN MTFTP6_INSTANCE *Instance, 324 IN MTFTP6_EXT_OPTION_INFO *ReplyInfo, 325 IN MTFTP6_EXT_OPTION_INFO *RequestInfo 331 326 ) 332 327 { … … 345 340 (((ReplyInfo->BitMap & MTFTP6_OPT_WINDOWSIZE_BIT) != 0) && (ReplyInfo->BlkSize > RequestInfo->BlkSize)) || 346 341 (((ReplyInfo->BitMap & MTFTP6_OPT_TIMEOUT_BIT) != 0) && (ReplyInfo->Timeout != RequestInfo->Timeout)) 347 ) { 342 ) 343 { 348 344 return FALSE; 349 345 } … … 355 351 // 356 352 if (((ReplyInfo->BitMap & MTFTP6_OPT_MCAST_BIT) != 0) && !NetIp6IsUnspecifiedAddr (&Instance->McastIp)) { 357 358 if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && CompareMem (359 &ReplyInfo->McastIp,360 &Instance->McastIp,361 sizeof (EFI_IPv6_ADDRESS)362 ) != 0){353 if (!NetIp6IsUnspecifiedAddr (&ReplyInfo->McastIp) && (CompareMem ( 354 &ReplyInfo->McastIp, 355 &Instance->McastIp, 356 sizeof (EFI_IPv6_ADDRESS) 357 ) != 0)) 358 { 363 359 return FALSE; 364 360 } … … 371 367 return TRUE; 372 368 } 373 374 369 375 370 /** … … 386 381 EFIAPI 387 382 Mtftp6RrqConfigMcastUdpIo ( 388 IN UDP_IO 389 IN VOID 383 IN UDP_IO *McastIo, 384 IN VOID *Context 390 385 ) 391 386 { 392 EFI_STATUS 393 EFI_UDP6_PROTOCOL 394 EFI_UDP6_CONFIG_DATA 395 EFI_IPv6_ADDRESS 396 MTFTP6_INSTANCE 387 EFI_STATUS Status; 388 EFI_UDP6_PROTOCOL *Udp6; 389 EFI_UDP6_CONFIG_DATA *Udp6Cfg; 390 EFI_IPv6_ADDRESS Group; 391 MTFTP6_INSTANCE *Instance; 397 392 398 393 Udp6 = McastIo->Protocol.Udp6; 399 394 Udp6Cfg = &(McastIo->Config.Udp6); 400 Instance = (MTFTP6_INSTANCE *) 395 Instance = (MTFTP6_INSTANCE *)Context; 401 396 402 397 // … … 438 433 } 439 434 440 441 435 /** 442 436 Process the OACK packet for Rrq. … … 456 450 EFI_STATUS 457 451 Mtftp6RrqHandleOack ( 458 IN MTFTP6_INSTANCE 459 IN EFI_MTFTP6_PACKET 460 IN UINT32 461 OUT NET_BUF 462 OUT BOOLEAN 452 IN MTFTP6_INSTANCE *Instance, 453 IN EFI_MTFTP6_PACKET *Packet, 454 IN UINT32 Len, 455 OUT NET_BUF **UdpPacket, 456 OUT BOOLEAN *IsCompleted 463 457 ) 464 458 { 465 EFI_MTFTP6_OPTION 466 UINT32 467 MTFTP6_EXT_OPTION_INFO 468 EFI_STATUS 469 INTN 470 EFI_UDP6_PROTOCOL 459 EFI_MTFTP6_OPTION *Options; 460 UINT32 Count; 461 MTFTP6_EXT_OPTION_INFO ExtInfo; 462 EFI_STATUS Status; 463 INTN Expected; 464 EFI_UDP6_PROTOCOL *Udp6; 471 465 472 466 *IsCompleted = FALSE; 473 Options = NULL;467 Options = NULL; 474 468 475 469 // … … 480 474 ASSERT (Expected != -1); 481 475 482 if (Instance->IsMaster && Expected != 1) {476 if (Instance->IsMaster && (Expected != 1)) { 483 477 return EFI_SUCCESS; 484 478 } … … 494 488 return Status; 495 489 } 490 496 491 ASSERT (Options != NULL); 497 492 … … 518 513 Instance, 519 514 EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION, 520 (UINT8 *) 515 (UINT8 *)"Malformatted OACK packet" 521 516 ); 522 517 } … … 526 521 527 522 if ((ExtInfo.BitMap & MTFTP6_OPT_MCAST_BIT) != 0) { 528 529 523 // 530 524 // Save the multicast info. Always update the Master, only update the … … 535 529 536 530 if (NetIp6IsUnspecifiedAddr (&Instance->McastIp)) { 537 if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || ExtInfo.McastPort == 0) {531 if (NetIp6IsUnspecifiedAddr (&ExtInfo.McastIp) || (ExtInfo.McastPort == 0)) { 538 532 // 539 533 // Free the received packet before send new packet in ReceiveNotify, … … 548 542 Instance, 549 543 EFI_MTFTP6_ERRORCODE_ILLEGAL_OPERATION, 550 (UINT8 *) 544 (UINT8 *)"Illegal multicast setting" 551 545 ); 552 546 … … 563 557 ); 564 558 565 Instance->McastPort 559 Instance->McastPort = ExtInfo.McastPort; 566 560 if (Instance->McastUdpIo == NULL) { 567 561 Instance->McastUdpIo = UdpIoCreateIo ( … … 576 570 Instance->McastUdpIo->UdpHandle, 577 571 &gEfiUdp6ProtocolGuid, 578 (VOID **) 572 (VOID **)&Udp6, 579 573 Instance->Service->Image, 580 574 Instance->Handle, … … 613 607 Instance, 614 608 EFI_MTFTP6_ERRORCODE_ACCESS_VIOLATION, 615 (UINT8 *) 609 (UINT8 *)"Failed to create socket to receive multicast packet" 616 610 ); 617 611 … … 634 628 } 635 629 } 636 637 630 } else { 638 639 631 Instance->IsMaster = TRUE; 640 632 … … 662 654 // or tell the server we want to receive the Expected block. 663 655 // 664 return Mtftp6RrqSendAck (Instance, (UINT16) 656 return Mtftp6RrqSendAck (Instance, (UINT16)(Expected - 1)); 665 657 } 666 667 658 668 659 /** … … 678 669 EFIAPI 679 670 Mtftp6RrqInput ( 680 IN NET_BUF 681 IN UDP_END_POINT 682 IN EFI_STATUS 683 IN VOID 671 IN NET_BUF *UdpPacket, 672 IN UDP_END_POINT *UdpEpt, 673 IN EFI_STATUS IoStatus, 674 IN VOID *Context 684 675 ) 685 676 { 686 MTFTP6_INSTANCE 687 EFI_MTFTP6_PACKET 688 BOOLEAN 689 BOOLEAN 690 EFI_STATUS 691 UINT16 692 UINT32 693 UINT32 694 695 Instance = (MTFTP6_INSTANCE *) 677 MTFTP6_INSTANCE *Instance; 678 EFI_MTFTP6_PACKET *Packet; 679 BOOLEAN IsCompleted; 680 BOOLEAN IsMcast; 681 EFI_STATUS Status; 682 UINT16 Opcode; 683 UINT32 TotalNum; 684 UINT32 Len; 685 686 Instance = (MTFTP6_INSTANCE *)Context; 696 687 697 688 NET_CHECK_SIGNATURE (Instance, MTFTP6_INSTANCE_SIGNATURE); … … 724 715 &Instance->McastIp, 725 716 sizeof (EFI_IPv6_ADDRESS) 726 ) == 0) { 717 ) == 0) 718 { 727 719 IsMcast = TRUE; 728 720 } else { … … 764 756 } 765 757 766 NetbufCopy (UdpPacket, 0, Len, (UINT8 *) Packet); 767 758 NetbufCopy (UdpPacket, 0, Len, (UINT8 *)Packet); 768 759 } else { 769 Packet = (EFI_MTFTP6_PACKET *) 760 Packet = (EFI_MTFTP6_PACKET *)NetbufGetByte (UdpPacket, 0, NULL); 770 761 ASSERT (Packet != NULL); 771 762 } … … 778 769 // 779 770 if ((Instance->Token->CheckPacket != NULL) && 780 ( Opcode == EFI_MTFTP6_OPCODE_OACK || Opcode == EFI_MTFTP6_OPCODE_ERROR)781 ) {782 771 ((Opcode == EFI_MTFTP6_OPCODE_OACK) || (Opcode == EFI_MTFTP6_OPCODE_ERROR)) 772 ) 773 { 783 774 Status = Instance->Token->CheckPacket ( 784 775 &Instance->Mtftp6, 785 776 Instance->Token, 786 (UINT16) 777 (UINT16)Len, 787 778 Packet 788 779 ); … … 805 796 Instance, 806 797 EFI_MTFTP6_ERRORCODE_REQUEST_DENIED, 807 (UINT8 *) 798 (UINT8 *)"User aborted the transfer" 808 799 ); 809 800 } … … 818 809 // 819 810 switch (Opcode) { 820 case EFI_MTFTP6_OPCODE_DATA: 821 if ((Len > (UINT32) (MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32) MTFTP6_DATA_HEAD_LEN)) { 822 goto ON_EXIT; 823 } 824 // 825 // Handle the data packet of Rrq. 826 // 827 Status = Mtftp6RrqHandleData ( 828 Instance, 829 Packet, 830 Len, 831 &UdpPacket, 832 &IsCompleted 833 ); 834 break; 835 836 case EFI_MTFTP6_OPCODE_OACK: 837 if (IsMcast || Len <= MTFTP6_OPCODE_LEN) { 838 goto ON_EXIT; 839 } 840 // 841 // Handle the Oack packet of Rrq. 842 // 843 Status = Mtftp6RrqHandleOack ( 844 Instance, 845 Packet, 846 Len, 847 &UdpPacket, 848 &IsCompleted 849 ); 850 break; 851 852 default: 853 // 854 // Drop and return error if received error message. 855 // 856 Status = EFI_TFTP_ERROR; 857 break; 811 case EFI_MTFTP6_OPCODE_DATA: 812 if ((Len > (UINT32)(MTFTP6_DATA_HEAD_LEN + Instance->BlkSize)) || (Len < (UINT32)MTFTP6_DATA_HEAD_LEN)) { 813 goto ON_EXIT; 814 } 815 816 // 817 // Handle the data packet of Rrq. 818 // 819 Status = Mtftp6RrqHandleData ( 820 Instance, 821 Packet, 822 Len, 823 &UdpPacket, 824 &IsCompleted 825 ); 826 break; 827 828 case EFI_MTFTP6_OPCODE_OACK: 829 if (IsMcast || (Len <= MTFTP6_OPCODE_LEN)) { 830 goto ON_EXIT; 831 } 832 833 // 834 // Handle the Oack packet of Rrq. 835 // 836 Status = Mtftp6RrqHandleOack ( 837 Instance, 838 Packet, 839 Len, 840 &UdpPacket, 841 &IsCompleted 842 ); 843 break; 844 845 default: 846 // 847 // Drop and return error if received error message. 848 // 849 Status = EFI_TFTP_ERROR; 850 break; 858 851 } 859 852 … … 863 856 // receive, otherwise end the session. 864 857 // 865 if ( Packet != NULL && TotalNum > 1) {858 if ((Packet != NULL) && (TotalNum > 1)) { 866 859 FreePool (Packet); 867 860 } 861 868 862 if (UdpPacket != NULL) { 869 863 NetbufFree (UdpPacket); 870 864 } 865 871 866 if (!EFI_ERROR (Status) && !IsCompleted) { 872 867 if (IsMcast) { … … 886 881 } 887 882 } 883 888 884 // 889 885 // Clean up the current session if failed to continue. … … 893 889 } 894 890 } 895 896 891 897 892 /** … … 909 904 EFI_STATUS 910 905 Mtftp6RrqStart ( 911 IN MTFTP6_INSTANCE 912 IN UINT16 906 IN MTFTP6_INSTANCE *Instance, 907 IN UINT16 Operation 913 908 ) 914 909 { 915 EFI_STATUS 910 EFI_STATUS Status; 916 911 917 912 // … … 940 935 ); 941 936 } 942
Note:
See TracChangeset
for help on using the changeset viewer.