Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.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/UefiPxeBcDxe/PxeBcSupport.c
r85718 r99404 9 9 10 10 #include "PxeBcImpl.h" 11 12 11 13 12 /** … … 24 23 EFI_STATUS 25 24 PxeBcFlushStationIp ( 26 PXEBC_PRIVATE_DATA 27 EFI_IP_ADDRESS *StationIp, OPTIONAL28 EFI_IP_ADDRESS 29 ) 30 { 31 EFI_PXE_BASE_CODE_MODE 32 EFI_STATUS 33 EFI_ARP_CONFIG_DATA 25 PXEBC_PRIVATE_DATA *Private, 26 EFI_IP_ADDRESS *StationIp OPTIONAL, 27 EFI_IP_ADDRESS *SubnetMask OPTIONAL 28 ) 29 { 30 EFI_PXE_BASE_CODE_MODE *Mode; 31 EFI_STATUS Status; 32 EFI_ARP_CONFIG_DATA ArpConfigData; 34 33 35 34 Mode = Private->PxeBc.Mode; … … 37 36 ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); 38 37 39 if (Mode->UsingIpv6 && StationIp != NULL) {38 if (Mode->UsingIpv6 && (StationIp != NULL)) { 40 39 // 41 40 // Overwrite Udp6CfgData/Ip6CfgData StationAddress. … … 62 61 // 63 62 ArpConfigData.SwAddressType = 0x0800; 64 ArpConfigData.SwAddressLength = (UINT8) 65 ArpConfigData.StationAddress = StationIp;63 ArpConfigData.SwAddressLength = (UINT8)sizeof (EFI_IPv4_ADDRESS); 64 ArpConfigData.StationAddress = StationIp; 66 65 67 66 Private->Arp->Configure (Private->Arp, NULL); … … 83 82 } 84 83 85 if ( StationIp != NULL && SubnetMask != NULL) {84 if ((StationIp != NULL) && (SubnetMask != NULL)) { 86 85 // 87 86 // Updated the route table. … … 93 92 } 94 93 95 if ( StationIp != NULL || SubnetMask != NULL) {94 if ((StationIp != NULL) || (SubnetMask != NULL)) { 96 95 // 97 96 // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address. … … 113 112 } 114 113 115 116 114 /** 117 115 Notify the callback function when an event is triggered. … … 124 122 EFIAPI 125 123 PxeBcCommonNotify ( 126 IN EFI_EVENT Event, 127 IN VOID *Context 128 ) 129 { 130 *((BOOLEAN *) Context) = TRUE; 131 } 132 124 IN EFI_EVENT Event, 125 IN VOID *Context 126 ) 127 { 128 *((BOOLEAN *)Context) = TRUE; 129 } 133 130 134 131 /** … … 146 143 BOOLEAN 147 144 PxeBcCheckArpCache ( 148 IN EFI_PXE_BASE_CODE_MODE 149 IN EFI_IPv4_ADDRESS 150 OUT EFI_MAC_ADDRESS 151 ) 152 { 153 UINT32 145 IN EFI_PXE_BASE_CODE_MODE *Mode, 146 IN EFI_IPv4_ADDRESS *Ip4Addr, 147 OUT EFI_MAC_ADDRESS *MacAddress 148 ) 149 { 150 UINT32 Index; 154 151 155 152 ASSERT (!Mode->UsingIpv6); … … 172 169 } 173 170 174 175 171 /** 176 172 Update the arp cache periodically. … … 183 179 EFIAPI 184 180 PxeBcArpCacheUpdate ( 185 IN EFI_EVENT 186 IN VOID 181 IN EFI_EVENT Event, 182 IN VOID *Context 187 183 ) 188 184 { … … 195 191 EFI_STATUS Status; 196 192 197 Private = (PXEBC_PRIVATE_DATA *) 193 Private = (PXEBC_PRIVATE_DATA *)Context; 198 194 Mode = Private->PxeBc.Mode; 199 195 … … 229 225 CopyMem ( 230 226 &Mode->ArpCache[Index].MacAddr, 231 (UINT8 *) 227 (UINT8 *)(ArpEntry + 1) + ArpEntry->SwAddressLength, 232 228 ArpEntry->HwAddressLength 233 229 ); 234 ArpEntry = (EFI_ARP_FIND_DATA *) ((UINT8 *) ArpEntry + EntryLength); 235 } 236 } 237 230 ArpEntry = (EFI_ARP_FIND_DATA *)((UINT8 *)ArpEntry + EntryLength); 231 } 232 } 238 233 239 234 /** … … 246 241 EFIAPI 247 242 PxeBcIcmpErrorDpcHandle ( 248 IN VOID 249 ) 250 { 251 EFI_STATUS 252 EFI_IP4_RECEIVE_DATA 253 EFI_IP4_PROTOCOL 254 PXEBC_PRIVATE_DATA 255 EFI_PXE_BASE_CODE_MODE 256 UINT8 257 UINTN 258 UINT32 259 UINT8 260 261 Private = (PXEBC_PRIVATE_DATA *) 243 IN VOID *Context 244 ) 245 { 246 EFI_STATUS Status; 247 EFI_IP4_RECEIVE_DATA *RxData; 248 EFI_IP4_PROTOCOL *Ip4; 249 PXEBC_PRIVATE_DATA *Private; 250 EFI_PXE_BASE_CODE_MODE *Mode; 251 UINT8 Type; 252 UINTN Index; 253 UINT32 CopiedLen; 254 UINT8 *IcmpError; 255 256 Private = (PXEBC_PRIVATE_DATA *)Context; 262 257 Mode = &Private->Mode; 263 258 Status = Private->IcmpToken.Status; … … 285 280 } 286 281 287 if ( EFI_IP4 (RxData->Header->SourceAddress) != 0&&282 if ((EFI_IP4 (RxData->Header->SourceAddress) != 0) && 288 283 (NTOHL (Mode->SubnetMask.Addr[0]) != 0) && 289 IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) && 290 !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) { 284 IP4_NET_EQUAL (NTOHL (Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) && 285 !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) 286 { 291 287 // 292 288 // The source address of the received packet should be a valid unicast address. … … 307 303 ASSERT (RxData->Header->Protocol == EFI_IP_PROTO_ICMP); 308 304 309 Type = *((UINT8 *) RxData->FragmentTable[0].FragmentBuffer); 310 311 if (Type != ICMP_DEST_UNREACHABLE && 312 Type != ICMP_SOURCE_QUENCH && 313 Type != ICMP_REDIRECT && 314 Type != ICMP_TIME_EXCEEDED && 315 Type != ICMP_PARAMETER_PROBLEM) { 305 Type = *((UINT8 *)RxData->FragmentTable[0].FragmentBuffer); 306 307 if ((Type != ICMP_DEST_UNREACHABLE) && 308 (Type != ICMP_SOURCE_QUENCH) && 309 (Type != ICMP_REDIRECT) && 310 (Type != ICMP_TIME_EXCEEDED) && 311 (Type != ICMP_PARAMETER_PROBLEM)) 312 { 316 313 // 317 314 // The type of the receveid ICMP message should be ICMP_ERROR_MESSAGE. … … 324 321 // 325 322 CopiedLen = 0; 326 IcmpError = (UINT8 *) 323 IcmpError = (UINT8 *)&Mode->IcmpError; 327 324 328 325 for (Index = 0; Index < RxData->FragmentCount; Index++) { … … 341 338 ); 342 339 } 340 343 341 IcmpError += CopiedLen; 344 342 } … … 352 350 } 353 351 354 355 352 /** 356 353 Callback function to update the latest ICMP6 error message. … … 363 360 EFIAPI 364 361 PxeBcIcmpErrorUpdate ( 365 IN EFI_EVENT 366 IN VOID 362 IN EFI_EVENT Event, 363 IN VOID *Context 367 364 ) 368 365 { 369 366 QueueDpc (TPL_CALLBACK, PxeBcIcmpErrorDpcHandle, Context); 370 367 } 371 372 368 373 369 /** … … 380 376 EFIAPI 381 377 PxeBcIcmp6ErrorDpcHandle ( 382 IN VOID 378 IN VOID *Context 383 379 ) 384 380 { … … 393 389 UINT8 *Icmp6Error; 394 390 395 Private = (PXEBC_PRIVATE_DATA *) 391 Private = (PXEBC_PRIVATE_DATA *)Context; 396 392 Mode = &Private->Mode; 397 393 Status = Private->Icmp6Token.Status; … … 427 423 428 424 if (!NetIp6IsUnspecifiedAddr (&Mode->StationIp.v6) && 429 !EFI_IP6_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v6)) { 425 !EFI_IP6_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v6)) 426 { 430 427 // 431 428 // The destination address of the received packet should be equal to the host address. … … 439 436 ASSERT (RxData->Header->NextHeader == IP6_ICMP); 440 437 441 Type = *((UINT8 *) RxData->FragmentTable[0].FragmentBuffer); 442 443 if (Type != ICMP_V6_DEST_UNREACHABLE && 444 Type != ICMP_V6_PACKET_TOO_BIG && 445 Type != ICMP_V6_TIME_EXCEEDED && 446 Type != ICMP_V6_PARAMETER_PROBLEM) { 438 Type = *((UINT8 *)RxData->FragmentTable[0].FragmentBuffer); 439 440 if ((Type != ICMP_V6_DEST_UNREACHABLE) && 441 (Type != ICMP_V6_PACKET_TOO_BIG) && 442 (Type != ICMP_V6_TIME_EXCEEDED) && 443 (Type != ICMP_V6_PARAMETER_PROBLEM)) 444 { 447 445 // 448 446 // The type of the receveid packet should be an ICMP6 error message. … … 455 453 // 456 454 CopiedLen = 0; 457 Icmp6Error = (UINT8 *) 455 Icmp6Error = (UINT8 *)&Mode->IcmpError; 458 456 459 457 for (Index = 0; Index < RxData->FragmentCount; Index++) { … … 472 470 ); 473 471 } 472 474 473 Icmp6Error += CopiedLen; 475 474 } … … 483 482 } 484 483 485 486 484 /** 487 485 Callback function to update the latest ICMP6 error message. … … 494 492 EFIAPI 495 493 PxeBcIcmp6ErrorUpdate ( 496 IN EFI_EVENT 497 IN VOID 494 IN EFI_EVENT Event, 495 IN VOID *Context 498 496 ) 499 497 { 500 498 QueueDpc (TPL_CALLBACK, PxeBcIcmp6ErrorDpcHandle, Context); 501 499 } 502 503 500 504 501 /** … … 564 561 } 565 562 566 if (!EFI_ERROR (Status) && *SrcPort == 0) {563 if (!EFI_ERROR (Status) && (*SrcPort == 0)) { 567 564 Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); 568 565 *SrcPort = Udp4CfgData.StationPort; … … 571 568 return Status; 572 569 } 573 574 570 575 571 /** … … 614 610 } 615 611 616 if (!EFI_ERROR (Status) && *SrcPort == 0) {612 if (!EFI_ERROR (Status) && (*SrcPort == 0)) { 617 613 Udp6->GetModeData (Udp6, &CfgData, NULL, NULL, NULL); 618 614 *SrcPort = CfgData.StationPort; … … 621 617 return Status; 622 618 } 623 624 619 625 620 /** … … 643 638 EFI_STATUS 644 639 PxeBcUdp4Write ( 645 IN EFI_UDP4_PROTOCOL 646 IN EFI_UDP4_SESSION_DATA 647 IN EFI_EVENT 648 IN EFI_IPv4_ADDRESS 649 IN UINTN 650 IN VOID 651 IN UINTN 652 IN VOID 653 ) 654 { 655 EFI_UDP4_COMPLETION_TOKEN Token;656 EFI_UDP4_TRANSMIT_DATA *TxData;657 UINT32 TxLength;658 UINT32 FragCount;659 UINT32 DataLength;660 BOOLEAN IsDone;661 EFI_STATUS Status;640 IN EFI_UDP4_PROTOCOL *Udp4, 641 IN EFI_UDP4_SESSION_DATA *Session, 642 IN EFI_EVENT TimeoutEvent, 643 IN EFI_IPv4_ADDRESS *Gateway OPTIONAL, 644 IN UINTN *HeaderSize OPTIONAL, 645 IN VOID *HeaderPtr OPTIONAL, 646 IN UINTN *BufferSize, 647 IN VOID *BufferPtr 648 ) 649 { 650 EFI_UDP4_COMPLETION_TOKEN Token; 651 EFI_UDP4_TRANSMIT_DATA *TxData; 652 UINT32 TxLength; 653 UINT32 FragCount; 654 UINT32 DataLength; 655 BOOLEAN IsDone; 656 EFI_STATUS Status; 662 657 663 658 // … … 666 661 FragCount = (HeaderSize != NULL) ? 2 : 1; 667 662 TxLength = sizeof (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP4_FRAGMENT_DATA); 668 TxData = (EFI_UDP4_TRANSMIT_DATA *) 663 TxData = (EFI_UDP4_TRANSMIT_DATA *)AllocateZeroPool (TxLength); 669 664 if (TxData == NULL) { 670 665 return EFI_OUT_OF_RESOURCES; … … 672 667 673 668 TxData->FragmentCount = FragCount; 674 TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) 669 TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32)*BufferSize; 675 670 TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; 676 DataLength = (UINT32) 671 DataLength = (UINT32)*BufferSize; 677 672 678 673 if (HeaderSize != NULL) { 679 TxData->FragmentTable[0].FragmentLength = (UINT32) 674 TxData->FragmentTable[0].FragmentLength = (UINT32)*HeaderSize; 680 675 TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; 681 DataLength += (UINT32) 676 DataLength += (UINT32)*HeaderSize; 682 677 } 683 678 684 679 if (Gateway != NULL) { 685 TxData->GatewayAddress 686 } 687 688 TxData->UdpSessionData 689 TxData->DataLength 690 Token.Packet.TxData 691 Token.Status 692 IsDone 680 TxData->GatewayAddress = Gateway; 681 } 682 683 TxData->UdpSessionData = Session; 684 TxData->DataLength = DataLength; 685 Token.Packet.TxData = TxData; 686 Token.Status = EFI_NOT_READY; 687 IsDone = FALSE; 693 688 694 689 Status = gBS->CreateEvent ( … … 713 708 while (!IsDone && 714 709 Token.Status == EFI_NOT_READY && 715 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { 710 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) 711 { 716 712 Udp4->Poll (Udp4); 717 713 } … … 723 719 gBS->CloseEvent (Token.Event); 724 720 } 721 725 722 FreePool (TxData); 726 723 727 724 return Status; 728 725 } 729 730 726 731 727 /** … … 748 744 EFI_STATUS 749 745 PxeBcUdp6Write ( 750 IN EFI_UDP6_PROTOCOL 751 IN EFI_UDP6_SESSION_DATA 752 IN EFI_EVENT 753 IN UINTN 754 IN VOID 755 IN UINTN 756 IN VOID 757 ) 758 { 759 EFI_UDP6_COMPLETION_TOKEN Token;760 EFI_UDP6_TRANSMIT_DATA *TxData;761 UINT32 TxLength;762 UINT32 FragCount;763 UINT32 DataLength;764 BOOLEAN IsDone;765 EFI_STATUS Status;746 IN EFI_UDP6_PROTOCOL *Udp6, 747 IN EFI_UDP6_SESSION_DATA *Session, 748 IN EFI_EVENT TimeoutEvent, 749 IN UINTN *HeaderSize OPTIONAL, 750 IN VOID *HeaderPtr OPTIONAL, 751 IN UINTN *BufferSize, 752 IN VOID *BufferPtr 753 ) 754 { 755 EFI_UDP6_COMPLETION_TOKEN Token; 756 EFI_UDP6_TRANSMIT_DATA *TxData; 757 UINT32 TxLength; 758 UINT32 FragCount; 759 UINT32 DataLength; 760 BOOLEAN IsDone; 761 EFI_STATUS Status; 766 762 767 763 // … … 770 766 FragCount = (HeaderSize != NULL) ? 2 : 1; 771 767 TxLength = sizeof (EFI_UDP6_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP6_FRAGMENT_DATA); 772 TxData = (EFI_UDP6_TRANSMIT_DATA *) 768 TxData = (EFI_UDP6_TRANSMIT_DATA *)AllocateZeroPool (TxLength); 773 769 if (TxData == NULL) { 774 770 return EFI_OUT_OF_RESOURCES; … … 776 772 777 773 TxData->FragmentCount = FragCount; 778 TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) 774 TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32)*BufferSize; 779 775 TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; 780 DataLength = (UINT32) 776 DataLength = (UINT32)*BufferSize; 781 777 782 778 if (HeaderSize != NULL) { 783 TxData->FragmentTable[0].FragmentLength = (UINT32) 779 TxData->FragmentTable[0].FragmentLength = (UINT32)*HeaderSize; 784 780 TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; 785 DataLength += (UINT32) 786 } 787 788 TxData->UdpSessionData 789 TxData->DataLength 790 Token.Packet.TxData 791 Token.Status 792 IsDone 781 DataLength += (UINT32)*HeaderSize; 782 } 783 784 TxData->UdpSessionData = Session; 785 TxData->DataLength = DataLength; 786 Token.Packet.TxData = TxData; 787 Token.Status = EFI_NOT_READY; 788 IsDone = FALSE; 793 789 794 790 Status = gBS->CreateEvent ( … … 813 809 while (!IsDone && 814 810 Token.Status == EFI_NOT_READY && 815 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { 811 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) 812 { 816 813 Udp6->Poll (Udp6); 817 814 } … … 823 820 gBS->CloseEvent (Token.Event); 824 821 } 822 825 823 FreePool (TxData); 826 824 827 825 return Status; 828 826 } 829 830 827 831 828 /** … … 842 839 BOOLEAN 843 840 PxeBcCheckByIpFilter ( 844 IN EFI_PXE_BASE_CODE_MODE 845 IN VOID 846 IN UINT16 847 ) 848 { 849 EFI_IP_ADDRESS 850 UINTN 841 IN EFI_PXE_BASE_CODE_MODE *Mode, 842 IN VOID *Session, 843 IN UINT16 OpFlags 844 ) 845 { 846 EFI_IP_ADDRESS DestinationIp; 847 UINTN Index; 851 848 852 849 if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) == 0) { … … 864 861 CopyMem ( 865 862 &DestinationIp, 866 &((EFI_UDP6_SESSION_DATA *) 863 &((EFI_UDP6_SESSION_DATA *)Session)->DestinationAddress, 867 864 sizeof (EFI_IPv6_ADDRESS) 868 865 ); … … 872 869 CopyMem ( 873 870 &DestinationIp, 874 &((EFI_UDP4_SESSION_DATA *) 871 &((EFI_UDP4_SESSION_DATA *)Session)->DestinationAddress, 875 872 sizeof (EFI_IPv4_ADDRESS) 876 873 ); … … 878 875 } 879 876 880 if (( Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0&&877 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) && 881 878 (IP4_IS_MULTICAST (DestinationIp.Addr[0]) || 882 IP6_IS_MULTICAST (&DestinationIp))) { 879 IP6_IS_MULTICAST (&DestinationIp))) 880 { 883 881 return TRUE; 884 882 } 885 883 886 if ((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0 && 887 IP4_IS_LOCAL_BROADCAST (DestinationIp.Addr[0])) { 884 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) && 885 IP4_IS_LOCAL_BROADCAST (DestinationIp.Addr[0])) 886 { 888 887 ASSERT (!Mode->UsingIpv6); 889 888 return TRUE; 890 889 } 891 890 892 if (( Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0&&891 if (((Mode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) && 893 892 (EFI_IP4_EQUAL (&Mode->StationIp.v4, &DestinationIp) || 894 EFI_IP6_EQUAL (&Mode->StationIp.v6, &DestinationIp))) { 893 EFI_IP6_EQUAL (&Mode->StationIp.v6, &DestinationIp))) 894 { 895 895 // 896 896 // Matched if the dest address is equal to the station address. … … 902 902 ASSERT (Index < EFI_PXE_BASE_CODE_MAX_IPCNT); 903 903 if (EFI_IP4_EQUAL (&Mode->IpFilter.IpList[Index].v4, &DestinationIp) || 904 EFI_IP6_EQUAL (&Mode->IpFilter.IpList[Index].v6, &DestinationIp)) { 904 EFI_IP6_EQUAL (&Mode->IpFilter.IpList[Index].v6, &DestinationIp)) 905 { 905 906 // 906 907 // Matched if the dest address is equal to any of address in the filter list. … … 913 914 } 914 915 915 916 916 /** 917 917 Filter the received packet using the destination Ip. … … 928 928 BOOLEAN 929 929 PxeBcCheckByDestIp ( 930 IN EFI_PXE_BASE_CODE_MODE 931 IN VOID 932 IN OUT EFI_IP_ADDRESS 933 IN UINT16 930 IN EFI_PXE_BASE_CODE_MODE *Mode, 931 IN VOID *Session, 932 IN OUT EFI_IP_ADDRESS *DestIp, 933 IN UINT16 OpFlags 934 934 ) 935 935 { … … 953 953 ); 954 954 } 955 956 } 955 } 956 957 957 return TRUE; 958 } else if ( DestIp != NULL&&958 } else if ((DestIp != NULL) && 959 959 (EFI_IP4_EQUAL (DestIp, &((EFI_UDP4_SESSION_DATA *)Session)->DestinationAddress) || 960 EFI_IP6_EQUAL (DestIp, &((EFI_UDP6_SESSION_DATA *)Session)->DestinationAddress))) { 960 EFI_IP6_EQUAL (DestIp, &((EFI_UDP6_SESSION_DATA *)Session)->DestinationAddress))) 961 { 961 962 // 962 963 // The destination address in the received packet is matched if present. … … 964 965 return TRUE; 965 966 } else if (EFI_IP4_EQUAL (&Mode->StationIp, &((EFI_UDP4_SESSION_DATA *)Session)->DestinationAddress) || 966 EFI_IP6_EQUAL (&Mode->StationIp, &((EFI_UDP6_SESSION_DATA *)Session)->DestinationAddress)) { 967 EFI_IP6_EQUAL (&Mode->StationIp, &((EFI_UDP6_SESSION_DATA *)Session)->DestinationAddress)) 968 { 967 969 // 968 970 // The destination address in the received packet is equal to the host address. … … 973 975 return FALSE; 974 976 } 975 976 977 977 978 /** … … 989 990 BOOLEAN 990 991 PxeBcCheckByDestPort ( 991 IN EFI_PXE_BASE_CODE_MODE 992 IN VOID 993 IN OUT UINT16 994 IN UINT16 995 ) 996 { 997 UINT16 992 IN EFI_PXE_BASE_CODE_MODE *Mode, 993 IN VOID *Session, 994 IN OUT UINT16 *DestPort, 995 IN UINT16 OpFlags 996 ) 997 { 998 UINT16 Port; 998 999 999 1000 if (Mode->UsingIpv6) { 1000 Port = ((EFI_UDP6_SESSION_DATA *) 1001 Port = ((EFI_UDP6_SESSION_DATA *)Session)->DestinationPort; 1001 1002 } else { 1002 Port = ((EFI_UDP4_SESSION_DATA *) 1003 Port = ((EFI_UDP4_SESSION_DATA *)Session)->DestinationPort; 1003 1004 } 1004 1005 … … 1010 1011 *DestPort = Port; 1011 1012 } 1013 1012 1014 return TRUE; 1013 } else if ( DestPort != NULL && *DestPort == Port) {1015 } else if ((DestPort != NULL) && (*DestPort == Port)) { 1014 1016 // 1015 1017 // The destination port in the received packet is matched if present. … … 1020 1022 return FALSE; 1021 1023 } 1022 1023 1024 1024 1025 /** … … 1036 1037 BOOLEAN 1037 1038 PxeBcFilterBySrcIp ( 1038 IN EFI_PXE_BASE_CODE_MODE 1039 IN VOID 1040 IN OUT EFI_IP_ADDRESS 1041 IN UINT16 1039 IN EFI_PXE_BASE_CODE_MODE *Mode, 1040 IN VOID *Session, 1041 IN OUT EFI_IP_ADDRESS *SrcIp, 1042 IN UINT16 OpFlags 1042 1043 ) 1043 1044 { … … 1061 1062 ); 1062 1063 } 1063 1064 } 1064 } 1065 1065 1066 return TRUE; 1066 } else if ( SrcIp != NULL&&1067 } else if ((SrcIp != NULL) && 1067 1068 (EFI_IP4_EQUAL (SrcIp, &((EFI_UDP4_SESSION_DATA *)Session)->SourceAddress) || 1068 EFI_IP6_EQUAL (SrcIp, &((EFI_UDP6_SESSION_DATA *)Session)->SourceAddress))) { 1069 EFI_IP6_EQUAL (SrcIp, &((EFI_UDP6_SESSION_DATA *)Session)->SourceAddress))) 1070 { 1069 1071 // 1070 1072 // The source address in the received packet is matched if present. … … 1075 1077 return FALSE; 1076 1078 } 1077 1078 1079 1079 1080 /** … … 1091 1092 BOOLEAN 1092 1093 PxeBcFilterBySrcPort ( 1093 IN EFI_PXE_BASE_CODE_MODE 1094 IN VOID 1095 IN OUT UINT16 1096 IN UINT16 1097 ) 1098 { 1099 UINT16 1094 IN EFI_PXE_BASE_CODE_MODE *Mode, 1095 IN VOID *Session, 1096 IN OUT UINT16 *SrcPort, 1097 IN UINT16 OpFlags 1098 ) 1099 { 1100 UINT16 Port; 1100 1101 1101 1102 if (Mode->UsingIpv6) { 1102 Port = ((EFI_UDP6_SESSION_DATA *) 1103 Port = ((EFI_UDP6_SESSION_DATA *)Session)->SourcePort; 1103 1104 } else { 1104 Port = ((EFI_UDP4_SESSION_DATA *) 1105 Port = ((EFI_UDP4_SESSION_DATA *)Session)->SourcePort; 1105 1106 } 1106 1107 … … 1112 1113 *SrcPort = Port; 1113 1114 } 1115 1114 1116 return TRUE; 1115 } else if ( SrcPort != NULL && *SrcPort == Port) {1117 } else if ((SrcPort != NULL) && (*SrcPort == Port)) { 1116 1118 // 1117 1119 // The source port in the received packet is matched if present. … … 1122 1124 return FALSE; 1123 1125 } 1124 1125 1126 1126 1127 /** … … 1145 1146 EFI_STATUS 1146 1147 PxeBcUdp4Read ( 1147 IN EFI_UDP4_PROTOCOL 1148 IN EFI_UDP4_COMPLETION_TOKEN 1149 IN EFI_PXE_BASE_CODE_MODE 1150 IN EFI_EVENT 1151 IN UINT16 1152 IN BOOLEAN 1153 OUT BOOLEAN*IsMatched,1154 IN OUT EFI_IP_ADDRESS 1155 IN OUT EFI_PXE_BASE_CODE_UDP_PORT 1156 IN OUT EFI_IP_ADDRESS 1157 IN OUT EFI_PXE_BASE_CODE_UDP_PORT 1158 ) 1159 { 1160 EFI_UDP4_RECEIVE_DATA 1161 EFI_UDP4_SESSION_DATA 1162 EFI_STATUS 1148 IN EFI_UDP4_PROTOCOL *Udp4, 1149 IN EFI_UDP4_COMPLETION_TOKEN *Token, 1150 IN EFI_PXE_BASE_CODE_MODE *Mode, 1151 IN EFI_EVENT TimeoutEvent, 1152 IN UINT16 OpFlags, 1153 IN BOOLEAN *IsDone, 1154 OUT BOOLEAN *IsMatched, 1155 IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, 1156 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, 1157 IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, 1158 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL 1159 ) 1160 { 1161 EFI_UDP4_RECEIVE_DATA *RxData; 1162 EFI_UDP4_SESSION_DATA *Session; 1163 EFI_STATUS Status; 1163 1164 1164 1165 Token->Status = EFI_NOT_READY; … … 1175 1176 while (!(*IsDone) && 1176 1177 Token->Status == EFI_NOT_READY && 1177 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { 1178 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) 1179 { 1178 1180 // 1179 1181 // Poll the token until reply/ICMPv6 error message received or timeout. 1180 1182 // 1181 1183 Udp4->Poll (Udp4); 1182 if (Token->Status == EFI_ICMP_ERROR || 1183 Token->Status == EFI_NETWORK_UNREACHABLE || 1184 Token->Status == EFI_HOST_UNREACHABLE || 1185 Token->Status == EFI_PROTOCOL_UNREACHABLE || 1186 Token->Status == EFI_PORT_UNREACHABLE) { 1184 if ((Token->Status == EFI_ICMP_ERROR) || 1185 (Token->Status == EFI_NETWORK_UNREACHABLE) || 1186 (Token->Status == EFI_HOST_UNREACHABLE) || 1187 (Token->Status == EFI_PROTOCOL_UNREACHABLE) || 1188 (Token->Status == EFI_PORT_UNREACHABLE)) 1189 { 1187 1190 break; 1188 1191 } … … 1195 1198 // check whether this packet matches the filters 1196 1199 // 1197 RxData 1198 Session 1200 RxData = Token->Packet.RxData; 1201 Session = &RxData->UdpSession; 1199 1202 1200 1203 *IsMatched = PxeBcCheckByIpFilter (Mode, Session, OpFlags); … … 1226 1229 return Status; 1227 1230 } 1228 1229 1231 1230 1232 /** … … 1249 1251 EFI_STATUS 1250 1252 PxeBcUdp6Read ( 1251 IN EFI_UDP6_PROTOCOL 1252 IN EFI_UDP6_COMPLETION_TOKEN 1253 IN EFI_PXE_BASE_CODE_MODE 1254 IN EFI_EVENT 1255 IN UINT16 1256 IN BOOLEAN 1257 OUT BOOLEAN*IsMatched,1258 IN OUT EFI_IP_ADDRESS 1259 IN OUT EFI_PXE_BASE_CODE_UDP_PORT 1260 IN OUT EFI_IP_ADDRESS 1261 IN OUT EFI_PXE_BASE_CODE_UDP_PORT 1262 ) 1263 { 1264 EFI_UDP6_RECEIVE_DATA 1265 EFI_UDP6_SESSION_DATA 1266 EFI_STATUS 1253 IN EFI_UDP6_PROTOCOL *Udp6, 1254 IN EFI_UDP6_COMPLETION_TOKEN *Token, 1255 IN EFI_PXE_BASE_CODE_MODE *Mode, 1256 IN EFI_EVENT TimeoutEvent, 1257 IN UINT16 OpFlags, 1258 IN BOOLEAN *IsDone, 1259 OUT BOOLEAN *IsMatched, 1260 IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, 1261 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, 1262 IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, 1263 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL 1264 ) 1265 { 1266 EFI_UDP6_RECEIVE_DATA *RxData; 1267 EFI_UDP6_SESSION_DATA *Session; 1268 EFI_STATUS Status; 1267 1269 1268 1270 Token->Status = EFI_NOT_READY; … … 1279 1281 while (!(*IsDone) && 1280 1282 Token->Status == EFI_NOT_READY && 1281 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { 1283 EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) 1284 { 1282 1285 // 1283 1286 // Poll the token until reply/ICMPv6 error message received or timeout. 1284 1287 // 1285 1288 Udp6->Poll (Udp6); 1286 if (Token->Status == EFI_ICMP_ERROR || 1287 Token->Status == EFI_NETWORK_UNREACHABLE || 1288 Token->Status == EFI_HOST_UNREACHABLE || 1289 Token->Status == EFI_PROTOCOL_UNREACHABLE || 1290 Token->Status == EFI_PORT_UNREACHABLE) { 1289 if ((Token->Status == EFI_ICMP_ERROR) || 1290 (Token->Status == EFI_NETWORK_UNREACHABLE) || 1291 (Token->Status == EFI_HOST_UNREACHABLE) || 1292 (Token->Status == EFI_PROTOCOL_UNREACHABLE) || 1293 (Token->Status == EFI_PORT_UNREACHABLE)) 1294 { 1291 1295 break; 1292 1296 } … … 1299 1303 // check whether this packet matches the filters 1300 1304 // 1301 RxData 1302 Session 1305 RxData = Token->Packet.RxData; 1306 Session = &RxData->UdpSession; 1303 1307 1304 1308 *IsMatched = PxeBcCheckByIpFilter (Mode, Session, OpFlags); … … 1331 1335 } 1332 1336 1333 1334 1337 /** 1335 1338 This function is to display the IPv4 address. … … 1340 1343 VOID 1341 1344 PxeBcShowIp4Addr ( 1342 IN EFI_IPv4_ADDRESS 1343 ) 1344 { 1345 UINTN 1345 IN EFI_IPv4_ADDRESS *Ip 1346 ) 1347 { 1348 UINTN Index; 1346 1349 1347 1350 for (Index = 0; Index < 4; Index++) { … … 1353 1356 } 1354 1357 1355 1356 1358 /** 1357 1359 This function is to display the IPv6 address. … … 1362 1364 VOID 1363 1365 PxeBcShowIp6Addr ( 1364 IN EFI_IPv6_ADDRESS 1365 ) 1366 { 1367 UINTN 1366 IN EFI_IPv6_ADDRESS *Ip 1367 ) 1368 { 1369 UINTN Index; 1368 1370 1369 1371 for (Index = 0; Index < 16; Index++) { 1370 1371 1372 if (Ip->Addr[Index] != 0) { 1372 1373 AsciiPrint ("%x", Ip->Addr[Index]); 1373 1374 } 1375 1374 1376 Index++; 1375 1377 if (Index > 15) { 1376 1378 return; 1377 1379 } 1380 1378 1381 if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) { 1379 1382 AsciiPrint ("0"); 1380 1383 } 1384 1381 1385 AsciiPrint ("%x", Ip->Addr[Index]); 1382 1386 if (Index < 15) { … … 1386 1390 } 1387 1391 1388 1389 1392 /** 1390 1393 This function is to convert UINTN to ASCII string with the required formatting. … … 1397 1400 VOID 1398 1401 PxeBcUintnToAscDecWithFormat ( 1399 IN UINTN Number, 1400 IN UINT8 *Buffer, 1401 IN INTN Length 1402 ) 1403 { 1404 UINTN Remainder; 1405 1406 for (; Length > 0; Length--) { 1407 Remainder = Number % 10; 1408 Number /= 10; 1409 Buffer[Length - 1] = (UINT8) ('0' + Remainder); 1410 } 1411 } 1412 1402 IN UINTN Number, 1403 IN UINT8 *Buffer, 1404 IN INTN Length 1405 ) 1406 { 1407 UINTN Remainder; 1408 1409 for ( ; Length > 0; Length--) { 1410 Remainder = Number % 10; 1411 Number /= 10; 1412 Buffer[Length - 1] = (UINT8)('0' + Remainder); 1413 } 1414 } 1413 1415 1414 1416 /** … … 1425 1427 UINTN 1426 1428 PxeBcUintnToAscDec ( 1427 IN UINTN 1428 IN UINT8 1429 IN UINTN 1430 ) 1431 { 1432 UINTN 1433 UINTN 1434 CHAR8 1435 1436 Index 1437 TempStr[Index] 1429 IN UINTN Number, 1430 IN UINT8 *Buffer, 1431 IN UINTN BufferSize 1432 ) 1433 { 1434 UINTN Index; 1435 UINTN Length; 1436 CHAR8 TempStr[64]; 1437 1438 Index = 63; 1439 TempStr[Index] = 0; 1438 1440 1439 1441 do { 1440 1442 Index--; 1441 TempStr[Index] = (CHAR8) 1442 Number = (UINTN) 1443 TempStr[Index] = (CHAR8)('0' + (Number % 10)); 1444 Number = (UINTN)(Number / 10); 1443 1445 } while (Number != 0); 1444 1446 1445 AsciiStrCpyS ((CHAR8 *) 1446 1447 Length = AsciiStrLen ((CHAR8 *) 1447 AsciiStrCpyS ((CHAR8 *)Buffer, BufferSize, &TempStr[Index]); 1448 1449 Length = AsciiStrLen ((CHAR8 *)Buffer); 1448 1450 1449 1451 return Length; 1450 1452 } 1451 1452 1453 1453 1454 /** … … 1463 1464 EFI_STATUS 1464 1465 PxeBcUniHexToUint8 ( 1465 OUT UINT8 1466 IN CHAR16 1466 OUT UINT8 *Digit, 1467 IN CHAR16 Char 1467 1468 ) 1468 1469 { 1469 1470 if ((Char >= L'0') && (Char <= L'9')) { 1470 *Digit = (UINT8) 1471 *Digit = (UINT8)(Char - L'0'); 1471 1472 return EFI_SUCCESS; 1472 1473 } 1473 1474 1474 1475 if ((Char >= L'A') && (Char <= L'F')) { 1475 *Digit = (UINT8) 1476 *Digit = (UINT8)(Char - L'A' + 0x0A); 1476 1477 return EFI_SUCCESS; 1477 1478 } 1478 1479 1479 1480 if ((Char >= L'a') && (Char <= L'f')) { 1480 *Digit = (UINT8) 1481 *Digit = (UINT8)(Char - L'a' + 0x0A); 1481 1482 return EFI_SUCCESS; 1482 1483 } … … 1493 1494 VOID 1494 1495 CalcElapsedTime ( 1495 IN PXEBC_PRIVATE_DATA 1496 ) 1497 { 1498 EFI_TIME 1499 UINT64 1500 UINT64 1496 IN PXEBC_PRIVATE_DATA *Private 1497 ) 1498 { 1499 EFI_TIME Time; 1500 UINT64 CurrentStamp; 1501 UINT64 ElapsedTimeValue; 1501 1502 1502 1503 // … … 1530 1531 ElapsedTimeValue = 0xffff; 1531 1532 } 1533 1532 1534 // 1533 1535 // Save the elapsed time … … 1536 1538 } 1537 1539 } 1538
Note:
See TracChangeset
for help on using the changeset viewer.