Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Library/DxeIpIoLib/DxeIpIoLib.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/Library/DxeIpIoLib/DxeIpIoLib.c
r85718 r99404 19 19 #include <Library/DpcLib.h> 20 20 21 22 21 GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY mActiveIpIoList = { 23 22 &mActiveIpIoList, … … 32 31 FALSE, 33 32 FALSE, 34 {{0, 0, 0, 0}}, 35 {{0, 0, 0, 0}}, 33 { 34 { 0, 0, 0, 0 } 35 }, 36 { 37 { 0, 0, 0, 0 } 38 }, 36 39 0, 37 40 255, … … 47 50 TRUE, 48 51 FALSE, 49 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 50 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 52 { 53 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 54 }, 55 { 56 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 57 }, 51 58 0, 52 59 255, … … 57 64 58 65 GLOBAL_REMOVE_IF_UNREFERENCED ICMP_ERROR_INFO mIcmpErrMap[10] = { 59 { FALSE, TRUE}, // ICMP_ERR_UNREACH_NET60 { FALSE, TRUE}, // ICMP_ERR_UNREACH_HOST61 { TRUE, TRUE}, // ICMP_ERR_UNREACH_PROTOCOL62 { TRUE, TRUE}, // ICMP_ERR_UNREACH_PORT63 { TRUE, TRUE}, // ICMP_ERR_MSGSIZE64 { FALSE, TRUE}, // ICMP_ERR_UNREACH_SRCFAIL65 { FALSE, TRUE}, // ICMP_ERR_TIMXCEED_INTRANS66 { FALSE, TRUE}, // ICMP_ERR_TIMEXCEED_REASS67 { FALSE, FALSE}, // ICMP_ERR_QUENCH68 { FALSE, TRUE }// ICMP_ERR_PARAMPROB66 { FALSE, TRUE }, // ICMP_ERR_UNREACH_NET 67 { FALSE, TRUE }, // ICMP_ERR_UNREACH_HOST 68 { TRUE, TRUE }, // ICMP_ERR_UNREACH_PROTOCOL 69 { TRUE, TRUE }, // ICMP_ERR_UNREACH_PORT 70 { TRUE, TRUE }, // ICMP_ERR_MSGSIZE 71 { FALSE, TRUE }, // ICMP_ERR_UNREACH_SRCFAIL 72 { FALSE, TRUE }, // ICMP_ERR_TIMXCEED_INTRANS 73 { FALSE, TRUE }, // ICMP_ERR_TIMEXCEED_REASS 74 { FALSE, FALSE }, // ICMP_ERR_QUENCH 75 { FALSE, TRUE } // ICMP_ERR_PARAMPROB 69 76 }; 70 77 71 78 GLOBAL_REMOVE_IF_UNREFERENCED ICMP_ERROR_INFO mIcmp6ErrMap[10] = { 72 { FALSE, TRUE}, // ICMP6_ERR_UNREACH_NET73 { FALSE, TRUE}, // ICMP6_ERR_UNREACH_HOST74 { TRUE, TRUE}, // ICMP6_ERR_UNREACH_PROTOCOL75 { TRUE, TRUE}, // ICMP6_ERR_UNREACH_PORT76 { TRUE, TRUE}, // ICMP6_ERR_PACKAGE_TOOBIG77 { FALSE, TRUE}, // ICMP6_ERR_TIMXCEED_HOPLIMIT78 { FALSE, TRUE}, // ICMP6_ERR_TIMXCEED_REASS79 { FALSE, TRUE}, // ICMP6_ERR_PARAMPROB_HEADER80 { FALSE, TRUE}, // ICMP6_ERR_PARAMPROB_NEXHEADER81 { FALSE, TRUE} // ICMP6_ERR_PARAMPROB_IPV6OPTION79 { FALSE, TRUE }, // ICMP6_ERR_UNREACH_NET 80 { FALSE, TRUE }, // ICMP6_ERR_UNREACH_HOST 81 { TRUE, TRUE }, // ICMP6_ERR_UNREACH_PROTOCOL 82 { TRUE, TRUE }, // ICMP6_ERR_UNREACH_PORT 83 { TRUE, TRUE }, // ICMP6_ERR_PACKAGE_TOOBIG 84 { FALSE, TRUE }, // ICMP6_ERR_TIMXCEED_HOPLIMIT 85 { FALSE, TRUE }, // ICMP6_ERR_TIMXCEED_REASS 86 { FALSE, TRUE }, // ICMP6_ERR_PARAMPROB_HEADER 87 { FALSE, TRUE }, // ICMP6_ERR_PARAMPROB_NEXHEADER 88 { FALSE, TRUE } // ICMP6_ERR_PARAMPROB_IPV6OPTION 82 89 }; 83 84 90 85 91 /** … … 92 98 EFIAPI 93 99 IpIoTransmitHandlerDpc ( 94 IN VOID 100 IN VOID *Context 95 101 ); 96 97 102 98 103 /** … … 106 111 EFIAPI 107 112 IpIoTransmitHandler ( 108 IN EFI_EVENT Event,109 IN VOID *Context113 IN EFI_EVENT Event, 114 IN VOID *Context 110 115 ); 111 112 116 113 117 /** … … 144 148 ServiceBindingGuid = &gEfiIp4ServiceBindingProtocolGuid; 145 149 IpProtocolGuid = &gEfiIp4ProtocolGuid; 146 } else if (IpVersion == IP_VERSION_6) {150 } else if (IpVersion == IP_VERSION_6) { 147 151 ServiceBindingGuid = &gEfiIp6ServiceBindingProtocolGuid; 148 152 IpProtocolGuid = &gEfiIp6ProtocolGuid; … … 190 194 } 191 195 192 193 196 /** 194 197 This function close the previously opened IP protocol and destroy the IP child. … … 266 269 EFI_STATUS 267 270 IpIoIcmpv4Handler ( 268 IN IP_IO *IpIo,269 IN OUT NET_BUF *Pkt,270 IN EFI_NET_SESSION_DATA *Session271 IN IP_IO *IpIo, 272 IN OUT NET_BUF *Pkt, 273 IN EFI_NET_SESSION_DATA *Session 271 274 ) 272 275 { … … 292 295 293 296 IcmpHdr = NET_PROTO_HDR (Pkt, IP4_ICMP_ERROR_HEAD); 294 IpHdr = (EFI_IP4_HEADER *) 297 IpHdr = (EFI_IP4_HEADER *)(&IcmpHdr->IpHead); 295 298 296 299 if (Pkt->TotalSize < ICMP_ERRLEN (IpHdr)) { 297 298 300 return EFI_ABORTED; 299 301 } … … 306 308 // 307 309 switch (Type) { 308 case ICMP_TYPE_UNREACH: 309 switch (Code) { 310 case ICMP_CODE_UNREACH_NET: 311 case ICMP_CODE_UNREACH_HOST: 312 case ICMP_CODE_UNREACH_PROTOCOL: 313 case ICMP_CODE_UNREACH_PORT: 314 case ICMP_CODE_UNREACH_SRCFAIL: 315 IcmpErr = (UINT8) (ICMP_ERR_UNREACH_NET + Code); 310 case ICMP_TYPE_UNREACH: 311 switch (Code) { 312 case ICMP_CODE_UNREACH_NET: 313 case ICMP_CODE_UNREACH_HOST: 314 case ICMP_CODE_UNREACH_PROTOCOL: 315 case ICMP_CODE_UNREACH_PORT: 316 case ICMP_CODE_UNREACH_SRCFAIL: 317 IcmpErr = (UINT8)(ICMP_ERR_UNREACH_NET + Code); 318 319 break; 320 321 case ICMP_CODE_UNREACH_NEEDFRAG: 322 IcmpErr = ICMP_ERR_MSGSIZE; 323 324 break; 325 326 case ICMP_CODE_UNREACH_NET_UNKNOWN: 327 case ICMP_CODE_UNREACH_NET_PROHIB: 328 case ICMP_CODE_UNREACH_TOSNET: 329 IcmpErr = ICMP_ERR_UNREACH_NET; 330 331 break; 332 333 case ICMP_CODE_UNREACH_HOST_UNKNOWN: 334 case ICMP_CODE_UNREACH_ISOLATED: 335 case ICMP_CODE_UNREACH_HOST_PROHIB: 336 case ICMP_CODE_UNREACH_TOSHOST: 337 IcmpErr = ICMP_ERR_UNREACH_HOST; 338 339 break; 340 341 default: 342 return EFI_ABORTED; 343 } 316 344 317 345 break; 318 346 319 case ICMP_CODE_UNREACH_NEEDFRAG: 320 IcmpErr = ICMP_ERR_MSGSIZE; 347 case ICMP_TYPE_TIMXCEED: 348 if (Code > 1) { 349 return EFI_ABORTED; 350 } 351 352 IcmpErr = (UINT8)(Code + ICMP_ERR_TIMXCEED_INTRANS); 321 353 322 354 break; 323 355 324 case ICMP_CODE_UNREACH_NET_UNKNOWN: 325 case ICMP_CODE_UNREACH_NET_PROHIB: 326 case ICMP_CODE_UNREACH_TOSNET: 327 IcmpErr = ICMP_ERR_UNREACH_NET; 356 case ICMP_TYPE_PARAMPROB: 357 if (Code > 1) { 358 return EFI_ABORTED; 359 } 360 361 IcmpErr = ICMP_ERR_PARAMPROB; 328 362 329 363 break; 330 364 331 case ICMP_CODE_UNREACH_HOST_UNKNOWN: 332 case ICMP_CODE_UNREACH_ISOLATED: 333 case ICMP_CODE_UNREACH_HOST_PROHIB: 334 case ICMP_CODE_UNREACH_TOSHOST: 335 IcmpErr = ICMP_ERR_UNREACH_HOST; 365 case ICMP_TYPE_SOURCEQUENCH: 366 if (Code != 0) { 367 return EFI_ABORTED; 368 } 369 370 IcmpErr = ICMP_ERR_QUENCH; 336 371 337 372 break; … … 339 374 default: 340 375 return EFI_ABORTED; 341 }342 343 break;344 345 case ICMP_TYPE_TIMXCEED:346 if (Code > 1) {347 return EFI_ABORTED;348 }349 350 IcmpErr = (UINT8) (Code + ICMP_ERR_TIMXCEED_INTRANS);351 352 break;353 354 case ICMP_TYPE_PARAMPROB:355 if (Code > 1) {356 return EFI_ABORTED;357 }358 359 IcmpErr = ICMP_ERR_PARAMPROB;360 361 break;362 363 case ICMP_TYPE_SOURCEQUENCH:364 if (Code != 0) {365 return EFI_ABORTED;366 }367 368 IcmpErr = ICMP_ERR_QUENCH;369 370 break;371 372 default:373 return EFI_ABORTED;374 376 } 375 377 … … 378 380 // IP and ICMP header 379 381 // 380 PayLoadHdr = (UINT8 *) ((UINT8 *)IpHdr + EFI_IP4_HEADER_LEN (IpHdr));381 TrimBytes = (UINT32) (PayLoadHdr - (UINT8 *)IcmpHdr);382 PayLoadHdr = (UINT8 *)((UINT8 *)IpHdr + EFI_IP4_HEADER_LEN (IpHdr)); 383 TrimBytes = (UINT32)(PayLoadHdr - (UINT8 *)IcmpHdr); 382 384 383 385 NetbufTrim (Pkt, TrimBytes, TRUE); … … 408 410 EFI_STATUS 409 411 IpIoIcmpv6Handler ( 410 IN IP_IO *IpIo,411 IN OUT NET_BUF *Pkt,412 IN EFI_NET_SESSION_DATA *Session412 IN IP_IO *IpIo, 413 IN OUT NET_BUF *Pkt, 414 IN EFI_NET_SESSION_DATA *Session 413 415 ) 414 416 { … … 432 434 // 433 435 if (Pkt->TotalSize < sizeof (IP6_ICMP_ERROR_HEAD)) { 434 435 436 return EFI_ABORTED; 436 437 } … … 444 445 // 445 446 switch (Type) { 446 case ICMP_V6_DEST_UNREACHABLE: 447 switch (Code) { 448 case ICMP_V6_NO_ROUTE_TO_DEST: 449 case ICMP_V6_BEYOND_SCOPE: 450 case ICMP_V6_ROUTE_REJECTED: 451 IcmpErr = ICMP6_ERR_UNREACH_NET; 447 case ICMP_V6_DEST_UNREACHABLE: 448 switch (Code) { 449 case ICMP_V6_NO_ROUTE_TO_DEST: 450 case ICMP_V6_BEYOND_SCOPE: 451 case ICMP_V6_ROUTE_REJECTED: 452 IcmpErr = ICMP6_ERR_UNREACH_NET; 453 454 break; 455 456 case ICMP_V6_COMM_PROHIBITED: 457 case ICMP_V6_ADDR_UNREACHABLE: 458 case ICMP_V6_SOURCE_ADDR_FAILED: 459 IcmpErr = ICMP6_ERR_UNREACH_HOST; 460 461 break; 462 463 case ICMP_V6_PORT_UNREACHABLE: 464 IcmpErr = ICMP6_ERR_UNREACH_PORT; 465 466 break; 467 468 default: 469 return EFI_ABORTED; 470 } 452 471 453 472 break; 454 473 455 case ICMP_V6_COMM_PROHIBITED: 456 case ICMP_V6_ADDR_UNREACHABLE: 457 case ICMP_V6_SOURCE_ADDR_FAILED: 458 IcmpErr = ICMP6_ERR_UNREACH_HOST; 474 case ICMP_V6_PACKET_TOO_BIG: 475 if (Code >= 1) { 476 return EFI_ABORTED; 477 } 478 479 IcmpErr = ICMP6_ERR_PACKAGE_TOOBIG; 459 480 460 481 break; 461 482 462 case ICMP_V6_PORT_UNREACHABLE: 463 IcmpErr = ICMP6_ERR_UNREACH_PORT; 483 case ICMP_V6_TIME_EXCEEDED: 484 if (Code > 1) { 485 return EFI_ABORTED; 486 } 487 488 IcmpErr = (UINT8)(ICMP6_ERR_TIMXCEED_HOPLIMIT + Code); 464 489 465 490 break; 466 491 467 default: 492 case ICMP_V6_PARAMETER_PROBLEM: 493 if (Code > 3) { 494 return EFI_ABORTED; 495 } 496 497 IcmpErr = (UINT8)(ICMP6_ERR_PARAMPROB_HEADER + Code); 498 499 break; 500 501 default: 502 468 503 return EFI_ABORTED; 469 } 470 471 break; 472 473 case ICMP_V6_PACKET_TOO_BIG: 474 if (Code >= 1) { 475 return EFI_ABORTED; 476 } 477 478 IcmpErr = ICMP6_ERR_PACKAGE_TOOBIG; 479 480 break; 481 482 case ICMP_V6_TIME_EXCEEDED: 483 if (Code > 1) { 484 return EFI_ABORTED; 485 } 486 487 IcmpErr = (UINT8) (ICMP6_ERR_TIMXCEED_HOPLIMIT + Code); 488 489 break; 490 491 case ICMP_V6_PARAMETER_PROBLEM: 492 if (Code > 3) { 493 return EFI_ABORTED; 494 } 495 496 IcmpErr = (UINT8) (ICMP6_ERR_PARAMPROB_HEADER + Code); 497 498 break; 499 500 default: 501 502 return EFI_ABORTED; 503 } 504 } 504 505 505 506 // … … 508 509 // 509 510 510 IpHdr = (EFI_IP6_HEADER *) 511 IpHdr = (EFI_IP6_HEADER *)(&IcmpHdr->IpHead); 511 512 NextHeader = IpHdr->NextHeader; 512 PayLoadHdr = (UINT8 *) ((UINT8 *)IcmpHdr + sizeof (IP6_ICMP_ERROR_HEAD));513 PayLoadHdr = (UINT8 *)((UINT8 *)IcmpHdr + sizeof (IP6_ICMP_ERROR_HEAD)); 513 514 Flag = TRUE; 514 515 515 516 do { 516 517 switch (NextHeader) { 517 case EFI_IP_PROTO_UDP:518 case EFI_IP_PROTO_TCP:519 case EFI_IP_PROTO_ICMP:520 case IP6_NO_NEXT_HEADER:521 Flag = FALSE;522 523 break;524 525 case IP6_HOP_BY_HOP:526 case IP6_DESTINATION:527 //528 // The Hdr Ext Len is 8-bit unsigned integer in 8-octet units, not including529 // the first 8 octets.530 //531 NextHeader = *(PayLoadHdr);532 PayLoadHdr = (UINT8 *)(PayLoadHdr + (*(PayLoadHdr + 1) + 1) * 8);533 534 break;535 536 case IP6_FRAGMENT:537 //538 // The Fragment Header Length is 8 octets.539 //540 NextHeader = *(PayLoadHdr);541 PayLoadHdr = (UINT8 *)(PayLoadHdr + 8);542 543 break;544 545 default:546 547 return EFI_ABORTED;518 case EFI_IP_PROTO_UDP: 519 case EFI_IP_PROTO_TCP: 520 case EFI_IP_PROTO_ICMP: 521 case IP6_NO_NEXT_HEADER: 522 Flag = FALSE; 523 524 break; 525 526 case IP6_HOP_BY_HOP: 527 case IP6_DESTINATION: 528 // 529 // The Hdr Ext Len is 8-bit unsigned integer in 8-octet units, not including 530 // the first 8 octets. 531 // 532 NextHeader = *(PayLoadHdr); 533 PayLoadHdr = (UINT8 *)(PayLoadHdr + (*(PayLoadHdr + 1) + 1) * 8); 534 535 break; 536 537 case IP6_FRAGMENT: 538 // 539 // The Fragment Header Length is 8 octets. 540 // 541 NextHeader = *(PayLoadHdr); 542 PayLoadHdr = (UINT8 *)(PayLoadHdr + 8); 543 544 break; 545 546 default: 547 548 return EFI_ABORTED; 548 549 } 549 550 } while (Flag); 550 551 551 TrimBytes = (UINT32) (PayLoadHdr - (UINT8 *)IcmpHdr);552 TrimBytes = (UINT32)(PayLoadHdr - (UINT8 *)IcmpHdr); 552 553 553 554 NetbufTrim (Pkt, TrimBytes, TRUE); … … 578 579 EFI_STATUS 579 580 IpIoIcmpHandler ( 580 IN IP_IO *IpIo, 581 IN OUT NET_BUF *Pkt, 582 IN EFI_NET_SESSION_DATA *Session 583 ) 584 { 585 581 IN IP_IO *IpIo, 582 IN OUT NET_BUF *Pkt, 583 IN EFI_NET_SESSION_DATA *Session 584 ) 585 { 586 586 if (IpIo->IpVersion == IP_VERSION_4) { 587 588 587 return IpIoIcmpv4Handler (IpIo, Pkt, Session); 589 590 588 } else if (IpIo->IpVersion == IP_VERSION_6) { 591 592 589 return IpIoIcmpv6Handler (IpIo, Pkt, Session); 593 594 } else { 595 590 } else { 596 591 return EFI_UNSUPPORTED; 597 592 } 598 593 } 599 600 594 601 595 /** … … 613 607 ) 614 608 { 615 gBS->SignalEvent ((EFI_EVENT) Event); 616 } 617 609 gBS->SignalEvent ((EFI_EVENT)Event); 610 } 618 611 619 612 /** … … 635 628 IP_IO_SEND_ENTRY * 636 629 IpIoCreateSndEntry ( 637 IN OUT IP_IO *IpIo,638 IN OUT NET_BUF *Pkt,639 IN IP_IO_IP_PROTOCOL Sender,640 IN VOID *Context OPTIONAL,641 IN VOID *NotifyData OPTIONAL,642 IN EFI_IP_ADDRESS *Dest OPTIONAL,643 IN IP_IO_OVERRIDE *Override644 ) 645 { 646 IP_IO_SEND_ENTRY 647 EFI_EVENT 648 EFI_STATUS 649 NET_FRAGMENT 650 UINT32 651 IP_IO_OVERRIDE 652 IP_IO_IP_TX_DATA 653 EFI_IP4_TRANSMIT_DATA 654 EFI_IP6_TRANSMIT_DATA 630 IN OUT IP_IO *IpIo, 631 IN OUT NET_BUF *Pkt, 632 IN IP_IO_IP_PROTOCOL Sender, 633 IN VOID *Context OPTIONAL, 634 IN VOID *NotifyData OPTIONAL, 635 IN EFI_IP_ADDRESS *Dest OPTIONAL, 636 IN IP_IO_OVERRIDE *Override 637 ) 638 { 639 IP_IO_SEND_ENTRY *SndEntry; 640 EFI_EVENT Event; 641 EFI_STATUS Status; 642 NET_FRAGMENT *ExtFragment; 643 UINT32 FragmentCount; 644 IP_IO_OVERRIDE *OverrideData; 645 IP_IO_IP_TX_DATA *TxData; 646 EFI_IP4_TRANSMIT_DATA *Ip4TxData; 647 EFI_IP6_TRANSMIT_DATA *Ip6TxData; 655 648 656 649 if ((IpIo->IpVersion != IP_VERSION_4) && (IpIo->IpVersion != IP_VERSION_6)) { … … 686 679 // Allocate resource for TxData 687 680 // 688 TxData = (IP_IO_IP_TX_DATA *) 689 sizeof (IP_IO_IP_TX_DATA) + sizeof (NET_FRAGMENT) * (FragmentCount - 1)690 );681 TxData = (IP_IO_IP_TX_DATA *)AllocatePool ( 682 sizeof (IP_IO_IP_TX_DATA) + sizeof (NET_FRAGMENT) * (FragmentCount - 1) 683 ); 691 684 692 685 if (NULL == TxData) { … … 698 691 // 699 692 if (IpIo->IpVersion == IP_VERSION_4) { 700 ExtFragment = (NET_FRAGMENT *) 701 } else { 702 ExtFragment = (NET_FRAGMENT *) 693 ExtFragment = (NET_FRAGMENT *)TxData->Ip4TxData.FragmentTable; 694 } else { 695 ExtFragment = (NET_FRAGMENT *)TxData->Ip6TxData.FragmentTable; 703 696 } 704 697 705 698 NetbufBuildExt (Pkt, ExtFragment, &FragmentCount); 706 699 707 708 700 // 709 701 // Allocate resource for OverrideData if needed 710 702 // 711 703 if (NULL != Override) { 712 713 704 OverrideData = AllocateCopyPool (sizeof (IP_IO_OVERRIDE), Override); 714 705 if (NULL == OverrideData) { … … 721 712 // 722 713 if (IpIo->IpVersion == IP_VERSION_4) { 723 724 714 Ip4TxData = &TxData->Ip4TxData; 725 715 … … 738 728 SndEntry->SndToken.Ip4Token.Packet.TxData = Ip4TxData; 739 729 } else { 740 741 730 Ip6TxData = &TxData->Ip6TxData; 742 731 … … 763 752 // Set the fields of SndEntry 764 753 // 765 SndEntry->IpIo 766 SndEntry->Ip 767 SndEntry->Context 768 SndEntry->NotifyData 769 770 SndEntry->Pkt 754 SndEntry->IpIo = IpIo; 755 SndEntry->Ip = Sender; 756 SndEntry->Context = Context; 757 SndEntry->NotifyData = NotifyData; 758 759 SndEntry->Pkt = Pkt; 771 760 NET_GET_REF (Pkt); 772 761 … … 795 784 return NULL; 796 785 } 797 798 786 799 787 /** … … 815 803 816 804 if (SndEntry->IpIo->IpVersion == IP_VERSION_4) { 817 Event 818 TxData = (IP_IO_IP_TX_DATA *)SndEntry->SndToken.Ip4Token.Packet.TxData;819 Override = (IP_IO_OVERRIDE *)TxData->Ip4TxData.OverrideData;805 Event = SndEntry->SndToken.Ip4Token.Event; 806 TxData = (IP_IO_IP_TX_DATA *)SndEntry->SndToken.Ip4Token.Packet.TxData; 807 Override = (IP_IO_OVERRIDE *)TxData->Ip4TxData.OverrideData; 820 808 } else if (SndEntry->IpIo->IpVersion == IP_VERSION_6) { 821 Event 822 TxData = (IP_IO_IP_TX_DATA *)SndEntry->SndToken.Ip6Token.Packet.TxData;823 Override = (IP_IO_OVERRIDE *)TxData->Ip6TxData.OverrideData;824 } else { 825 return 809 Event = SndEntry->SndToken.Ip6Token.Event; 810 TxData = (IP_IO_IP_TX_DATA *)SndEntry->SndToken.Ip6Token.Packet.TxData; 811 Override = (IP_IO_OVERRIDE *)TxData->Ip6TxData.OverrideData; 812 } else { 813 return; 826 814 } 827 815 … … 840 828 FreePool (SndEntry); 841 829 } 842 843 830 844 831 /** … … 851 838 EFIAPI 852 839 IpIoTransmitHandlerDpc ( 853 IN VOID 840 IN VOID *Context 854 841 ) 855 842 { … … 858 845 EFI_STATUS Status; 859 846 860 SndEntry = (IP_IO_SEND_ENTRY *)Context;861 862 IpIo 847 SndEntry = (IP_IO_SEND_ENTRY *)Context; 848 849 IpIo = SndEntry->IpIo; 863 850 864 851 if (IpIo->IpVersion == IP_VERSION_4) { 865 852 Status = SndEntry->SndToken.Ip4Token.Status; 866 } else if (IpIo->IpVersion == IP_VERSION_6) {853 } else if (IpIo->IpVersion == IP_VERSION_6) { 867 854 Status = SndEntry->SndToken.Ip6Token.Status; 868 855 } else { 869 return 856 return; 870 857 } 871 858 … … 882 869 } 883 870 884 885 871 /** 886 872 Notify function for IP transmit token. … … 893 879 EFIAPI 894 880 IpIoTransmitHandler ( 895 IN EFI_EVENT Event,896 IN VOID *Context881 IN EFI_EVENT Event, 882 IN VOID *Context 897 883 ) 898 884 { … … 902 888 QueueDpc (TPL_CALLBACK, IpIoTransmitHandlerDpc, Context); 903 889 } 904 905 890 906 891 /** … … 913 898 EFIAPI 914 899 IpIoDummyHandlerDpc ( 915 IN VOID 916 ) 917 { 918 IP_IO_IP_INFO 919 EFI_STATUS 920 EFI_EVENT 921 922 IpInfo = (IP_IO_IP_INFO *)Context;900 IN VOID *Context 901 ) 902 { 903 IP_IO_IP_INFO *IpInfo; 904 EFI_STATUS Status; 905 EFI_EVENT RecycleEvent; 906 907 IpInfo = (IP_IO_IP_INFO *)Context; 923 908 924 909 if ((IpInfo->IpVersion != IP_VERSION_4) && (IpInfo->IpVersion != IP_VERSION_6)) { 925 return 910 return; 926 911 } 927 912 … … 941 926 } 942 927 } 943 944 945 928 946 929 if (EFI_ABORTED == Status) { … … 974 957 } 975 958 976 977 959 /** 978 960 This function add IpIoDummyHandlerDpc to the end of the DPC queue. … … 985 967 EFIAPI 986 968 IpIoDummyHandler ( 987 IN EFI_EVENT Event,988 IN VOID *Context969 IN EFI_EVENT Event, 970 IN VOID *Context 989 971 ) 990 972 { … … 994 976 QueueDpc (TPL_CALLBACK, IpIoDummyHandlerDpc, Context); 995 977 } 996 997 978 998 979 /** … … 1006 987 EFIAPI 1007 988 IpIoListenHandlerDpc ( 1008 IN VOID 989 IN VOID *Context 1009 990 ) 1010 991 { … … 1015 996 NET_BUF *Pkt; 1016 997 1017 IpIo = (IP_IO *) 998 IpIo = (IP_IO *)Context; 1018 999 1019 1000 if (IpIo->IpVersion == IP_VERSION_4) { 1020 1001 Status = IpIo->RcvToken.Ip4Token.Status; 1021 RxData = (IP_IO_IP_RX_DATA *) 1002 RxData = (IP_IO_IP_RX_DATA *)IpIo->RcvToken.Ip4Token.Packet.RxData; 1022 1003 } else if (IpIo->IpVersion == IP_VERSION_6) { 1023 1004 Status = IpIo->RcvToken.Ip6Token.Status; 1024 RxData = (IP_IO_IP_RX_DATA *) 1005 RxData = (IP_IO_IP_RX_DATA *)IpIo->RcvToken.Ip6Token.Packet.RxData; 1025 1006 } else { 1026 1007 return; … … 1065 1046 goto CleanUp; 1066 1047 } 1048 1067 1049 if ((EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress) != 0) && 1068 1050 (IpIo->SubnetMask != 0) && 1069 IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), IpIo->SubnetMask) && 1070 !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), IpIo->SubnetMask)) { 1051 IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *)RxData)->Header->SourceAddress), IpIo->SubnetMask) && 1052 !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *)RxData)->Header->SourceAddress), IpIo->SubnetMask)) 1053 { 1071 1054 // 1072 1055 // The source address doesn't match StationIp and it's not a unicast IP address, discard it. … … 1091 1074 // 1092 1075 Pkt = NetbufFromExt ( 1093 (NET_FRAGMENT *) 1076 (NET_FRAGMENT *)RxData->Ip4RxData.FragmentTable, 1094 1077 RxData->Ip4RxData.FragmentCount, 1095 1078 0, … … 1112 1095 } else { 1113 1096 ASSERT (RxData->Ip6RxData.Header != NULL); 1114 if (!NetIp6IsValidUnicast (&RxData->Ip6RxData.Header->SourceAddress)) {1097 if (!NetIp6IsValidUnicast (&RxData->Ip6RxData.Header->SourceAddress)) { 1115 1098 goto CleanUp; 1116 1099 } … … 1132 1115 // 1133 1116 Pkt = NetbufFromExt ( 1134 (NET_FRAGMENT *) 1117 (NET_FRAGMENT *)RxData->Ip6RxData.FragmentTable, 1135 1118 RxData->Ip6RxData.FragmentCount, 1136 1119 0, … … 1149 1132 &Session.Source, 1150 1133 &RxData->Ip6RxData.Header->SourceAddress, 1151 sizeof (EFI_IPv6_ADDRESS)1134 sizeof (EFI_IPv6_ADDRESS) 1152 1135 ); 1153 1136 CopyMem ( 1154 1137 &Session.Dest, 1155 1138 &RxData->Ip6RxData.Header->DestinationAddress, 1156 sizeof (EFI_IPv6_ADDRESS)1139 sizeof (EFI_IPv6_ADDRESS) 1157 1140 ); 1158 1141 Session.IpHdr.Ip6Hdr = RxData->Ip6RxData.Header; … … 1162 1145 1163 1146 if (EFI_SUCCESS == Status) { 1164 1165 1147 IpIo->PktRcvdNotify (EFI_SUCCESS, 0, &Session, Pkt, IpIo->RcvdContext); 1166 1148 } else { … … 1178 1160 CleanUp: 1179 1161 1180 if (IpIo->IpVersion == IP_VERSION_4) {1162 if (IpIo->IpVersion == IP_VERSION_4) { 1181 1163 gBS->SignalEvent (RxData->Ip4RxData.RecycleSignal); 1182 1164 } else { … … 1186 1168 Resume: 1187 1169 1188 if (IpIo->IpVersion == IP_VERSION_4) {1170 if (IpIo->IpVersion == IP_VERSION_4) { 1189 1171 IpIo->Ip.Ip4->Receive (IpIo->Ip.Ip4, &(IpIo->RcvToken.Ip4Token)); 1190 1172 } else { … … 1203 1185 EFIAPI 1204 1186 IpIoListenHandler ( 1205 IN EFI_EVENT Event,1206 IN VOID *Context1187 IN EFI_EVENT Event, 1188 IN VOID *Context 1207 1189 ) 1208 1190 { … … 1212 1194 QueueDpc (TPL_CALLBACK, IpIoListenHandlerDpc, Context); 1213 1195 } 1214 1215 1196 1216 1197 /** … … 1235 1216 EFIAPI 1236 1217 IpIoCreate ( 1237 IN EFI_HANDLE Image,1238 IN EFI_HANDLE Controller,1239 IN UINT8 IpVersion1218 IN EFI_HANDLE Image, 1219 IN EFI_HANDLE Controller, 1220 IN UINT8 IpVersion 1240 1221 ) 1241 1222 { … … 1253 1234 InitializeListHead (&(IpIo->PendingSndList)); 1254 1235 InitializeListHead (&(IpIo->IpList)); 1255 IpIo->Controller 1256 IpIo->Image 1257 IpIo->IpVersion 1258 Event 1236 IpIo->Controller = Controller; 1237 IpIo->Image = Image; 1238 IpIo->IpVersion = IpVersion; 1239 Event = NULL; 1259 1240 1260 1241 Status = gBS->CreateEvent ( … … 1283 1264 &IpIo->ChildHandle, 1284 1265 IpVersion, 1285 (VOID **) &(IpIo->Ip)1266 (VOID **)&(IpIo->Ip) 1286 1267 ); 1287 1268 if (EFI_ERROR (Status)) { … … 1301 1282 return NULL; 1302 1283 } 1303 1304 1284 1305 1285 /** … … 1329 1309 EFIAPI 1330 1310 IpIoOpen ( 1331 IN OUT IP_IO *IpIo,1332 IN IP_IO_OPEN_DATA *OpenData1333 ) 1334 { 1335 EFI_STATUS 1336 UINT8 1337 1338 if ( IpIo == NULL || OpenData == NULL) {1311 IN OUT IP_IO *IpIo, 1312 IN IP_IO_OPEN_DATA *OpenData 1313 ) 1314 { 1315 EFI_STATUS Status; 1316 UINT8 IpVersion; 1317 1318 if ((IpIo == NULL) || (OpenData == NULL)) { 1339 1319 return EFI_INVALID_PARAMETER; 1340 1320 } … … 1351 1331 // configure ip 1352 1332 // 1353 if (IpVersion == IP_VERSION_4) {1333 if (IpVersion == IP_VERSION_4) { 1354 1334 // 1355 1335 // RawData mode is no supported. … … 1361 1341 1362 1342 if (!OpenData->IpConfigData.Ip4CfgData.UseDefaultAddress) { 1363 IpIo->StationIp = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.StationAddress);1343 IpIo->StationIp = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.StationAddress); 1364 1344 IpIo->SubnetMask = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.SubnetMask); 1365 1345 } … … 1370 1350 ); 1371 1351 } else { 1372 1373 1352 Status = IpIo->Ip.Ip6->Configure ( 1374 1353 IpIo->Ip.Ip6, … … 1386 1365 // @bug its code 1387 1366 // 1388 if (IpVersion == IP_VERSION_4) {1367 if (IpVersion == IP_VERSION_4) { 1389 1368 Status = IpIo->Ip.Ip4->Routes ( 1390 1369 IpIo->Ip.Ip4, … … 1403 1382 IpIo->PktSentNotify = OpenData->PktSentNotify; 1404 1383 1405 IpIo->RcvdContext 1406 IpIo->SndContext 1407 1408 if (IpVersion == IP_VERSION_4) {1384 IpIo->RcvdContext = OpenData->RcvdContext; 1385 IpIo->SndContext = OpenData->SndContext; 1386 1387 if (IpVersion == IP_VERSION_4) { 1409 1388 IpIo->Protocol = OpenData->IpConfigData.Ip4CfgData.DefaultProtocol; 1410 1389 … … 1420 1399 return Status; 1421 1400 } 1422 1423 } else { 1424 1401 } else { 1425 1402 IpIo->Protocol = OpenData->IpConfigData.Ip6CfgData.DefaultProtocol; 1426 Status = IpIo->Ip.Ip6->Receive (1427 IpIo->Ip.Ip6,1428 &(IpIo->RcvToken.Ip6Token)1429 );1403 Status = IpIo->Ip.Ip6->Receive ( 1404 IpIo->Ip.Ip6, 1405 &(IpIo->RcvToken.Ip6Token) 1406 ); 1430 1407 if (EFI_ERROR (Status)) { 1431 1408 IpIo->Ip.Ip6->Configure (IpIo->Ip.Ip6, NULL); … … 1440 1417 } 1441 1418 1442 1443 1419 /** 1444 1420 Stop an IP_IO instance. … … 1459 1435 EFIAPI 1460 1436 IpIoStop ( 1461 IN OUT IP_IO *IpIo1462 ) 1463 { 1464 EFI_STATUS 1465 IP_IO_IP_INFO 1466 UINT8 1437 IN OUT IP_IO *IpIo 1438 ) 1439 { 1440 EFI_STATUS Status; 1441 IP_IO_IP_INFO *IpInfo; 1442 UINT8 IpVersion; 1467 1443 1468 1444 if (IpIo == NULL) { … … 1491 1467 Status = IpIo->Ip.Ip6->Configure (IpIo->Ip.Ip6, NULL); 1492 1468 } 1469 1493 1470 if (EFI_ERROR (Status)) { 1494 1471 return Status; … … 1515 1492 // Close the receive event. 1516 1493 // 1517 if (IpVersion == IP_VERSION_4) {1494 if (IpVersion == IP_VERSION_4) { 1518 1495 gBS->CloseEvent (IpIo->RcvToken.Ip4Token.Event); 1519 1496 } else { … … 1523 1500 return EFI_SUCCESS; 1524 1501 } 1525 1526 1502 1527 1503 /** … … 1541 1517 EFIAPI 1542 1518 IpIoDestroy ( 1543 IN OUT IP_IO *IpIo1544 ) 1545 { 1546 EFI_STATUS 1519 IN OUT IP_IO *IpIo 1520 ) 1521 { 1522 EFI_STATUS Status; 1547 1523 1548 1524 // … … 1571 1547 return EFI_SUCCESS; 1572 1548 } 1573 1574 1549 1575 1550 /** … … 1602 1577 EFIAPI 1603 1578 IpIoSend ( 1604 IN OUT IP_IO *IpIo,1605 IN OUT NET_BUF *Pkt,1606 IN IP_IO_IP_INFO *Sender OPTIONAL,1607 IN VOID *Context OPTIONAL,1608 IN VOID *NotifyData OPTIONAL,1609 IN EFI_IP_ADDRESS *Dest OPTIONAL,1610 IN IP_IO_OVERRIDE *OverrideData OPTIONAL1611 ) 1612 { 1613 EFI_STATUS Status;1614 IP_IO_IP_PROTOCOL Ip;1615 IP_IO_SEND_ENTRY *SndEntry;1579 IN OUT IP_IO *IpIo, 1580 IN OUT NET_BUF *Pkt, 1581 IN IP_IO_IP_INFO *Sender OPTIONAL, 1582 IN VOID *Context OPTIONAL, 1583 IN VOID *NotifyData OPTIONAL, 1584 IN EFI_IP_ADDRESS *Dest OPTIONAL, 1585 IN IP_IO_OVERRIDE *OverrideData OPTIONAL 1586 ) 1587 { 1588 EFI_STATUS Status; 1589 IP_IO_IP_PROTOCOL Ip; 1590 IP_IO_SEND_ENTRY *SndEntry; 1616 1591 1617 1592 if ((IpIo == NULL) || (Pkt == NULL)) { … … 1640 1615 // Send this Packet 1641 1616 // 1642 if (IpIo->IpVersion == IP_VERSION_4) {1617 if (IpIo->IpVersion == IP_VERSION_4) { 1643 1618 Status = Ip.Ip4->Transmit ( 1644 1619 Ip.Ip4, … … 1658 1633 return Status; 1659 1634 } 1660 1661 1635 1662 1636 /** … … 1677 1651 ) 1678 1652 { 1679 LIST_ENTRY *Node;1680 IP_IO_SEND_ENTRY *SndEntry;1681 IP_IO_IP_PROTOCOL Ip;1653 LIST_ENTRY *Node; 1654 IP_IO_SEND_ENTRY *SndEntry; 1655 IP_IO_IP_PROTOCOL Ip; 1682 1656 1683 1657 ASSERT ((IpIo != NULL) && (Packet != NULL)); 1684 1658 1685 1659 NET_LIST_FOR_EACH (Node, &IpIo->PendingSndList) { 1686 1687 1660 SndEntry = NET_LIST_USER_STRUCT (Node, IP_IO_SEND_ENTRY, Entry); 1688 1661 1689 1662 if (SndEntry->Pkt == Packet) { 1690 1691 1663 Ip = SndEntry->Ip; 1692 1664 … … 1706 1678 } 1707 1679 } 1708 1709 } 1710 1680 } 1711 1681 1712 1682 /** … … 1764 1734 &IpInfo->ChildHandle, 1765 1735 IpInfo->IpVersion, 1766 (VOID **) 1736 (VOID **)&IpInfo->Ip 1767 1737 ); 1768 1738 if (EFI_ERROR (Status)) { … … 1813 1783 } 1814 1784 1815 1816 1785 /** 1817 1786 Configure the IP instance of this IpInfo and start the receiving if IpConfigData … … 1836 1805 EFIAPI 1837 1806 IpIoConfigIp ( 1838 IN OUT IP_IO_IP_INFO 1839 IN OUT VOID 1807 IN OUT IP_IO_IP_INFO *IpInfo, 1808 IN OUT VOID *IpConfigData OPTIONAL 1840 1809 ) 1841 1810 { … … 1875 1844 if (IpConfigData != NULL) { 1876 1845 if (IpInfo->IpVersion == IP_VERSION_4) { 1877 1878 if (((EFI_IP4_CONFIG_DATA *) IpConfigData)->UseDefaultAddress) { 1846 if (((EFI_IP4_CONFIG_DATA *)IpConfigData)->UseDefaultAddress) { 1879 1847 Status = Ip.Ip4->GetModeData ( 1880 1848 Ip.Ip4, … … 1888 1856 } 1889 1857 1890 IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA *)IpConfigData)->StationAddress, &Ip4ModeData.ConfigData.StationAddress);1891 IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA *)IpConfigData)->SubnetMask, &Ip4ModeData.ConfigData.SubnetMask);1858 IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA *)IpConfigData)->StationAddress, &Ip4ModeData.ConfigData.StationAddress); 1859 IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA *)IpConfigData)->SubnetMask, &Ip4ModeData.ConfigData.SubnetMask); 1892 1860 } 1893 1861 1894 1862 CopyMem ( 1895 1863 &IpInfo->Addr.Addr, 1896 &((EFI_IP4_CONFIG_DATA *) 1864 &((EFI_IP4_CONFIG_DATA *)IpConfigData)->StationAddress, 1897 1865 sizeof (IP4_ADDR) 1898 1866 ); 1899 1867 CopyMem ( 1900 1868 &IpInfo->PreMask.SubnetMask, 1901 &((EFI_IP4_CONFIG_DATA *) 1869 &((EFI_IP4_CONFIG_DATA *)IpConfigData)->SubnetMask, 1902 1870 sizeof (IP4_ADDR) 1903 1871 ); … … 1924 1892 if (Ip6ModeData.IsConfigured) { 1925 1893 CopyMem ( 1926 &((EFI_IP6_CONFIG_DATA *) 1894 &((EFI_IP6_CONFIG_DATA *)IpConfigData)->StationAddress, 1927 1895 &Ip6ModeData.ConfigData.StationAddress, 1928 1896 sizeof (EFI_IPv6_ADDRESS) … … 1952 1920 FreePool (Ip6ModeData.IcmpTypeList); 1953 1921 } 1954 1955 1922 } else { 1956 1923 Status = EFI_NO_MAPPING; … … 1983 1950 } 1984 1951 1985 1986 1952 /** 1987 1953 Destroy an IP instance maintained in IpIo->IpList for … … 2001 1967 EFIAPI 2002 1968 IpIoRemoveIp ( 2003 IN IP_IO *IpIo, 2004 IN IP_IO_IP_INFO *IpInfo 2005 ) 2006 { 2007 2008 UINT8 IpVersion; 2009 2010 if (IpIo == NULL || IpInfo == NULL) { 1969 IN IP_IO *IpIo, 1970 IN IP_IO_IP_INFO *IpInfo 1971 ) 1972 { 1973 UINT8 IpVersion; 1974 1975 if ((IpIo == NULL) || (IpInfo == NULL)) { 2011 1976 return; 2012 1977 } … … 2017 1982 2018 1983 if (IpInfo->RefCnt > 0) { 2019 2020 1984 return; 2021 1985 } … … 2027 1991 RemoveEntryList (&IpInfo->Entry); 2028 1992 2029 if (IpVersion == IP_VERSION_4) {1993 if (IpVersion == IP_VERSION_4) { 2030 1994 IpInfo->Ip.Ip4->Configure ( 2031 1995 IpInfo->Ip.Ip4, … … 2040 2004 2041 2005 gBS->CloseEvent (IpInfo->DummyRcvToken.Ip4Token.Event); 2042 2043 } else { 2044 2006 } else { 2045 2007 IpInfo->Ip.Ip6->Configure ( 2046 2008 IpInfo->Ip.Ip6, … … 2061 2023 } 2062 2024 2063 2064 2025 /** 2065 2026 Find the first IP protocol maintained in IpIo whose local … … 2086 2047 ) 2087 2048 { 2088 LIST_ENTRY 2089 IP_IO 2090 LIST_ENTRY 2091 IP_IO_IP_INFO 2092 2093 if ( IpIo == NULL || Src == NULL) {2049 LIST_ENTRY *IpIoEntry; 2050 IP_IO *IpIoPtr; 2051 LIST_ENTRY *IpInfoEntry; 2052 IP_IO_IP_INFO *IpInfo; 2053 2054 if ((IpIo == NULL) || (Src == NULL)) { 2094 2055 return NULL; 2095 2056 } … … 2108 2069 NET_LIST_FOR_EACH (IpInfoEntry, &IpIoPtr->IpList) { 2109 2070 IpInfo = NET_LIST_USER_STRUCT (IpInfoEntry, IP_IO_IP_INFO, Entry); 2110 if (IpInfo->IpVersion == IP_VERSION_4){ 2111 2071 if (IpInfo->IpVersion == IP_VERSION_4) { 2112 2072 if (EFI_IP4_EQUAL (&IpInfo->Addr.v4, &Src->v4)) { 2113 2073 *IpIo = IpIoPtr; 2114 2074 return IpInfo; 2115 2075 } 2116 2117 2076 } else { 2118 2119 2077 if (EFI_IP6_EQUAL (&IpInfo->Addr.v6, &Src->v6)) { 2120 2078 *IpIo = IpIoPtr; … … 2131 2089 } 2132 2090 2133 2134 2091 /** 2135 2092 Get the ICMP error map information. … … 2151 2108 EFIAPI 2152 2109 IpIoGetIcmpErrStatus ( 2153 IN UINT8 2154 IN UINT8 2155 OUT BOOLEAN 2156 OUT BOOLEAN 2110 IN UINT8 IcmpError, 2111 IN UINT8 IpVersion, 2112 OUT BOOLEAN *IsHard OPTIONAL, 2113 OUT BOOLEAN *Notify OPTIONAL 2157 2114 ) 2158 2115 { … … 2169 2126 2170 2127 switch (IcmpError) { 2171 case ICMP_ERR_UNREACH_NET: 2172 return EFI_NETWORK_UNREACHABLE; 2173 2174 case ICMP_ERR_TIMXCEED_INTRANS: 2175 case ICMP_ERR_TIMXCEED_REASS: 2176 case ICMP_ERR_UNREACH_HOST: 2177 return EFI_HOST_UNREACHABLE; 2178 2179 case ICMP_ERR_UNREACH_PROTOCOL: 2180 return EFI_PROTOCOL_UNREACHABLE; 2181 2182 case ICMP_ERR_UNREACH_PORT: 2183 return EFI_PORT_UNREACHABLE; 2184 2185 case ICMP_ERR_MSGSIZE: 2186 case ICMP_ERR_UNREACH_SRCFAIL: 2187 case ICMP_ERR_QUENCH: 2188 case ICMP_ERR_PARAMPROB: 2189 return EFI_ICMP_ERROR; 2190 2191 default: 2192 ASSERT (FALSE); 2193 return EFI_UNSUPPORTED; 2194 } 2195 2128 case ICMP_ERR_UNREACH_NET: 2129 return EFI_NETWORK_UNREACHABLE; 2130 2131 case ICMP_ERR_TIMXCEED_INTRANS: 2132 case ICMP_ERR_TIMXCEED_REASS: 2133 case ICMP_ERR_UNREACH_HOST: 2134 return EFI_HOST_UNREACHABLE; 2135 2136 case ICMP_ERR_UNREACH_PROTOCOL: 2137 return EFI_PROTOCOL_UNREACHABLE; 2138 2139 case ICMP_ERR_UNREACH_PORT: 2140 return EFI_PORT_UNREACHABLE; 2141 2142 case ICMP_ERR_MSGSIZE: 2143 case ICMP_ERR_UNREACH_SRCFAIL: 2144 case ICMP_ERR_QUENCH: 2145 case ICMP_ERR_PARAMPROB: 2146 return EFI_ICMP_ERROR; 2147 2148 default: 2149 ASSERT (FALSE); 2150 return EFI_UNSUPPORTED; 2151 } 2196 2152 } else if (IpVersion == IP_VERSION_6) { 2197 2198 2153 ASSERT (IcmpError <= ICMP6_ERR_PARAMPROB_IPV6OPTION); 2199 2154 … … 2207 2162 2208 2163 switch (IcmpError) { 2209 case ICMP6_ERR_UNREACH_NET: 2210 return EFI_NETWORK_UNREACHABLE; 2211 2212 case ICMP6_ERR_UNREACH_HOST: 2213 case ICMP6_ERR_TIMXCEED_HOPLIMIT: 2214 case ICMP6_ERR_TIMXCEED_REASS: 2215 return EFI_HOST_UNREACHABLE; 2216 2217 case ICMP6_ERR_UNREACH_PROTOCOL: 2218 return EFI_PROTOCOL_UNREACHABLE; 2219 2220 case ICMP6_ERR_UNREACH_PORT: 2221 return EFI_PORT_UNREACHABLE; 2222 2223 case ICMP6_ERR_PACKAGE_TOOBIG: 2224 case ICMP6_ERR_PARAMPROB_HEADER: 2225 case ICMP6_ERR_PARAMPROB_NEXHEADER: 2226 case ICMP6_ERR_PARAMPROB_IPV6OPTION: 2227 return EFI_ICMP_ERROR; 2228 2229 default: 2230 ASSERT (FALSE); 2231 return EFI_UNSUPPORTED; 2232 } 2233 2164 case ICMP6_ERR_UNREACH_NET: 2165 return EFI_NETWORK_UNREACHABLE; 2166 2167 case ICMP6_ERR_UNREACH_HOST: 2168 case ICMP6_ERR_TIMXCEED_HOPLIMIT: 2169 case ICMP6_ERR_TIMXCEED_REASS: 2170 return EFI_HOST_UNREACHABLE; 2171 2172 case ICMP6_ERR_UNREACH_PROTOCOL: 2173 return EFI_PROTOCOL_UNREACHABLE; 2174 2175 case ICMP6_ERR_UNREACH_PORT: 2176 return EFI_PORT_UNREACHABLE; 2177 2178 case ICMP6_ERR_PACKAGE_TOOBIG: 2179 case ICMP6_ERR_PARAMPROB_HEADER: 2180 case ICMP6_ERR_PARAMPROB_NEXHEADER: 2181 case ICMP6_ERR_PARAMPROB_IPV6OPTION: 2182 return EFI_ICMP_ERROR; 2183 2184 default: 2185 ASSERT (FALSE); 2186 return EFI_UNSUPPORTED; 2187 } 2234 2188 } else { 2235 2189 // … … 2240 2194 } 2241 2195 } 2242 2243 2196 2244 2197 /** … … 2289 2242 return Ip->Neighbors (Ip, FALSE, &Neighbor->v6, NULL, Timeout, TRUE); 2290 2243 } 2291
Note:
See TracChangeset
for help on using the changeset viewer.