Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Mtftp4Dxe/Mtftp4Rrq.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/Mtftp4Dxe/Mtftp4Rrq.c
r85718 r99404 8 8 **/ 9 9 10 11 10 #include "Mtftp4Impl.h" 12 13 11 14 12 /** … … 24 22 EFIAPI 25 23 Mtftp4RrqInput ( 26 IN NET_BUF 27 IN UDP_END_POINT 28 IN EFI_STATUS 29 IN VOID 24 IN NET_BUF *UdpPacket, 25 IN UDP_END_POINT *EndPoint, 26 IN EFI_STATUS IoStatus, 27 IN VOID *Context 30 28 ); 31 32 29 33 30 /** … … 47 44 EFI_STATUS 48 45 Mtftp4RrqStart ( 49 IN MTFTP4_PROTOCOL 50 IN UINT16 46 IN MTFTP4_PROTOCOL *Instance, 47 IN UINT16 Operation 51 48 ) 52 49 { 53 EFI_STATUS 50 EFI_STATUS Status; 54 51 55 52 // … … 74 71 } 75 72 76 77 73 /** 78 74 Build and send a ACK packet for the download session. … … 88 84 EFI_STATUS 89 85 Mtftp4RrqSendAck ( 90 IN MTFTP4_PROTOCOL 91 IN UINT16 86 IN MTFTP4_PROTOCOL *Instance, 87 IN UINT16 BlkNo 92 88 ) 93 89 { 94 EFI_MTFTP4_PACKET 95 NET_BUF 96 EFI_STATUS 90 EFI_MTFTP4_PACKET *Ack; 91 NET_BUF *Packet; 92 EFI_STATUS Status; 97 93 98 94 Status = EFI_SUCCESS; … … 103 99 } 104 100 105 Ack = (EFI_MTFTP4_PACKET *) 106 107 108 109 101 Ack = (EFI_MTFTP4_PACKET *)NetbufAllocSpace ( 102 Packet, 103 sizeof (EFI_MTFTP4_ACK_HEADER), 104 FALSE 105 ); 110 106 ASSERT (Ack != NULL); 111 107 … … 120 116 return Status; 121 117 } 122 123 118 124 119 /** … … 139 134 EFI_STATUS 140 135 Mtftp4RrqSaveBlock ( 141 IN OUT MTFTP4_PROTOCOL 142 IN EFI_MTFTP4_PACKET 143 IN UINT32 136 IN OUT MTFTP4_PROTOCOL *Instance, 137 IN EFI_MTFTP4_PACKET *Packet, 138 IN UINT32 Len 144 139 ) 145 140 { 146 EFI_MTFTP4_TOKEN 147 EFI_STATUS 148 UINT16 149 UINT64 150 UINT32 151 UINT64 152 BOOLEAN 141 EFI_MTFTP4_TOKEN *Token; 142 EFI_STATUS Status; 143 UINT16 Block; 144 UINT64 Start; 145 UINT32 DataLen; 146 UINT64 BlockCounter; 147 BOOLEAN Completed; 153 148 154 149 Completed = FALSE; … … 161 156 // 162 157 if (DataLen < Instance->BlkSize) { 163 Completed = TRUE;158 Completed = TRUE; 164 159 Instance->LastBlock = Block; 165 160 Mtftp4SetLastBlockNum (&Instance->Blocks, Block); … … 182 177 183 178 if (Token->CheckPacket != NULL) { 184 Status = Token->CheckPacket (&Instance->Mtftp4, Token, (UINT16) 179 Status = Token->CheckPacket (&Instance->Mtftp4, Token, (UINT16)Len, Packet); 185 180 186 181 if (EFI_ERROR (Status)) { … … 188 183 Instance, 189 184 EFI_MTFTP4_ERRORCODE_ILLEGAL_OPERATION, 190 (UINT8 *) 185 (UINT8 *)"User aborted download" 191 186 ); 192 187 … … 196 191 197 192 if (Token->Buffer != NULL) { 198 193 Start = MultU64x32 (BlockCounter - 1, Instance->BlkSize); 199 194 200 195 if (Start + DataLen <= Token->BufferSize) { 201 CopyMem ((UINT8 *) 196 CopyMem ((UINT8 *)Token->Buffer + Start, Packet->Data.Data, DataLen); 202 197 203 198 // … … 207 202 Token->BufferSize = Start + DataLen; 208 203 } 209 210 204 } else if (Instance->LastBlock != 0) { 211 205 // … … 219 213 Instance, 220 214 EFI_MTFTP4_ERRORCODE_DISK_FULL, 221 (UINT8 *) 215 (UINT8 *)"User provided memory block is too small" 222 216 ); 223 217 … … 228 222 return EFI_SUCCESS; 229 223 } 230 231 224 232 225 /** … … 248 241 EFI_STATUS 249 242 Mtftp4RrqHandleData ( 250 IN MTFTP4_PROTOCOL 251 IN EFI_MTFTP4_PACKET 252 IN UINT32 253 IN BOOLEAN 254 243 IN MTFTP4_PROTOCOL *Instance, 244 IN EFI_MTFTP4_PACKET *Packet, 245 IN UINT32 Len, 246 IN BOOLEAN Multicast, 247 OUT BOOLEAN *Completed 255 248 ) 256 249 { 257 EFI_STATUS 258 UINT16 259 INTN 260 261 *Completed 262 Status 263 BlockNum 264 Expected 250 EFI_STATUS Status; 251 UINT16 BlockNum; 252 INTN Expected; 253 254 *Completed = FALSE; 255 Status = EFI_SUCCESS; 256 BlockNum = NTOHS (Packet->Data.Block); 257 Expected = Mtftp4GetNextBlockNum (&Instance->Blocks); 265 258 266 259 ASSERT (Expected >= 0); … … 275 268 // If Expected is 0, (UINT16) (Expected - 1) is also the expected Ack number (65535). 276 269 // 277 return Mtftp4RrqSendAck (Instance, (UINT16)(Expected - 1));270 return Mtftp4RrqSendAck (Instance, (UINT16)(Expected - 1)); 278 271 } 279 272 … … 287 280 // Record the total received and saved block number. 288 281 // 289 Instance->TotalBlock 282 Instance->TotalBlock++; 290 283 291 284 // … … 315 308 BlockNum = Instance->LastBlock; 316 309 *Completed = TRUE; 317 318 310 } else { 319 BlockNum = (UINT16) 320 } 321 322 if ( Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock) || Expected < 0) {311 BlockNum = (UINT16)(Expected - 1); 312 } 313 314 if ((Instance->WindowSize == (Instance->TotalBlock - Instance->AckedBlock)) || (Expected < 0)) { 323 315 Status = Mtftp4RrqSendAck (Instance, BlockNum); 324 316 } 325 326 317 } 327 318 328 319 return Status; 329 320 } 330 331 321 332 322 /** … … 349 339 BOOLEAN 350 340 Mtftp4RrqOackValid ( 351 IN MTFTP4_PROTOCOL 352 IN MTFTP4_OPTION 353 IN MTFTP4_OPTION 341 IN MTFTP4_PROTOCOL *This, 342 IN MTFTP4_OPTION *Reply, 343 IN MTFTP4_OPTION *Request 354 344 ) 355 345 { 356 357 346 // 358 347 // It is invalid for server to return options we don't request … … 366 355 // return the timeout matches that requested. 367 356 // 368 if ((((Reply->Exist & MTFTP4_BLKSIZE_EXIST) != 0) && (Reply->BlkSize > Request->BlkSize)) ||369 (((Reply->Exist & MTFTP4_WINDOWSIZE_EXIST) != 0) && (Reply->WindowSize > Request->WindowSize)) ||357 if ((((Reply->Exist & MTFTP4_BLKSIZE_EXIST) != 0) && (Reply->BlkSize > Request->BlkSize)) || 358 (((Reply->Exist & MTFTP4_WINDOWSIZE_EXIST) != 0) && (Reply->WindowSize > Request->WindowSize)) || 370 359 (((Reply->Exist & MTFTP4_TIMEOUT_EXIST) != 0) && (Reply->Timeout != Request->Timeout)) 371 ) { 360 ) 361 { 372 362 return FALSE; 373 363 } … … 391 381 } 392 382 393 394 383 /** 395 384 Configure a UDP IO port to receive the multicast. … … 406 395 EFIAPI 407 396 Mtftp4RrqConfigMcastPort ( 408 IN UDP_IO 409 IN VOID 397 IN UDP_IO *McastIo, 398 IN VOID *Context 410 399 ) 411 400 { 412 MTFTP4_PROTOCOL 413 EFI_MTFTP4_CONFIG_DATA 414 EFI_UDP4_CONFIG_DATA 415 EFI_IPv4_ADDRESS 416 EFI_STATUS 417 IP4_ADDR 418 419 Instance = (MTFTP4_PROTOCOL *)Context;420 Config 401 MTFTP4_PROTOCOL *Instance; 402 EFI_MTFTP4_CONFIG_DATA *Config; 403 EFI_UDP4_CONFIG_DATA UdpConfig; 404 EFI_IPv4_ADDRESS Group; 405 EFI_STATUS Status; 406 IP4_ADDR Ip; 407 408 Instance = (MTFTP4_PROTOCOL *)Context; 409 Config = &Instance->Config; 421 410 422 411 UdpConfig.AcceptBroadcast = FALSE; … … 432 421 IP4_COPY_ADDRESS (&UdpConfig.StationAddress, &Config->StationIp); 433 422 IP4_COPY_ADDRESS (&UdpConfig.SubnetMask, &Config->SubnetMask); 434 UdpConfig.StationPort 435 UdpConfig.RemotePort 423 UdpConfig.StationPort = Instance->McastPort; 424 UdpConfig.RemotePort = 0; 436 425 437 426 Ip = HTONL (Instance->ServerIp); … … 445 434 446 435 if (!Config->UseDefaultSetting && 447 !EFI_IP4_EQUAL (&mZeroIp4Addr, &Config->GatewayIp)) { 436 !EFI_IP4_EQUAL (&mZeroIp4Addr, &Config->GatewayIp)) 437 { 448 438 // 449 439 // The station IP address is manually configured and the Gateway IP is not 0. … … 473 463 } 474 464 475 476 465 /** 477 466 Function to process the OACK. … … 493 482 EFI_STATUS 494 483 Mtftp4RrqHandleOack ( 495 IN OUT MTFTP4_PROTOCOL 496 IN EFI_MTFTP4_PACKET 497 IN UINT32 498 IN BOOLEAN 499 484 IN OUT MTFTP4_PROTOCOL *Instance, 485 IN EFI_MTFTP4_PACKET *Packet, 486 IN UINT32 Len, 487 IN BOOLEAN Multicast, 488 OUT BOOLEAN *Completed 500 489 ) 501 490 { 502 MTFTP4_OPTION 503 EFI_STATUS 504 INTN 505 EFI_UDP4_PROTOCOL 491 MTFTP4_OPTION Reply; 492 EFI_STATUS Status; 493 INTN Expected; 494 EFI_UDP4_PROTOCOL *Udp4; 506 495 507 496 *Completed = FALSE; … … 526 515 527 516 if (EFI_ERROR (Status) || 528 !Mtftp4RrqOackValid (Instance, &Reply, &Instance->RequestOption)) { 517 !Mtftp4RrqOackValid (Instance, &Reply, &Instance->RequestOption)) 518 { 529 519 // 530 520 // Don't send an ERROR packet if the error is EFI_OUT_OF_RESOURCES. … … 534 524 Instance, 535 525 EFI_MTFTP4_ERRORCODE_ILLEGAL_OPERATION, 536 (UINT8 *) 526 (UINT8 *)"Malformatted OACK packet" 537 527 ); 538 528 } … … 542 532 543 533 if ((Reply.Exist & MTFTP4_MCAST_EXIST) != 0) { 544 545 534 // 546 535 // Save the multicast info. Always update the Master, only update the … … 555 544 Instance, 556 545 EFI_MTFTP4_ERRORCODE_ILLEGAL_OPERATION, 557 (UINT8 *) 546 (UINT8 *)"Illegal multicast setting" 558 547 ); 559 548 … … 564 553 // Create a UDP child then start receive the multicast from it. 565 554 // 566 Instance->McastIp 567 Instance->McastPort 555 Instance->McastIp = Reply.McastIp; 556 Instance->McastPort = Reply.McastPort; 568 557 if (Instance->McastUdpPort == NULL) { 569 558 Instance->McastUdpPort = UdpIoCreateIo ( … … 578 567 Instance->McastUdpPort->UdpHandle, 579 568 &gEfiUdp4ProtocolGuid, 580 (VOID **) 569 (VOID **)&Udp4, 581 570 Instance->Service->Image, 582 571 Instance->Handle, … … 591 580 } 592 581 593 594 582 if (Instance->McastUdpPort == NULL) { 595 583 return EFI_DEVICE_ERROR; … … 602 590 Instance, 603 591 EFI_MTFTP4_ERRORCODE_ACCESS_VIOLATION, 604 (UINT8 *) 592 (UINT8 *)"Failed to create socket to receive multicast packet" 605 593 ); 606 594 … … 623 611 } 624 612 } 625 626 613 } else { 627 614 Instance->Master = TRUE; … … 644 631 // or tell the server we want to receive the Expected block. 645 632 // 646 return Mtftp4RrqSendAck (Instance, (UINT16) 633 return Mtftp4RrqSendAck (Instance, (UINT16)(Expected - 1)); 647 634 } 648 649 635 650 636 /** … … 660 646 EFIAPI 661 647 Mtftp4RrqInput ( 662 IN NET_BUF 663 IN UDP_END_POINT 664 IN EFI_STATUS 665 IN VOID 648 IN NET_BUF *UdpPacket, 649 IN UDP_END_POINT *EndPoint, 650 IN EFI_STATUS IoStatus, 651 IN VOID *Context 666 652 ) 667 653 { 668 MTFTP4_PROTOCOL 669 EFI_MTFTP4_PACKET 670 BOOLEAN 671 BOOLEAN 672 EFI_STATUS 673 UINT16 674 UINT32 675 676 Instance = (MTFTP4_PROTOCOL *)Context;654 MTFTP4_PROTOCOL *Instance; 655 EFI_MTFTP4_PACKET *Packet; 656 BOOLEAN Completed; 657 BOOLEAN Multicast; 658 EFI_STATUS Status; 659 UINT16 Opcode; 660 UINT32 Len; 661 662 Instance = (MTFTP4_PROTOCOL *)Context; 677 663 NET_CHECK_SIGNATURE (Instance, MTFTP4_PROTOCOL_SIGNATURE); 678 664 … … 692 678 // Find the port this packet is from to restart receive correctly. 693 679 // 694 Multicast = (BOOLEAN) 680 Multicast = (BOOLEAN)(EndPoint->LocalAddr.Addr[0] == Instance->McastIp); 695 681 696 682 if (UdpPacket->TotalSize < MTFTP4_OPCODE_LEN) { … … 725 711 } 726 712 727 NetbufCopy (UdpPacket, 0, Len, (UINT8 *) Packet); 728 713 NetbufCopy (UdpPacket, 0, Len, (UINT8 *)Packet); 729 714 } else { 730 Packet = (EFI_MTFTP4_PACKET *) 715 Packet = (EFI_MTFTP4_PACKET *)NetbufGetByte (UdpPacket, 0, NULL); 731 716 ASSERT (Packet != NULL); 732 717 } … … 739 724 // 740 725 if ((Instance->Token->CheckPacket != NULL) && 741 ((Opcode == EFI_MTFTP4_OPCODE_OACK) || (Opcode == EFI_MTFTP4_OPCODE_ERROR))) {742 726 ((Opcode == EFI_MTFTP4_OPCODE_OACK) || (Opcode == EFI_MTFTP4_OPCODE_ERROR))) 727 { 743 728 Status = Instance->Token->CheckPacket ( 744 729 &Instance->Mtftp4, 745 730 Instance->Token, 746 (UINT16) 731 (UINT16)Len, 747 732 Packet 748 733 ); … … 756 741 Instance, 757 742 EFI_MTFTP4_ERRORCODE_REQUEST_DENIED, 758 (UINT8 *) 743 (UINT8 *)"User aborted the transfer" 759 744 ); 760 745 } … … 766 751 767 752 switch (Opcode) { 768 case EFI_MTFTP4_OPCODE_DATA: 769 if ((Len > (UINT32) (MTFTP4_DATA_HEAD_LEN + Instance->BlkSize)) || 770 (Len < (UINT32) MTFTP4_DATA_HEAD_LEN)) { 771 goto ON_EXIT; 772 } 773 774 Status = Mtftp4RrqHandleData (Instance, Packet, Len, Multicast, &Completed); 775 break; 776 777 case EFI_MTFTP4_OPCODE_OACK: 778 if (Multicast || (Len <= MTFTP4_OPCODE_LEN)) { 779 goto ON_EXIT; 780 } 781 782 Status = Mtftp4RrqHandleOack (Instance, Packet, Len, Multicast, &Completed); 783 break; 784 785 case EFI_MTFTP4_OPCODE_ERROR: 786 Status = EFI_TFTP_ERROR; 787 break; 788 789 default: 790 break; 753 case EFI_MTFTP4_OPCODE_DATA: 754 if ((Len > (UINT32)(MTFTP4_DATA_HEAD_LEN + Instance->BlkSize)) || 755 (Len < (UINT32)MTFTP4_DATA_HEAD_LEN)) 756 { 757 goto ON_EXIT; 758 } 759 760 Status = Mtftp4RrqHandleData (Instance, Packet, Len, Multicast, &Completed); 761 break; 762 763 case EFI_MTFTP4_OPCODE_OACK: 764 if (Multicast || (Len <= MTFTP4_OPCODE_LEN)) { 765 goto ON_EXIT; 766 } 767 768 Status = Mtftp4RrqHandleOack (Instance, Packet, Len, Multicast, &Completed); 769 break; 770 771 case EFI_MTFTP4_OPCODE_ERROR: 772 Status = EFI_TFTP_ERROR; 773 break; 774 775 default: 776 break; 791 777 } 792 778
Note:
See TracChangeset
for help on using the changeset viewer.